Por que eu devo ler este artigo:

Algoritmo é uma matéria fundamental que ensina a pensar como um programador.

Um algoritmo é uma sequência de passos para se alcançar um objetivo. É um conceito fácil, porque mesmo sem notar lidamos com algoritmos desde os primeiros anos de vida.

Por exemplo, no ensino fundamental aprendemos um algoritmo conhecido como Long Multiplication (Código 1) para multiplicar números com mais de uma casa decimal.

     500
  x   10
  ------
     000 (500 x 0)
  + 500  (500 x 1)
  ------
    5000
Código 1. Algoritmo para multiplicação conhecido como Long Multiplication

Utilizando long multiplication precisamos multiplicar o multiplicando (500) por cada multiplicador (0 e 1), deslocando cada resultado apropriadamente para depois somar cada um deles.

Algoritmos na computação

Nessa matéria, o nosso trabalho será aprender como identificar quais são os passos que compõem um algoritmo e se ele resolve o problema proposto da melhor forma.

Algoritmo e programa são coisas diferentes. Enquanto um algoritmo descreve uma sequência de passos e pode ser escrito de diferentes formas, tais como com uma narrativa textual, fluxogramas ou pseudocódigo, um programa é a implementação desses passos em uma linguagem de programação. Por isso a matéria de algoritmos é menos sobre programação e mais sobre aprender como pensar como um programador.

As ferramentas fundamentais para a criação de um algoritmo são variáveis, expressões e instruções.

Variável

Uma variável armazena um ou mais valores. Além disso, elas possuem um nome e um tipo. Usamos o nome de uma variável para definir e acessar o seu valor.

O tipo de uma variável informa quais valores ela pode armazenar e o quanto da memória do computador deverá ser reservado para ela.

Por exemplo, vamos declarar uma variável para armazenar a nota de um aluno. Nesse contexto chamamos “nota de um aluno” de dado, que pode conter valores como 0, 2, 7.5, 8.9, por exemplo. Dessa forma, o nome da variável pode ser “nota” e o seu tipo é Real, pois seus valores estão dentro do conjunto dos números reais.

Em pseudocódigo declaramos uma variável da seguinte forma:

Var       nota: Real

Na Linha 1 usamos a palavra-chave Var para indicar que esse se trata do bloco de declaração de variáveis do algoritmo. Nessa matéria vamos sempre começar um algoritmo com esse bloco.

Após, nessa mesma linha declaramos a primeira variável chamada nota do tipo Real. Uma variável do tipo Real pode armazenar números inteiros e reais, tais como 0, 2, 7.5, 8.9.

No Código 2 temos outros exemplos de declaração de variáveis de outros tipos.

Var       apartamento: Inteiro
          preco: Real
          nome: Literal[20]
          ativo: Logico
Código 2. Declaração de variáveis

Uma variável do tipo Inteiro pode armazenar somente números inteiros.

Uma variável do tipo Real pode armazenar números reais, incluindo os números inteiros, pois fazem parte desse conjunto.

Uma variável do tipo Literal pode armazenar um texto, como “Olá, mundo”, “Informe o seu nome: ”, entre outros. O número entre colchetes determina o número máximo de caracteres que o texto pode conter.

Uma variável do tipo Logico pode armazenar os valores VERDADEIRO, verdadeiro, ou FALSO, Falso. Veremos a utilidade desse tipo em um outro momento.

Expressões

Expressões produzem novos valores a partir de uma ou mais variáveis. Elas são construídas com operadores, tais como +, -, *, /, entre outros.

Por exemplo, nota_av + nota_avs é uma expressão que soma as variáveis nota_av e nota_avs. O valor produzido por essa expressão é um novo número.

As expressões se dividem em três conjuntos de acordo com o valor que os seus operadores produzem.

Expressões aritméticas

O primeiro conjunto é o das expressões aritméticas, que são aquelas que resultam em um número inteiro ou real. Nesse conjunto estão contidos os operadores aritméticos, como mostra a Tabela1.

Operador Operação Exemplo
+ Adição 1 + 1, salario + bonus
- Subtração 2 - 1, preco - desconto
* Multiplicação 4 * 4, preco * juros
/ Divisão 4 / 2, total / pagantes
** Exponenciação 2 ** 2, m * c ** 2 (mc²)
+ Manutenção de sinal + (-2)
- Inversão de sinal - (-2)
Tabela 1. Operadores aritméticos

