2  Arrumando as coisas para começar a falar de algoritmos

2.1 O que você saberá se você ler todo este capítulo?

  1. Você irá trabalhar em uma empresa ou em um mestrado/doutorado para resolver problemas usando Python, e não somente para apertar botões e comandos. Por isso, você precisará saber trabalhar com algoritmos (usando Python ou qualquer outra linguagem).
  2. Algoritmo não é sinônimo de inteligência artificial, e você pode pensar em casos da vida real em forma de algoritmos.
  3. Algoritmos podem conter dados.
    • Dados que não mudam são armazenados em constantes.
    • Dados que mudam são armazenados em variáveis.
    • Dados são manipulados com operadores (ex.: adição, subtração, divisão, comparação).
    • Dados podem ser números, textos ou variáveis lógicas (verdadeiro/falso), dentre outros.
  4. Todo algoritmo é organizado da seguinte forma:
    • Entrada: são os pré-requisitos que um algoritmo tem para que possa funcionar, ou seja, os dados ou informações necessárias para realizar a tarefa.
    • Processamento: é a sequência de passos ou instruções que serão executados para processar a entrada e produzir uma saída.
    • Saída: é o resultado final que o algoritmo produz, que pode ser uma resposta, um valor ou uma ação.
  5. Algoritmos servem para resolver problemas de um jeito estruturado e organizado seguindo uma sequência lógica: não importa o computador/pessoa que execute aquele algoritmo - devemos esperar o mesmo resultado.
    • Exemplo: não importa o modelo de celular, a cidade ou o restaurante - o aplicativo de delivery de comida deve funcionar da mesma forma para todas estas combinações possíveis.
  6. O algoritmo precisa ser claro, conciso e eficiente na solução do problema proposto.

🎓 Vindo do Capítulo 1? Ótimo! Você já configurou seu ambiente e executou seu primeiro código. Agora é hora de entender COMO pensar em algoritmos antes de começar a programar de verdade. Este capítulo é sobre a lógica por trás do código. No Capítulo 3, você finalmente começará a programar em Python!

💡 Dica importante: Este capítulo tem bastante teoria, mas é essencial! Não pule seções. Cada conceito aqui será usado nos próximos capítulos.

Ah, antes de começar: veja o vídeo abaixo (ele possui legendas traduzidas para o português, se quiser). É um exemplo do que acontece quando você faz um algoritmo sem pensar direito na sua organização. No caso, Josh Darnit pediu para que os seus filhos fizessem um algoritmo (um passo-a-passo) para fazer um sanduíche de manteiga de amendoim e geleia. E ele seguiu as instruções ao pé da letra, como um computador seguirá ao pé da letra um algoritmo que você irá desenvolver no futuro.

Vídeo: Como fazer um sanduíche - algoritmo mal feito

💡 Dica: Este vídeo mostra exatamente por que algoritmos precisam ser bem pensados. Assista e você vai entender melhor o que vamos aprender neste capítulo!

2.2 Os algoritmos e a sua vida

Olha, se você está lendo isso, provavelmente já seguiu milhares de algoritmos na sua vida e nem percebeu!

Vamos supor que você quer preparar um bolo. Você sabe que para preparar um bolo, você precisa seguir uma receita passo a passo. Essa receita é um conjunto de instruções que você segue para chegar ao resultado desejado.

2.2.1 O que é um algoritmo, afinal?

Assim como na receita de bolo, um algoritmo é um conjunto de instruções que segue uma sequência lógica de passos para resolver um problema específico.

Mas não pense que algoritmo é só coisa de computador! Você usa algoritmos todos os dias:

  • Receita de bolo = algoritmo para fazer um bolo
  • Instruções do GPS = algoritmo para chegar em algum lugar
  • Regras de um jogo = algoritmo para jogar o jogo
  • Manual de montagem de móveis = algoritmo para montar o móvel

2.2.2 Como funcionam os algoritmos?

Os passos podem ser executados em ordem (ou seja: primeiro fazemos as instruções do passo 1, depois o passo 2, depois o passo 3 e assim sucessivamente) ou podem ter condições que definem qual passo deve ser executado em seguida.

Exemplo simples: “Se estiver chovendo, leve guarda-chuva. Se não estiver chovendo, pode sair sem guarda-chuva.” Aqui temos uma condição que decide qual passo seguir.

2.2.3 Exemplo 1: Fazendo um bolo

Vejamos por exemplo uma receita de bolo de chocolate. Perceba principalmente no exemplo abaixo a organização sequencial da receita e como ela é preparada em uma sequência lógica (afinal, não faria sentido lhe dar o modo de preparo sem passar primeiro os ingredientes, não é?).

Imagem de um bolo redondo de chocolate
Créditos: American Heritage Chocolate no Unsplash

2.2.3.1 Ingredientes

  • 1 xícara de açúcar
  • ¾ xícara de farinha de trigo
  • ½ xícara de cacau em pó
  • ½ colher de chá de bicarbonato de sódio
  • ½ colher de chá de fermento em pó
  • ½ colher de chá de sal
  • 2 ovos
  • ½ xícara de leite
  • ¼ xícara de óleo vegetal
  • 1 colher de chá de essência de baunilha
  • ½ xícara de água quente

2.2.3.2 Modo de preparo

  1. Preaqueça o forno a 180°C. Unte uma forma redonda de 23 cm com manteiga ou óleo e enfarinhe.
  2. Em uma tigela grande, misture o açúcar, a farinha de trigo, o cacau em pó, o bicarbonato de sódio, o fermento em pó e o sal.
  3. Adicione os ovos, o leite, o óleo vegetal e a essência de baunilha. Bata em velocidade média por 2 minutos.
  4. Adicione a água quente e misture até ficar homogêneo. A massa ficará bem líquida.
  5. Se a massa estiver muito grossa, adicione mais água quente aos poucos, até que a massa atinja a consistência adequada.
  6. Despeje a massa na forma untada.
  7. Asse por 30 a 35 minutos ou até que um palito inserido no centro do bolo saia limpo.
  8. Deixe esfriar completamente antes de servir.

2.2.3.3 Resultado esperado

Um bolo de chocolate.

Perceba que no passo 5 a condição “se” verifica se a massa está muito grossa. Se a massa estiver muito grossa, adicionamos mais água quente aos poucos até que a massa atinja a consistência adequada. Essa condição ajuda a garantir que o bolo não fique muito denso ou seco e que o resultado final seja o melhor possível.

