Você está na página 1de 60

Algoritmos

Carlos A. P. Campani
6 de setembro de 2006
Sumario
1 Introducao 2
2 Conceitos Basicos 3
2.1 Comando de Escrita . . . . . . . . . . . . . . . . . . . . . . . 4
2.2 Constantes . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 6
2.3 Vari aveis . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 6
2.4 Atribuic ao . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 7
2.5 Comando de Leitura . . . . . . . . . . . . . . . . . . . . . . . 8
2.6 Expressoes Aritmeticas . . . . . . . . . . . . . . . . . . . . . . 10
2.7 Expressoes Logicas . . . . . . . . . . . . . . . . . . . . . . . . 13
3 Estrutura Condicional 14
4 Estrutura de Repeticao 16
5 Algoritmos com Acumulador 19
6 Renamentos Sucessivos 21
7 Usando Matrizes 24
7.1 Declarac ao de Matrizes . . . . . . . . . . . . . . . . . . . . . . 25
7.2 Tratando com Matrizes . . . . . . . . . . . . . . . . . . . . . . 26
1
8 Usando Listas 29
8.1 Constantes Lista . . . . . . . . . . . . . . . . . . . . . . . . . 30
8.2 Operacoes com Listas . . . . . . . . . . . . . . . . . . . . . . . 30
8.3 Declarac ao de Vari avel Lista . . . . . . . . . . . . . . . . . . . 30
8.4 Tratando Listas . . . . . . . . . . . . . . . . . . . . . . . . . . 32
9 Sub-algoritmos 35
9.1 Sub-rotinas . . . . . . . . . . . . . . . . . . . . . . . . . . . . 37
9.2 Fun coes . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 39
10 Recursividade 44
11 Algoritmos de Ordenacao 50
11.1 BUBLE SORT . . . . . . . . . . . . . . . . . . . . . . . . . . 50
11.2 SELEC

