Programação, como começar


Se me perguntassem a alguns meses como começar a programar eu diria “estude e entenda bem os fundamentos que você vai se dar bem”. Continuo com o mesmo pensamento, rever o básico e fortalecer a base é sempre bom. Por isso mesmo que decidi dar um passo para trás e voltar a estudar o básico. A ideia é trazer aqui de forma lúdica e prática conceitos e fundamentos presentes na programação.

Antes da dar continuidade e ir direto para os conceitos iniciais, eu gostaria de fazer um adendo. Uma enorme mudança do meu eu antigo para o meu eu atual, que agora tem uma visão acadêmica da produção de software, é que eu tenho noção das outras etapas da criação de software. Apenas saber programar vai te fazer um bom escritor de código, mas não vai te tornar um desenvolvedor realmente. Um bom desenvolvedor conhece boas práticas e as melhores formas de construção de um software, esse conhecimento vai muito além de conhecer a sintaxe de uma linguagem ou saber lógica. Por isso não ache que apenas saber escrever linhas de código vai te tornar um desenvolvedor completo, programar é apenas a pontinha do iceberg, mas ainda sim é o primeiro passo. Vamos lá ?

Lógica de Programação

O primeiro passo para aprender a programar é conhecer lógica e não existem muitas formas de aprender lógica se não praticando. Aconselho fortemente estudar lógica aliada a seu estudo de programação. Quando falamos de lógica, estamos falando do conceito mais primitivo de algoritmo, que é nada mais nada menos que a resolução de problemas. Podemos enxergar o software ou o algoritmo como um conjunto de instruções para resolver um problema. Vamos imaginar algo assim :

Ana é uma professora de ensino primário, ela precisa de uma forma mais fácil de calcular as notas e as médias de seus aluno

Como poderíamos ajudar Ana a resolver seu problema ? Em um primeiro momento não vamos nos preocupar com codificação, vamos apenas resolver o problema de Ana. Vamos pensar em etapas. O primeiro passo para pensar em uma solução para Ana é analisar como o processo é feito de forma individual.

Ana tem um sistema de avaliação com uma prova em cada unidade e cada ano escolar possui 4 unidades, 2 em cada semestre.

Ou seja, cada aluno terá 4 notas diferentes ao longo do ano, sendo assim, para determinar se um aluno passou ou não de ano, a professora precisa fazer uma média entre essas 4 notas e determinar um valor que seja uma régua para a turma. Vamos colocar em termos mais práticos, Ana precisa calcular a média das notas e se ela for, por exemplo, maior do que 7 o aluno está aprovado por média, caso seja menor, ele não está aprovado. Vamos então criar uma lista de etapas que Ana precisa seguir para que ela obtenha a nota do aluno :

  1. Recolher as notas das 4 avaliações de cada aluno
  2. Calcular a média entre as 4 avaliações
  3. verificar se a nota é maior ou igual a média determinada como satisfatória, vamos usar 7

Com essa lista de etapas podemos determinar se o aluno de Ana foi ou não reprovado, vamos para um exemplo :

Aluno : André
Av1 = 10
Av2 = 7
Av3 = 4
Av4 = 9

O primeiro passo já foi concluído, já possuímos as notas do aluno, vamos então para o segundo passo :

10 + 7 + 4 + 9 = 30
30 / 4 = 7,5

Agora que já temos a média das avalições podemos comparar com a média pré-determinada. No caso em questão a média pré-determinada foi 7, o aluno André ficou com uma média de 7,5 anual, sendo assim ele está aprovado por média.

A resolução de problemas é uma das habilidades mais importantes do desenvolvedor pois seu trabalho consiste nisso, por isso a lógica é tão importante, espero que esse exemplo tenha deixado claro o processo de analise e resolução de um problema, no inicio dá um nó na cabeça, mas depois você se acostuma.