Em outras palavras, esta condição não é obrigatória: poderíamos pular do passo 4 para o passo 6 se a massa estivesse na consistência adequada. Também poderíamos repetir várias e várias vezes o passo 5 até que ela finalmente estivesse do jeito que gostaríamos.

Perceba também que cada passo naquela receita de bolo é importante para garantir que o resultado seja o melhor possível. Por exemplo, a escolha dos ingredientes corretos e as medidas precisas são etapas cruciais para evitar erros na receita. Da mesma forma, a temperatura do forno e o tempo de cozimento são passos importantes para garantir que o bolo seja assado corretamente. Não importa o dia, local, a pessoa ou a marca do forno e da farinha de trigo: quem seguir os passos acima deverá ter o mesmo resultado. No caso, o bolo de chocolate.

2.2.4 Exemplo 2: Pedindo comida por aplicativo

Agora, vamos para outro exemplo de algoritmo: no caso, do pedido de comida em um aplicativo de delivery. Observe novamente a organização do algoritmo:

2.2.4.1 Pré-requisitos

  • Ter um smartphone ou tablet com acesso à internet.
  • Ter um aplicativo de delivery instalado e configurado com as informações do usuário, incluindo endereço de entrega e forma de pagamento.

2.2.4.2 Passo-a-passo

  1. Abra o aplicativo de delivery.
  2. Procure o restaurante desejado.
  3. Escolha os itens desejados do menu.
  4. Selecione as opções desejadas para cada item, como tamanho da porção, temperatura, ingredientes extras, etc.
  5. Adicione os itens ao carrinho.
  6. Verifique o carrinho para garantir que todos os itens estejam corretos e que as quantidades estejam de acordo com o desejado.
  7. Se quiser adicionar mais itens ao pedido, repita os passos 3 a 6 até que todos os itens desejados estejam no carrinho.
  8. Selecione a forma de pagamento desejada.
  9. Insira o endereço de entrega correto ou confirme o endereço já cadastrado.
  10. Se o endereço de entrega for diferente do endereço cadastrado, confirme o novo endereço de entrega.
  11. Confirme o pedido.

2.2.4.3 Resultado esperado

O usuário recebe a comida no endereço indicado dentro do tempo estimado.

Imagem de um bolo redondo de chocolate
Créditos: abillion no Unsplash.

Veja mais uma vez que a organização é parecida com o exemplo do bolo: temos uma lista de pré-requisitos (que antes eram os ingredientes), a sequência de instruções e, finalmente, o resultado esperado. De novo: não importa o que você está pedindo, o modelo do celular ou a sua cidade: o funcionamento deve ser o mesmo e o resultado esperado também deve ser o mesmo, beleza?

Eu queria trazer estes exemplos para você para que ficasse claro que, ainda que sejam frequentemente associados à inteligência artificial e ao processamento de dados em computadores, os algoritmos podem ser encontrados em muitos outros contextos na vida real.

Se você está começando a estudar desenvolvimento de software, este seria um bom exercício: começar a pensar em outros exemplos no seu cotidiano que poderiam ser descritos em formato de algoritmos. Alguns exemplos de exercícios que você pode fazer em um pedaço de papel ou em um documento do Word seriam:

  • Limpar um cômodo da casa;
  • Atendimento de um cliente em uma loja;
  • Compra de um carro;
  • Organização de um churrasco de fim de semana;
  • Planejamento de uma viagem.

Por isso, veja que os algoritmos podem ser executados em outras plataformas que não são computadores. Por exemplo, os algoritmos são usados em jogos de tabuleiro como xadrez e damas, onde as jogadas dos jogadores seguem uma sequência de instruções definidas. Os algoritmos também podem ser usados em processos industriais, como a produção de alimentos ou de produtos químicos, para garantir que as etapas de produção sejam realizadas com precisão e eficiência.

Assim como na receita de bolo, um algoritmo é uma sequência de instruções que um computador segue para realizar uma tarefa específica. Os algoritmos são usados em uma ampla variedade de tarefas, desde buscas na internet até o processamento de imagens médicas e a previsão do tempo.

2.3 Os algoritmos e os computadores

Neste momento você já deve saber que algoritmos não são limitados somente a computadores. Agora, o próximo passo é ficar claro o que são computadores para podermos (finalmente) colocar a mão na massa. Primeiro: os computadores não se limitam somente aos notebooks e desktops que as pessoas usam para mandar e-mails, ler este conteúdo, jogar Counter-Strike ou ficar mexendo na internet. Também não são somente os celulares e tablets. Logo, computadores também incluem coisas como os elevadores, microondas e máquinas de lavar roupa.

Na verdade, a maioria dos dispositivos que usamos hoje em dia possui algum tipo de computador interno. Esses computadores são responsáveis por executar diversas tarefas que fazem com que esses dispositivos funcionem corretamente.

Por exemplo, pensemos em um elevador. Ele não é apenas uma caixa que se move para cima e para baixo, mas também inclui um sistema de controle que é executado por um computador interno. Esse computador é responsável por garantir que o elevador se mova corretamente, pare no andar correto e abra as portas de forma segura.

Da mesma forma, um microondas também inclui um computador interno que controla o tempo de cozimento e a intensidade das ondas de calor. Esse computador permite que o microondas aqueça sua comida de maneira uniforme e segura.

Por fim, até mesmo uma máquina de lavar roupa pode incluir um computador interno. Esse computador é responsável por controlar o ciclo de lavagem, a temperatura da água e a duração do ciclo. Isso garante que suas roupas sejam lavadas corretamente e sem danos.

O que eu queria trazer a você com estes pontos é que um algoritmo escrito para computador não incluem somente isso:

  • Algoritmos de busca em sites de busca como Google e Bing.
  • Algoritmos de recomendação em serviços de streaming de vídeo como Netflix e YouTube.
  • Algoritmos de filtragem de spam em serviços de e-mail como Gmail e Outlook.
  • Algoritmos de classificação de produtos em sites de comércio eletrônico como Amazon e Mercado Livre.
  • Algoritmos de previsão do clima em institutos de meteorologia.
  • Algoritmos de análise de dados em empresas de análise financeira.
  • Algoritmos de criptografia em sistemas de segurança de dados.
  • Algoritmos de compressão de dados em serviços de armazenamento em nuvem como Google Drive e Dropbox.
  • Algoritmos de reconhecimento de voz em assistentes pessoais como Siri e Alexa.
  • Algoritmos de reconhecimento facial em sistemas de segurança.
  • Algoritmos de diagnóstico em sistemas de saúde e medicina.
  • Algoritmos de recomendação em plataformas de música como Spotify e Apple Music.