AO DIRETA . . . . . . . . . . . . . . . . . . . . . . . 50
11.3 QUICK SORT . . . . . . . . . . . . . . . . . . . . . . . . . . . 51
12 Programacao Funcional 55
12.1 Declaracao de Func oes Lambda . . . . . . . . . . . . . . . . . 55
12.2 Estruturas de Programacao Funcional . . . . . . . . . . . . . . 55
12.3 Escrevendo Func oes . . . . . . . . . . . . . . . . . . . . . . . . 56
Bibliograa
FARRER, H. et alii. Algoritmos Estruturados. Rio de Janeiro, Editora
Guanabara, 1989;
WIRTH, N. Programacao Sistematica. Rio de Janeiro, Ed. Campus,
1978.
1 Introducao
Algoritmos sao ferramentas importantes no estudo de ciencia da computacao.
A compreensao das tecnicas de desenvolvimento e construc ao de algoritmos
e uma ferramenta valiosa, nao so para o aprendizado de linguagens de pro-
gramac ao, mas para o estudo das mais variadas disciplinas da area. Um
exemplo poderia ser dado se lembrarmos que boa parte da teoria matematica
2
da computacao baseia-se no conceito de algoritmo, como uma ideia primi-
tiva.
Nesta disciplina, desenvolveremos os algoritmos usando uma linguagem
hipotetica, cuja estrutura e funcionamento serao descritos ao longo do desen-
volvimento da disciplina. A linguagem adotada aqui foi projetada para que
fosse facil a implementac ao dos exemplos apresentados em uma linguagem de
programac ao usual, particularmente visando Python como linguagem alvo.
2 Conceitos Basicos
Algoritmo e a descricao de um conjunto de comandos que, efetuados, resul-
tam numa sucessao nita de acoes. Uma outra forma: Algoritmo e uma
lista de instruc oes (comandos) ordenadas que tem por nalidade resolver
um determinado problema. Exemplos de algoritmos: Uma receita culinaria;
Instruc oes para montar algo.
Ex. Algoritmo para fritar um ovo:
1. Colocar um ovo na frigideira;
2. Esperar o ovo car frito;
3. Tirar o ovo.
O algoritmo acima nao esta detalhado. Uma versao mais aceitavel e:
1. Retirar um ovo da geladeira;
2. Colocar a frigideira no fogo;
3. Colocar oleo;
4. Esperar ate o oleo car quente;
5. Quebrar o ovo separando a casca;
6. Colocar o conte udo na frigideira;
7. Esperar um minuto;
8. Retirar o ovo da frigideira;
9. Apagar o fogo.
3
Esta vers ao e mais completa e detalhada que a anterior. Para que um
algoritmo possa ser executado e necessario que seu usuario conheca a termi-
nologia nele utilizada. No exemplo anterior, para que o algoritmo seja util,
e necessario que o usuario conheca o signicado dos verbos Retirar, Colocar,
Esperar assim como dos substantivos utilizados.
Os algoritmos estudados em aula serao algoritmos computacionais, listas
de comandos a serem executados por um computador. Para que o computa-
dor consiga executa-los ele tambem deve conhecer a terminologia utilizada.
Ao conjunto de comandos que fazem parte de uma linguagem de programacao
chama-se sintaxe da linguagem de programacao.
Os algoritmos estudados na disciplina de Algoritmos serao desenvolvidos
utilizando uma sintaxe que sera apresentada progressivamente ao longo do
semestre. Esta sintaxe pode ser chamada de portugues estruturado e os
algoritmos nela desenvolvidos podem ser facilmente adaptaveis as diversas
linguagens de programacao existentes.
A forma geral dos algoritmos a ser adotada em aula e:
Algoritmo
{ lista-de-comandos }
fim_algoritmo
onde { lista-de-comandos } e uma lista com um ou mais comandos. Note
a endentac ao dos comandos dentro do ambiente Algoritmo-fim_algoritmo.
Vamos imaginar uma maquina virtual que executa os comandos de nossos
algoritmos, lendo os dados de uma entrada ctcia, e imprimindo os resulta-
dos em uma tela virtual. Embora esta maquina nao exista no mundo real,
com ela poderemos mentalmente executar os nossos algoritmos. Com relati-
vamente pouca diculdade e possvel traduzir os algoritmos de sala de aula
para uma linguagem de programacao real.
2.1 Comando de Escrita
O comando de escrita e utilizado quando se deseja que o algoritmo escreva
algo. Esta escrita pode ser em uma impressora, um terminal de vdeo ou
outra sada qualquer. O formato do comando e:
Escreva { lista-de-express~oes }
4
onde { lista-de-express~oes } e uma lista de uma ou mais expressoes e
uma expressao pode ser uma constante, uma expressao aritmetica, variavel
ou chamada de func ao.
Ex: (dica: use endentac ao)
Algoritmo
Escreva Jo~ao Vitor, ,Luana Escreva 1
Escreva 1 + 2
fim_algoritmo
Ao ser executado este algoritmo o resultado sera:
Jo~ao Vitor Luana
1
3
O exemplo e composto de tres comandos de escrita. Observe que podemos
colocar mais de um comando por linha (opc ao nao muito interessante pois
esconde a estrutura do algoritmo e confunde a sua leitura).
O primeiro comando manda escrever uma lista de tres constantes, no
segundo deve escrever uma constante e no terceiro deve escrever o resultado
de uma expressao aritmetica. Quando um comando de escrita tiver mais de
um valor a ser escrito como no primeiro, os diversos valores sao separados
por vrgula.
Observe que Jo~ao Vitor e um literal, ou seja, tudo que estiver entre
dois sera impresso exatamente da forma com que esta escrito. A utilidade
do e efetuar a separac ao entre os diversos termos a serem impressos ja
que o comando Escreva imprime os termos sem espacos entre eles.
Ex2:
Algoritmo
Escreva Jo~ao Vitor,Luana
Escreva 1+2
Escreva 1+2
fim_algoritmo
Produzindo:
Jo~ao VitorLuana
3
1+2
5
Observe o efeito da ausencia de entre Jo~ao Vitor e Luana.
Os comandos como Algoritmo e fim_algoritmo sao chamados palavras
reservadas da linguagem. A linguagem trata mai usculas e min usculas como
iguais.
2.2 Constantes
Uma constante e um valor que nao se modica com o tempo. As constan-
tes com que trabalharemos podem ser de tres tipos diferentes, numericas,
logicas ou literais. Constantes numericas podem conter quaisquer valores
numericos, reais ou inteiros, positivos ou negativos, etc. Exemplos de cons-
tantes numericas sao:
25
3.14
-2.57
-0.0003
-10
Constantes literais podem conter um ou mais caracteres alfabeticos ou
numericos. Sao delimitados por aspas. Exemplos de constantes literais sao:
Jose da Silva
1245
1 2 3 de oliveira
Constantes logicas podem conter somente dois valores, verdadeiro e
falso. Normalmente sao utilizadas em testes em algoritmos.
2.3 Variaveis
Uma variavel e um valor que pode ser alterado em um algoritmo. Cada
variavel tem um nome associado a ela que a identica. O identicador de
uma variavel deve comecar por uma letra e pode conter letras ou dgitos. Ex:
A
X5
Joao
6
Assim como as constantes as variaveis tambem podem ser de tres tipos:
numericas, logicas ou literais.
Para utilizar uma vari avel em um algoritmo e necessario que ela seja
declarada no incio do algoritmo, ou seja, dena-se no incio do algoritmo
qual o tipo de valor com que a vari avel ira trabalhar ( numerico, logico ou
literal ). O formato do comando de declaracao e:
Declare <lista de identificadores> <tipo das variaveis>
Ex:
Declare Nota,Codigo,X5 Numerico
Declare Teste,Sim Logico
Declare Nome,End1,End2 Literal
Assim, a forma geral de um algoritmo passa a ser:
Algoritmo
{ declarac~ oes }
{ corpo do algoritmo }
fim_algoritmo
2.4 Atribuicao
Uma vari avel pode armazenar qualquer valor e seu valor pode ser alterado a
qualquer momento no algoritmo. O comando utilizado para alterar o valor
de uma variavel e o comando de atribuicao. Sua forma geral e a seguinte:
<identificador de variavel> := <express~ao>
onde <express~ao> pode ser uma constante, expressao aritmetica, vari avel
ou chamada de func ao. Por exemplo:
A := 5
O comando acima (le-se A recebe cinco) faz com que a vari avel A passe
a valer 5. O valor anterior da vari avel A e perdido e seu novo valor passa a
ser 5.
Assim, por exemplo:
{A=10}
A := 5
{A=5}
7
E ca perdido o valor anterior da vari avel (10).
Entao, como trocar dois valores? Resposta: Usando uma vari avel auxiliar.
Ex: trocar os valores de a e b.
aux := a
a := b
b:= aux
Outros exemplos de atribuicao sao:
A := 3 + 2
A := B
X5 := A + 1
No primeiro exemplo a variavel A recebe o resultado da expressao aritmetica
3 + 2, expressao esta que contem somente constantes. No segundo exemplo a
variavel A recebe o conte udo da vari avel B e no terceiro exemplo a vari avel X5
recebe o resultado da expressao aritmetica A + 1, expressao esta que contem
a vari avel A e a constante 1.
Um exemplo interessante:
{A=10}
A := A+1
{A=11}
Ou seja, a expressao A+1 e avaliada, tendo como resultado 10 + 1 = 11 e o
valor e atribuido `a variavel A.
2.5 Comando de Leitura
O comando de leitura e utilizado quando o algoritmo deve receber um valor
externo, por exemplo, de um teclado. Seu formato geral e:
Leia <lista-de-variaveis>
Este comando faz com que a primeira vari avel da lista receba o primeiro
valor digitado no teclado, a segunda vari avel receba o segundo valor e assim
por diante.
Ex:
Leia A,B
8
Ao executar este comando o computador espera que sejam fornecidos dois
valores na entrada virtual ( p.ex: 10 e 20 ). A vari avel A recebera ent ao o
primeiro valor (10) e a vari avel B recebera o segundo valor (20).
Ex 2.8 - Escrever um algoritmo que le tres n umeros, calcula as medias
aritmetica, harmonica e geometrica e escreve os n umeros lidos e as medias
calculadas.
MA =
A + B + C
3
MG =
3

A B C MH =
3
1
A
+
1
B
+
1
C
Ex 2.9 - Escrever um algoritmo que le o nome de um funcionario, o
n umero do funcionario, seu n umero de horas trabalhadas, o valor que recebe
por hora, o n umero de lhos com idade menor que 14 anos e calcula o salario
deste funcionario.
Ex 2.10 - Escrever um algoritmo que calcula o fatorial de 5.
Ex 2.11 - Escrever um algoritmo que le tres valores, a, b e c e calcula:
1. A area do triangulo que tem a por base e b por altura;
2. A area do crculo de raio c;
3. A area do trapezio que tem a e b por bases e c por altura;
4. A area do quadrado de lado b;
5. A area do retangulo de lados a e b;
6. A area da superfcie de um cubo que tem c por aresta.
Ex 2.12 - Escrever um algoritmo que escreve os n umeros mpares entre
10 e 20.
Ex 2.13 - Escrever um algoritmo que le p, u e r, respectivamente o primeiro
termo de uma progressao aritmetica, o ultimo termo da progressao e a razao
desta progressao. Determinar a soma dos termos desta progressao aritmetica.
soma =
a
n
+ a
1
2
n n =
a
n
a
1
r
+ 1
Ex 2.14 - Escrever um algoritmo que le o codigo da peca 1, o n umero de
pecas 1, o valor unitario da peca 1, o codigo da peca 2, o n umero de pecas
2, o valor unitario da peca 2 e a percentagem do IPI a ser acrescentado e
calcula o valor total a ser pago.
9
Operacao Smbolo Precedencia
Adic ao + 3
Subtrac ao - 3
Multiplicacao * 2
Divisao / 2
Potenciacao ** 1
Tabela 1: Operac oes Aritmeticas
2.6 Expressoes Aritmeticas
Para que uma expressao possa ser avaliada em um algoritmo ela deve seguir
uma sintaxe bem denida. As operacoes utilizadas nas expressoes aritmeticas
em nossa linguagem sao as mostradas na Tabela 1 junto com as suas pre-
cedencias. A precedencia dos operadores indica a ordem que eles serao ava-
liados em uma expressao.
A precedencia dos operadores e relevante para o resultado da avaliac ao
de uma expressao. Por exemplo, a avaliac ao da expressao 3 + 4 * 2 pode
resultar 14 se a soma for efetuada em primeiro lugar ou 11 se a multiplicacao
for efetuada em primeiro lugar. Para isto se dene a prioridade das operac oes.
Ao avaliar uma expressao primeiro sao efetuada as potenciac oes, apos sao efe-
tuadas as multiplicac oes e divisoes e por m as adicoes e subtracoes. Quando
houverem duas operac oes de mesma prioridade para serem efetuadas, a or-
dem de execucao e da esquerda para a direita.

E possvel alterar a ordem de execuc ao das operac oes em uma expressao


com o uso de parenteses. Em uma expressao com parenteses em primeiro
lugar sao efetuadas as operac oes entre parenteses.
Ex: Expressao para o calculo das razes de uma equacao de segundo grau
segundo a formula de Bascara (usar o - unario).
X1 := (-B+(B**2-4*A*C)**(1/2))/(2*A)
X2 := (-B-(B**2-4*A*C)**(1/2))/(2*A)
Alem das operac oes acima descritas a nossa linguagem oferece as funcoes
pre-denidas da Tabela 2.
Ex: ABS(-2)= 2, QUOCIENTE(7,2)= 3, RESTO(5,2)= 1, TRUNCA(3.9)=
3, ARREDONDA(3.4)= 3 e ARREDONDA(3.5)= 4.
10
Funcao Especicac ao
LOG(x) logaritmo de x na base 10
LN(x) logaritmo natural de x
EXP(x) e elevado na x-esima potencia
ABS(x) modulo ( valor absoluto ) de x
TRUNCA(x) valor inteiro de x
ARREDONDA(x) inteiro mais proximo a x
SINAL(x) 1 se x < 0
0 se x = 0
1 se x > 0
QUOCIENTE(x,y) quociente inteiro da divisao de x por y
RESTO(x,y) resto da divisao inteira de x por y
Tabela 2: Func oes Pre-denidas
Ex 2.16 - Escrever um algoritmo para calcular os sucessivos valores de
E usando a serie abaixo considerando primeiro 3 termos, depois 4 termos e
nalmente 5 termos:
E =
1
1!
+
1
2!
+
1
3!
+
1
4!
Ex 2.17 - Escrever um algoritmo que le o valor de um emprestimo e
calcula o valor de cada amortizac ao considerando 24 amortizac oes a uma
taxa de 48%. Depois fazer o mesmo algoritmo lendo os valores da taxa e do
n umero de amortizac oes.
VAMORT = VEMPREST TAXA/NAMORT
onde VAMORT e o valor da amortizacao, VEMPREST e o valor do empres-
timo, TAXA e a taxa, e NAMORT e o n umero de amortizac oes.
Ex 2.18 - Escrever um algoritmo que le um valor em cruzeiros e calcula
qual o menor n umero possvel de notas de 5000, 1000, 500, 200, 100, 50, 10,
5 e 1 em que o valor lido pode ser decomposto. Escrever o valor lido e a
relac ao de notas necessarias.
Ex 2.19 - Escrever um algoritmo que le o n umero do vendedor, o seu
salario xo, o total de vendas por ele efetuadas e o percentual que ganha
sobre o total de vendas. Calcular o salario total do vendedor. Escrever o
n umero do vendedor e o salario total.
11
Ex 2.20 - Escrever um algoritmo que le 3 valores a, b e c que sao lados de
um triangulo e calcule a area deste triangulo.
area =
_
s(s a)(s b)(s c)
onde s = (a + b + c)/2 (semi-permetro).
Ex 2.21 - Um sistema de equacoes lineares do tipo:
_
ax + by = c
dx + ey = f
pode ser resolvido segundo mostrado abaixo:
x =
ce bf
ae bd
y =
af cd
ae bd
Escrever um algoritmo que le os coecientes a, b, c, d, e, e f, e calcula e
escreve os valores de x e y.
Ex 2.22 - O custo ao consumidor, de um carro novo, e a soma do custo
de fabrica com a porcentagem do distribuidor e dos impostos ( aplicados ao
custo de fabrica ). Supondo que a percentagem do distribuidor seja de 28%
e os impostos de 45%, escrever um algoritmo para ler o custo de fabrica de
um carro e escrever o custo ao consumidor. Depois fazer o mesmo algoritmo
lendo os valores da porcentagem do distribuidor e dos impostos.
Ex 2.23 - Uma revendedora de carros usados paga a seus funcionarios
vendedores, um salario xo por mes, mais uma comissao tambem xa para
cada carro vendido e mais 5% do valor das vendas por ele efetuadas. Escrever
um algoritmo que le o nome do vendedor, o n umero do vendedor, o n umero
de carros por ele vendidos, o valor total de suas vendas, o salario xo e o
valor que recebe por carro vendido e calcula o salario mensal do vendedor,
escrevendo-o juntamente com o seu nome e seu n umero de identicacao.
Ex 2.24 - Considerando que o aumento dos funcionarios e de 80% do INPC
e mais um percentual de produtividade discutido com a empresa. Escrever
um algoritmo que le o nome do funcionario, o n umero do funcionario, seu
salario atual, o valor do INPC e o ndice de produtividade conquistado e
escreve o nome do funcionario, seu aumento e o valor do novo salario.
Ex 2.25 - Escrever um algoritmo que le 3 valores a, b e c e os escreve.
Encontre a seguir o maior dos tres valores e o escreva com a mensagem:

E
o maior.
maior =
a + b +|a b|
2
12
Relacional Signicado
= Igual a
<> ou = Diferente de
> Maior que
< Menor que
>= Maior ou igual a
<= Menor ou igual a
Tabela 3: Relacionais
Operador Signicado
N~ao Inverte o valor logico do operando
E Verdadeiro se e somente se os
dois opeandos sao verdadeiros
Ou Verdadeiro se pelo menos um dos
dois operandos e verdadeiro
Tabela 4: Operadores Logicos
2.7 Expressoes Logicas
Expressoes logicas sao expressoes que avaliadas resultam em um valor logico
( verdadeiro ou falso ). Assim como as expressoes aritmeticas elas tambem
dispoem de um conjunto de operadores, smbolos e prioridades. Os operado-
res sao divididos em operadores relacionais e operadores logicos.
Operadores relacionais atuam sobre operandos numericos mas resultam
em valores logicos. Sao operadores de comparacao entre dois operandos. A
Tabela 3
Operadores logicos atuam sobre valores logicos e resultam em valores
logicos (veja Tabela 4).
Exemplos de expressoes logicas:
A > 0 E B > 3
Teste OU A * B > C
A precedencia de operadores da nossa linguagem e apresentada na Ta-
bela 5.
13
Operador Precedencia
Operadores Aritmeticos 1
Operadores Relacionais 2
Nao 3
E 4
OU 5
Tabela 5: Operadores e suas Precedencias
Ex: Se A = 1, B = 2 e C = 2 qual o resultado da avaliac ao da expressao
seguinte?
A + B = 0 E C <> 0
3 = 0 E C <> 0
Falso E Verdadeiro
Falso
3 Estrutura Condicional
Utilizada quando um trecho de algoritmo so deve ser executado em determi-
nadas condic oes. Formas Gerais:
1. Se <condic~ ao>
ent~ao <lista-de-comandos>
fim_se
2. Se <condic~ ao>
ent~ao <lista-de-comandos>
sen~ao <lista-de-comandos>
fim_se
onde <condic~ ao> e uma expressao logica qualquer.
Ex:
Se a>b
ent~ao Escreva a
sen~ao Escreva b
fim_se
14
Ao ser executado este comando a expressao a > b e avaliada e depen-
dendo do resultado da avalia cao e executado o primeiro comando (escreva
a) ou o segundo comando (escreva b). Observe que as estruturas podem ser
aninhadas.
Ex2:
Se a<>b
ent~ao Se a>b
ent~ao Escreva a maior que b
sen~ao Escreva a menor que b
fim_se
sen~ao Escreva a igual a b
fim_se
Ex3: Algoritmo que calcula a raiz da equac ao y = ax + b.
Algoritmo
Declare A,B,X numerico
Leia A,B
Se A = 0
ent~ao Escreva N~ao ha raizes
sen~ao X := -B/A
Escreva Raiz=,X
fim_se
fim_algoritmo
15
Ex4: Algoritmo que calcula as raizes da equac ao y = ax
2
+ bx + c.
Algoritmo
Declare A,B,C,Delta numerico
Leia A,B,C
Delta := B**2-4*A*C
Se Delta = 0
ent~ao Escreva So ha uma raiz,-B/(2*A)
fim_se
Se Delta < 0
ent~ao Escreva ha duas raizes complexas
Escreva -B/(2*A),+-,ABS((-Delta)**0.5/(2*A)),J
fim_se
Se Delta > 0
ent~ao Escreva Ha duas raizes reais
Escreva (-B+Delta**0.5)/(2*A), E ,\
(-B-(Delta**0.5))/(2*A)
fim_se
fim_algoritmo
Observe o \ no algoritmo. Ele serve para indicar que a linha continua na
seguinte. Isto e util quando a linha de um algoritmo e muito grande.
4 Estrutura de Repeticao
Utilizada quando um trecho de um algoritmo deve ser repetido um deter-
minado n umero de vezes. Esta estrutura tambem e chamada de laco de
repetic ao. Forma geral:
1. Enquanto <condic~ ao>
faca { lista-de-comandos }
fim_enquanto
2. Repita
{ lista de comandos }
ate <condic~ ao>
16
Na primeira forma os comandos sao executados repetitivamente enquanto
a condicao e verdadeira, e a condicao e testada antes (pode nao executar ne-
nhuma vez). Na segunda forma os comandos sao executados repetitivamente
ate a condicao tornar-se verdadeira (testa depois de executar, assim sempre
e executado pelo menos uma vez).
Ex: Escrever os n umeros de 1 a 10.
Algoritmo
Declare I numerico
I := 1
Repita
Escreva I
I := I + 1
ate I > 10
fim_algoritmo
A vari avel I e quem controla o n umero de repeticoes do laco.

E chamada
variavel contadora. Uma vari avel contadora e uma vari avel que recebe um
valor inicial, e incrementada de um valor constante no laco e tem seu valor
testado em algum ponto do laco. Ao chegar a um determinado valor o laco e
interrompido. A inicializacao da vari avel contadora deve ir, necessariamente,
fora do laco.
Existem diversas maneiras de implementar o mesmo laco, mas todo laco
com vari avel de controle deve conter:
inicializacao;
incremento (ou decremento);
teste de valor nal.
Abaixo sao mostradas outras tres maneiras de implementar o algoritmo
anterior:
17
1. Algoritmo
Declare I numerico
I := 0
Repita
I := I + 1
Escreva I
ate I = 10
fim_algoritmo
2. Algoritmo
Declare I numerico
I := 0
Enquanto I < 10
faca
I := I + 1
Escreva I
fim_enquanto
fim_algoritmo
3. Algoritmo
Declare I numerico
I := 1
Enquanto I < 11
faca
Escreva I
I := I + 1
fim_enquanto
fim_algoritmo
Ainda existe uma possibilidade adicional de abandonar um laco de re-
petic ao (tanto o Repita quanto o Enquanto) em qualquer lugar por meio de
um comando Interrompa:
18
Enquanto verdadeiro
faca
Leia x
Se x>0 ent~ao Interrompa fim_se
Escreva Valor invalido
Escreva Digite novamente
fim_enquanto
signicando que o laco (condic ao de parada do laco e verdadeiro) sera in-
terrompido (pelo comando Interrompa) apenas quando o usuario fornecer
um n umero maior que zero.
Ex. 4.7 Escrever um algoritmo que gera e escreve os n umeros impares
entre 100 e 200.
Exerc. Escrever um algoritmo para calcular o fatorial de um n umero.
5 Algoritmos com Acumulador
Quando o algoritmo necessitar efetuar alguma totalizacao usa-se uma variavel
chamada acumulador. A vari avel acumuladora tambem deve ser inicializada
(normalmente com zero) e pode ser incrementada ou nao de um valor variavel
no laco.
Ex: Somar os n umeros de 1 a 10.
S := 0
I := 0
Enquanto I<10
faca
I := I + 1
S := S + I
fim_enquanto
Assim, os valores de S e I ao longo da execucao do algoritmo sao mostra-
dos na Tabela 6.
Ex. 4.6 - Escrever um algoritmo que le 5 valores para a, um de cada vez,
e conta quantos destes valores sao negativos, escrevendo esta informacao.
Ex. 4.8 - Escrever um algoritmo que le 10 valores, um de cada vez,
e conta quantos deles estao no intervalo [10,20] e quantos deles estao fora
deste intervalo, escrevendo estas informacoes.
19
Volta do laco Valor de I (ao nal) Valor de S (ao nal)
1 1 1
2 2 3
3 3 6
4 4 10
.
.
.
.
.
.
.
.
.
10 10 55
Tabela 6: Execuc ao Programa de Soma
Ex. 4.9 - Escrever um algoritmo que le um n umero nao conhecido de va-
lores, um de cada vez, e conta quantos deles estao em cada um dos intervalos
[0,25], (25,50], (50,75], (75,100].
Ex. 4.10 - Escrever um algoritmo semelhante ao anterior que calcula as
medias aritmeticas de cada intervalo e as escreve, juntamente com o n umero
de valores de cada intervalo.
Exerccio: A serie de Fibonacci e uma sequencia de n umeros em que os
dois primeiros sao 0 e 1 e a partir da cada n umero e a soma dos anteriores,
ou seja
t
n
= t
n1
+ t
n2
Escrever um algoritmo que escreve os 10 primeiros termos da serie.
Ex. 4.11 - Escrever um algoritmo que gera os 10 primeiros termos da
Serie de Fibonacci e calcula e escreve a soma destes termos.
Exerccio: Escrever um algoritmo que leia um n umero N e escreva o
n umero de divisores de N.
20
Algoritmo
Declare N,acum,I numerico
Leia N
acum := 0
I := 1
Repita
Se Resto(N,I)=0
entao acum := acum+1
fim_se
I := I+1
ate I>N
escreva acum
fim_algoritmo
Escrever um algoritmo que leia um n umero e escreva uma mensagem
dizendo: O n umero e primo ou O n umero nao e primo conforme o caso.
Ex. 4.12 - Escrever um algoritmo que gera os 30 primeiros termos da
serie de Fibonacci e escreve os termos gerados com a mensagem:

E primo
ou Nao e primo conforme o caso.
6 Renamentos Sucessivos

E uma tecnica para desenvolver um algoritmo em diversos passos aumentando


o nvel de detalhamento a cada passo. A partir do problema gerar uma
possvel solucao e detalha-la ate um nvel aceitavel.
Ex: Escrever um algoritmo que leia um n umero e escreva a mensagem

E
primo ou Nao e primo. Primeira Versao:
Algoritmo
Declare numero
Leia numero
{Verifica se numero e primo}
Se {numero e primo}
ent~ao escreva numero e primo
sen~ao escreva numero n~ao e primo
fim_se
fim_algoritmo
21
Detalhamentos:
{ Verifica se numero e primo }
Um n umero e primo se e divisvel somente por si e pela unidade (1). Uma
maneira de descobrir isto e contando o n umero de divisores do n umero. Se
possuir apenas dois divisores (1 e o proprio n umero ) ele e primo.
{ Verifica se numero e primo } { Conta numero de divisores }
{ Conta numero de divisores }
acum := 0
i := 1
Repita
Se Resto(Numero,i)=0
ent~ao acum:=acum+1
fim_se
i:=i+1
ate i>numero
{ Numero e primo }
Se acum=2
ent~ao...
O renamento para { Conta numero de divisores } nao e bom, por-
que basta vericar que existem mais de dois divisores do n umero para ele
nao ser primo. Assim, rebatizando { Conta numero de divisores } para
{ Verifica se ha mais de dois divisores }, obtemos, usando o coman-
do Interrompa:
{ Verifica se ha mais de dois divisores }
acum := 1
i := 1
Enquanto i <= TRUNCA(numero/2)
Faca
Se Resto(Numero,i)=0
ent~ao acum:=acum+1
fim_se
Se acum>2 ent~ao Interrompa fim_se
i:=i+1
fim_enquanto
22
Principal
rrf
f
f
f
f
f
f
f
f
f
f
f
f
f
f
f
f
f
f
f
f
f
f
f
f
f

{ numero e primo } { Verifica de numero e primo }

{ Verifica se ha mais de dois divisores }


Figura 1: Diagrama de Renamentos para o Exemplo
Isto melhora a performance do algoritmo, pois ele abandona o laco assim
que percebe que ja existem mais de dois divisores e faz divisoes apenas ate
TRUNCA(numero/2).
A Figura 1 apresenta o diagrama de renamentos para este exemplo.
Montando as partes obtemos a vers ao nal:
Algoritmo
Declare numero,i,acum numerico
Leia numero
acum := 1
i := 1
Enquanto i <= TRUNCA(numero/2)
Faca
Se Resto(Numero,i)=0
ent~ao acum:=acum+1
fim_se
Se acum>2 ent~ao Interrompa fim_se
i:=i+1
fim_enquanto
Se acum=2
ent~ao escreva numero e primo
sen~ao escreva numero n~ao e primo
fim_se
fim_algoritmo
23
Usar renamentos sucessivos:
Ex 1.12.30. Escrever um algoritmo para gerar e escrever uma tabela
com os valores do seno de um angulo A em radianos, utilizando a serie de
Mac-Laurin truncada com 20 termos:
sin(A) =
A
1
1!

A
3
3!
+
A
5
5!

A
7
7!

Os valores dos angulos A devem variar de 0.0 a 6.3 de 0.1 em 0.1.
Exerc.: Repetir o exerccio anterior, truncando a serie considerando uma
precisao de 0,0001 na aproximac ao obtida (dica: considere o valor absoluto
do ultimo termo).
Ex. 1.12.40. Fazer um algoritmo que calcule e escreva o cosseno de A
usando a serie truncada com 20 termos:
cos(A) = 1
A
2
2!
+
A
4
4!

A
6
6!
+
A
8
8!

Ex. 1.12.32. O valor aproximado de ? pode ser calculado usando-se a
serie:
S =
1
1
3

1
3
3
+
1
5
3

1
7
3
+
1
9
3

sendo
3

S 32. Fazer um algoritmo para calcular e escrever o valor de


com 51 termos.
7 Usando Matrizes
Matriz e um conjunto de variaveis, cada uma podendo representar o valor
de uma constante, como se fossem vari aveis simples, mas todas elas com-
partilhando um nome comum.

Indices sao associados a este nome comum
permitindo individualizar os elementos do conjunto.
Ex: conjunto de 5 elementos e nome a
a
1
a
2
a
3
a
4
a
5
Qual e a utilidade dos matrizes? Resposta: Tratar com dados em serie
do mesmo tipo.
Ex: Deseja-se calcular a media de notas de 10 alunos e determinar quantos
caram acima da media. Portanto, deve-se calcular a media de 10 n umeros
lidos e determinar quantos destes n umeros estao acima da media.
Para calcular a media podemos usar o seguinte algoritmo:
24
Algoritmo
Declare cont,soma,num numerico
cont := 10
soma := 0
Repita
Leia num
soma := soma+num
cont := cont-1
Ate cont=0
Escreva soma/10
fim_algoritmo
Problema: Quando os n umeros sao lidos nao conhecemos ainda o valor
da media. Ao nal do programa anterior nao temos mais acesso aos n umeros
lidos (pois ja foram lidos). Le-los novamente seria perda de tempo.
Como fazer este algoritmo sem matrizes?
Resposta: Ler os 10 n umeros e guarda-los em 10 vari aveis para testar
uma a uma apos obter a media.
Problema: E se fossem 1000 alunos? Teriamos diculdades de manipular
1000 vari aveis diferentes.
Solucao: uso de uma matriz para armazenar os valores das notas para
posteriormente processa-los.
7.1 Declaracao de Matrizes
Deve-se denir nas declarac oes:
1. Quais vari aveis do algoritmo sao do tipo matriz;
2. Quantas dimensoes possui cada uma delas;
3. Qual o tamanho de cada dimensao;
4. O tipo dos componentes individuais da matriz.
Notacao:
Declare <Nome> ( <tamanho> ) <tipo>
Declare <Nome> ( <tamanho> , <tamanho> ... ) <tipo>
25
Ex: Declare a(5),m(6,8) numerico.
Convenc ao: O primeiro ndice representa a linha e o segundo a coluna.
O menor ndice e o 1.
7.2 Tratando com Matrizes
Para ler uma matriz e necessario ler cada um dos seus componentes indivi-
duais.
Ex: Ler 5 elementos da matriz a.
Algoritmo
Declare i,a(5) numerico
i := 1
Enquanto i<6
faca
Leia a(i)
i:=i+1
fim_enquanto
fim_algoritmo
Observac ao: a variavel i e chamada de ndice.
Ex: Ler os 48 elementos da matriz m(6, 8). Devemos usar duas vari aveis
de ndice.
Algoritmo
Declare i,j,m(6,8) numerico
i:=1
Enquanto i<7
faca
j:=1
Enquanto j<9
faca
Leia m(i,j)
j:=j+1
fim_enquanto
i:=i+1
fim_enquanto
fim_algoritmo
26
Observe que este algoritmo usa dois lacos aninhados.
Ex: Somar os elementos da diagonal principal de m(10, 10), lendo a matriz
antes e escrevendo a soma ao nal.
Algoritmo
Declare soma,i,j,m(10,10) numerico
i:=1
Repita
j:=1
Repita
Leia m(i,j)
j:=j+1
ate j>10
i:=i+1
ate i>10
soma:=0
i:=1
Repita
soma:=soma+m(i,i)
i:=i+1
ate i>10
Escreva soma
fim_algoritmo
Exerc.: Calcular a media de 10 alunos de uma disciplina, entrando a
nota e o nome do aluno. Determinar o n umero de alunos que tiveram nota
superior a media e imprimir o nome dos alunos que tiveram este feito.
Ex. 2.5.1.4. Dado um conjunto de 100 valores numericos disponveis na
entrada, fazer um algoritmo para armazena-los em uma matriz e calcular e
imprimir o valor do somatorio dado a seguir:
S = (v
1
v
100
)
3
+ (v
2
v
99
)
3
+ (v
3
v
98
)
3
+ + (v
50
v
51
)
3
Determinar a posic ao, dentro de uma matriz quadrada, de um elemento
pode ser muito util em alguns tipos de algoritmos. Por exemplo, determi-
nar se determinado elemento esta acima ou abaixo da diagonal principal da
matriz.
27
Figura 2: Posic oes em uma Matriz
Algumas relacoes sao importantes para determinar a posic ao dos elemen-
tos de uma matriz quadrada (veja Figura 2).
_
_
_
_
_
_
_
_
_
a
11
a
12
a
13
a
1n
a
21
a
22
a
23
a
2n
a
31
a
32
a
33
a
3n
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
a
n1
a
n2
a
n3
a
nn
_
_
_
_
_
_
_
_
_
Sendo i e j os ndices dos elementos da matriz:
Diagonal principal i = j;
Diagonal secundaria i + j = n + 1;
Abaixo da diagonal principal i > j;
Acima da diagonal principal i < j;
Acima da diagonal secundaria i + j < n + 1;
Abaixo da diagonal secundaria i + j > n + 1.
Exerc. Escrever um algoritmo para ler um valor n e a seguir ler uma
matriz n n. Entao, determinar a soma de todos os elementos acima da
diagonal principal e imprimi-lo.
Exerc. Escrever um algoritmo para ler uma matriz a de tamanho n m
e outra matriz b de tamanho mp. Ent ao, determinar e imprimir a matriz
produto c de tamanho n p.
c
ij
=
m

k=1
a
ik
b
kj
28
CAR CDR
3 nil
nil a
1 2 c
b
Figura 3: Representa cao Graca da Lista
8 Usando Listas
Uma estrutura formada por uma seq uencia de elementos de tipos diversos e
chamada de lista. Importante observar que um elemento de uma lista pode
ser outra lista.
Por exemplo:
[1,2,3,[a,b],c]
que e uma lista com cinco elementos e o quarto elemento da lista e uma outra
lista de dois elementos.
Na representa cao interna de lista, cada elemento de uma lista e formado
por um nodo com dois elementos (CAR e CDR pronuncia-se cuder) que
podem ser preenchidos com valores constantes (numericos, literais ou logicos)
ou elos. Um elo e um indicador da posic ao de um outro nodo na memoria da
maquina. Existe um elo especial (nil) que nao aponta para nenhum lugar e
e usado para indicar o m de uma lista. nil pode indicar tambem uma lista
vazia. Observe que uma matriz nao pode ser um elemento de uma lista.
Exemplo:
[1,2,3,[a,b],c]
seria armazenado internamente na memoria da maquina como ilustrado na
Figura 3.
Comumente se chama a parte CAR de cabeca da lista e a parte CDR de
resto ou rabo da lista.
29
8.1 Constantes Lista
As constantes listas sao qualquer seq uencia de numericos, literais ou logicos,
separados por vrgulas e delimitados por [ e ]. Uma constante lista pode ter
em um ou mais de seus termos outras listas e assim por diante. Ex:
[1,2,[a,b,[1,b]],3]
8.2 Operac oes com Listas
Estao denidas em nossa linguagem de algoritmos as func oes e operac oes
sobre listas da Tabela 7. Ex:
CAR(CDR([1,2,3]))=2
CDR(CDR([a,b,c,d]))=[c,d]
CDR(CAR(CDR([1,[2,3],4])))=[3]
CONS(a,[b,c])=[a,b,c]
CONS(a,nil)=[a]
CONS([1,2],[a,b])=[[1,2],a,b]
NIL([1,2])=falso
[1,2,3,4,5](2)=3
A Figura 4 apresenta a interpretacao graca das operac oes CAR e CDR para
a avalia cao CDR(CAR(CDR([a,[b,[c]],d]))).
8.3 Declaracao de Variavel Lista
Uma vari avel lista e declarada da seguinte forma:
Declare x lista
Podemos agora manipular a variavel lista em uma atribuic ao.
Ex:
x := [2,3,4]
x := CONS(1,x)
que resulta em x igual a [1,2,3,4].
Observac ao: Nao podemos atribuir um valor a uma posic ao qualquer da
lista. So podemos trocar sua cabeca:
x := [1,2,3,4]
x := CONS(10,CDR(x))
que resulta em x igual a [10,2,3,4].
30
a
b d nil
nil
nil c
primeiro CDR
CAR
segundo CDR
Figura 4: Interpretac ao Graca de CAR e CDR
31
Operac ao Signicado
CAR(x) Obtem a cabeca de uma lista
(devolve o CAR de x)
CDR(x) Obtem o resto de uma lista
(devolve a lista CDR de x)
CONS(x,y) Constroi um nodo tendo como
CAR x, e como CDR y
(segundo argumento deve ser uma lista)
x(i) Devolve a i-esima posic ao da lista x
(o ndice da primeira posic ao e zero)
TAM(x) Tamanho da lista x
NIL(x) Verica se a lista e vazia
(testa se x e igual a nil,
retornando verdadeiro ou falso)
Tabela 7: Func oes e Operac oes sobre Listas
8.4 Tratando Listas
Listas sao uma estrutura dinamica muito poderosa e exvel para construir
algoritmos que tratem com situac oes em que os dados estao constantemente
sendo inseridos e retirados (pilhas e las sao exemplos).
Tambem sao uma boa alternativa `as matrizes, em casos em que o tama-
nho dos dados e conhecido apenas em tempo de execuc ao. Por exemplo, se
desejamos encontrar o n umero de elementos que sao menores que a media de
um conjunto de numericos:
32
Algoritmo
Declare x,n,i,acum,m numerico
Declare a lista
Escreva Entre a quantidade de valores
Leia n
i := 1
a := nil
acum := 0
Enquanto i<n+1
faca
Escreva Entre com valor ,i
Leia x
a := CONS(x,a)
i := i+1
acum:=acum+x
fim_enquanto
m := acum/n
acum := 0
Enquanto N~ao NIL(a)
faca
Se a(0)<m ent~ao acum := acum+1 fim_se
a := CDR(a)
fim_enquanto
Escreva acum
fim_algoritmo
Exerccio: Escreva um trecho de algoritmo que apague o ultimo elemento
de uma lista qualquer.
Exerccio: Escrever um algoritmo que leia uma lista de 10 elementos e
depois apague da lista todos os elementos que forem menores que 100.
33
Solucao:
Algoritmo
Declare x,i numerico
Declare a,b lista
i := 1
a := nil
Enquanto i<11
faca
Leia x
a := CONS(x,a)
i := i+1
fim_enquanto
i := 1
b := nil
Enquanto N~ao NIL(a)
faca
Se CAR(a)>=100
ent~ao b:=CONS(CAR(a),b)
fim_se
a := CDR(a)
fim_enquanto
Escreva b
fim_algoritmo
Exerccio: Escreva um trecho de algoritmo que encontre o maior valor de
uma lista de numericos.
Exerccio: Escrever um trecho de algoritmo que inverta uma lista.
E se precisassemos fazer a concatenacao de duas listas? Assim, se a=[1,2,3]
e b=[4,5] sua concatenac ao sera [1,2,3,4,5].
Atenc ao: CONS(a,b) nao vai funcionar. Por que?
Exerccio: Escrever um trecho de algoritmo para concatenar duas listas.
34
9 Sub-algoritmos
Sub-algoritmos sao trechos de algoritmos que efetuam um ou mais calculos
determinados em sua declarac ao ou denicao. Ao inves de escrever-se um
algoritmo grande, escrevem-se varios algoritmos menores, os quais, nao iso-
ladamente, mas em conjunto, resolvem o problema proposto.