Alguns professores optam por utilizar algumas ferramentas como o Portugol para ensinar lógica de programação para seus alunos. Porém, considerando o leque de linguagens que existem hoje acredito que usar linguagens como Python pode ser mais proveitoso. O ponto é entenda os conceitos, as linguagens acabam somente mudando sua sintaxe, ou seja, a forma como você escreve os códigos, mas os conceitos são iguais, por exemplo uma variável é uma variável tanto em Python quanto em Java.

Por esse motivo mesmo que vamos partir agora para exemplos práticos com o Python e explicar esses conceitos iniciais. Para facilitar a vida dos programadores, existem algumas coisas chamadas IDE’s (Integrated Development Environment) são ambiente de desenvolvimento, aplicações que utilizamos para programar, acho que você já deve ter ouvido falar de algumas, por exemplo o vscode, o pycharm, intellij entre outros. Eu recomendo o uso do vscode, todos os meus códigos em Python eu escrevo por ele. Para te ajudar o link para download do vscode . Vamos prosseguir !

Conceitos iniciais

Para falar sobre os conceitos mais iniciais, vamos continuar no exemplo de Ana e vamos tentar resolver o problema dela usando uma linguagem de programação, Python no caso.

Variáveis

O primeiro conceito que vamos abordar é o de variável, que nada mais é do que um espaço na memória do computador que guarda um dado, ou seja, uma informação. Vamos fazer uma comparação com o mundo real, imagina que você tem um brinquedo e você quer guardar esse brinquedo em algum lugar, você então pega uma caixa e guarda ela em um armário. Nesse exemplo, nossa caixinha é uma variável, o brinquedo é o dado que queremos guardar e o armário a memória do nosso computador.

Mas para que isso serve ? Vamos voltar para o exemplo de Ana, nós vamos usar variáveis para guardar as notas dos alunos por exemplo.

nota_1 = 10
nota_2 = 7
nota_3 = 4
nota_4 = 9

O nota_1 é uma variável, ou seja, um espaço na memória do computador que guarda a nota do aluno. Um ponto importante sobre variáveis, Elas só guardam uma informação por vez, sendo assim, não adianta atribuir mais de um valor a uma variável, depois vamos falar sobre estruturas de dados que permitem mais de uma informação por vez, por hora, vamos nos manter apenas nas variáveis, mas ainda no exemplo de Ana.

Tipos primitivos

Quando atribuímos um valor a uma variável, podemos manipular esse valor de diferentes formas. Para isso é importante falar um pouco sobre tipos primitivos, todo dado em uma linguagem de programação possui um tipo, mas como assim um tipo ? Vamos para um exemplo, o valor 5 é um número correto ? O Python também classifica os seus dados em alguns tipos, os mais básicos são chamados de tipos primitivos, são eles :

  • Inteiros (Você verá eles nos códigos com a nomenclatura int), são números positivos e negativos, sem casas decimais.
  • Float, são números com ponto flutuante, ou seja, números com casas decimais.
  • Booleanos (você verá eles no código como bool ou boolean), são valores que só podem ter dois estados, verdadeiro ou falso (true or false).
  • Strings, são cadeias de caracteres, o “texto” que usamos normalmente, todo esse texto é um conjunto de strings, uma palavra é uma string.

Passamos pelos principais tipos de dados que podemos ter, claro que existem muitos outros, mas por hora vamos focar nesses. No nosso exemplo, todas as nossas variáveis são inteiros, para conferir isso, vamos usar duas funções do Python, uma delas será o print e a outra será o type. Vamos escrever um código simples :

nota_1 = 10
nota_2 = 7
nota_3 = 4
nota_4 = 9

#Vamos pegar o nota_1 como exemplo
print(type(nota_1))

OBS: Quando colocamos um texto precedido por # o Python ignora aquela linha, chamamos isso de comentário.

A saída que teremos será :

<class 'int'>

OBS: Ignore o class por enquanto, falaremos sobre ele no futuro

Se modificarmos o valor de nota_1 para nota_1 = "", o tipo que ele possui também irá mudar :

