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.