E conveniente
usa-los quando uma determinada tarefa e efetuada em diversos lugares no
mesmo algoritmo. Ao inves de escrever-se o mesmo trecho diversas vezes,
escreve-se o sub-algoritmo e o mesmo e chamado diversas vezes.
As vantagens sao:
Eles reduzem o tamanho do algoritmo;
Facilitam a compreensao e visualizac ao do algoritmo;
Isolam determinadas partes do algoritmo para que possam ser desen-
volvidas e testadas em separado.
O sub-algoritmo e denido apos as declaracoes de variaveis e antes do
corpo principal do algoritmo. Assim, a estrutura dos nossos algoritmos pas-
sara a ser:
Algoritmo
{ Declarac~ oes de variaveis }
{ Definic~ oes de sub-algoritmos }
{ corpo do algoritmo }
fim_algoritmo
Argumentos (ou parametros) sao valores enviados ao sub-algoritmo para
serem processados, e/ou recebidos do sub-algoritmo como resultados do pro-
cessamento.
Um sub-algoritmo pode conter declaracoes de variaveis, mas as vari aveis
declaradas nele (chamadas variaveis locais do sub-algoritmo) so podem ser
acessadas dentro dele. Alem de suas variaveis locais, um sub-algoritmo
pode acessar variaveis declaradas fora dele, no algoritmo principal (chama-
das variaveis globais). Os parametros usados na denic ao do sub-algoritmo
sao chamados parametros formais, e os parametros usados na chamada do
sub-algoritmo sao chamados de parametros reais.
Ex:
35
Algoritmo
Declare a,b numerico
Sub-rotina y(c,d numericos)
Declare e,f numerico
{ comandos de y }
fim_sub-rotina
Sub-rotina z(e numerico)
Declare f numerico
{ comandos de z }
fim_sub-rotina
y(1,2)
z(10)
fim_algoritmo
Onde: a, b variaveis globais (acessadas pelo algoritmo e pelos dois sub-
algoritmos);
e, f vari aveis locais a y (acessadas apenas pelo sub-algoritmo y);
c, d parametros formais de y (usados na hora da chamada de y)
declarados como numericos;
f variavel local a z (acessada somente pelo sub-algoritmo z, nao
possuindo qualquer relac ao com a outra variavel f (local a y);
e parametro formal de z, declarado como numerico;
y(1, 2) chamada de y com parametros reais 1 e 2 (1 sera atribuido a
c e 2 sera atribuido a d);
z(10) chamada de z.
Existem varios tipos de passagem de parametros para sub-algoritmo:
Passagem por valor Envia um valor para o sub-algoritmo e nao retorna
valores pelo parametro formal (so entrada). No momento da chamada
os valores dos parametros reais sao copiados para os parametros formais
para serem usados dentro do sub-algoritmo sem que se modiquem os
valores armazenados nos parametros reais. Ex: PASCAL (padrao);
Passagem Copia-restaura Envia e recebe valores do sub-algoritmo (en-
trada e sada). Na chamada os valores passados sao copiados para os
parametros formais e usados. Ao nal (no retorno do sub-algoritmo)
36
os valores nais dos parametros formais sao copiados de volta nos
parametros reais (e obvio que os parametros reais, neste caso, deverao
ser vari aveis);
Passagem por referencia Envia e recebe valores do sub-algoritmo (en-
trada e sada) usando uma referencia `a vari avel (nao faz copia; usa o
proprio parametro real dentro do sub-algoritmo). Ex: PASCAL (VAR).
Nos nossos algoritmos usaremos passagem Copia-restaura e por valor.
Indicaremos o tipo copia-restaura antecedendo a palavra reservada CR aos
parametros deste tipo.
Existem dois tipos de sub-algoritmos: sub-rotinas (ou procedures) e fun-
coes.
9.1 Sub-rotinas
Retornam valores apenas pelos argumentos (caso sejam passados como copia-
restaura).
Declaracao:
sub-rotina <nome>[(<lista de par^ametros formais>)]
{ declarac~ oes locais `a sub-rotina }
{ comandos }
fim_sub-rotina
Observe que podemos denir uma sub-rotina sem parametros formais
(para qual nao precisamos passar nenhum parametro na chamada). Observe
tambem que e possvel denir um sub-algoritmo dentro de outro (aninha-
mento), pois nao faremos nenhuma restric ao ao que pode ser declarado den-
tro de um sub-algoritmo. Sub-algoritmos declarados dentro de outros sao
locais a estes (desconhecidos fora).
Ex.: Sub-rotina troca
sub-rotina troca(x,y numerico)
Declare aux numerico
aux:=x
x:=y
y:=aux
fim_sub-rotina
37
Esta sub-rotina nao funciona. Porque? Resposta: falta denir a passagem
de parametros Copia-restaura).
sub-rotina troca(CR x,y numerico)
Declare aux numerico
aux:=x
x:=y
y:=aux
fim_sub-rotina
Exemplo: Um algoritmo para ordenar 3 valores em ordem crescente.
Algoritmo
Declare a,b,c : numerico
sub-rotina troca(CR x,y numerico)
Declare aux numerico
aux:=x
x:=y
y:=aux
fim_sub-rotina
Leia a,b,c
Se a>b
ent~ao troca(a,b)
fim_se
Se a>c
ent~ao troca(a,c)
fim_se
Se b>c
ent~ao troca(b,c)
fim_se
Escreva a,b,c
fim_algoritmo
38
9.2 Func oes
Retornam um valor pelo seu nome (alem de pelos parametros declarados
como copia-restaura).
Ex: ABS(x), TRUNCA(x) (func oes pre-denidas)
Declaracao:
func~ao <tipo> <nome>[(<lista de par^ametros formais)]
{ declarac~ oes locais }
{ comandos }
fim_func~ao
Observe que devemos declarar o tipo que sera retornado pela funcao.
Chamada:
a := TRUNCA(3.5)
ou
se SINAL(x)<=0 ...
Retorno do valor usando a palavra reservada Retorna.
Ex: Func ao fatorial(n):
func~ao numerico fatorial(n numerico)
Declare fat numerico
fat:=1
Enquanto n>1
faca
fat:=fat*n
n:=n-1
fim_enquanto
Retorna fat
fim_func~ao
Usando sub-algoritmos:
Ex 3.3: Escrever um algoritmo que leia as medidas dos tres lados a, b
e c de um paraleleppedo, calcule e escreva o valor de sua diagonal (veja
Figura 5).
39
c
a
b
d
dia
Figura 5: Paraleleppedo
Ex 3.4: Escrever uma funcao logica que recebe uma vari avel unidimen-
sional M de numericos, o n umero N de elementos de M, e um valor X e
retorne verdadeiro se X pertence a M ou falso em caso contrario.
Como passar uma matriz como parametro real?
Resposta: encontra(m(),n,x numerico) (nao indicar seu tamanho
decidido na hora da chamada).
Ex 3.5: Escrever uma funcao que calcule a distancia entre dois pontos de
um plano, sendo fornecidas as coordenadas (x
1
, y
1
) e (x
2
, y
2
).
Exerccio: Escrever um algoritmo que leia 10 conjuntos de valores x1,y1,
x2, y2, x3 e y3 coordenadas de 10 triangulos e calcule a area dos 10 triangulos,
usando a funcao do exerccio anterior. Usar duas func oes:
1. A do exerccio anterior;
2. Uma que chame a anterior tres vezes e use a formula do semi-permetro
para calcular a area.
Ex 3.6: escrever um algoritmo que:
Leia varios pares de n umeros inteiros positivos, M e P;
40
calcule e escreva o n umero de arranjos e combinac oes de M elementos
P a P, dado pelas formulas:
A
P
M
=
M!
(M P)!
C
P
M
=
M!
P(M P)!
Se M < P, por denic ao:
A
P
M
= 0 C
P
M
= 0
Ao nal de cada calculo de um par e perguntado se deseja continuar. A
resposta deve ser S ou N.
Exerc. Utilizando as seguintes series, com 20 termos:
e
x
= 1 + x +
x
2
2!
+
x
3
3!
+
ln(x) =
_
x 1
x
_
1
+ 1/2
_
x 1
x
_
2
+ 1/3
_
x 1
x
_
3
+
Faca um algoritmo que gere uma tabela de x, e
x
, e ln(x), para x variando
entre 1 e 100 com intervalos de 0.5 (x = 1, x = 1.5, x = 2, . . . , x = 100).
Dena sub-algoritmos onde for necessario.
Solucao (observe as funcoes aninhadas e seu escopo):
Algoritmo
Declare x numerico
{ declarac~ oes das func~ oes }
x := 1
Repita
Escreva x, ,exp2(x), ,ln2(x)
x := x+0.5
ate x>100
fim_algoritmo
41
Func oes:
Func~ao numerico exp2(x numerico)
Declare soma,ind numerico
Func~ao numerico fatorial(n numerico)
Declare fat numerico
fat := 1
Enquanto n>1
faca
fat := fat*n
n := n-1
fim_enquanto
Retorna fat
fim_func~ao
soma := 1
ind := 1
Repita
soma := soma+(x**ind)/fatorial(ind)
ind := ind+1
ate ind>19
Retorna soma
fim_func~ao
Func~ao numerico ln2(x numerico)
Declare soma,ind numerico
soma := 0
ind := 1
Repita
soma := soma+(((x-1)/x)**ind)/ind
ind := ind+1
ate ind>20
Retorna soma
fim_func~ao
Observe que o laco da funcao exp2 tem como condic ao de parada ind>19,
pois serao somados 20 termos e o primeiro e 1 e ja foi somado (soma := 1).
42
Exerc. A partir das seguintes series do sin e cos, e usando funcoes, escreva
um algoritmo que gere uma tabela de x, sin(x), cos(x), tan(x), cot(x), sec(x),
e csc(x) para x variando de 0.5 a 1.5 em intervalos de 0.1. Calcule os valores
do sin e do cos com erro maximo de 0.0001 ( modulo do ultimo termo).
sin(x) = x
x
3
3!
+
x
5
5!

