Escolar Documentos
Profissional Documentos
Cultura Documentos
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
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
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
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