Uma expressão aritmética pode ser composta por um ou mais operadores aritméticos.

Expressões lógicas

As expressões lógicas resultam em um valor lógico como verdadeiro, simbolizado por VERDADEIRO, ou falso, simbolizado por FALSO.

Nesse primeiro contato com os operadores lógicos só o que precisamos aprender é que eles produzem valores lógicos e tudo a seguir vem apenas a título de conhecimento.

Fazem parte desse conjunto os operadores listados na Tabela 2.

Operador Operação
OU Disjunção
E Conjunção
NAO Negação
Tabela 2. Operadores lógicos

Dado que uma variável lógica pode armazenar apenas dois valores, VERDADEIRO e FALSO, os operadores lógicos realizam operações sobre esses valores considerando as quatro combinações possíveis entre eles. Cada operador retornará um valor dependendo da combinação utilizada.

Abaixo, na Tabela 3 vemos esses combinações e os valores que serão gerados ao aplicar cada um desses três operadores.

A B NAO A NAO B A OU B A E B
FALSO FALSO VERDADEIRO VERDADEIRO FALSO FALSO
FALSO VERDADEIRO VERDADEIRO FALSO VERDADEIRO FALSO
VERDADEIRO FALSO FALSO VERDADEIRO VERDADEIRO FALSO
VERDADEIRO VERDADEIRO FALSO FALSO VERDADEIRO VERDADEIRO
Tabela 3. Operações lógicas válidas

Esses operadores nos ajudam a expressão em pseudocódigo frases como “cliente ativo e com pagamento em dia”, “preco > 199.99 ou em promoção”, entre muitas outras para as quais a resposta deve ser verdadeira ou falsa.

Por exemplo, “cliente ativo e com pagamento em dia” pode ser escrito como:

cliente_ativo E pagamento_em_dia

Considerando que o valor de cliente_ativo seja VERDADEIRO e que o valor de pagamento_em_dia seja FALSO, no caso acima o valor produzido pela expressão será FALSO, uma vez que de acordo com a Tabela 3 a operação VERDADEIRO E FALSO e igual a FALSO.

Faz sentido aprender sobre isso, porque recebemos muitos pedidos para escrever códigos como esse durante nossa carreira e eles permitem ao programa ter inteligência, decidindo quando fazer algo ou não com base nos valores VERDADEIRO e FALSO.

Os operadores lógicos podem ser um assunto novo para a maioria das pessoas e eles têm a sua própria matéria, a lógica booleana. Por isso, não se preocupe se esse assunto parecer estranho num primeiro momento, porque voltaremos a falar dele mais tarde.

Instruções

As instruções são rotinas fundamentais que todo programa deve executar para conseguir gerenciar memória e se comunicar com o mundo exterior. Elas são três, atribuição de valor a uma variável, entrada e saída de dados.

Atribuição de valor

É com a instrução <- que uma variável passa a armazenar algum valor.

Por exemplo, no algoritmo do Código 3 declaramos três variáveis que recebem diferentes valores.

Algoritmo "Exemplo de atribuição de valor"

Var
          cliente_ativo, pagamento_em_dia, resultado_da_expressao: Logico
Inicio
          cliente_ativo <- VERDADEIRO
          pagamento_em_dia <- FALSO
          resultado_da_expressao <- cliente_ativo E pagamento_em_dia
          Escreval(resultado_da_expressao)
FimAlgoritmo
Código 3. Exemplo de atribuição de valor

Na Linha 6 a variável cliente_ativo recebe o valor VERDADEIRO.

Na Linha 7 a variável pagamento_em_dia recebe o valor FALSO.

Na Linha 8 a variável resultado_da_expressao recebe o valor resultante da expressão lógica cliente_ativo E pagamento_em_dia que nesse caso será FALSO, de acordo com a Tabela 3.

Aqui vemos pelo menos duas formas de atribuir valor a uma variável. Na primeira forma, Linhas 5 e 6, fazemos isso diretamente, utilizando os valores VERDADEIRO e FALSO. Na segunda forma, usamos uma expressão para gerar um novo valor a partir de duas variáveis o qual atribuímos a variável.

Saída de dados

Como vimos antes, as variáveis são um recurso poderoso para facilitar o gerenciamento da memória. Contudo, se o programa guarda todas as informações para si, ele tem pouca utilidade. As instruções de saída nos permitem compartilhar informações com o usuário, colocando-as em dispositivos de saída, tais como a tela do computador.