x
7
7!
+
cos(x) = 1
x
2
2!
+
x
4
4!

x
6
6!
+
Relacoes:
tan(x) =
sin(x)
cos(x)
cot(x) =
1
tan(x)
sec(x) =
1
cos(x)
csc(x) =
1
sin(x)
Solucao:
Algoritmo
Declare x numerico
{ declarac~ oes de func~ oes }
x := 0.5
Repita
Escreva x, ,sen(x), ,cos(x), ,sen(x)/cos(x), ,\
cos(x)/sen(x), ,1/cos(x), ,1/sen(x)
x := x+0.1
ate x>1.5
fim_algoritmo
Func oes:
Func~ao numerico fatorial(n numerico)
Declare fat,cont numerico
cont := 1
fat := 1
Repita
fat := fat*cont
cont := cont+1
ate cont>n
Retorna fat
fim_func~ao
43
Func~ao numerico sen(x numerico)
Declare acum,soma,ind,termo,sinal numerico
acum := 0
ind := 1
sinal := 1
Enquanto abs(termo)>0.0001
faca
termo := sinal*(x**ind)/fatorial(ind)
acum := acum+termo
sinal := -sinal
ind := ind+2
fim_enquanto
Retorna acum
fim_func~ao
Func~ao numerico cos(x numerico)
Declare acum,ind,termo,sinal numerico
acum := 1
ind := 2
sinal := -1
Enquanto abs(termo)<0.0001
faca
termo := sinal*(x**ind)/fatorial(ind)
acum := acum+termo
ind := ind+2
sinal := -sinal
fim_enquanto
Retorna acum
fim_func~ao
10 Recursividade
Uma func ao e dita recursiva quando contem, em seu corpo, uma chamada a si
mesma (este tipo de recursividade e chamada recursividade direta). Sao uti-
lizadas quando e possvel decompor o problema a ser resolvido em problemas
menores, um dos quais e semelhante ao problema inicial.
44
Ex.: Fatorial.
n! = n (n 1) (n 2) 3 2 1
Uma forma recursiva de denir o fatorial e:
_
fat(n) = 1 n = 0 n = 1 (Base)
fat(n) = n fat(n 1) n > 1 (Passo recursivo)
Outro ex.: A soma dos n umeros de 1 a n pode ser denida de forma
recursiva como:
_
soma(1) = 1
soma(n) = n + soma(n 1) n > 1
A soma dos n umeros mpares de 1 a n pode ser denida de forma recursiva
por:
_

