Conceitos Iniciais #01
Tags: python, programming, beginners, tutorial
Published: 2022-03-03 11:26:43

{% youtube https://youtu.be/xyUpL7c9GPk %}
## Introdução

A _arte de programar_ se baseia na construção de **programas**, que por sua vez, são **_algoritmos_**.

Entender o que um algoritmo faz, geralmente não é algo de grande complexidade, mas _a forma no qual foi construído é o segredo para se tornar um bom desenvolvedor de software_ e **_só aprende a escrever programas quem pratica_**.


![imagem 1](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/c7lymaecl4vwxig2noy8.png)

Para que possamos entender melhor estes conceitos, temos que saber o que é um algoritmo, e uma melhor definição do que é um programa.

## O que é um algoritmo?

Um **algoritmo** é uma sequência de passos finitos com o objetivo de solucionar um problema, aplicando a técnica da **lógica de programação**. Por sua vez, a lógica de programação é a técnica de encadear pensamentos para atingir determinado objetivo.

Observe as qualidades de um algoritmo: ele deve possuir uma quantidade **finita** de passos, ou seja, ter início e fim, e executado de forma **sequencial**. 

Dado o seguinte problema: _gostaria de saber como posso ir ao cinema mais próximo saindo de casa?_ 

Você é capaz de resolvê-lo? Descrever os passos para chegar ao cinema mais próximo saindo de sua casa? 

Se você respondeu que sim, isso significa que você consegue escrever um algoritmo para este problema. **Parabéns**! 

Provavelmente *você tem mais de uma forma* de resolvê-lo, por exemplo, você pode pegar um determinado ônibus para ir ao cinema, ou pode ir caminhando, entre outras opções como solicitar carona à um amigo e até mesmo se deslocar em um transporte particular como um carro ou bicicleta!

É comum a solução de um problema (_ir ao cinema_) ter diversos caminhos ou passos (_ir de carro, caminhando, carona, entre outras formas_). Isto implica que **um algoritmo pode ser escrito de diversas formas** e quanto mais experiente você se tornar, mais eficientes serão seus algoritmos.

Vamos explorar outros algoritmos do nosso dia-a-dia.

Veja o exemplo de um algoritmo para resolver o problema de fritar um ovo - Algoritmo 01.

<table>
  <tr>
   <td><strong><code>Algoritmo 01 - Fritar um ovo</code></strong>
   </td>
  </tr>
  <tr>
   <td><code>1 - pegar frigideira, ovo, óleo e sal</code>
   </td>
  </tr>
  <tr>
   <td><code>2 - colocar óleo na frigideira</code>
   </td>
  </tr>
  <tr>
   <td><code>3 - acender o fogo</code>
   </td>
  </tr>
  <tr>
   <td><code>4 - colocar a frigideira no fogo</code>
   </td>
  </tr>
  <tr>
   <td><code>5 - esperar o óleo esquentar</code>
   </td>
  </tr>
  <tr>
   <td><code>6 - colocar o ovo</code>
   </td>
  </tr>
  <tr>
   <td><code>7 - retirar quando pronto</code>
   </td>
  </tr>
</table>

Cada linha do algoritmo é chamado de **instrução**, o Algoritmo 01 - Fritar um ovo o algoritmo utiliza um conjunto finito e sequencial de sete instruções. **Um algoritmo é um conjunto de instruções.**

Outros exemplos de algoritmos simples:


<table>
  <tr>
   <td><strong><code>Algoritmo 02 - Trocar uma lâmpada</code></strong>
   </td>
  </tr>
  <tr>
   <td><code>1 - se (lâmpada estiver fora de alcance)</code>
<p>
<code>pegar a escada;</code>
   </td>
  </tr>
  <tr>
   <td><code>2 - pegar a lâmpada;</code>
   </td>
  </tr>
  <tr>
   <td><code>3 - se (lâmpada estiver quente)</code>
<p>
<code>pegar pano;</code>
   </td>
  </tr>
  <tr>
   <td><code>4 - Tirar lâmpada queimada;</code>
   </td>
  </tr>
  <tr>
   <td><code>5 - Colocar lâmpada boa;</code>
   </td>
  </tr>
</table>


No Algoritmo 02 - Trocar uma lâmpada, temos instruções mais refinadas, observe a linha 03, o ato de “_pegar o pano_” será executado somente se a _“lâmpada estiver quente”_. **Temos uma instrução condicional**!


<table>
  <tr>
   <td><strong><code>Algoritmo 03 - Preparar um bolo simples</code></strong>
   </td>
  </tr>
  <tr>
   <td><code>1 - pegar os ingredientes;</code>
   </td>
  </tr>
  <tr>
   <td><code>2 - se (roupa branca)</code>
<p>
<code>colocar avental;</code>
   </td>
  </tr>
  <tr>
   <td><code>3 - se (tiver batedeira)</code>
<p>
<code>bater os ingredientes na batedeira;</code>
<p>
<code>senão</code>
<p>
<code>bater os ingredientes à mão;</code>
   </td>
  </tr>
  <tr>
   <td><code>4 - colocar a massa na forma;</code>
   </td>
  </tr>
  <tr>
   <td><code>5 - colocar a forma no forno;</code>
   </td>
  </tr>
  <tr>
   <td><code>6 - aguardar o tempo necessário;</code>
   </td>
  </tr>
  <tr>
   <td><code>7 - retirar o bolo;</code>
   </td>
  </tr>
</table>


O que acontece se seguirmos sempre os mesmos passos do Algoritmo 03 - Preparar um bolo simples? Teremos ao final de cada execução do algoritmo um novo bolo. 

Um **_algoritmo é dito determinístico_**, <span style="text-decoration:underline;">se para um mesmo conjunto de entrada sempre teremos os mesmos valores de saída.</span>

Finalmente, observe  este algoritmo representando o jogo da forca:


<table>
  <tr>
   <td><strong><code>Algoritmo 04 - Jogo da forca</code></strong>
   </td>
  </tr>
  <tr>
   <td><code>1 - escolher a palavra;</code>
   </td>
  </tr>
  <tr>
   <td><code>2 - montar o diagrama do jogo;</code>
   </td>
  </tr>
  <tr>
   <td><code>3 - enquanto ((houver lacunas vazias) e (corpo incompleto))faça</code>
<p>
<code>se (acertar uma letra)</code>
<p>
<code>escrever na lacuna correspondente;</code>
<p>
<code>senão</code>
<p>
<code>desenhar uma parte do corpo na forca;</code>
   </td>
  </tr>
</table>


A instrução na linha 03 do Algoritmo 04- Jogo da forca, é denominada uma **instrução de repetição**, alguns passos são executados repetidamente enquanto determinadas condições permanecem satisfeitas. Neste caso, enquanto houver lacunas vazias e o corpo da figura do jogo da forca estiver incompleto, os jogadores continuarão jogando.


<table>
  <tr>
   <td>Agora é a sua vez!
   </td>
  </tr>
  <tr>
   <td>Era uma vez um fazendeiro que foi ao mercado e comprou um lobo, um carneiro e uma alface. No caminho para casa, o fazendeiro chegou à margem de um rio e arrendou um barco. Mas, na travessia do rio por barco, o agricultor poderia levar apenas a si mesmo e uma única de suas compras — o lobo, o carneiro, ou a alface.
<p>
Se fossem deixados sozinhos em uma mesma margem, o lobo comeria o carneiro e o carneiro comeria a alface.
<p>
O desafio do fazendeiro é atravessar a si mesmo e as suas compras para a margem oposta do rio, deixando cada compra intacta. Crie um algoritmo para resolver este problema!
   </td>
  </tr>
  <tr>
   <td>
   </td>
  </tr>
</table>

Agora sabemos que um algoritmo é um conjunto sequencial de instruções. As instruções podem ser **simples**, **condicionais** ou de **repetição**, e os algoritmos são construídos para resolver um determinado problema e de forma determinística.

Nosso próximo objetivo é aprender criar algoritmos (arte de programar) para serem executados em computadores ou dispositivos com capacidade de processamento, como nossos celulares, _video games_, eletrodomésticos inteligentes, entre outros dispositivos.

## O que é programar?

Programar é o ato de escrever programas de computador, hoje aplicados a diversos dispositivos programáveis ou computacionais, como celulares por exemplo. 

Um **programa de computador** é um algoritmo escrito através de uma **_linguagem de programação (computador)_**, como Java, C++, Python, entre outros. Mas independente da linguagem utilizada, o mais importante de um programa é a lógica utilizada na resolução do problema. Os programas são os **_softwares_** ou **_aplicativos_** que você utiliza na sua máquina.

Na construção de algoritmos é importante você identificar as informações que você utilizará como entrada, as transformações ou operações utilizadas para resolver o problema e finalmente a saída ou o estado final esperado depois de sua execução. Esta é a representação de um algoritmo ou de um programa de computador.

![imagem 2](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/49vax03b2mm3mpr1bu8g.png)

No Algoritmo 05 - Somar dois números, temos como dados de entrada os dois números que queremos somar, como operação a soma utilizando os números de entrada e como saída o resultado da soma.


<table>
  <tr>
   <td><strong><code>Algoritmo 05 - Somar dois números</code></strong>
   </td>
  </tr>
  <tr>
   <td><code>1 - leia o primeiro número</code>
   </td>
  </tr>
  <tr>
   <td><code>2 - leia o segundo número</code>
   </td>
  </tr>
  <tr>
   <td><code>3 - realize a soma do primeiro e do segundo número</code>
   </td>
  </tr>
  <tr>
   <td><code>4 - apresente o resultado da soma</code>
   </td>
  </tr>
</table>


Nota importante:_nem todos os algoritmos exigem dados de entrada como também não são obrigados a gerarem dados de saída._ Mas independente da geração de dados de saída, existe diferença no ambiente em que ele executou entre o “antes da execução” e o “depois da execução”, o que chamamos mudança de estado. Veja por exemplo um programa que representa um relógio, ele não recebe nenhuma informação como entrada mas a cada minuto apresenta na tela uma informação diferente, atualizando as informações de horário (modificando o estado “antes” e “depois”).

## E a linguagem de programação?

Uma linguagem de programação é a linguagem utilizada pelo computador para executar as instruções de um algoritmo.

Até agora, escrevemos nossos algoritmos utilizando a nossa **linguagem natural**, o português, mas estes comandos não são entendíveis pelo computador. Por exemplo, utilizando o Algoritmo 05 - Somar dois números, pedir para o computador ler um número (instrução `leia o primeiro número`), não fará com que seja lido do teclado da máquina um valor numérico. É necessário escrever esta instrução usando uma linguagem de programação, no nosso caso, usando Python.

De forma simplificada, escrevemos nossos programas usando a linguagem Python, estes programas contém instruções que são comandos para o sistema operacional da máquina que deverão ser executados e poderão acessar recursos como por exemplo o teclado, o monitor, acessar a Internet, entre outros.


![imagem 3](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/2s1v32yqddrzuxttes7l.png)

Da mesma forma que uma linguagem natural, uma linguagem de programação possui seu vocabulário (**palavras reservadas**) e suas regras de escrita (**sintaxe**) de instruções. Felizmente a quantidade de palavras reservadas e de regras de sintaxe são bem menores do que as utilizadas na linguagem natural.

Nossa meta é aprender a **sintaxe da linguagem Python** e escrever programas que possam ser executados pelo computador.

## Linguagem Python

A linguagem Python é uma linguagem de programação **interpretada**, isto significa que você precisa instalar o interpretador Python para que seus programas possam ser executados na sua máquina ([Instalando Python](https://dev.to/jcarlosvale/instalando-python-iniciantes-1d2m)).

O nome não é originário da cobra _python_, mas tem origem no grupo de comédia britânico _Monty Python._ É uma linguagem de fácil leitura, em inglês, e possui um _shell_ interativo que permite a criação e execução de programas.

Python é bastante adotado como primeira linguagem a ser usada para se aprender lógica de programação, principalmente pela sua simplicidade. Compare um programa Python para imprimir uma mensagem na tela com um programa escrito em Java, por exemplo.


>Programa 01.a - Escrever uma mensagem na tela (Python)
```
print('ola, meu primeiro programa')
```

>Programa 01.b - Escrever uma mensagem na tela (Java)
```
public class MedianStream {
    public static void main(String[] args) {
        System.out.print("ola, meu primeiro programa");</code>
    }
}
```

Fazer a leitura do Programa 01.a em Python é mais intuitivo do que o mesmo algoritmo escrito em Java, no Programa 01.b.

Podemos usar Python para criar jogos, construir aplicações _web_, resolver problemas de negócio, automatizar atividades do dia-a-dia e em diversos campos científicos. Muitas aplicações de inteligência artificial e de ciência de dados, usam Python como linguagem principal.

## Algumas dicas para os futuros desenvolvedores

Mantenha-se motivado e se orgulhe com a oportunidade de criar algo do zero, usando lógica para desenvolver programas que podem ser executados pelo computador.

Quando você estiver se sentindo frustrado por não estar conseguindo resolver um problema, tente quebrar o problema em pequenos pedaços e resolver cada pedacinho primeiro. 
Caso você continue bloqueado, talvez seja a hora de dar uma relaxada e depois voltar a trabalhar na resolução do problema.

Até a próxima.