Mas incluem também isso:

  • Algoritmos de controle de velocidade em esteiras de academia para manter o usuário na velocidade e ritmo adequados.
  • Algoritmos de controle de temperatura em microondas para garantir que a comida seja aquecida uniformemente.
  • Algoritmos de controle de força em motores de elevadores para garantir que ele suba e desça de forma segura e eficiente.
  • Algoritmos de processamento de dados em smartwatches para monitorar a atividade física, frequência cardíaca e sono do usuário.
  • Algoritmos de análise de imagem em sistemas médicos para detecção de doenças e anomalias em imagens de raio-X, ressonância magnética e tomografia.

2.3.1 O mesmo algoritmo em Python

Agora veja como o pseudocódigo acima fica quando transformado em Python de verdade:

💻 Execute a célula abaixo! Se você estiver usando Jupyter Notebook, clique na célula e aperte Shift + Enter. Se estiver usando PyCharm, copie o código para um arquivo .py e execute.

Code
# Início do algoritmo

# Declaramos as variáveis (Python faz isso automaticamente)
# Em Python, não precisamos declarar o tipo com antecedência

# Solicita o primeiro número ao usuário
print("Digite o primeiro número: ")
num1 = int(input())  # input() lê o que o usuário digita; int() converte para inteiro

# Solicita o segundo número ao usuário  
print("Digite o segundo número: ")
num2 = int(input())

# Calcula a soma
soma = num1 + num2

# Exibe o resultado
print(f"O resultado da soma é: {soma}")

# Fim do algoritmo

2.3.2 Comparando Pseudocódigo vs Python

Observe as semelhanças e diferenças:

Pseudocódigo Python Explicação
Inteiro: num1, num2, soma (não necessário) Python descobre o tipo automaticamente
Escreva("texto") print("texto") Função para mostrar mensagens
Leia(variavel) variavel = input() Função para ler entrada do usuário
soma = num1 + num2 soma = num1 + num2 Idêntico! A lógica é a mesma
Início / Fim (não necessário) Python usa indentação ao invés disso

🎯 Ponto importante: A LÓGICA é a mesma! Por isso aprender pseudocódigo é tão valioso - você está aprendendo a pensar como um programador, independente da linguagem.

⚠️ Nota: Não se preocupe se você não entendeu 100% do código Python. O objetivo aqui é você ver a conexão entre pseudocódigo e Python. No próximo capítulo, você aprenderá cada comando detalhadamente!

2.4 Pseudocódigo: O “rascunho” da programação

Agora que você sabe como pensar em algoritmos, vamos avançar mais um passo com o pseudocódigo.

2.4.1 O que é pseudocódigo?

Imagine que você quer construir uma casa. Você não vai começar construindo direto, né? Primeiro você faz um projeto, desenha a planta, pensa onde vai colocar cada coisa. O pseudocódigo é exatamente isso para programação: é o “projeto” do seu programa.

Pseudocódigo é uma forma de escrever algoritmos que:

  • ✅ É fácil de entender (quase como português)
  • ✅ Não precisa de sintaxe complicada de linguagem
  • ✅ Foca na lógica, não na sintaxe
  • ✅ Pode ser convertido para qualquer linguagem de programação

2.4.2 Por que usar pseudocódigo?

1. Planeja antes de programar - É como medir duas vezes antes de cortar uma vez. Você pensa na lógica antes de se preocupar com a sintaxe.

2. Identifica problemas cedo - É muito mais fácil corrigir um erro no pseudocódigo do que no código final.

3. Comunica ideias - Você pode mostrar seu pseudocódigo para outros programadores e eles vão entender rapidamente o que você quer fazer.

4. É linguagem universal - O mesmo pseudocódigo pode virar Python, Java, C++, ou qualquer outra linguagem.

2.4.3 Exemplo prático

Vamos ver um algoritmo para calcular a soma de dois números. Em pseudocódigo, seria assim:

Início
  Inteiro: num1, num2, soma

  Escreva("Digite o primeiro número: ")
  Leia(num1)
  
  Escreva("Digite o segundo número: ")
  Leia(num2)
  
  soma = num1 + num2
  Escreva("O resultado da soma é: ", soma)
Fim

Todo algoritmo possui um início e fim. Isso era verdade com o exemplo do bolo (começamos tendo nada nas mãos e terminamos com um bolo), com o delivery (começamos com fome e acabamos com a comida entregue) e também é verdade aqui. No exemplo acima, o pseudocódigo começa com o passo Início na linha 1, que é uma convenção para indicar o início do algoritmo. Da mesma forma, o algoritmo termina com o passo Fim na linha 12, que indica o final do código.

Dentro deste bloco (ou seja: entre o Início e Fim) temos duas variáveis que foram declaradas logo de cara para armazenar os números: num1 e num2, ambas na linha 2. Estas variáveis poderiam ter qualquer outro nome como, por exemplo, numero1 e numero2; primeiro_numero e segundo_numero ou banana e abacaxi. Dito isso, é recomendável que você use nomes claros e descritivos para variáveis e funções, a fim de tornar o código mais fácil de ler e entender. Além disso, é importante usar uma indentação adequada (isto é: o espaçamento antes de iniciar cada uma das linhas) para separar os blocos de instruções e tornar o código mais legível.

Também definimos na linha 2 uma variável para armazenar o resultado da soma. Convenientemente, o nome desta variável é soma. Todas estas variáveis devem armazenar somente valores inteiros (isto é: sem casas decimais). isto também é definido pela linha 2.

O próximo passo (linhas 4 a 8) é solicitar ao usuário que digite os dois números, utilizando a função Escreva para exibir uma mensagem na tela (ou seja: fazer com que o computador escreva uma mensagem na tela para o usuário) e a função Leia para ler o que o usuário digitou com o teclado e armazenar isto nas variáveis correspondentes.

Depois disso, é feito o cálculo da soma na linha 10, utilizando a equação num1 + num2. O resultado é armazenado na variável soma.

Por fim, é exibido na tela o resultado da soma, utilizando novamente a função Escreva na linha 11, que exibe a mensagem “A soma dos dois números é:” seguida do valor da variável soma.

2.4.4 Onde usar/como trabalhar com pseudocódigos?

Os pseudocódigos são uma ferramenta útil para os desenvolvedores em diversos momentos, como na fase de planejamento e concepção de algoritmos e também para documentar um código já desenvolvido. Eles são uma espécie de “rascunho” que descreve, de forma abstrata e sem se preocupar com a sintaxe de uma linguagem de programação específica, as etapas e a lógica de um algoritmo.