_
somaimp(1) = 1
somaimp(n) = somaimp(n 1) n par n > 1
somaimp(n) = n + somaimp(n 2) n impar n > 2
Algoritmo da func ao fatorial denida recursivamente:
Func~ao numerico fatorial(n numerico)
Se n=0 OU n=1
ent~ao Retorna 1
sen~ao Retorna n*fatorial(n-1)
fim_se
fim_func~ao
A execucao desta funcao para uma chamada fatorial(3) e a mostrada
na Figura 6.
Exerc.: Denir recursivamente a func ao que devolve a soma dos n umeros
mpares de 1 a n.
Exerc.: Denir recursivamente a func ao que determina o n-esimo termo
da serie de bonacci (veja a Tabela 8).
45
fatorial(3)

3 fatorial(2)

//
3 2 = 6
//
6
2 fatorial(1)

//
2 1 = 2
88
q
q
q
q
q
q
q
q
q
q
q
q
fatorial(1) = 1
66
m
m
m
m
m
m
m
m
m
m
m
m
m
Figura 6: Execuc ao de fatorial(3)
n fibonacci(n)
0 0
1 1
2 1
3 2
4 3
5 5
6 8
.
.
.
.
.
.
Tabela 8: Tabela do Fibonacci
46
Solucao:
Func~ao numerico fibonacci(n numerico)
Se n=0 OU n=1
ent~ao Retorna n
sen~ao Retorna fibonacci(n-1)+fibonacci(n-2)
fim_se
fim_func~ao
Exerc.: Considere uma seq uencia de n umeros onde cada termo e dado pela
combina cao dos 4 termos anteriores A
n
= A
n4
+2A
n3
+3A
n2
+4A
n1
e os 4 primeiros termos sao por denic ao:
A
1
= 1 A
2
= 2 A
3
= 3 A
4
= 4
Escreva uma funcao recursiva SEQ que receba um n umero n e retorne o
termo A
n
.
Solucao:
Func~ao numerico seq(n numerico)
Se n<=4
ent~ao Retorna n
sen~ao Retorna seq(n-4)+2*seq(n-3)+3*seq(n-2)+4*seq(n-1)
fim_se
fim_func~ao
Exerc.: Dois n umeros sao amigos entre si, se a soma dos divisores de cada
um deles e igual ao outro. Exemplo, 220 e 284:
Divisores de 220 Divisores de 284
1 1
2 2
4 4
5 71
10 142
11 Soma 220
20
22
44
55
110
Soma 284
47
Faca um algoritmo que leia dois n umeros e verique se sao amigos.
Solucao:
Algoritmo
Declare a,b numerico
{ declarac~ ao de func~ oes }
Leia a,b
Se a=soma(b) E b=soma(a)
entao Escreva S~ao amigos
sen~ao Escreva N~ao s~ao amigos
fim_se
fim_algoritmo
Func oes com soluc ao nao recursiva:
Func~ao numerico soma(n numerico)
Declare aux,ind numerico
ind := 1
aux := 0
Repita
Se resto(n,ind)=0
ent~ao aux := aux+ind
fim_se
ind := ind+1
ate ind=n
Retorna aux
fim_func~ao
Solucao recursiva (chamar soma(n,n-1)):
Func~ao numerico soma(num,cont numerico)
Se cont=1
ent~ao Retorna 1
sen~ao
Se RESTO(num,cont)=0
ent~ao Retorna cont+soma(num,cont-1)
sen~ao Retorna soma(num,cont-1)
fim_se
fim_se
fim_func~ao
48
C B A
Figura 7: Torre de Hanoi
Exemplo: Torre de Hanoi (objetivo e mover os tres discos de A para C,
movendo um por vez e sem nunca colocar um disco maior sobre um menor;
veja Figura 7).
Mover 3 discos de A para C=
Mover 2 discos de A para B=
Mover 1 de A para C
Mover 1 de A para B
Mover 1 de C para B
Mover 1 disco de A para C=
Mover 1 de A para C
Mover 2 discos de B para C=
Mover 1 de B para A
Mover 1 de B para C
Mover 1 de A para C
Solucao (chamar move(3,1,3,2)):
Sub-rotina move(num,origem,destino,interm numerico)
Se num=1
ent~ao Escreva move de ,origem, para ,destino
sen~ao
move(num-1,origem,interm,destino)
move(1,origem,destino,interm)
move(num-1,interm,destino,origem)
49
fim_se
fim_sub-rotina
Outros problemas interessantes que podem ser resolvidos recursivamente:
O problema do cavalo Mover o cavalo por todas as casas do tabuleiro sem
ocupar nunca duas vezes a mesma casa comecando em qualquer casa;
O problema das oito rainhas Colocar oito rainhas em um tabuleiro sem
que nenhuma ataque a outra.
11 Algoritmos de Ordenacao
Os algoritmos de ordenacao (ou classicacao) permitem ordenar os dados em
alguma ordem (crescente ou decrescente). Podem ser aplicados sobre dados
numericos ou alfabeticos (neste caso deve-se associar uma ordem entre os
simbolos alfabeticos).
11.1 BUBLE SORT