<class 'str'>

O tipo do valor da nossa variável mudou, antes ele era um inteiro, agora ele é uma string, sim mesmo não tendo nada ele é uma string, uma string vazia, mas ainda sim uma string.

Operações Matemáticas

Agora que já sabemos que os dados em Python possuem certos tipos, vamos voltar para o problema de Ana. Na situação de Ana, ela precisa calcular a média das notas do aluno, mas como que podemos fazer isso com Python ? Bem no Python podemos realizar operações matemáticas, sim aquelas que usamos no dia a dia. Ele segue padrões muito semelhantes dos usado na matemática, podemos atribuir inclusive expressões inteiras e o resultado atribuir a uma variável, chamamos isso de composição. Vamos então criar uma variável que irá receber o valor da média da nota dos alunos :

nota_1 = 10
nota_2 = 7
nota_3 = 4
nota_4 = 9
media = (nota_1+nota_2+nota_3+nota_4)/4
print(media)

Quando executarmos esse código, teremos algo mais ou menos assim :

7.5

Agora nosso código mostra a média das notas do aluno de Ana, mas de somente um aluno.

Entrada de dados

Agora, temos um problema, nem todos os alunos de Ana vão possuir as mesmas notas, como nos podemos tornar nosso código dinâmico para que ele atenda as necessidades de Ana ? Vamos usar um comando em Python, o comando é input o que ele vai fazer é nada mais nada menos que receber uma entrada do usuário, ou seja, quando digitarmos algo no terminal ele irá receber essa entrada e atribuir a uma variável.

Vamos exemplificar :

nota_1 = input()
nota_2 = input()
nota_3 = input()
nota_4 = input()
media = (nota_1+nota_2+nota_3+nota_4)/4

print(media)

Quando rodarmos o código, o código vai pedir para digitarmos um valor para ser atribuído a variável, o resultado será esse :

10
4
5
7
Traceback (most recent call last):
  File "/home/aalecrim/Projetos/tutorial_lógica/teste.py", line 5, in <module>
    media = (nota_1+nota_2+nota_3+nota_4)/4
            ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~^~
TypeError: unsupported operand type(s) for /: 'str' and 'int'

Ué ? Esse não era o resultado esperado…vamos analisar o que o erro diz : TypeError: unsupported operand type(s) for /: 'str' and 'int', de forma grosseira ele está dizendo que a operação não é suportada pelo tipo str (string), mas como assim ? todos os valores inseridos não eram números ? Por padrão o input define o tipo de toda entrada de dados como uma string, então precisamos definir esse dado como um inteiro, assim :

nota_1 = int(input("Digite o valor da primeira nota "))
nota_2 = int(input("Digite o valor da segunda nota "))
nota_3 = int(input("Digite o valor da terceira nota "))
nota_4 = int(input("Digite o valor da quarta nota "))
media = (nota_1+nota_2+nota_3+nota_4)/4

print(media)

Além disso, o input imprime um texto no terminal, ajudando a informar ao usuário o que fazer, rodando o código, temos algo assim :

Digite o valor da primeira nota 10
Digite o valor da segunda nota 9
Digite o valor da terceira nota 6
Digite o valor da quarta nota 9
8.5

Repetição e condicionais

Ana já está ficando bem satisfeita com o produto final dela, mas ela ainda precisa rodar o código toda vez que precisa calcular a média de um aluno, além de que ela precisa fazer a verificação sozinha da nota. Como podemos tornar o código mais dinâmico para ajudar Ana a resolver seu problema ? Bom vamos primeiro usar uma coisa chamada estruturas condicionais, No exemplo um aluno seria aprovado se a nota dele fosse maior do que 7 correto ? pois bem o Python pode fazer essa analise, vamos usar um comando chamado if que significa se em português, ou seja, vamos criar uma condição no nosso código para que ele imprima a mensagem de aprovado, a condição será a média do aluno ser maior que 7. Vamos para o código :