Há duas formas de escrever essa instrução:

Escreval(variavel1, variavel2)

Onde o valor das variáveis será impresso em linhas diferentes.

Escreval(“Olá, mundo!”)

Onde o texto Olá, mundo! é apenas um exemplo de literal que podemos escrever.

Por exemplo, escreva um algoritmo (Código 4) que calcule o valor total de uma venda considerando o preço unitário do produto e a quantidade comprada.

Algoritmo “Uso da instrução de saída Escreva”
   
Var       preco_unidade, valor_total: Real 
          quantidade_comprada: Inteiro
Inicio
          preco_unidade <- 2.99
          quantidade_comprada <- 10
          valor_total <- preco_unidade * quantidade_comprada
          Escreval(valor_total)
FimAlgoritmo
Código 4. Uso da instrução de saída Escreva

No exemplo acima, usamos a instrução de saída Escreval na Linha 9 para apresentar para o usuário o valor da variável valor_total.

Entrada de dados

Perceba que até aqui atribuímos as variáveis valores literais, números ou textos inseridos diretamente no código, como 2.99 na Linha 6 do Código 4 ou 10 na Linha 5 do mesmo exemplo. Mas na maioria das vezes lidamos com valores desconhecidos, que devem ser informados por outra pessoa e não pelo programador.

Por exemplo, no problema do Código 4 uma outra solução possível seria criar um algoritmo que lesse do usuário os valores das variáveis preco_unidade e quantidade_comprada. Assim, o algoritmo passaria a poder ser utilizado para qualquer venda e se tornaria mais útil dessa forma.

A instrução de entrada de dados Leia é o que precisamos para que um valor seja fornecido pelo usuário. A sintaxe ou forma de escrever essa instrução é esta:

Leia([nome_da_variavel1], [nome_da_variavel2], [nome_da_variaveln])

Vamos reescrever o algoritmo no Código 4 adicionando essa instrução, conforme mostra o Código 5.

Algoritmo “Uso da instrução de entrada Leia”
   
Var       preco_unidade, valor_total: Real 
          quantidade_comprada: Inteiro
Inicio
          Leia(preco_unidade, quantidade_comprada)
          valor_total <- preco_unidade * quantidade_comprada
          Escreval(valor_total)
FimAlgoritmo
Código 5. Uso da instrução de entrada Leia

Agora, em lugar de lidar com valores literais no código estamos recebendo na Linha 6 um dado de um dispositivo de entrada, tal qual o teclado.

Como escrever um algoritmo

A descrição de um algoritmo passa por algumas etapas, que podemos resumir com as três perguntas abaixo:

  1. Qual problema precisamos resolver?
    A especificação do problema que será resolvido. Quanto mais precisa e detalhada melhor.
  2. Como esse problema pode ser resolvido?
    Uma descrição do próprio algoritmo que demonstra como o problema será resolvido.

Existem outros passos, mas por hora trabalharemos com esses dois para manter as coisas simples de início.

Não importa se estamos controlando as luzes de um semáforo ou ajustando a órbita de um satélite, sempre podemos utilizar essas perguntas para organizar nosso trabalho.

Escrevendo algoritmos

Vamos praticar um pouco escrevendo algoritmos simples.

Exemplo 1

Qual problema precisamos resolver? Somar dois números e imprimir o resultado.

Como esse problema pode ser resolvido? Uma forma poderia ser esta do Código 6.

Algoritmo “Algoritmo para ler e somar dois números”
   
Var       numero1, numero2, soma: Real
   
Início
          Leia(numero1, numero2)
   
          soma <- numero1 + numero2
   
          Escreval(soma)
FimAlgoritmo
Código 6. Algoritmo para ler e somar dois números

Na Linha 3 declaramos três variáveis chamadas numero1, numero2 e soma. As variáveis numero1 e numero2 armazenarão os valores que não conhecemos e que serão informados pelo usuário. Quanto a soma, será armazenado nela o resultado do cálculo entre numero1 e numero2.

Na Linha 6 usamos a instrução Leia para obter o valor do primeiro número, que armazenamos na variável numero1, e do segundo número, que armazenamos na variável numero2.

Na Linha 8 temos uma expressão, usada para somar os valores das variáveis numero1 e numero2. O resultado desse cálculo guardamos na variável soma.

Na Linha 10 usamos a instrução Escreval para imprimir o valor da variável soma na tela.

Exemplo 2

Qual problema precisamos resolver? Calcular a média entre dois números e imprimir o resultado.