E um tipo de algoritmo de ordenac ao por troca com tempo de ordenac ao


proporcional a O(N
2
) trocas.
10 19 13 12 7 .
10 13 12 7 . 19
10 12 7 . 13 19
10 7 . 12 13 19
7 . 10 12 13 19
11.2 SELEC

AO DIRETA

E um tipo de algoritmo de ordenac ao por selecao com tempo de ordenacao


proporcional a O(N
2
) comparacoes.
. 10 19 13 12 7
7 . 19 13 12 10
7 10 . 13 12 19
7 10 12 . 13 19
7 10 12 13 . 19
50
Implementac ao:
Sub-rotina selec(vet(),inic,fim numerico)
Declare elem,pos numerico
Se inic<>fim
ent~ao
pos := menor(vet,inic,fim)
elem := vet(pos)
vet(pos) := vet(inic)
vet(inic) := elem
selec(vet,inic+1,fim)
fim_se
fim_sub-rotina
e menor e uma funcao que encontra o menor elemento e devolve seu ndice
na matriz.
Exerccio: Reescrever esta sub-rotina usando listas. Escrever tambem a
func ao menor para este caso.
Exerccio: Implementar o Buble Sort.
11.3 QUICK SORT

E um tipo de algoritmo de ordenac ao por troca e particao com tempo de or-