nota_1 = int(input("Digite o valor da primeira nota "))
nota_2 = int(input("Digite o valor da segunda nota "))
nota_3 = int(input("Digite o valor da terceira nota "))
nota_4 = int(input("Digite o valor da quarta nota "))
media = (nota_1+nota_2+nota_3+nota_4)/4
if media > 7 :
	print("Aprovado!")

Vamos fazer dois testes :

  • Nota 1 = 10, Nota 2 = 8, Nota 3 = 9, Nota 4 = 10, media = 8,5
Digite o valor da primeira nota 10
Digite o valor da segunda nota 8
Digite o valor da terceira nota 9
Digite o valor da quarta nota 10
Aprovado!
  • Nota 1 = 7, Nota 2 = 7, Nota 3 = 7, Nota 4 = 7
Digite o valor da primeira nota 7
Digite o valor da segunda nota 7
Digite o valor da terceira nota 7
Digite o valor da quarta nota 7

Como podemos ver, o resultado do segundo teste não foi como o esperado. Mesmo a média sendo igual a 7, a mensagem de aprovado não foi impressa, além disso, como vamos saber se na verdade ele foi reprovado ? Nosso amigo if normalmente é acompanhado pelo seu complemento chamado else em português, algo como senão, vamos então determinar o que será feito (nesse caso, qual mensagem irá aparecer) se a condição determinada não for atingida. Nosso código vai ficar assim :

nota_1 = int(input("Digite o valor da primeira nota "))
nota_2 = int(input("Digite o valor da segunda nota "))
nota_3 = int(input("Digite o valor da terceira nota "))
nota_4 = int(input("Digite o valor da quarta nota "))
media = (nota_1+nota_2+nota_3+nota_4)/4
if media > 7 :
	print("Aprovado!")
else :
	print("Reprovado!")

Mas se testarmos de novo, o aluno será considerado reprovado, por que ? Vamos falar um pouco sobre operadores relacionais, o Python possui alguns operadores de comparação. Por padrão, o if irá executar as instruções que são definidas dentro dele, se a sentença que for colocada for considerada verdadeira. Vamos para um exemplo :

controle = True

if controle :
    print("verdadeiro!")
else :
    print("falso!")

O resultado será :

verdadeiro!

Mas se mudarmos o valor da variável controle para false, o resultado será :

falso!

Portanto, a sentença está sendo considerada falsa, mas por que ? Vamos usar a matemática ao nosso favor agora, quando falamos que um número é maior que 7, não estamos incluindo o 7, mas se falamos que ele é maior ou igual a 7 vamos considerar o 7 como um valor válido também. Sendo assim, podemos usar outros operadores de comparação para chegar ao resultado esperado, os operadores são :

  • ”>”: Maior que
  • ”<” : Menor que
  • ”>=” : Maior ou igual
  • ”<=” : Menor ou igual
  • ”==” : Igual a
  • ”!=” : diferente de

Como queremos incluir o 7 também nas notas, vamos usar o Maior ou igual :

nota_1 = int(input("Digite o valor da primeira nota "))
nota_2 = int(input("Digite o valor da segunda nota "))
nota_3 = int(input("Digite o valor da terceira nota "))
nota_4 = int(input("Digite o valor da quarta nota "))
media = (nota_1+nota_2+nota_3+nota_4)/4
if media >= 7 :
	print("Aprovado!")
else :
	print("Reprovado!")

O ato de modificar um código, por vários motivos, é extremamente comum, nesse caso foi por que não obtivemos o resultado esperado. Erros são extremamente comuns, por isso mesmo é importante conhecer bem os tipos de erros que podemos nos deparar, o primeiro erro é o de sintaxe, ou seja, quando escrevemos um comando errado, que é bem incomum hoje, pois a maioria das IDE’s aponta quando erros como esse aparecem, mas os erros de lógica, que são erros que acontecem quando o código funciona, mas sem devolver o resultado esperado, como aconteceu nesse caso da média, são bem mais comuns. Para corrigir esse tipo de erro é necessário imaginar todas as etapas de um programa para entender onde que está o erro e corrigi-lo, essa é a parte complicada de programar, por que não está claro onde o erro está, precisamos trabalhar como detetives e tentar encontrar a resposta para o nosso problema!