Como esse problema pode ser resolvido? Esse problema é muito parecido com o anterior, portanto aqui também precisaremos de duas variáveis para os números que calcularemos e uma terceira para então podermos imprimir seu resultado na tela.

Vamos escrever o algoritmo conforme o Código 7.

Algoritmo “Algoritmo para calcular a média entre dois números”
   
Var       numero1, numero2, media: Real 
   
Inicio
          numero1 <- 10.0
          numero2 <- 5.0
   
          media <- (numero1 + numero2) / 2
   
          Escreval(media)
FimAlgoritmo
Código 7. Algoritmo para calcular a média entre dois números

Na Linha 3 declaramos as variáveis numero1 e numero2 para armazenar o primeiro e o segundo número.

Na Linha 9 somamos o valor das duas variáveis numero1 e numero2 e depois dividimos esse resultado por 2 para calcular a média que armazenamos na variável media.

Nesse caso o valor impresso na Linha 11 deverá ser 7.5.

Exemplo 3

Agora vamos aumentar um pouco a dificuldade.

Qual problema precisamos resolver? Considerando que a velocidade de um humano adulto varia entre 5 e 6.5 km/h, calcule o tempo mínimo e máximo de uma caminhada considerando a distância que será percorrida em km.

Como esse problema pode ser resolvido? Vamos resolver esse problema um passo de cada vez.

Ele é de fácil resolução, porque podemos dividir a distância que será percorrida pelos valores 5 e 6.5 para encontrar os tempos mínimo e máximo de caminhada.

Para isso, primeiro vamos declarar variáveis para armazenar os valores conhecidos, 5 e 6.5

velocidade_media_minima <- 5
   
velocidade_media_máxima <- 6.5

Agora, devemos armazenar a distância percorrida em quilômetros. Vamos testar com um número qualquer.

distancia_em_quilometros <- 10

De posse desses valores podemos calcular o tempo mínimo e máximo multiplicando a distância que será percorrida pelas velocidades mínima e máxima de caminhada:

tempo_minimo_de_caminhada <- distancia_em_quilometros / velocidade_media_minima 
   
tempo_maximo_de_caminhada <- distancia_em_quilometros / velocidade_media_maxima

Então, exibimos esses valores usando a função Escreval, assim como fizemos anteriormente:

Escreval(tempo_minimo_de_caminhada)
   
Escreval(tempo_maximo_de_caminhada)

Esse algoritmo funciona, resolvendo o problema proposto, por dois motivos principais:

  1. Seus comandos estão ordenados corretamente;
  2. O cálculo realizado está correto.

Outro ponto importante é o cálculo realizado pelo algoritmo. Essa é a inteligência por trás do código e o motivo pelo qual ele existe. Sendo assim, caso esse cálculo estivesse incorreto, o algoritmo apresentaria uma resposta incorreta.

Exemplo 4

Sempre que precisarmos armazenar valores usamos variáveis. Quanto mais complexo for um problema, de mais variáveis podemos precisar para resolvê-lo.

Qual problema precisamos resolver? Escreva um algoritmo que troca o valor de duas variáveis, a e b.

Como esse problema pode ser resolvido? O problema descreve duas variáveis, mas não fornece os seus valores, então vamos utilizar novamente Leia para pedir ao usuário que informe cada um deles.

O ponto mais importante aqui é a utilização da variável temporaria para resolver o problema, como mostra o Código 8.

Algoritmo "Troca o valor de duas variáveis"

Var       numero1, numero2, temporaria: Real
   
Inicio
          Leia(numero1, numero2)
   
          temporaria <- numero1
   
          numero1 <- numero2
          numero2 <- temporaria
   
          Escreval(numero1)
          Escreval(numero2)
FimAlgoritmo 
Código 8. Algoritmo para trocar o valor de duas variáveis

Vale apontar algo importante: toda vez que atribuímos um valor a uma variável o anterior atribuído a ela é perdido. Então, se tentarmos trocar os valores das variáveis dessa forma:

numero1 <- numero2
numero2 <- numero1

Quando a segunda instrução for executada, b = a, a já terá recebido o valor de b na linha anterior, o que fará com que a e b tenham o mesmo valor no final.

Portanto, precisamos de uma variável temporária para armazenar o valor de a, então atribuímos o valor de b a a e depois o valor da variável temporária a b.

Assim, esse algoritmo termina com a tendo o valor de b e b o valor de a.