denac ao proporcional a O(nlog
2
n). Baseia-se no princpio que e mais rapido
ordenar dois vetores de n/2 elementos do que um vetor com n elementos.
Baseia-se em um algoritmo que particiona o vetor em dois, o primeiro
dos valores menores e um segundo dos valores maiores que um elemento de
comparac ao. O elemento de comparac ao e, normalmente, o primeiro ele-
mento do vetor. Depois o algoritmo e repetido para as duas partes, obtendo
a ordenac ao completa.
O particionador comeca em ambas as extremidades do vetor efetuando
trocas para colocar os elementos menores e maiores que o de comparac ao em
seus lugares.
Exemplo de particionamento:
51
60 83 25 98 94 36 99 73 45 15 22 10
10 60
60 83
22 60
60 98
15 60
60 94
45 60
60 99
10 22 25 15 45 36 60 73 99 94 98 83
Algoritmo:
Sub-rotina quick(CR x lista)
Declare elem numerico
Declare x1,x2 lista
{ func~ ao concat }
{ sub-rotina partic }
Se TAM(x)>1
partic(x,x1,elem,x2)
quick(x1)
quick(x2)
x := concat(x1,CONS(elem,x2))
fim_se
fim_sub-rotina
Func ao concat:
Func~ao concat(x1,x2 lista) lista
Se NIL(x1)
ent~ao
Retorna x2
sen~ao
Retorna CONS(CAR(x1),concat(CDR(x1),x2))
fim_se
fim_func~ao
52
Func oes auxiliares de partic:
Func~ao adiciona_final(l lista, e numerico) lista
Se NIL(l)
ent~ao
Retorna CONS(e,nil)
sen~ao
Retorna CONS(CAR(l),adicional_final(CDR(l),e))
fim_func~ao
Func~ao retira_ultimo(l lista) lista
Se NIL(CDR(l))
ent~ao
Retorna nil
sen~ao
Retorna CONS(CAR(l),retira_ultimo(CDR(l)))
fim_se
fim_func~ao
Particionador:
53
sub-rotina partic(x lista, CR x1 lista, CR elem numerico,\
CR x2 lista)
Declare esq logico
{ func~ oes auxiliares }
elem := x(0)
x := CDR(x)
esq := verdadeiro
x1 := nil
x2 := nil
Enquanto N~ao NIL(x)
faca
Se esq
ent~ao
Se elem>x(TAM(x)-1)
ent~ao
x1 := concat(x1,CONS(x(TAM(x)-1),nil))
x := retira_ultimo(x)
esq := falso
sen~ao
x2 := CONS(x(TAM(x)-1),x2)
x := retira_ultimo(x)
fim_se
sen~ao
Se elem<x(0)
ent~ao
x2 := CONS(x(0),x2)
x := CDR(x)
esq := verdadeiro
sen~ao
x1 := adiciona_final(x1,x(0))
x := CDR(x)
fim_se
fim_se
fim_enquanto
fim_sub-rotina
54
12 Programacao Funcional
Com os recursos de manipulac ao de listas que ja temos em nossa linguagem e
com alguns outros recursos podemos implementar programacao funcional em
nossa linguagem. Programac ao funcional e um paradigma de programac ao
em que as principais entidades sao funcoes e listas. Programac ao funcio-
nal se baseia na avaliac ao de expressoes simbolicas. Este paradigma esta
plenamente representado na linguagem de programacao LISP.
Algumas caractersticas de programac ao funcional pura:
Nao existe declarac ao de tipos. Todos os dados sao dinamicos e a
linguagem efetua convers oes de tipo implcitas;
Homogeneidade das estruturas;
Nao ha lacos de repetic ao, apenas recursividade;
Baseado em notacao- (func oes-).
A estrutura basica de programac ao funcional e o atomo que pode ser
numerico ou literal (embora nao precise ser declarado como tal). Um par
de elementos com lado esquerdo (CAR) e lado direito (CDR) e chamado
expressao-S. A func ao CONS serve para construir expressoes-S.
12.1 Declaracao de Funcoes Lambda
Para declarar uma func ao lambda:
Func~ao lambda <nome>(<lista de par^ametros>) ( {definic~ ao} )
Ex:
Func~ao lambda cuder(x)(CDR(x))
Observe que nao e necessario declarar nenhum tipo de dado.
12.2 Estruturas de Programacao Funcional
Substituindo a estrutura Se-ent ao-senao tradicional, existe uma funcao
COND, que recebe tres argumentos:
COND(<condic~ao>,<fun c~ ao 1>,<func~ao 2>)
55
Caso a condicao seja verdadeira, e avaliada a func ao 1, caso contr ario e
avaliada a func ao 2.
Ex:
COND(NIL(x),nil,CAR(x))
que devolve nil se a lista x e vazia e o CAR de x caso contr ario.
O valor logico falso e representado por nil e o valor logico verdadeiro
por qualquer coisa diferente de nil. Assim, podemos testar a condic ao lista
vazia, no exemplo anterior, sem usar a funcao NIL(x), embora por elegancia
nao seja recomendavel faze-lo:
COND(x,nil,CAR(x))
Alem da func ao NIL(x), estao denidas na linguagem as func oes N
~
AO(x)
que inverte o valor logico, IGUAL(x,y) que testa se x e y sao iguais, e ZERO(x)
que testa se x = 0. Estao disponveis tambem as operac oes aritmeticas ja
denidas na nossa linguagem de algoritmos.
A Tabela 9 sumariza as estruturas disponveis em nossa linguagem de
algoritmos para programacao funcional.
12.3 Escrevendo Func oes
A seguir sao apresentados exemplos de funcoes usando a notacao- apresen-
tada.
Ex1: Calcula o fatorial.
Func~ao lambda fat(x)(
COND(ZERO(x),1,x*fat(x-1))
)
Ex2: Determina o tamanho de uma lista (implementa TAM(x)).
Func~ao lambda tamanho(x)(
COND(NIL(x),0,tamanho(CDR(x))+1)
)
Ex3: Concatena duas listas.
Func~ao lambda concat(x1,x2)(
COND(NIL(x1),x2,CONS(CAR(x1),concat(CDR(x1),x2)))
)
Com propositos de comparac ao, apresentamos a soluc ao tradicional da
concatenac ao de listas:
56
Estrutura Descricao
Func~ ao lambda Dene uma funcao nova
<nome>(<list param>)
({def func~ ao})
COND(<cond>,<f1>,<f2>) Condicional; Testa um valor;
Se <cond> e diferente de nil
entao avalia <f1>, senao avalia <f2>
Func ao CAR(x) Devolve o CAR de uma lista x
Func ao CDR(x) Devolve o CDR de uma lista x
Func ao CONS(x,y) Devolve o CONS de x e y
Func ao TAM(x) Devolve o tamanho de uma lista x
Func ao NIL(x) Testa se a lista x e vazia
Func ao N~ao(x) Inverte o valor logico de x
Func ao ZERO(x) Testa se o argumento x e zero
Fun cao IGUAL(x,y) Testa se x e y sao iguais
nil ou [] Lista vazia e/ou valor logico falso
Operador x(i) Devolve a i-esima posicao da lista x
Operador + Soma aritmetica
Operador - Subtrac ao aritmetica
Operador * Multiplicac ao aritmetica
Operador / Divisao aritmetica
Operador ** Potenciac ao aritmetica
Tabela 9: Resumo das Estruturas de Programac ao Funcional
57
Func~ao concat(x1,x2 listas) lista
Declare ind numerico
Declare x lista
ind := TAM(x2)
x := nil
Enquanto ind>0
faca
x := CONS(x2(ind-1),x)
ind:=ind-1
x2 := retira_ultimo(x2)
fim_enquanto
ind := TAM(x1)
Enquanto ind>0
faca
x := CONS(x1(ind-1),x)
ind:=ind-1
x1 := retira_ultimo(x1)
fim_Enquanto
Retorna x
fim_func~ao
Ex4: Verica se um elemento e pertence a uma lista l.
Func~ao lambda membro(e,l)(
COND(NIL(l),nil,
COND(IGUAL(e,CAR(l)),N
~
AO(nil),
membro(e,CDR(l))
)
)
)
Exerccio: Escrever uma funcao lambda que inclua um elemento no nal
de uma lista.
Exerccio: Escrever uma funcao lambda que apaga o ultimo elemento de
uma lista.
Exerccio: Escrever uma func ao que obtem a derivada de um polinomio
ordem n. Ex:
d
dx
_
3x
5
+ 2x
3
x + 1
_
= 15x
4
+ 6x
2
1
58
Representado como [[5,3],[3,2],[1,-1],[0,1]], que produzira
[[4,15],[2,6],[0,-1]], que representa 15x
4
+ 6x
2
1.
Exerccio: Inverter uma lista. Ex: [1,2,3,4][4,3,2,1].
Solucao:
Func~ao lambda inverte(x)(
COND(NIL(x),nil,concat(inverte(CDR(x)),CONS(CAR(x),nil)))
)
Exerccio: Escrever uma func ao lambda que ordene uma lista por selec ao
direta.
59
Copyright c 2005-2006 Carlos A. P. Campani.

E garantida a permissao para copiar, distribuir e/ou modicar este do-


cumento sob os termos da Licenca de Documentac ao Livre GNU (GNU Free
Documentation License), Vers ao 1.2 ou qualquer versao posterior publicada
pela Free Software Foundation; sem Secoes Invariantes, Textos de Capa Fron-
tal, e sem Textos de Quarta Capa. Uma copia da licenca e includa na sec ao
intitulada GNU Free Documentation License.
veja: http://www.ic.unicamp.br/~norton/fdl.html.
60