Agora que já temos o status do Aluno, podemos prosseguir, a próxima etapa é ajudar Ana a não ter que ficar rodando o código toda vez que ela precisar calcular a nota de um aluno, para isso vamos usar estruturas de repetição. Existem duas principais estruturas de repetição, o for e o while. De forma simples, o for funciona como um “contador”, por isso ele faz um loop uma quantidade determinada de vezes. Já o while ele repete as instruções dentro dele enquanto a sentença determinada nele for verdadeira, parecido com o if, vamos para alguns exemplos :

for i in range(5):
	print(i)

O resultado desse exemplo é :

0
1
2
3
4

Aqui vamos explicar alguns aspectos importantes do for. O primeiro ponto é que a estrutura dele que é bem distinta, o i é o que chamamos de variável de controle, ela é utilizada para limitar a repetição, imagine que existe um if intrínseco no for que mantem ele realizando suas instruções enquanto essa condição não foi atingida. Nós levando para a segunda parte da estrutura que chama a atenção, o comando range, o que ele faz é nada mais nada menos que dizer ao for a “distância” que ele precisa percorrer, no exemplo o for percorre 5 elementos. O outro aspecto importante de se levar em consideração no for é que a contagem dele foi até o 4 e começou no 0, pois bem, aqui está outra característica interessante sobre linguagens de programação a contagem delas começa no 0, mas ainda sim deveria ir até o 5 não é ? não, o 5 que colocamos ali se refere a quantidade de elementos que serão contados e não até que elemento a contagem vai. Vamos passar para o while agora.

While significa, de modo grosseiro, enquanto, sendo assim a instrução que for colocada dentro do loop será realizada enquanto a sentença utilizada for verdadeira. Vamos para um exemplo :

c = 0
while c < 5:
	print(c)
	c += 1

O resultado será :

0
1
2
3
4

Nesse exemplo, a instrução passada dentro do while será realizada enquanto o valor de c for menor que 5, mas além de imprimir no terminal o valor de c, ele soma 1 ao valor de c. Uma observação, o c += 1 é uma atribuição com soma, ou seja, o Python irá pegar como base o valor de c e irá somar 1 a ele e o resultado dessa soma será atribuido a c, outra forma de enxergar isso é c = c + 1. Esse forma de atribuição com soma, subtração e até produto é bem comum no python, esses e outros macetes você aprende com o tempo usando a linguagem.

Vamos então aplicar esses loops no nosso código para ajudar Ana. Vamos criar uma variável de controle e perguntar se Ana quer ou não continuar calculando as notas :

control = True

while control:
	nota_1 = int(input("Digite o valor da primeira nota "))
	nota_2 = int(input("Digite o valor da segunda nota "))
	nota_3 = int(input("Digite o valor da terceira nota "))
	nota_4 = int(input("Digite o valor da quarta nota "))
	media = (nota_1+nota_2+nota_3+nota_4)/4
	if media >= 7 :
		print("Aprovado!")
	else :
		print("Reprovado!")
	if input("Deseja continuar (s/n) ? ") == "n":
		control = False

Assim Ana pode utilizar o código quantas vezes forem necessárias sem precisar executar o arquivo toda vez, calculando a nota de seus alunos de forma mais prática !

Agradeço a você que chegou até aqui, abordamos bastante coisa, mas ainda temos muito mais o que falar, no próximo post vamos falar sobre funções e sobre estruturas de dados em Python e vamos evoluir esse código e facilitar ainda mais a vida de Ana. Espero que a leitura desse texto tenha sido tão proveitosa quanto foi escreve-lo. Até a próxima!

Referências :

Imagem gerada com o ChatGPT