Para você, serve para praticar. Isso ajuda demais na hora de começar a trabalhar com Python ou qualquer outra linguagem de programação para organizar as suas ideias. Você verá que funções como o Leia e Escreva possuirão nomes e formas de usar bem parecidas em Python.

Como exercício, tente escrever em um bloco de notas, folha de papel ou qualquer outro lugar algo que seja do seu dia-a-dia em um formato de algoritmo. Coloque início e fim pré-definidos e todos os passos de forma sequencial. Lembra do vídeo no início deste capítulo e da receita de bolo? Pois bem, o que acha de fazer algo parecido?

2.5 Conceitos Fundamentais que Você PRECISA Saber

⚠️ ATENÇÃO: Esta seção contém conceitos que você usará em TODOS os programas que fizer daqui para frente. Leia com calma e volte aqui sempre que tiver dúvidas!

Ok, estamos quaaase prontos para começar com o Python. Antes disso, valem reforçar alguns conceitos fundamentais:

2.5.1 Dados: A matéria-prima dos algoritmos

Dados são informações que são armazenadas e processadas por computadores. Um algoritmo irá processar dados para te dar algum resultado no final das contas.

Analogia culinária: Da mesma forma que um algoritmo para fazer o bolo de chocolate processa os ingredientes para te entregar um bolo, um algoritmo de delivery também irá processar o seu pedido (e os dados do seu cartão de crédito) para lhe entregar a comida.

No mundo digital: Um algoritmo de computadores irá processar números, textos e outros tipos de dados para lhe entregar algo no final das contas: isto pode ser uma transferência bancária, um sinal de alerta do microondas, uma mensagem de e-mail redirecionada à caixa de spam ou uma nova notificação no seu celular.

2.5.2 Por que tipos de dados são importantes?

Imagine que você está fazendo uma receita e precisa de “1 xícara de açúcar”. Se você colocar “1 xícara de sal”, o bolo vai ficar horrível, né? Com dados é a mesma coisa: você precisa saber que tipo de dado está trabalhando para usar os operadores corretos.

2.5.2.1 Tipos de dados

Em um algoritmo, existem vários tipos de dados que podem ser usados para armazenar informações e realizar cálculos. Desses, os mais básicos são:

  1. Numéricos: armazenam valores numéricos, como inteiros e reais. Elas podem ser usadas em operações matemáticas, como adição, subtração, multiplicação e divisão. Exemplos de variáveis numéricas em um pseudocódigo são “idade”, “peso” e “preço”.
    • Números inteiros: usados para representar valores inteiros (sem casas decimais). Exemplos: -1000, -5, 0, 20, 49, 2023.
    • Números reais: usados para representar valores com casas decimais. Exemplos: 3.1415, 1.72, 77.4, 0.001, -2.54.
  2. Lógicos/booleanos: representam valores lógicos, como verdadeiro (True) ou falso (False). Exemplo: uma variável chamada “possui_passaporte” poderia indicar se uma pessoa tem ou não tem passaporte.
  3. Alfanuméricos: armazenam valores de texto, como nomes, endereços, palavras e frases. Elas podem ser usadas em operações de concatenação, que unem duas ou mais strings em uma única string. Exemplos de variáveis alfanuméricas em um pseudocódigo são “nome”, “sobrenome” e “endereço”. Strings são sequências de caracteres (letras, números, espaços em branco, etc.) que representam textos.

2.5.2.2 Constantes e variáveis

Além disso, estes tipos de dados podem ser tratados de formas diferentes pelos algoritmos. Assim, temos:

  1. Constante: um valor que não pode ser alterado durante a execução do programa.
  2. Variável: é um espaço na memória do computador que pode armazenar diferentes valores ao longo da execução do programa.

Por exemplo, em uma receita de bolo, a quantidade de açúcar que deve ser adicionada é uma constante, pois não varia de acordo com a situação ou contexto. É uma informação fixa e predefinida na receita. Por outro lado, a quantidade de farinha que deve ser adicionada pode variar de acordo com a quantidade de ovos que serão utilizados, ou de acordo com o tamanho da forma utilizada. É uma informação que pode mudar e, portanto, poderiam ser variáveis na receita.

Pensando em computadores, as constantes são utilizadas quando há um valor que é conhecido previamente e que deve permanecer inalterado durante a execução do algoritmo ou programa. Por exemplo, pode-se utilizar uma constante para representar o valor da velocidade da luz, que é uma grandeza conhecida e que não muda durante a execução do programa.

As variáveis, por outro lado, são usadas para armazenar valores que podem mudar durante a execução do programa. Por exemplo, em um programa de cálculo de notas de alunos, uma variável pode ser utilizada para armazenar a nota de cada aluno, e essa nota pode mudar à medida que o usuário insere novas informações no programa.

Em resumo, as constantes e as variáveis são importantes conceitos em algoritmos e programação, e são utilizadas para armazenar e manipular diferentes tipos de dados. As constantes são usadas para valores que não mudam durante a execução do programa, enquanto as variáveis são usadas para valores que podem mudar.

2.5.3 Operadores: As “ferramentas” para manipular dados

Lembra na receita do bolo onde tinha um passo escrito “misture o açúcar, a farinha de trigo, o cacau em pó, o bicarbonato de sódio, o fermento em pó e o sal”? E outro chamado “adicione os ovos, o leite, o óleo vegetal e a essência de baunilha”? Como isso funcionaria na prática?

Você deve imaginar alguém pegando os ingredientes e misturando todos eles na tigela. Misturar, neste caso, significa mexer todos eles até que você não saiba mais o que é leite, o que é ovo e o que seriam os outros ingredientes: é mexer até que tudo vire uma coisa só.

Em algoritmos de computador, não temos tigelas e nem ferramentas para manipular estes ingredientes. No lugar, temos operadores para manipular números, textos e booleanos. São eles:

2.5.3.1 1. Aritméticos (para fazer contas)

Realizam operações matemáticas:

  • Adição: + (2 + 3 = 5)
  • Subtração: - (10 - 4 = 6)
  • Multiplicação: * (3 * 4 = 12)
  • Divisão: / (15 / 3 = 5)
  • Módulo: % (resto da divisão: 10 % 3 = 1)
  • Exponenciação: ** (2 ** 3 = 8)

2.5.3.2 2. Relacionais (para comparar coisas)

Comparam dois valores e retornam verdadeiro ou falso:

  • Igualdade: == (5 == 5 → True)
  • Desigualdade: != (5 != 3 → True)
  • Maior que: > (10 > 5 → True)
  • Menor que: < (3 < 7 → True)
  • Maior ou igual: >= (5 >= 5 → True)
  • Menor ou igual: <= (4 <= 6 → True)

2.5.3.3 3. Lógicos (para combinar condições)

Combinam resultados booleanos:

  • E: and (True and False → False)
  • Ou: or (True or False → True)
  • Não: not (not True → False)

2.5.3.4 4. Atribuição (para guardar valores)

Atribuem valores a uma variável:

  • Igual: = (soma = num1 + num2)

No pseudocódigo da soma dos dois números observe que a linha 10 tinha o código soma = num1 + num2. Isto é lido como: “A variável soma recebe o resultado de num1 mais num2”.

💡 Dica: Pense nos operadores como ferramentas. Você não vai usar uma chave de fenda para martelar um prego, né? Com operadores é a mesma coisa: cada um tem sua função específica.

{#python:identation}

2.5.4 Indentação

💡 Muito importante em Python! Diferente de outras linguagens, Python usa indentação para organizar o código. Erros de indentação são muito comuns em iniciantes.

Você viu no exemplo do pseudocódigo alguns espaços à esquerda nas linhas 2 a 11? Aquilo são indentações. A indentação é uma técnica usada para organizar o código em um programa de computador. É como uma espécie de espaçamento (recuo) que ajuda a identificar quais linhas de código estão dentro de outras linhas. É como se fosse um “encaixe” do código, onde cada bloco está dentro do outro.

Pense que você tem um conjunto de instruções para seguir. Algumas dessas instruções precisam ser executadas dentro de outras instruções. Para que você não se perca na sequência, você pode separar essas instruções com espaços, deixando mais claro quais instruções pertencem a qual conjunto. Na programação, isso é chamado de indentação. Como uma comparação simplista, imagine uma estrutura de tópicos e subtópicos de uma apresentação no PowerPoint ou, ainda, uma biblioteca em que cada livro é classificado e organizado por categorias e subcategorias que estão umas dentro das outras.

Na prática, a indentação é feita com a adição de espaços ou tabulações (tecla Tab do teclado) no início de cada linha de código, criando um recuo que ajuda a identificar a hierarquia dos blocos de código. É uma prática importante porque torna o código mais legível e fácil de entender, e ajuda a evitar erros de sintaxe. Veremos mais sobre isso adiante.

TipQuer treinar seu raciocínio algorítmico?

Criei o batel.tech, um site gratuito com exercícios práticos de Python para complementar seus estudos. Lá você encontra:

  • Exercícios progressivos sobre algoritmos e lógica de programação
  • Feedback imediato para suas soluções
  • Acompanhamento por IA para te ajudar quando travar
  • 💬 Comunidade no Discord para trocar ideias

É um projeto pessoal meu (Prof. Wellington) para te dar mais insumos e ajudar na jornada Python! 🐍


2.5.5 Dicas para Resolver os Exercícios

  1. Comece pelos mais fáceis: Não tente pular direto para o nível 5!
  2. Leia o problema com calma: Entenda exatamente o que está sendo pedido
  3. Quebre em partes menores: Divida problemas complexos em etapas
  4. Use pseudocódigo: Sempre escreva o algoritmo antes de pensar em código
  5. Teste mentalmente: Execute o algoritmo passo a passo na sua cabeça
  6. Verifique casos extremos: O que acontece com valores muito grandes ou muito pequenos?

💡 Lembre-se: Algoritmos são sobre lógica, não sobre sintaxe. Foque em entender o problema e criar uma solução lógica antes de se preocupar com detalhes técnicos!

2.6 Exercícios Práticos

Agora é hora de praticar! Estes exercícios são organizados por nível de dificuldade, desde o básico até o avançado. Cada exercício tem gabarito completo com explicações detalhadas. Ah, e lembre-se: todos os exercícios abaixo não envolvem uma única linha de Python. A ideia é somente a de desenvolver um pouco o seu raciocínio lógico, beleza? Fique à vontade para consultar as respostas para entender um pouco mais sobre esta lógica: afinal, nada mais justo do que aprender com mais exemplos.

2.6.1 Nível 1: Muito Fácil (Aplicação direta de conceitos básicos)

2.6.1.1 Exercício 1.1: Identificando algoritmos do dia a dia

Objetivo: Reconhecer algoritmos em situações cotidianas

Instruções: Para cada situação abaixo, responda: É um algoritmo? Por quê?

  1. Instruções para fazer um café
  2. Lista de compras no supermercado
  3. Regras de um jogo de futebol
  4. Receita de bolo de chocolate
  5. Manual de instruções de um micro-ondas
  1. Sim - Sequência de passos para chegar a um resultado específico
  2. Não - É apenas uma lista, não tem sequência de passos
  3. Sim - Regras que definem como o jogo deve funcionar
  4. Sim - Sequência de passos para fazer um bolo
  5. Sim - Instruções para usar o aparelho corretamente

Explicação: Algoritmo = sequência lógica de passos para resolver um problema específico. Lista de compras não resolve um problema, só lista itens.


2.6.1.2 Exercício 1.2: Tipos de dados básicos

Objetivo: Identificar tipos de dados em situações reais

Instruções: Para cada item abaixo, identifique o tipo de dado:

  1. 25 (idade de uma pessoa)
  2. "Maria Silva" (nome completo)
  3. 1.75 (altura em metros)
  4. True (pessoa tem CNH)
  5. "12345-678" (CEP)
  1. Numérico inteiro - Número sem casas decimais
  2. Alfanumérico/String - Texto/sequência de caracteres
  3. Numérico real - Número com casas decimais
  4. Lógico/Booleano - Verdadeiro ou falso
  5. Alfanumérico/String - Mesmo sendo números, CEP é texto (tem hífen)

Explicação:

  • Inteiro: números sem casas decimais (1, 2, 100, -5)
  • Real: números com casas decimais (1.5, 3.14, -2.7)
  • String: qualquer texto, mesmo que contenha números (CEP, telefone)
  • Booleano: apenas True ou False

2.6.1.3 Exercício 1.3: Constantes vs Variáveis

Objetivo: Diferenciar entre valores fixos e valores que mudam

Instruções: Classifique cada item como Constante ou Variável:

  1. Velocidade da luz (299.792.458 m/s)
  2. Saldo da conta bancária
  3. Número de dias em uma semana
  4. Idade de um usuário
  5. Valor de PI (3.14159…)
  1. Constante - Nunca muda, é uma constante física
  2. Variável - Muda a cada transação
  3. Constante - Sempre 7 dias
  4. Variável - Aumenta todo ano
  5. Constante - Valor matemático fixo

Explicação:

  • Constante: valor que nunca muda durante a execução
  • Variável: valor que pode mudar durante a execução

2.6.1.4 Exercício 1.4: Operadores aritméticos simples

Objetivo: Aplicar operadores aritméticos básicos

Instruções: Calcule o resultado de cada operação:

  1. 15 + 7
  2. 20 - 8
  3. 6 * 9
  4. 45 / 5
  5. 17 % 3 (módulo - resto da divisão)
  1. 15 + 7 = 22
  2. 20 - 8 = 12
  3. 6 * 9 = 54
  4. 45 / 5 = 9
  5. 17 % 3 = 2 (17 dividido por 3 = 5 com resto 2)

Explicação:

  • +: adição
  • -: subtração
  • *: multiplicação
  • /: divisão
  • %: módulo (resto da divisão)

2.6.2 Nível 2: Fácil (Combina 2-3 conceitos básicos)

2.6.2.1 Exercício 2.1: Escrevendo pseudocódigo simples

Objetivo: Criar um algoritmo básico em pseudocódigo

Instruções: Escreva o pseudocódigo para um algoritmo que:

  1. Solicita ao usuário dois números
  2. Calcula a multiplicação desses números
  3. Exibe o resultado
Início
  Inteiro: num1, num2, resultado
  
  Escreva("Digite o primeiro número: ")
  Leia(num1)
  
  Escreva("Digite o segundo número: ")
  Leia(num2)
  
  resultado = num1 * num2
  
  Escreva("O resultado da multiplicação é: ", resultado)
Fim

Explicação linha-a-linha:

  • Início e Fim: delimitam o algoritmo
  • Inteiro: num1, num2, resultado: declara variáveis do tipo inteiro
  • Escreva(): exibe mensagens na tela
  • Leia(): lê valores do usuário
  • resultado = num1 * num2: calcula e armazena o resultado

2.6.2.2 Exercício 2.2: Operadores relacionais

Objetivo: Aplicar operadores de comparação

Instruções: Para cada comparação, determine se o resultado é True ou False:

  1. 10 > 5
  2. 7 < 3
  3. 15 == 15
  4. 20 != 20
  5. 8 >= 8
  1. 10 > 5True (10 é maior que 5)
  2. 7 < 3False (7 não é menor que 3)
  3. 15 == 15True (15 é igual a 15)
  4. 20 != 20False (20 é igual a 20, não diferente)
  5. 8 >= 8True (8 é maior ou igual a 8)

Explicação:

  • >: maior que
  • <: menor que
  • ==: igual a
  • !=: diferente de
  • >=: maior ou igual a

2.6.2.3 Exercício 2.3: Operadores lógicos

Objetivo: Combinar condições usando operadores lógicos

Instruções: Calcule o resultado de cada expressão lógica:

  1. True and False
  2. True or False
  3. not True
  4. (5 > 3) and (2 < 4)
  5. (10 > 15) or (3 == 3)
  1. True and FalseFalse (E só é True se ambos forem True)
  2. True or FalseTrue (OU é True se pelo menos um for True)
  3. not TrueFalse (NOT inverte o valor)
  4. (5 > 3) and (2 < 4)True (True and True = True)
  5. (10 > 15) or (3 == 3)True (False or True = True)

Explicação:

  • and: E (ambos devem ser True)
  • or: OU (pelo menos um deve ser True)
  • not: NÃO (inverte o valor)

2.6.3 Nível 3: Médio (Requer raciocínio e combina múltiplos conceitos)

2.6.3.1 Exercício 3.1: Algoritmo completo em pseudocódigo

Objetivo: Criar um algoritmo mais complexo

Instruções: Escreva o pseudocódigo para um algoritmo que:

  1. Solicita ao usuário o raio de um círculo
  2. Calcula a área do círculo (área = PI × raio²)
  3. Calcula o perímetro do círculo (perímetro = 2 × PI × raio)
  4. Exibe ambos os resultados
Início
  Real: raio, area, perimetro
  Real: PI = 3.14159
  
  Escreva("Digite o raio do círculo: ")
  Leia(raio)
  
  area = PI * raio * raio
  perimetro = 2 * PI * raio
  
  Escreva("A área do círculo é: ", area)
  Escreva("O perímetro do círculo é: ", perimetro)
Fim

Explicação linha-a-linha:

  • Real: tipo de dado para números decimais
  • PI = 3.14159: constante com valor fixo
  • raio * raio: raio ao quadrado
  • 2 * PI * raio: fórmula do perímetro

2.6.3.2 Exercício 3.2: Algoritmo com condições

Objetivo: Criar algoritmo que toma decisões

Instruções: Escreva o pseudocódigo para um algoritmo que:

  1. Solicita a idade do usuário
  2. Se a idade for maior ou igual a 18, exibe “Maior de idade”
  3. Se a idade for menor que 18, exibe “Menor de idade”
Início
  Inteiro: idade
  
  Escreva("Digite sua idade: ")
  Leia(idade)
  
  Se (idade >= 18) então
    Escreva("Maior de idade")
  Senão
    Escreva("Menor de idade")
  FimSe
Fim

Explicação linha-a-linha:

  • Se (condição) então: estrutura condicional
  • idade >= 18: condição para maioridade
  • Senão: caso contrário
  • FimSe: fim da estrutura condicional

2.6.3.3 Exercício 3.3: Algoritmo com repetição

Objetivo: Criar algoritmo que repete ações

Instruções: Escreva o pseudocódigo para um algoritmo que:

  1. Solicita um número ao usuário
  2. Exibe a tabuada desse número (de 1 a 10)
  3. Para cada multiplicação, mostra: “número × contador = resultado”
Início
  Inteiro: numero, contador, resultado
  
  Escreva("Digite um número: ")
  Leia(numero)
  
  Para contador de 1 até 10 faça
    resultado = numero * contador
    Escreva(numero, " × ", contador, " = ", resultado)
  FimPara
Fim

Explicação linha-a-linha:

  • Para contador de 1 até 10 faça: loop de repetição
  • contador: variável que conta de 1 a 10
  • FimPara: fim do loop

2.6.4 Nível 4: Difícil (Integra conceitos e requer planejamento)

2.6.4.1 Exercício 4.1: Sistema de notas

Objetivo: Criar um sistema completo de cálculo de notas

Instruções: Escreva o pseudocódigo para um algoritmo que:

  1. Solicita 3 notas do usuário
  2. Calcula a média das notas
  3. Se a média for maior ou igual a 7, exibe “Aprovado”
  4. Se a média for menor que 7, exibe “Reprovado”
  5. Exibe a média calculada
Início
  Real: nota1, nota2, nota3, media
  
  Escreva("Digite a primeira nota: ")
  Leia(nota1)
  
  Escreva("Digite a segunda nota: ")
  Leia(nota2)
  
  Escreva("Digite a terceira nota: ")
  Leia(nota3)
  
  media = (nota1 + nota2 + nota3) / 3
  
  Se (media >= 7) então
    Escreva("Aprovado! Média: ", media)
  Senão
    Escreva("Reprovado! Média: ", media)
  FimSe
Fim

Explicação linha-a-linha:

  • Real: tipo para notas com casas decimais
  • (nota1 + nota2 + nota3) / 3: cálculo da média
  • Estrutura condicional para aprovação/reprovação

2.6.4.2 Exercício 4.2: Calculadora de IMC

Objetivo: Criar um sistema de cálculo de IMC com classificação

Instruções: Escreva o pseudocódigo para um algoritmo que:

  1. Solicita peso (em kg) e altura (em metros)
  2. Calcula o IMC (IMC = peso / altura²)
  3. Classifica o IMC:
    • Se IMC < 18.5: “Abaixo do peso”
    • Se 18.5 ≤ IMC < 25: “Peso normal”
    • Se 25 ≤ IMC < 30: “Sobrepeso”
    • Se IMC ≥ 30: “Obesidade”
Início
  Real: peso, altura, imc
  
  Escreva("Digite seu peso (kg): ")
  Leia(peso)
  
  Escreva("Digite sua altura (m): ")
  Leia(altura)
  
  imc = peso / (altura * altura)
  
  Se (imc < 18.5) então
    Escreva("IMC: ", imc, " - Abaixo do peso")
  Senão
    Se (imc < 25) então
      Escreva("IMC: ", imc, " - Peso normal")
    Senão
      Se (imc < 30) então
        Escreva("IMC: ", imc, " - Sobrepeso")
      Senão
        Escreva("IMC: ", imc, " - Obesidade")
      FimSe
    FimSe
  FimSe
Fim

Explicação linha-a-linha:

  • altura * altura: altura ao quadrado
  • Estruturas condicionais aninhadas para classificação
  • Cada condição verifica um intervalo de IMC

2.6.4.3 Exercício 4.3: Sistema de login

Objetivo: Criar um sistema básico de autenticação

Instruções: Escreva o pseudocódigo para um algoritmo que:

  1. Define uma senha correta (ex: “123456”)
  2. Solicita ao usuário que digite a senha
  3. Se a senha estiver correta, exibe “Acesso liberado”
  4. Se a senha estiver incorreta, exibe “Acesso negado”
  5. Permite até 3 tentativas
Início
  Texto: senha_correta, senha_digitada
  Inteiro: tentativas
  
  senha_correta = "123456"
  tentativas = 0
  
  Enquanto (tentativas < 3) faça
    Escreva("Digite a senha: ")
    Leia(senha_digitada)
    
    Se (senha_digitada == senha_correta) então
      Escreva("Acesso liberado!")
      tentativas = 3  // Para sair do loop
    Senão
      tentativas = tentativas + 1
      Se (tentativas < 3) então
        Escreva("Senha incorreta. Tente novamente.")
      Senão
        Escreva("Acesso negado. Número máximo de tentativas atingido.")
      FimSe
    FimSe
  FimEnquanto
Fim

Explicação linha-a-linha:

  • Texto: tipo para strings/senhas
  • Enquanto (condição) faça: loop condicional
  • tentativas = tentativas + 1: incrementa contador
  • Lógica para sair do loop quando senha correta

2.6.5 Nível 5: Muito Difícil (Desafio criativo e síntese avançada)

2.6.5.1 Exercício 5.1: Sistema de cadastro de alunos

Objetivo: Criar um sistema completo de gerenciamento de alunos

Instruções: Escreva o pseudocódigo para um algoritmo que:

  1. Solicita dados do aluno (nome, idade, curso)
  2. Solicita 4 notas do aluno
  3. Calcula a média das notas
  4. Determina o status (Aprovado/Reprovado)
  5. Exibe um relatório completo com todos os dados
  6. Calcula estatísticas da turma (média geral, quantos aprovados/reprovados)
Início
  Texto: nome, curso
  Inteiro: idade
  Real: nota1, nota2, nota3, nota4, media
  Texto: status
  Inteiro: total_alunos, aprovados, reprovados
  Real: media_geral, soma_medias
  
  // Inicialização das variáveis de controle
  total_alunos = 0
  aprovados = 0
  reprovados = 0
  soma_medias = 0
  
  Escreva("=== SISTEMA DE CADASTRO DE ALUNOS ===")
  Escreva("Digite 'fim' no nome para encerrar")
  
  Repita
    Escreva("Nome do aluno: ")
    Leia(nome)
    
    Se (nome != "fim") então
      Escreva("Idade: ")
      Leia(idade)
      
      Escreva("Curso: ")
      Leia(curso)
      
      Escreva("Nota 1: ")
      Leia(nota1)
      
      Escreva("Nota 2: ")
      Leia(nota2)
      
      Escreva("Nota 3: ")
      Leia(nota3)
      
      Escreva("Nota 4: ")
      Leia(nota4)
      
      // Cálculo da média
      media = (nota1 + nota2 + nota3 + nota4) / 4
      
      // Determinação do status
      Se (media >= 7) então
        status = "Aprovado"
        aprovados = aprovados + 1
      Senão
        status = "Reprovado"
        reprovados = reprovados + 1
      FimSe
      
      // Atualização das estatísticas
      total_alunos = total_alunos + 1
      soma_medias = soma_medias + media
      
      // Exibição do relatório do aluno
      Escreva("=== RELATÓRIO DO ALUNO ===")
      Escreva("Nome: ", nome)
      Escreva("Idade: ", idade)
      Escreva("Curso: ", curso)
      Escreva("Média: ", media)
      Escreva("Status: ", status)
      Escreva("==========================")
    FimSe
  Até (nome == "fim")
  
  // Cálculo da média geral
  Se (total_alunos > 0) então
    media_geral = soma_medias / total_alunos
    
    // Exibição das estatísticas da turma
    Escreva("=== ESTATÍSTICAS DA TURMA ===")
    Escreva("Total de alunos: ", total_alunos)
    Escreva("Aprovados: ", aprovados)
    Escreva("Reprovados: ", reprovados)
    Escreva("Média geral: ", media_geral)
    Escreva("=============================")
  Senão
    Escreva("Nenhum aluno foi cadastrado.")
  FimSe
Fim

Explicação linha-a-linha:

  • Sistema completo com loop principal
  • Contadores para estatísticas
  • Validação para evitar divisão por zero
  • Relatório detalhado para cada aluno
  • Estatísticas finais da turma

2.6.5.2 Exercício 5.2: Sistema de banco simples

Objetivo: Criar um sistema bancário básico com múltiplas operações

Instruções: Escreva o pseudocódigo para um algoritmo que:

  1. Inicia com saldo de R$ 1000
  2. Oferece menu de opções: (1) Consultar saldo, (2) Sacar, (3) Depositar, (4) Sair
  3. Para saque: verifica se há saldo suficiente
  4. Mantém histórico das últimas 5 operações
  5. Exibe saldo atualizado após cada operação
Início
  Real: saldo, valor
  Inteiro: opcao
  Texto: historico[5]
  Inteiro: contador_historico
  
  // Inicialização
  saldo = 1000.0
  contador_historico = 0
  
  Repita
    Escreva("=== BANCO PYTHON ===")
    Escreva("Saldo atual: R$ ", saldo)
    Escreva("1 - Consultar saldo")
    Escreva("2 - Sacar")
    Escreva("3 - Depositar")
    Escreva("4 - Sair")
    Escreva("Escolha uma opção: ")
    Leia(opcao)
    
    Se (opcao == 1) então
      Escreva("Saldo atual: R$ ", saldo)
      historico[contador_historico] = "Consulta de saldo"
      
    Senão
      Se (opcao == 2) então
        Escreva("Digite o valor para sacar: ")
        Leia(valor)
        
        Se (valor <= saldo) então
          saldo = saldo - valor
          Escreva("Saque realizado! Saldo atual: R$ ", saldo)
          historico[contador_historico] = "Saque: R$ " + valor
        Senão
          Escreva("Saldo insuficiente!")
          historico[contador_historico] = "Tentativa de saque negada: R$ " + valor
        FimSe
        
      Senão
        Se (opcao == 3) então
          Escreva("Digite o valor para depositar: ")
          Leia(valor)
          
          saldo = saldo + valor
          Escreva("Depósito realizado! Saldo atual: R$ ", saldo)
          historico[contador_historico] = "Depósito: R$ " + valor
          
        Senão
          Se (opcao == 4) então
            Escreva("Obrigado por usar o Banco Python!")
          Senão
            Escreva("Opção inválida!")
          FimSe
        FimSe
      FimSe
    FimSe
    
    // Atualização do histórico
    Se (opcao != 4) então
      contador_historico = contador_historico + 1
      Se (contador_historico >= 5) então
        contador_historico = 0  // Volta ao início do array
      FimSe
    FimSe
    
  Até (opcao == 4)
  
  // Exibição do histórico
  Escreva("=== HISTÓRICO DE OPERAÇÕES ===")
  Para i de 0 até 4 faça
    Se (historico[i] != "") então
      Escreva((i+1), ". ", historico[i])
    FimSe
  FimPara
  Escreva("==============================")
Fim

Explicação linha-a-linha:

  • Sistema de menu com loop principal
  • Validação de saldo para saques
  • Array para histórico de operações
  • Controle de índice circular para histórico
  • Interface amigável com mensagens claras

2.7 Referências bibliográficas

  • ALALWAN, A. A. Mobile food ordering apps: An empirical study of the factors affecting customer e-satisfaction and continued intention to reuse. International Journal of Information Management, v. 50, p. 28-44, 2020.
  • BRYANT, R. E.; O.’HALLARON, D. R. Computer systems: a programmer’s perspective. Upper Saddle River: Prentice Hall, 2003.
  • CHOI, J-C. User familiarity and satisfaction with food delivery mobile apps. Sage Open, v. 10, n. 4, 2020.
  • CHOO, C. W. The knowing organization: How organizations use information to construct meaning, create knowledge and make decisions. International journal of information management, v. 16, n. 5, p. 329-340, 1996.
  • CORMEN, T. H. et al. Introduction to algorithms. 3rd ed. MIT Press, 2009.
  • DOWNEY, A. B. Think Python: How to Think Like a Computer Scientist (2ª ed.). O’Reilly Media, 2015.
  • FARRELL, J. Programming Logic and Design, Comprehensive. Cengage Learning, 2014.
  • FORBELLONE, A. L. V.; EBERSPÄCHER, H. F. Lógica de programação: a construção de algoritmos e estruturas de dados. 2005.
  • GRAHAM, R. L. et al. Concrete mathematics: a foundation for computer science. Computers in Physics, v. 3, n. 5, p. 106-107, 1989.
  • HARRIS, S.; ROSS, J. Beginning algorithms. John Wiley & Sons, 2005.
  • KELLEHER, J. D.; TIERNEY, B. Data science: An introduction. MIT Press, 2018.
  • KELTON, W. D. et al. Simulation with ARENA. 6th ed. McGraw-Hill, 2014.
  • KNUTH, D. E. The Art of Computer Programming, Volume 1: Fundamental Algorithms. 3rd ed. Addison-Wesley, 1997.
  • LOUDON, K. Mastering algorithms with C. O’Reilly Media, 1999.
  • PRESSMAN, R. S.; MAXIM, B. R.; MAXIM, J. R. Engenharia de software: uma abordagem profissional. McGraw-Hill, 2016.
  • PUGA, S.; RISSETTI, G. Lógica de programação e estruturas de dados, com aplicações em Java. Pearson Educación, 2008.
  • SANTOS, R. L. Lógica de programação e estruturas de dados: com aplicações em Java. Editora Novatec, 2015.
  • SEDGEWICK, R.; WAYNE, K. Algorithms. 4th ed. Addison-Wesley, 2011.
  • TANENBAUM, A. S.; WOODHULL, A. S. Operating Systems: Design and Implementation. 3rd ed. Pearson, 2015.
  • TASTY. Classic Chocolate Cake. Disponível em: https://tasty.co/recipe/classic-chocolate-cake. Acesso em: 03 mar. 2023.
  • TURBAN, E.; SHARDA, R.; DELEN, D. Decision support and business intelligence systems. Pearson, 2019.