O documento discute conceitos básicos de algoritmos, incluindo: 1) Comandos de escrita e leitura; 2) Constantes, variáveis, atribuição e expressões aritméticas e lógicas; 3) Estruturas condicionais e de repetição. O documento também apresenta algoritmos que utilizam matrizes, listas, sub-rotinas, recursividade e ordenação.
2. 8 Usando Listas 29
8.1 Constantes Lista . . . . . . . . . . . . . . . . . . . . . . . . . 30
8.2 Opera¸˜es com Listas . . . .
co . . . . . . . . . . . . . . . . . . . 30
8.3 Declara¸ao de Vari´vel Lista
c˜ a . . . . . . . . . . . . . . . . . . . 30
8.4 Tratando Listas . . . . . . . . . . . . . . . . . . . . . . . . . . 32
9 Sub-algoritmos 35
9.1 Sub-rotinas . . . . . . . . . . . . . . . . . . . . . . . . . . . . 37
9.2 Fun¸˜es . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 39
co
10 Recursividade 44
11 Algoritmos de Ordena¸˜o
ca 50
11.1 BUBLE SORT . . . . . . . . . . . . . . . . . . . . . . . . . . 50
¸˜
11.2 SELECAO DIRETA . . . . . . . . . . . . . . . . . . . . . . . 50
11.3 QUICK SORT . . . . . . . . . . . . . . . . . . . . . . . . . . . 51
12 Programa¸˜o Funcional
ca 55
12.1 Declara¸˜o de Fun¸oes Lambda . . . . . . . . . . . . . . . . . 55
ca c˜
12.2 Estruturas de Programa¸˜o Funcional . . . . . . . . . . . . . . 55
ca
12.3 Escrevendo Fun¸oes . . . . . . . . . . . . . . . . . . . . . . . . 56
c˜
Bibliografia
• FARRER, H. et alii. Algoritmos Estruturados. Rio de Janeiro, Editora
Guanabara, 1989;
• WIRTH, N. Programa¸˜o Sistem´tica. Rio de Janeiro, Ed. Campus,
ca a
1978.
1 Introdu¸˜o
ca
Algoritmos s˜o ferramentas importantes no estudo de ciˆncia da computa¸˜o.
a e ca
A compreens˜o das t´cnicas de desenvolvimento e constru¸ao de algoritmos
a e c˜
´ uma ferramenta valiosa, n˜o s´ para o aprendizado de linguagens de pro-
e a o
grama¸ao, mas para o estudo das mais variadas disciplinas da ´rea. Um
c˜ a
exemplo poderia ser dado se lembrarmos que boa parte da teoria matem´tica
a
2
3. da computa¸˜o baseia-se no conceito de “algoritmo”, como uma id´ia primi-
ca e
tiva.
Nesta disciplina, desenvolveremos os algoritmos usando uma linguagem
hipot´tica, cuja estrutura e funcionamento ser˜o descritos ao longo do desen-
e a
volvimento da disciplina. A linguagem adotada aqui foi projetada para que
fosse f´cil a implementa¸ao dos exemplos apresentados em uma linguagem de
a c˜
programa¸ao usual, particularmente visando Python como linguagem alvo.
c˜
2 Conceitos B´sicos
a
Algoritmo ´ a descri¸˜o de um conjunto de comandos que, efetuados, resul-
e ca
tam numa sucess˜o finita de a¸˜es. Uma outra forma: Algoritmo ´ uma
a co e
lista de instru¸oes (comandos) ordenadas que tem por finalidade resolver
c˜
um determinado problema. Exemplos de algoritmos: Uma receita culin´ria;
a
Instru¸oes para montar algo.
c˜
Ex. Algoritmo para fritar um ovo:
1. Colocar um ovo na frigideira;
2. Esperar o ovo ficar frito;
3. Tirar o ovo.
O algoritmo acima n˜o est´ detalhado. Uma vers˜o mais aceit´vel ´:
a a a a e
1. Retirar um ovo da geladeira;
2. Colocar a frigideira no fogo;
3. Colocar ´leo;
o
4. Esperar at´ o ´leo ficar quente;
e o
5. Quebrar o ovo separando a casca;
6. Colocar o conte´do na frigideira;
u
7. Esperar um minuto;
8. Retirar o ovo da frigideira;
9. Apagar o fogo.
3
4. Esta vers˜o ´ mais completa e detalhada que a anterior. Para que um
a e
algoritmo possa ser executado ´ necess´rio que seu usu´rio conhe¸a a termi-
e a a c
nologia nele utilizada. No exemplo anterior, para que o algoritmo seja util,
´
´ necess´rio que o usu´rio conhe¸a o significado dos verbos Retirar, Colocar,
e a a c
Esperar assim como dos substantivos utilizados.
Os algoritmos estudados em aula ser˜o algoritmos computacionais, listas
a
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 programa¸˜o ca
chama-se sintaxe da linguagem de programa¸˜o.ca
Os algoritmos estudados na disciplina de Algoritmos ser˜o desenvolvidos
a
utilizando uma sintaxe que ser´ apresentada progressivamente ao longo do
a
semestre. Esta sintaxe pode ser chamada de portuguˆs estruturado e os
e
algoritmos nela desenvolvidos podem ser facilmente adapt´veis as diversas
a
linguagens de programa¸˜o existentes.
ca
A forma geral dos algoritmos a ser adotada em aula ´:e
Algoritmo
{ lista-de-comandos }
fim_algoritmo
onde { lista-de-comandos } ´ uma lista com um ou mais comandos. Note
e
a endenta¸ao dos comandos dentro do ambiente Algoritmo-fim_algoritmo.
c˜
Vamos imaginar uma m´quina virtual que executa os comandos de nossos
a
algoritmos, lendo os dados de uma entrada fict´
ıcia, e imprimindo os resulta-
dos em uma tela virtual. Embora esta m´quina n˜o exista no mundo real,
a a
com ela poderemos mentalmente executar os nossos algoritmos. Com relati-
vamente pouca dificuldade ´ poss´ traduzir os algoritmos de sala de aula
e ıvel
para uma linguagem de programa¸˜o real.
ca
2.1 Comando de Escrita
O comando de escrita ´ utilizado quando se deseja que o algoritmo escreva
e
algo. Esta “escrita” pode ser em uma impressora, um terminal de v´ıdeo ou
outra sa´ qualquer. O formato do comando ´:
ıda e
Escreva { lista-de-express~es }
o
4
5. onde { lista-de-express~es } ´ uma lista de uma ou mais express˜es e
o e o
uma express˜o pode ser uma constante, uma express˜o aritm´tica, vari´vel
a a e a
ou chamada de fun¸ao.
c˜
Ex: (dica: use endenta¸ao)
c˜
Algoritmo
Escreva ’Jo~o Vitor’,’ ’,’Luana’
a Escreva ’1’
Escreva 1 + 2
fim_algoritmo
Ao ser executado este algoritmo o resultado ser´:
a
Jo~o Vitor Luana
a
1
3
O exemplo ´ composto de trˆs comandos de escrita. Observe que podemos
e e
colocar mais de um comando por linha (op¸ao n˜o muito interessante pois
c˜ a
esconde a estrutura do algoritmo e confunde a sua leitura).
O primeiro comando manda escrever uma lista de trˆs constantes, no
e
segundo deve escrever uma constante e no terceiro deve escrever o resultado
de uma express˜o aritm´tica. Quando um comando de escrita tiver mais de
a e
um valor a ser escrito como no primeiro, os diversos valores s˜o separados
a
por v´ırgula.
Observe que ’Jo~o Vitor’ ´ um literal, ou seja, tudo que estiver entre
a e
dois ’ ser´ impresso exatamente da forma com que est´ escrito. A utilidade
a a
do ’ ’ ´ efetuar a separa¸ao entre os diversos termos a serem impressos j´
e c˜ a
que o comando Escreva imprime os termos sem espa¸os entre eles.
c
Ex2:
Algoritmo
Escreva ’Jo~o Vitor’,’Luana’
a
Escreva 1+2
Escreva ’1+2’
fim_algoritmo
Produzindo:
Jo~o VitorLuana
a
3
1+2
5
6. Observe o efeito da ausˆncia de ’ ’ entre ’Jo~o Vitor’ e ’Luana’.
e a
Os comandos como Algoritmo e fim_algoritmo s˜o chamados palavras
a
reservadas da linguagem. A linguagem trata mai´sculas e min´sculas como
u u
iguais.
2.2 Constantes
Uma constante ´ um valor que n˜o se modifica com o tempo. As constan-
e a
tes com que trabalharemos podem ser de trˆs tipos diferentes, num´ricas,
e e
l´gicas ou literais. Constantes num´ricas podem conter quaisquer valores
o e
num´ricos, reais ou inteiros, positivos ou negativos, etc. Exemplos de cons-
e
tantes num´ricas s˜o:
e a
25
3.14
-2.57
-0.0003
-10
Constantes literais podem conter um ou mais caracteres alfab´ticos ou
e
num´ricos. S˜o delimitados por aspas. Exemplos de constantes literais s˜o:
e a a
’Jose da Silva’
’1245’
’1 2 3 de oliveira’
Constantes l´gicas podem conter somente dois valores, verdadeiro e
o
falso. Normalmente s˜o utilizadas em testes em algoritmos.
a
2.3 Vari´veis
a
Uma vari´vel ´ um valor que pode ser alterado em um algoritmo. Cada
a e
vari´vel tem um nome associado a ela que a identifica. O identificador de
a
uma vari´vel deve come¸ar por uma letra e pode conter letras ou d´
a c ıgitos. Ex:
A
X5
Joao
6
7. Assim como as constantes as vari´veis tamb´m podem ser de trˆs tipos:
a e e
num´ricas, l´gicas ou literais.
e o
Para utilizar uma vari´vel em um algoritmo ´ necess´rio que ela seja
a e a
declarada no in´ ıcio do algoritmo, ou seja, defina-se no in´
ıcio do algoritmo
qual o tipo de valor com que a vari´vel ir´ trabalhar ( num´rico, l´gico ou
a a e o
literal ). O formato do comando de declara¸˜o ´:
ca e
Declare <lista de identificadores> <tipo das vari´veis>
a
Ex:
Declare Nota,Codigo,X5 Num´rico
e
Declare Teste,Sim L´gico
o
Declare Nome,End1,End2 Literal
Assim, a forma geral de um algoritmo passa a ser:
Algoritmo
{ declara¸oes }
c~
{ corpo do algoritmo }
fim_algoritmo
2.4 Atribui¸˜o
ca
Uma vari´vel pode armazenar qualquer valor e seu valor pode ser alterado a
a
qualquer momento no algoritmo. O comando utilizado para alterar o valor
de uma vari´vel ´ o comando de atribui¸˜o. Sua forma geral ´ a seguinte:
a e ca e
<identificador de vari´vel> := <express~o>
a a
onde <express~o> pode ser uma constante, express˜o aritm´tica, vari´vel
a a e a
ou chamada de fun¸ao. Por exemplo:
c˜
A := 5
O comando acima (lˆ-se “A recebe cinco”) faz com que a vari´vel A passe
e a
a valer 5. O valor anterior da vari´vel A ´ perdido e seu novo valor passa a
a e
ser 5.
Assim, por exemplo:
{A=10}
A := 5
{A=5}
7
8. E fica perdido o valor anterior da vari´vel (10).
a
Ent˜o, como trocar dois valores? Resposta: Usando uma vari´vel auxiliar.
a a
Ex: trocar os valores de a e b.
aux := a
a := b
b:= aux
Outros exemplos de atribui¸˜o s˜o:
ca a
A := 3 + 2
A := B
X5 := A + 1
No primeiro exemplo a vari´vel A recebe o resultado da express˜o aritm´tica
a a e
3 + 2, express˜o esta que cont´m somente constantes. No segundo exemplo a
a e
vari´vel A recebe o conte´do da vari´vel B e no terceiro exemplo a vari´vel X5
a u a a
recebe o resultado da express˜o aritm´tica A + 1, express˜o esta que cont´m
a e a e
a vari´vel A e a constante 1.
a
Um exemplo interessante:
{A=10}
A := A+1
{A=11}
Ou seja, a express˜o A+1 ´ avaliada, tendo como resultado 10 + 1 = 11 e o
a e
valor ´ atribuido ` vari´vel A.
e a a
2.5 Comando de Leitura
O comando de leitura ´ utilizado quando o algoritmo deve receber um valor
e
externo, por exemplo, de um teclado. Seu formato geral ´:
e
Leia <lista-de-vari´veis>
a
Este comando faz com que a primeira vari´vel da lista receba o primeiro
a
valor digitado no teclado, a segunda vari´vel receba o segundo valor e assim
a
por diante.
Ex:
Leia A,B
8
9. Ao executar este comando o computador espera que sejam fornecidos dois
valores na entrada virtual ( p.ex: 10 e 20 ). A vari´vel A receber´ ent˜o o
a a a
primeiro valor (10) e a vari´vel B receber´ o segundo valor (20).
a a
Ex 2.8 - Escrever um algoritmo que lˆ trˆs n´meros, calcula as m´dias
e e u e
aritm´tica, harmˆnica e geom´trica e escreve os n´meros lidos e as m´dias
e o e u e
calculadas.
A+B+C √
3 3
MA = MG = A×B×C MH = 1 1 1
3 A
+ B
+ C
Ex 2.9 - Escrever um algoritmo que lˆ o nome de um funcion´rio, o
e a
n´mero do funcion´rio, seu n´mero de horas trabalhadas, o valor que recebe
u a u
por hora, o n´mero de filhos com idade menor que 14 anos e calcula o sal´rio
u a
deste funcion´rio.
a
Ex 2.10 - Escrever um algoritmo que calcula o fatorial de 5.
Ex 2.11 - Escrever um algoritmo que lˆ trˆs valores, a, b e c e calcula:
e e
1. A ´rea do triˆngulo que tem a por base e b por altura;
a a
2. A ´rea do c´
a ırculo de raio c;
3. A ´rea do trap´zio que tem a e b por bases e c por altura;
a e
4. A ´rea do quadrado de lado b;
a
5. A ´rea do retˆngulo de lados a e b;
a a
6. A ´rea da superf´ de um cubo que tem c por aresta.
a ıcie
Ex 2.12 - Escrever um algoritmo que escreve os n´meros ´
u ımpares entre
10 e 20.
Ex 2.13 - Escrever um algoritmo que lˆ p, u e r, respectivamente o primeiro
e
termo de uma progress˜o aritm´tica, o ultimo termo da progress˜o e a raz˜o
a e ´ a a
desta progress˜o. Determinar a soma dos termos desta progress˜o aritm´tica.
a a e
an + a1 an − a1
soma = ×n n= +1
2 r
Ex 2.14 - Escrever um algoritmo que lˆ o c´digo da pe¸a 1, o n´mero de
e o c u
pe¸as 1, o valor unit´rio da pe¸a 1, o c´digo da pe¸a 2, o n´mero de pe¸as
c a c o c u c
2, o valor unit´rio da pe¸a 2 e a percentagem do IPI a ser acrescentado e
a c
calcula o valor total a ser pago.
9
10. Opera¸˜o
ca S´
ımbolo Precedˆncia
e
Adi¸ao
c˜ + 3
Subtra¸ao
c˜ - 3
Multiplica¸˜o
ca * 2
Divis˜o
a / 2
Potencia¸˜o
ca ** 1
Tabela 1: Opera¸oes Aritm´ticas
c˜ e
2.6 Express˜es Aritm´ticas
o e
Para que uma express˜o possa ser avaliada em um algoritmo ela deve seguir
a
uma sintaxe bem definida. As opera¸˜es utilizadas nas express˜es aritm´ticas
co o e
em nossa linguagem s˜o as mostradas na Tabela 1 junto com as suas pre-
a
cedˆncias. A precedˆncia dos operadores indica a ordem que eles ser˜o ava-
e e a
liados em uma express˜o. a
A precedˆncia dos operadores ´ relevante para o resultado da avalia¸ao
e e c˜
de uma express˜o. Por exemplo, a avalia¸ao da express˜o 3 + 4 * 2 pode
a c˜ a
resultar 14 se a soma for efetuada em primeiro lugar ou 11 se a multiplica¸˜o
ca
for efetuada em primeiro lugar. Para isto se define a prioridade das opera¸oes.
c˜
Ao avaliar uma express˜o primeiro s˜o efetuada as potencia¸oes, ap´s s˜o efe-
a a c˜ o a
tuadas as multiplica¸oes e divis˜es e por fim as adi¸˜es e subtra¸˜es. Quando
c˜ o co co
houverem duas opera¸oes de mesma prioridade para serem efetuadas, a or-
c˜
dem de execu¸˜o ´ da esquerda para a direita.
ca e
´
E poss´ alterar a ordem de execu¸ao das opera¸oes em uma express˜o
ıvel c˜ c˜ a
com o uso de parˆnteses. Em uma express˜o com parˆnteses em primeiro
e a e
lugar s˜o efetuadas as opera¸oes entre parˆnteses.
a c˜ e
Ex: Express˜o para o c´lculo das ra´ de uma equa¸˜o de segundo grau
a a ızes ca
segundo a f´rmula de Bascara (usar o - un´rio).
o a
X1 := (-B+(B**2-4*A*C)**(1/2))/(2*A)
X2 := (-B-(B**2-4*A*C)**(1/2))/(2*A)
Al´m das opera¸oes acima descritas a nossa ’linguagem’ oferece as fun¸˜es
e c˜ co
pr´-definidas da Tabela 2.
e
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
11. Fun¸˜o
ca Especifica¸ao
c˜
LOG(x) logaritmo de x na base 10
LN(x) logaritmo natural de x
EXP(x) e elevado na x-´sima potˆncia
e e
ABS(x) m´dulo ( valor absoluto ) de x
o
TRUNCA(x) valor inteiro de x
ARREDONDA(x) inteiro mais pr´ximo a x
o
SINAL(x) −1 se x < 0
0 se x = 0
1 se x > 0
QUOCIENTE(x,y) quociente inteiro da divis˜o de x por y
a
RESTO(x,y) resto da divis˜o inteira de x por y
a
Tabela 2: Fun¸oes Pr´-definidas
c˜ e
Ex 2.16 - Escrever um algoritmo para calcular os sucessivos valores de
E usando a s´rie abaixo considerando primeiro 3 termos, depois 4 termos e
e
finalmente 5 termos:
1 1 1 1
E= + + +
1! 2! 3! 4!
Ex 2.17 - Escrever um algoritmo que lˆ o valor de um empr´stimo e
e e
calcula o valor de cada amortiza¸ao considerando 24 amortiza¸oes a uma
c˜ c˜
taxa de 48%. Depois fazer o mesmo algoritmo lendo os valores da taxa e do
n´mero de amortiza¸oes.
u c˜
VAMORT = VEMPREST × TAXA/NAMORT
onde VAMORT ´ o valor da amortiza¸˜o, VEMPREST ´ o valor do empr´s-
e ca e e
timo, TAXA ´ a taxa, e NAMORT ´ o n´mero de amortiza¸oes.
e e u c˜
Ex 2.18 - Escrever um algoritmo que lˆ um valor em cruzeiros e calcula
e
qual o menor n´mero poss´ de notas de 5000, 1000, 500, 200, 100, 50, 10,
u ıvel
5 e 1 em que o valor lido pode ser decomposto. Escrever o valor lido e a
rela¸ao de notas necess´rias.
c˜ a
Ex 2.19 - Escrever um algoritmo que lˆ o n´mero do vendedor, o seu
e u
sal´rio fixo, o total de vendas por ele efetuadas e o percentual que ganha
a
sobre o total de vendas. Calcular o sal´rio total do vendedor. Escrever o
a
n´mero do vendedor e o sal´rio total.
u a
11
12. Ex 2.20 - Escrever um algoritmo que lˆ 3 valores a, b e c que s˜o lados de
e a
um triˆngulo e calcule a ´rea deste triˆngulo.
a a a
´rea =
a s(s − a)(s − b)(s − c)
onde s = (a + b + c)/2 (semi-per´
ımetro).
Ex 2.21 - Um sistema de equa¸˜es lineares do tipo:
co
ax + by = c
dx + ey = f
pode ser resolvido segundo mostrado abaixo:
ce − bf af − cd
x= y=
ae − bd ae − bd
Escrever um algoritmo que lˆ os coeficientes a, b, c, d, e, e f , e calcula e
e
escreve os valores de x e y.
Ex 2.22 - O custo ao consumidor, de um carro novo, ´ a soma do custo
e
de f´brica com a porcentagem do distribuidor e dos impostos ( aplicados ao
a
custo de f´brica ). Supondo que a percentagem do distribuidor seja de 28%
a
e os impostos de 45%, escrever um algoritmo para ler o custo de f´brica de
a
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 funcion´rios a
vendedores, um sal´rio fixo por mˆs, mais uma comiss˜o tamb´m fixa para
a e a e
cada carro vendido e mais 5% do valor das vendas por ele efetuadas. Escrever
um algoritmo que lˆ o nome do vendedor, o n´mero do vendedor, o n´mero
e u u
de carros por ele vendidos, o valor total de suas vendas, o sal´rio fixo e o
a
valor que recebe por carro vendido e calcula o sal´rio mensal do vendedor,
a
escrevendo-o juntamente com o seu nome e seu n´mero de identifica¸˜o.
u ca
Ex 2.24 - Considerando que o aumento dos funcion´rios ´ de 80% do INPC
a e
e mais um percentual de produtividade discutido com a empresa. Escrever
um algoritmo que lˆ o nome do funcion´rio, o n´mero do funcion´rio, seu
e a u a
sal´rio atual, o valor do INPC e o ´
a ındice de produtividade conquistado e
escreve o nome do funcion´rio, seu aumento e o valor do novo sal´rio.
a a
Ex 2.25 - Escrever um algoritmo que lˆ 3 valores a, b e c e os escreve.
e
Encontre a seguir o maior dos trˆs valores e o escreva com a mensagem: ”E
e ´
o maior”.
a + b + |a − b|
maior =
2
12
13. Relacional Significado
= Igual a
<> ou = Diferente de
> Maior que
< Menor que
>= Maior ou igual a
<= Menor ou igual a
Tabela 3: Relacionais
Operador Significado
N~o
a Inverte o valor l´gico do operando
o
E Verdadeiro se e somente se os
dois opeandos s˜o verdadeiros
a
Ou Verdadeiro se pelo menos um dos
dois operandos ´ verdadeiro
e
Tabela 4: Operadores L´gicos
o
2.7 Express˜es L´gicas
o o
Express˜es l´gicas s˜o express˜es que avaliadas resultam em um valor l´gico
o o a o o
( verdadeiro ou falso ). Assim como as express˜es aritm´ticas elas tamb´m
o e e
disp˜em de um conjunto de operadores, s´
o ımbolos e prioridades. Os operado-
res s˜o divididos em operadores relacionais e operadores l´gicos.
a o
Operadores relacionais atuam sobre operandos num´ricos mas resultam
e
em valores l´gicos. S˜o operadores de compara¸˜o entre dois operandos. A
o a ca
Tabela 3
Operadores l´gicos atuam sobre valores l´gicos e resultam em valores
o o
l´gicos (veja Tabela 4).
o
Exemplos de express˜es l´gicas:
o o
A > 0 E B > 3
Teste OU A * B > C
A precedˆncia de operadores da nossa linguagem ´ apresentada na Ta-
e e
bela 5.
13
14. Operador Precedˆncia
e
Operadores Aritm´ticos
e 1
Operadores Relacionais 2
Nao 3
E 4
OU 5
Tabela 5: Operadores e suas Precedˆncias
e
Ex: Se A = 1, B = 2 e C = 2 qual o resultado da avalia¸ao da express˜o
c˜ a
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 s´ deve ser executado em determi-
o
nadas condi¸oes. Formas Gerais:
c˜
1. Se <condi¸ao>
c~
ent~o <lista-de-comandos>
a
fim_se
2. Se <condi¸ao>
c~
ent~o <lista-de-comandos>
a
sen~o <lista-de-comandos>
a
fim_se
onde <condi¸ao> ´ uma express˜o l´gica qualquer.
c~ e a o
Ex:
Se a>b
ent~o Escreva a
a
sen~o Escreva b
a
fim_se
14
15. Ao ser executado este comando a express˜o a > b ´ avaliada e depen-
a e
dendo do resultado da avalia¸˜o ´ executado o primeiro comando (escreva
ca e
a) ou o segundo comando (escreva b). Observe que as estruturas podem ser
“aninhadas”.
Ex2:
Se a<>b
ent~o Se a>b
a
ent~o Escreva ’a maior que b’
a
sen~o Escreva ’a menor que b’
a
fim_se
sen~o Escreva ’a igual a b’
a
fim_se
Ex3: Algoritmo que calcula a raiz da equa¸ao y = ax + b.
c˜
Algoritmo
Declare A,B,X num´rico
e
Leia A,B
Se A = 0
ent~o Escreva ’N~o h´ raizes’
a a a
sen~o X := -B/A
a
Escreva ’Raiz=’,X
fim_se
fim_algoritmo
15
16. Ex4: Algoritmo que calcula as raizes da equa¸ao y = ax2 + bx + c.
c˜
Algoritmo
Declare A,B,C,Delta num´rico
e
Leia A,B,C
Delta := B**2-4*A*C
Se Delta = 0
ent~o Escreva ’S´ h´ uma raiz’,-B/(2*A)
a o a
fim_se
Se Delta < 0
ent~o Escreva ’h´ duas raizes complexas’
a a
Escreva -B/(2*A),’+-’,ABS((-Delta)**0.5/(2*A)),’J’
fim_se
Se Delta > 0
ent~o Escreva ’Ha duas raizes reais’
a
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 ´ util quando a linha de um algoritmo ´ muito grande.
e´ e
4 Estrutura de Repeti¸˜o
ca
Utilizada quando um trecho de um algoritmo deve ser repetido um deter-
minado n´mero de vezes. Esta estrutura tamb´m ´ chamada de la¸o de
u e e c
repeti¸ao. Forma geral:
c˜
1. Enquanto <condi¸ao>
c~
fa¸a { lista-de-comandos }
c
fim_enquanto
2. Repita
{ lista de comandos }
at´ <condi¸ao>
e c~
16
17. Na primeira forma os comandos s˜o executados repetitivamente enquanto
a
a condi¸˜o ´ verdadeira, e a condi¸˜o ´ testada antes (pode n˜o executar ne-
ca e ca e a
nhuma vez). Na segunda forma os comandos s˜o executados repetitivamente
a
at´ a condi¸˜o tornar-se verdadeira (testa depois de executar, assim sempre
e ca
´ executado pelo menos uma vez).
e
Ex: Escrever os n´meros de 1 a 10.
u
Algoritmo
Declare I num´rico
e
I := 1
Repita
Escreva I
I := I + 1
at´ I > 10
e
fim_algoritmo
e u co c ´
A vari´vel I ´ quem controla o n´mero de repeti¸˜es do la¸o. E chamada
a
vari´vel contadora. Uma vari´vel contadora ´ uma vari´vel que recebe um
a a e a
valor inicial, ´ incrementada de um valor constante no la¸o e tem seu valor
e c
testado em algum ponto do la¸o. Ao chegar a um determinado valor o la¸o ´
c c e
interrompido. A inicializa¸˜o da vari´vel contadora deve ir, necessariamente,
ca a
fora do la¸o.
c
Existem diversas maneiras de implementar o mesmo la¸o, mas todo la¸o
c c
com vari´vel de controle deve conter:
a
• inicializa¸˜o;
ca
• incremento (ou decremento);
• teste de valor final.
Abaixo s˜o mostradas outras trˆs maneiras de implementar o algoritmo
a e
anterior:
17
18. 1. Algoritmo
Declare I num´rico
e
I := 0
Repita
I := I + 1
Escreva I
at´ I = 10
e
fim_algoritmo
2. Algoritmo
Declare I num´rico
e
I := 0
Enquanto I < 10
fa¸a
c
I := I + 1
Escreva I
fim_enquanto
fim_algoritmo
3. Algoritmo
Declare I num´rico
e
I := 1
Enquanto I < 11
fa¸a
c
Escreva I
I := I + 1
fim_enquanto
fim_algoritmo
Ainda existe uma possibilidade adicional de abandonar um la¸o de re-
c
peti¸ao (tanto o Repita quanto o Enquanto) em qualquer lugar por meio de
c˜
um comando Interrompa:
18
19. Enquanto verdadeiro
fa¸a
c
Leia x
Se x>0 ent~o Interrompa fim_se
a
Escreva ’Valor inv´lido’
a
Escreva ’Digite novamente’
fim_enquanto
significando que o la¸o (condi¸ao de parada do la¸o ´ verdadeiro) ser´ in-
c c˜ c e a
terrompido (pelo comando Interrompa) apenas quando o usu´rio fornecer
a
um n´mero maior que zero.
u
Ex. 4.7 Escrever um algoritmo que gera e escreve os n´meros impares
u
entre 100 e 200.
Exerc. Escrever um algoritmo para calcular o fatorial de um n´mero.
u
5 Algoritmos com Acumulador
Quando o algoritmo necessitar efetuar alguma totaliza¸˜o usa-se uma vari´vel
ca a
chamada acumulador. A vari´vel acumuladora tamb´m deve ser inicializada
a e
(normalmente com zero) e pode ser incrementada ou n˜o de um valor vari´vel
a a
no la¸o.
c
Ex: Somar os n´meros de 1 a 10.
u
S := 0
I := 0
Enquanto I<10
fa¸a
c
I := I + 1
S := S + I
fim_enquanto
Assim, os valores de S e I ao longo da execu¸˜o do algoritmo s˜o mostra-
ca a
dos na Tabela 6.
Ex. 4.6 - Escrever um algoritmo que lˆ 5 valores para a, um de cada vez,
e
e conta quantos destes valores s˜o negativos, escrevendo esta informa¸˜o.
a ca
Ex. 4.8 - Escrever um algoritmo que lˆ 10 valores, um de cada vez,
e
e conta quantos deles est˜o no intervalo [10,20] e quantos deles est˜o fora
a a
deste intervalo, escrevendo estas informa¸˜es.
co
19
20. Volta do la¸o
c Valor de I (ao final) Valor de S (ao final)
1 1 1
2 2 3
3 3 6
4 4 10
.
. .
. .
.
. . .
10 10 55
Tabela 6: Execu¸ao Programa de Soma
c˜
Ex. 4.9 - Escrever um algoritmo que lˆ um n´mero n˜o conhecido de va-
e u a
lores, um de cada vez, e conta quantos deles est˜o em cada um dos intervalos
a
[0,25], (25,50], (50,75], (75,100].
Ex. 4.10 - Escrever um algoritmo semelhante ao anterior que calcula as
m´dias aritm´ticas de cada intervalo e as escreve, juntamente com o n´mero
e e u
de valores de cada intervalo.
Exerc´ıcio: A s´rie de Fibonacci ´ uma sequˆncia de n´meros em que os
e e e u
dois primeiros s˜o 0 e 1 e a partir da´ cada n´mero ´ a soma dos anteriores,
a ı u e
ou seja
tn = tn−1 + tn−2
Escrever um algoritmo que escreve os 10 primeiros termos da s´rie.
e
Ex. 4.11 - Escrever um algoritmo que gera os 10 primeiros termos da
S´rie de Fibonacci e calcula e escreve a soma destes termos.
e
Exerc´ıcio: Escrever um algoritmo que leia um n´mero N e escreva o
u
n´mero de divisores de N.
u
20
21. Algoritmo
Declare N,acum,I num´rico
e
Leia N
acum := 0
I := 1
Repita
Se Resto(N,I)=0
entao acum := acum+1
fim_se
I := I+1
at´ I>N
e
escreva acum
fim_algoritmo
Escrever um algoritmo que leia um n´mero e escreva uma mensagem
u
dizendo: “O n´mero ´ primo” ou “O n´mero n˜o ´ primo” conforme o caso.
u e u a e
Ex. 4.12 - Escrever um algoritmo que gera os 30 primeiros termos da
´
s´rie de Fibonacci e escreve os termos gerados com a mensagem: “E primo”
e
ou “N˜o ´ primo” conforme o caso.
a e
6 Refinamentos Sucessivos
´
E uma t´cnica para desenvolver um algoritmo em diversos passos aumentando
e
o n´
ıvel de detalhamento a cada passo. A partir do problema gerar uma
poss´ solu¸˜o e detalh´-la at´ um n´ aceit´vel.
ıvel ca a e ıvel a
Ex: Escrever um algoritmo que leia um n´mero e escreva a mensagem “E
u ´
primo” ou “N˜o ´ primo”. Primeira Vers˜o:
a e a
Algoritmo
Declare n´mero
u
Leia n´mero
u
{Verifica se n´mero ´ primo}
u e
Se {n´mero ´ primo}
u e
ent~o escreva ’n´mero ´ primo’
a u e
sen~o escreva ’n´mero n~o ´ primo’
a u a e
fim_se
fim_algoritmo
21
22. Detalhamentos:
{ Verifica se n´mero ´ primo }
u e
Um n´mero ´ primo se ´ divis´ somente por si e pela unidade (1). Uma
u e e ıvel
maneira de descobrir isto ´ contando o n´mero de divisores do n´mero. Se
e u u
possuir apenas dois divisores (1 e o pr´prio n´mero ) ele ´ primo.
o u e
{ Verifica se n´mero ´ primo } ⇒ { Conta n´mero de divisores }
u e u
{ Conta n´mero de divisores }
u
acum := 0
i := 1
Repita
Se Resto(Numero,i)=0
ent~o acum:=acum+1
a
fim_se
i:=i+1
at´ i>n´mero
e u
{ N´mero ´ primo }
u e
Se acum=2
ent~o...
a
O refinamento para { Conta n´mero de divisores } n˜o ´ bom, por-
u a e
que basta verificar que existem mais de dois divisores do n´mero para ele
u
n˜o ser primo. Assim, rebatizando { Conta n´mero de divisores } para
a u
{ Verifica se h´ mais de dois divisores }, obtemos, usando o coman-
a
do Interrompa:
{ Verifica se h´ mais de dois divisores }
a
acum := 1
i := 1
Enquanto i <= TRUNCA(n´mero/2)
u
Fa¸a
c
Se Resto(Numero,i)=0
ent~o acum:=acum+1
a
fim_se
Se acum>2 ent~o Interrompa fim_se
a
i:=i+1
fim_enquanto
22
23. ff P rincipal
fffff
fffffffff
fffff
rfffff
{ n´mero ´ primo }
u e { Verifica de n´mero ´ primo }
u e
{ Verifica se h´ mais de dois divisores }
a
Figura 1: Diagrama de Refinamentos para o Exemplo
Isto melhora a performance do algoritmo, pois ele abandona o la¸o assim
c
que percebe que j´ existem mais de dois divisores e faz divis˜es apenas at´
a o e
TRUNCA(n´mero/2).
u
A Figura 1 apresenta o diagrama de refinamentos para este exemplo.
Montando as partes obtemos a vers˜o final:
a
Algoritmo
Declare n´mero,i,acum num´rico
u e
Leia n´mero
u
acum := 1
i := 1
Enquanto i = TRUNCA(n´mero/2)
u
Fa¸a
c
Se Resto(Numero,i)=0
ent~o acum:=acum+1
a
fim_se
Se acum2 ent~o Interrompa fim_se
a
i:=i+1
fim_enquanto
Se acum=2
ent~o escreva ’n´mero ´ primo’
a u e
sen~o escreva ’n´mero n~o ´ primo’
a u a e
fim_se
fim_algoritmo
23
24. Usar refinamentos sucessivos:
Ex 1.12.30. Escrever um algoritmo para gerar e escrever uma tabela
com os valores do seno de um ˆngulo A em radianos, utilizando a s´rie de
a e
Mac-Laurin truncada com 20 termos:
A1 A3 A5 A7
sin(A) = − + − ···
1! 3! 5! 7!
Os valores dos ˆngulos A devem variar de 0.0 a 6.3 de 0.1 em 0.1.
a
Exerc.: Repetir o exerc´ anterior, truncando a s´rie considerando uma
ıcio e
precis˜o de 0,0001 na aproxima¸ao obtida (dica: considere o valor absoluto
a c˜
do ultimo termo).
´
Ex. 1.12.40. Fazer um algoritmo que calcule e escreva o cosseno de A
usando a s´rie truncada com 20 termos:
e
A2 A4 A6 A8
cos(A) = 1 − + − + ···
2! 4! 6! 8!
Ex. 1.12.32. O valor aproximado de ? pode ser calculado usando-se a
s´rie:
e
1 1 1 1 1
S = 3 − 3 + 3 − 3 + 3 ···
1 3 5 7 9
√
3
sendo π ≈ S × 32. Fazer um algoritmo para calcular e escrever o valor de
π com 51 termos.
7 Usando Matrizes
Matriz ´ um conjunto de vari´veis, cada uma podendo representar o valor
e a
de uma constante, como se fossem vari´veis simples, mas todas elas com-
a
´
partilhando um nome comum. Indices s˜o associados a este nome comum
a
permitindo individualizar os elementos do conjunto.
Ex: conjunto de 5 elementos e nome a
a1 a2 a3 a4 a5
Qual ´ a utilidade dos matrizes? Resposta: Tratar com dados em s´rie
e e
do mesmo tipo.
Ex: Deseja-se calcular a m´dia de notas de 10 alunos e determinar quantos
e
ficaram acima da m´dia. Portanto, deve-se calcular a m´dia de 10 n´meros
e e u
lidos e determinar quantos destes n´meros est˜o acima da m´dia.
u a e
Para calcular a m´dia podemos usar o seguinte algoritmo:
e
24
25. Algoritmo
Declare cont,soma,num num´rico
e
cont := 10
soma := 0
Repita
Leia num
soma := soma+num
cont := cont-1
At´ cont=0
e
Escreva soma/10
fim_algoritmo
Problema: Quando os n´meros s˜o lidos n˜o conhecemos ainda o valor
u a a
da m´dia. Ao final do programa anterior n˜o temos mais acesso aos n´meros
e a u
lidos (pois j´ foram lidos). Lˆ-los novamente seria perda de tempo.
a e
Como fazer este algoritmo sem matrizes?
Resposta: Ler os 10 n´meros e guarda-los em 10 vari´veis para testar
u a
uma a uma ap´s obter a m´dia.
o e
Problema: E se fossem 1000 alunos? Teriamos dificuldades de manipular
1000 vari´veis diferentes.
a
Solu¸˜o: uso de uma matriz para armazenar os valores das notas para
ca
posteriormente processa-los.
7.1 Declara¸˜o de Matrizes
ca
Deve-se definir nas declara¸oes:
c˜
1. Quais vari´veis do algoritmo s˜o do tipo matriz;
a a
2. Quantas dimens˜es possui cada uma delas;
o
3. Qual o tamanho de cada dimens˜o;
a
4. O tipo dos componentes individuais da matriz.
Nota¸˜o:
ca
Declare Nome ’(’ tamanho ’)’ tipo
Declare Nome ’(’ tamanho ’,’ tamanho ... ’)’ tipo
25
26. Ex: Declare a(5),m(6,8) num´rico.
e
Conven¸ao: O primeiro ´
c˜ ındice representa a linha e o segundo a coluna.
O menor ´
ındice ´ o 1.
e
7.2 Tratando com Matrizes
Para ler uma matriz ´ necess´rio ler cada um dos seus componentes indivi-
e a
duais.
Ex: Ler 5 elementos da matriz a.
Algoritmo
Declare i,a(5) num´rico
e
i := 1
Enquanto i6
fa¸a
c
Leia a(i)
i:=i+1
fim_enquanto
fim_algoritmo
Observa¸ao: a vari´vel i ´ chamada de ´
c˜ a e ındice.
Ex: Ler os 48 elementos da matriz m(6, 8). Devemos usar duas vari´veis
a
de ´
ındice.
Algoritmo
Declare i,j,m(6,8) num´rico
e
i:=1
Enquanto i7
fa¸a
c
j:=1
Enquanto j9
fa¸a
c
Leia m(i,j)
j:=j+1
fim_enquanto
i:=i+1
fim_enquanto
fim_algoritmo
26
27. Observe que este algoritmo usa dois la¸os aninhados.
c
Ex: Somar os elementos da diagonal principal de m(10, 10), lendo a matriz
antes e escrevendo a soma ao final.
Algoritmo
Declare soma,i,j,m(10,10) num´rico
e
i:=1
Repita
j:=1
Repita
Leia m(i,j)
j:=j+1
at´ j10
e
i:=i+1
at´ i10
e
soma:=0
i:=1
Repita
soma:=soma+m(i,i)
i:=i+1
at´ i10
e
Escreva soma
fim_algoritmo
Exerc.: Calcular a m´dia de 10 alunos de uma disciplina, entrando a
e
nota e o nome do aluno. Determinar o n´mero de alunos que tiveram nota
u
superior a m´dia e imprimir o nome dos alunos que tiveram este feito.
e
Ex. 2.5.1.4. Dado um conjunto de 100 valores num´ricos dispon´
e ıveis na
entrada, fazer um algoritmo para armazen´-los em uma matriz e calcular e
a
imprimir o valor do somat´rio dado a seguir:
o
S = (v1 − v100 )3 + (v2 − v99 )3 + (v3 − v98 )3 + · · · + (v50 − v51 )3
Determinar a posi¸ao, dentro de uma matriz quadrada, de um elemento
c˜
pode ser muito util em alguns tipos de algoritmos. Por exemplo, determi-
´
nar se determinado elemento est´ acima ou abaixo da diagonal principal da
a
matriz.
27
28. Figura 2: Posi¸oes em uma Matriz
c˜
Algumas rela¸˜es s˜o importantes para determinar a posi¸ao dos elemen-
co a c˜
tos de uma matriz quadrada (veja Figura 2).
a11 a12 a13 · · · a1n
a21 a22 a23 · · · a2n
a31 a32 a33 · · · a3n
. . . .. .
.
. .
. .
. . .
.
an1 an2 an3 · · · ann
Sendo i e j os ´
ındices dos elementos da matriz:
• Diagonal principal – i = j;
• Diagonal secund´ria – i + j = n + 1;
a
• Abaixo da diagonal principal – i j;
• Acima da diagonal principal – i j;
• Acima da diagonal secund´ria – i + j n + 1;
a
• Abaixo da diagonal secund´ria – i + j n + 1.
a
Exerc. Escrever um algoritmo para ler um valor n e a seguir ler uma
matriz n × n. Ent˜o, determinar a soma de todos os elementos acima da
a
diagonal principal e imprimi-lo.
Exerc. Escrever um algoritmo para ler uma matriz a de tamanho n × m
e outra matriz b de tamanho m × p. Ent˜o, determinar e imprimir a matriz
a
produto c de tamanho n × p.
m
cij = aik bkj
k=1
28
29. CAR CDR
1 2 3 c nil
a b nil
Figura 3: Representa¸˜o Gr´fica da Lista
ca a
8 Usando Listas
Uma estrutura formada por uma seq¨ˆncia de elementos de tipos diversos ´
ue 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 ´ uma lista com cinco elementos e o quarto elemento da lista ´ uma outra
e e
lista de dois elementos.
Na representa¸˜o interna de lista, cada elemento de uma lista ´ formado
ca e
por um nodo com dois elementos (CAR e CDR – pronuncia-se “cuder”) que
podem ser preenchidos com valores constantes (num´ricos, literais ou l´gicos)
e o
ou elos. Um elo ´ um indicador da posi¸ao de um outro nodo na mem´ria da
e c˜ o
m´quina. Existe um elo especial (nil) que n˜o aponta para nenhum lugar e
a a
´ usado para indicar o fim de uma lista. nil pode indicar tamb´m uma lista
e e
vazia. Observe que uma matriz n˜o pode ser um elemento de uma lista.
a
Exemplo:
[1,2,3,[’a’,’b’],’c’]
seria armazenado internamente na mem´ria da m´quina como ilustrado na
o a
Figura 3.
Comumente se chama a parte CAR de cabe¸a da lista e a parte CDR de
c
resto ou rabo da lista.
29
30. 8.1 Constantes Lista
As constantes listas s˜o qualquer seq¨ˆncia de num´ricos, literais ou l´gicos,
a ue e o
separados por v´ırgulas 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 Opera¸oes com Listas
c˜
Est˜o definidas em nossa linguagem de algoritmos as fun¸oes e opera¸oes
a c˜ c˜
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 interpreta¸˜o gr´fica das opera¸oes CAR e CDR para
ca a c˜
a avalia¸˜o CDR(CAR(CDR([a,[b,[c]],d]))).
ca
8.3 Declara¸˜o de Vari´vel Lista
ca a
Uma vari´vel lista ´ declarada da seguinte forma:
a e
Declare x lista
Podemos agora manipular a vari´vel lista em uma atribui¸ao.
a c˜
Ex:
x := [2,3,4]
x := CONS(1,x)
que resulta em x igual a [1,2,3,4].
Observa¸ao: N˜o podemos atribuir um valor a uma posi¸ao qualquer da
c˜ a c˜
lista. S´ podemos trocar sua cabe¸a:
o c
x := [1,2,3,4]
x := CONS(10,CDR(x))
que resulta em x igual a [10,2,3,4].
30
31. a
primeiro CDR
CAR
b d nil
segundo CDR
nil
c nil
Figura 4: Interpreta¸ao Gr´fica de CAR e CDR
c˜ a
31
32. Opera¸ao
c˜ Significado
CAR(x) Obt´m a cabe¸a de uma lista
e c
(devolve o CAR de x)
CDR(x) Obt´m o resto de uma lista
e
(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-´sima posi¸ao da lista x
e c˜
(o ´
ındice da primeira posi¸ao ´ zero)
c˜ e
TAM(x) Tamanho da lista x
NIL(x) Verifica se a lista ´ vazia
e
(testa se x ´ igual a nil,
e
retornando verdadeiro ou falso)
Tabela 7: Fun¸oes e Opera¸oes sobre Listas
c˜ c˜
8.4 Tratando Listas
Listas s˜o uma estrutura dinˆmica muito poderosa e flex´ para construir
a a ıvel
algoritmos que tratem com situa¸oes em que os dados est˜o constantemente
c˜ a
sendo inseridos e retirados (pilhas e filas s˜o exemplos).
a
Tamb´m s˜o uma boa alternativa `s matrizes, em casos em que o tama-
e a a
nho dos dados ´ conhecido apenas em tempo de execu¸ao. Por exemplo, se
e c˜
desejamos encontrar o n´mero de elementos que s˜o menores que a m´dia de
u a e
um conjunto de num´ricos:
e
32
33. Algoritmo
Declare x,n,i,acum,m num´rico
e
Declare a lista
Escreva ’Entre a quantidade de valores’
Leia n
i := 1
a := nil
acum := 0
Enquanto in+1
fa¸a
c
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~o NIL(a)
a
fa¸a
c
Se a(0)m ent~o acum := acum+1 fim_se
a
a := CDR(a)
fim_enquanto
Escreva acum
fim_algoritmo
Exerc´ıcio: Escreva um trecho de algoritmo que apague o ultimo elemento
´
de uma lista qualquer.
Exerc´ıcio: Escrever um algoritmo que leia uma lista de 10 elementos e
depois apague da lista todos os elementos que forem menores que 100.
33
34. Solu¸˜o:
ca
Algoritmo
Declare x,i num´rico
e
Declare a,b lista
i := 1
a := nil
Enquanto i11
fa¸a
c
Leia x
a := CONS(x,a)
i := i+1
fim_enquanto
i := 1
b := nil
Enquanto N~o NIL(a)
a
fa¸a
c
Se CAR(a)=100
ent~o b:=CONS(CAR(a),b)
a
fim_se
a := CDR(a)
fim_enquanto
Escreva b
fim_algoritmo
Exerc´ıcio: Escreva um trecho de algoritmo que encontre o maior valor de
uma lista de num´ricos.
e
Exerc´ıcio: Escrever um trecho de algoritmo que inverta uma lista.
E se precis´ssemos fazer a concatena¸˜o de duas listas? Assim, se a=[1,2,3]
a ca
e b=[4,5] sua concatena¸ao ser´ [1,2,3,4,5].
c˜ a
Aten¸ao: CONS(a,b) n˜o vai funcionar. Por que?
c˜ a
Exerc´ıcio: Escrever um trecho de algoritmo para concatenar duas listas.
34
35. 9 Sub-algoritmos
Sub-algoritmos s˜o trechos de algoritmos que efetuam um ou mais c´lculos
a a
determinados em sua declara¸ao ou defini¸˜o. Ao inv´s de escrever-se um
c˜ ca e
algoritmo grande, escrevem-se v´rios algoritmos menores, os quais, n˜o iso-
a a
´
ladamente, mas em conjunto, resolvem o problema proposto. E conveniente
usa-los quando uma determinada tarefa ´ efetuada em diversos lugares no
e
mesmo algoritmo. Ao inv´s de escrever-se o mesmo trecho diversas vezes,
e
escreve-se o sub-algoritmo e o mesmo ´ chamado diversas vezes.
e
As vantagens s˜o:
a
• Eles reduzem o tamanho do algoritmo;
• Facilitam a compreens˜o e visualiza¸ao do algoritmo;
a c˜
• Isolam determinadas partes do algoritmo para que possam ser desen-
volvidas e testadas em separado.
O sub-algoritmo ´ definido ap´s as declara¸˜es de vari´veis e antes do
e o co a
corpo principal do algoritmo. Assim, a estrutura dos nossos algoritmos pas-
sar´ a ser:
a
Algoritmo
{ Declara¸oes de vari´veis }
c~ a
{ Defini¸oes de sub-algoritmos }
c~
{ corpo do algoritmo }
fim_algoritmo
Argumentos (ou parˆmetros) s˜o valores enviados ao sub-algoritmo para
a a
serem processados, e/ou recebidos do sub-algoritmo como resultados do pro-
cessamento.
Um sub-algoritmo pode conter declara¸˜es de vari´veis, mas as vari´veis
co a a
declaradas nele (chamadas vari´veis locais do sub-algoritmo) s´ podem ser
a o
acessadas dentro dele. Al´m de suas vari´veis locais, um sub-algoritmo
e a
pode acessar vari´veis declaradas fora dele, no algoritmo principal (chama-
a
das vari´veis globais). Os parˆmetros usados na defini¸ao do sub-algoritmo
a a c˜
s˜o chamados parˆmetros formais, e os parˆmetros usados na chamada do
a a a
sub-algoritmo s˜o chamados de parˆmetros reais.
a a
Ex:
35
36. Algoritmo
Declare a,b num´rico
e
Sub-rotina y(c,d num´ricos)
e
Declare e,f num´rico
e
{ comandos de y }
fim_sub-rotina
Sub-rotina z(e num´rico)
e
Declare f num´rico
e
{ comandos de z }
fim_sub-rotina
y(1,2)
z(10)
fim_algoritmo
Onde: a, b – vari´veis globais (acessadas pelo algoritmo e pelos dois sub-
a
algoritmos);
e, f – vari´veis locais a y (acessadas apenas pelo sub-algoritmo y);
a
c, d – parˆmetros formais de y (usados na hora da chamada de y)
a
declarados como num´ricos;
e
f – variavel local a z (acessada somente pelo sub-algoritmo z, n˜o a
possuindo qualquer rela¸ao com a outra variavel f (local a y);
c˜
e – parˆmetro formal de z, declarado como num´rico;
a e
y(1, 2) – chamada de y com parˆmetros reais 1 e 2 (1 ser´ atribuido a
a a
c e 2 ser´ atribuido a d);
a
z(10) – chamada de z.
Existem v´rios tipos de passagem de parˆmetros para sub-algoritmo:
a a
Passagem por valor Envia um valor para o sub-algoritmo e n˜o retorna
a
valores pelo parˆmetro formal (s´ entrada). No momento da chamada
a o
os valores dos parˆmetros reais s˜o copiados para os parˆmetros formais
a a a
para serem usados dentro do sub-algoritmo sem que se modifiquem os
valores armazenados nos parˆmetros reais. Ex: PASCAL (padr˜o);
a a
Passagem Copia-restaura Envia e recebe valores do sub-algoritmo (en-
trada e sa´
ıda). Na chamada os valores passados s˜o copiados para os
a
parˆmetros formais e usados. Ao final (no retorno do sub-algoritmo)
a
36
37. os valores finais dos parˆmetros formais s˜o copiados de volta nos
a a
parˆmetros reais (´ ´bvio que os parˆmetros reais, neste caso, dever˜o
a eo a a
ser vari´veis);
a
Passagem por referˆncia Envia e recebe valores do sub-algoritmo (en-
e
trada e sa´
ıda) usando uma referˆncia ` vari´vel (n˜o faz c´pia; usa o
e a a a o
pr´prio parˆmetro real dentro do sub-algoritmo). Ex: PASCAL (VAR).
o a
Nos nossos algoritmos usaremos passagem Copia-restaura e por valor.
Indicaremos o tipo copia-restaura antecedendo a palavra reservada CR aos
parˆmetros deste tipo.
a
Existem dois tipos de sub-algoritmos: sub-rotinas (ou procedures) e fun-
¸˜es.
co
9.1 Sub-rotinas
Retornam valores apenas pelos argumentos (caso sejam passados como copia-
restaura).
Declara¸˜o:
ca
sub-rotina nome[’(’lista de par^metros formais’)’]
a
{ declara¸oes locais ` sub-rotina }
c~ a
{ comandos }
fim_sub-rotina
Observe que podemos definir uma sub-rotina sem parˆmetros formais
a
(para qual n˜o precisamos passar nenhum parˆmetro na chamada). Observe
a a
tamb´m que ´ poss´
e e ıvel definir um sub-algoritmo dentro de outro (aninha-
mento), pois n˜o faremos nenhuma restri¸ao ao que pode ser declarado den-
a c˜
tro de um sub-algoritmo. Sub-algoritmos declarados dentro de outros s˜o a
locais a estes (desconhecidos fora).
Ex.: Sub-rotina troca
sub-rotina troca(x,y num´rico)
e
Declare aux num´rico
e
aux:=x
x:=y
y:=aux
fim_sub-rotina
37
38. Esta sub-rotina n˜o funciona. Porque? Resposta: falta definir a passagem
a
de parˆmetros Copia-restaura).
a
sub-rotina troca(CR x,y num´rico)
e
Declare aux num´rico
e
aux:=x
x:=y
y:=aux
fim_sub-rotina
Exemplo: Um algoritmo para ordenar 3 valores em ordem crescente.
Algoritmo
Declare a,b,c : num´rico
e
sub-rotina troca(CR x,y num´rico)
e
Declare aux num´rico
e
aux:=x
x:=y
y:=aux
fim_sub-rotina
Leia a,b,c
Se ab
ent~o troca(a,b)
a
fim_se
Se ac
ent~o troca(a,c)
a
fim_se
Se bc
ent~o troca(b,c)
a
fim_se
Escreva a,b,c
fim_algoritmo
38
39. 9.2 Fun¸oes
c˜
Retornam um valor pelo seu nome (al´m de pelos parˆmetros declarados
e a
como copia-restaura).
Ex: ABS(x), TRUNCA(x) (fun¸oes pr´-definidas)
c˜ e
Declara¸˜o:
ca
fun¸~o tipo nome[’(’lista de par^metros formais’)’]
ca a
{ declara¸oes locais }
c~
{ comandos }
fim_fun¸~o
ca
Observe que devemos declarar o tipo que ser´ retornado pela fun¸˜o.
a ca
Chamada:
a := TRUNCA(3.5)
ou
se SINAL(x)=0 ...
Retorno do valor usando a palavra reservada Retorna.
Ex: Fun¸ao fatorial(n):
c˜
fun¸~o num´rico fatorial(n num´rico)
ca e e
Declare fat num´rico
e
fat:=1
Enquanto n1
fa¸a
c
fat:=fat*n
n:=n-1
fim_enquanto
Retorna fat
fim_fun¸~o
ca
Usando sub-algoritmos:
Ex 3.3: Escrever um algoritmo que leia as medidas dos trˆs lados a, b
e
e c de um paralelep´
ıpedo, calcule e escreva o valor de sua diagonal (veja
Figura 5).
39
40. dia
c
d
b
a
Figura 5: Paralelep´
ıpedo
Ex 3.4: Escrever uma fun¸˜o l´gica que recebe uma vari´vel unidimen-
ca o a
sional M de num´ricos, o n´mero N de elementos de M , e um valor X e
e u
retorne verdadeiro se X pertence a M ou falso em caso contr´rio. a
Como passar uma matriz como parˆmetro real?
a
Resposta: encontra(m(),n,x num´rico) (n˜o indicar seu tamanho –
e a
decidido na hora da chamada).
Ex 3.5: Escrever uma fun¸˜o que calcule a distˆncia entre dois pontos de
ca a
um plano, sendo fornecidas as coordenadas (x1 , y1 ) e (x2 , y2 ).
Exerc´ıcio: Escrever um algoritmo que leia 10 conjuntos de valores x1,y1,
x2, y2, x3 e y3 coordenadas de 10 triangulos e calcule a ´rea dos 10 triangulos,
a
usando a fun¸˜o do exerc´ anterior. Usar duas fun¸oes:
ca ıcio c˜
1. A do exerc´ anterior;
ıcio
2. Uma que chame a anterior trˆs vezes e use a f´rmula do semi-per´
e o ımetro
para calcular a ´rea.
a
Ex 3.6: escrever um algoritmo que:
• Leia v´rios pares de n´meros inteiros positivos, M e P ;
a u
40
41. • calcule e escreva o n´mero de arranjos e combina¸oes de M elementos
u c˜
P a P , dado pelas f´rmulas:
o
M! M!
AP =
M
P
CM =
(M − P )! P (M − P )!
Se M P , por defini¸ao:
c˜
AP = 0 CM = 0
M
P
Ao final de cada c´lculo de um par ´ perguntado se deseja continuar. A
a e
resposta deve ser ’S’ ou ’N’.
Exerc. Utilizando as seguintes s´ries, com 20 termos:
e
x2 x3
ex = 1 + x + + + ···
2! 3!
x−1 1 x−1 2 x−1 3
ln(x) = + 1/2 + 1/3 + ···
x x x
Fa¸a um algoritmo que gere uma tabela de x, ex , e ln(x), para x variando
c
entre 1 e 100 com intervalos de 0.5 (x = 1, x = 1.5, x = 2, . . . , x = 100).
Defina sub-algoritmos onde for necess´rio.
a
Solu¸˜o (observe as fun¸˜es aninhadas e seu escopo):
ca co
Algoritmo
Declare x num´rico
e
{ declara¸oes das fun¸oes }
c~ c~
x := 1
Repita
Escreva x,’ ’,exp2(x),’ ’,ln2(x)
x := x+0.5
at´ x100
e
fim_algoritmo
41
42. Fun¸oes:
c˜
Fun¸~o num´rico exp2(x num´rico)
ca e e
Declare soma,ind num´rico
e
Fun¸~o num´rico fatorial(n num´rico)
ca e e
Declare fat num´rico
e
fat := 1
Enquanto n1
fa¸a
c
fat := fat*n
n := n-1
fim_enquanto
Retorna fat
fim_fun¸~o
ca
soma := 1
ind := 1
Repita
soma := soma+(x**ind)/fatorial(ind)
ind := ind+1
at´ ind19
e
Retorna soma
fim_fun¸~o
ca
Fun¸~o num´rico ln2(x num´rico)
ca e e
Declare soma,ind num´rico
e
soma := 0
ind := 1
Repita
soma := soma+(((x-1)/x)**ind)/ind
ind := ind+1
at´ ind20
e
Retorna soma
fim_fun¸~o
ca
Observe que o la¸o da fun¸˜o exp2 tem como condi¸ao de parada ind19,
c ca c˜
pois ser˜o somados 20 termos e o primeiro ´ 1 e j´ foi somado (soma := 1).
a e a
42
43. Exerc. A partir das seguintes s´ries do sin e cos, e usando fun¸˜es, escreva
e co
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 m´ximo de 0.0001 (≈ m´dulo do ultimo termo).
a o ´
x3 x5 x7
sin(x) = x − + − + ···
3! 5! 7!
x2 x4 x6
cos(x) = 1 − + − + ···
2! 4! 6!
Rela¸˜es:
co
sin(x) 1 1 1
tan(x) = cot(x) = sec(x) = csc(x) =
cos(x) tan(x) cos(x) sin(x)
Solu¸˜o:
ca
Algoritmo
Declare x num´rico
e
{ declara¸oes de fun¸oes }
c~ c~
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
at´ x1.5
e
fim_algoritmo
Fun¸oes:
c˜
Fun¸~o num´rico fatorial(n num´rico)
ca e e
Declare fat,cont num´rico
e
cont := 1
fat := 1
Repita
fat := fat*cont
cont := cont+1
at´ contn
e
Retorna fat
fim_fun¸~o
ca
43
44. Fun¸~o num´rico sen(x num´rico)
ca e e
Declare acum,soma,ind,termo,sinal num´rico
e
acum := 0
ind := 1
sinal := 1
Enquanto abs(termo)0.0001
fa¸a
c
termo := sinal*(x**ind)/fatorial(ind)
acum := acum+termo
sinal := -sinal
ind := ind+2
fim_enquanto
Retorna acum
fim_fun¸~o
ca
Fun¸~o num´rico cos(x num´rico)
ca e e
Declare acum,ind,termo,sinal num´rico
e
acum := 1
ind := 2
sinal := -1
Enquanto abs(termo)0.0001
fa¸a
c
termo := sinal*(x**ind)/fatorial(ind)
acum := acum+termo
ind := ind+2
sinal := -sinal
fim_enquanto
Retorna acum
fim_fun¸~o
ca
10 Recursividade
Uma fun¸ao ´ dita recursiva quando cont´m, em seu corpo, uma chamada a si
c˜ e e
mesma (este tipo de recursividade ´ chamada recursividade direta). S˜o uti-
e a
lizadas quando ´ poss´ decompor o problema a ser resolvido em problemas
e ıvel
menores, um dos quais ´ semelhante ao problema inicial.
e
44
45. Ex.: Fatorial.
n! = n × (n − 1) × (n − 2) · · · 3 × 2 × 1
Uma forma recursiva de definir o fatorial ´:
e
fat(n) = 1 n=0∨n=1 (Base)
fat(n) = n × fat(n − 1) n1 (Passo recursivo)
Outro ex.: A soma dos n´meros de 1 a n pode ser definida de forma
u
recursiva como:
soma(1) = 1
soma(n) = n + soma(n − 1) n1
A soma dos n´meros ´
u ımpares de 1 a n pode ser definida 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 fun¸ao fatorial definida recursivamente:
c˜
Fun¸~o num´rico fatorial(n num´rico)
ca e e
Se n=0 OU n=1
ent~o Retorna 1
a
sen~o Retorna n*fatorial(n-1)
a
fim_se
fim_fun¸~o
ca
A execu¸˜o desta fun¸˜o para uma chamada fatorial(3) ´ a mostrada
ca ca e
na Figura 6.
Exerc.: Definir recursivamente a fun¸ao que devolve a soma dos n´meros
c˜ u
´
ımpares de 1 a n.
Exerc.: Definir recursivamente a fun¸ao que determina o n-´simo termo
c˜ e
da s´rie de fibonacci (veja a Tabela 8).
e
45
47. Solu¸˜o:
ca
Fun¸~o num´rico fibonacci(n num´rico)
ca e e
Se n=0 OU n=1
ent~o Retorna n
a
sen~o Retorna fibonacci(n-1)+fibonacci(n-2)
a
fim_se
fim_fun¸~o
ca
Exerc.: Considere uma seq¨ˆncia de n´meros onde cada termo ´ dado pela
ue u e
combina¸˜o dos 4 termos anteriores An = An−4 +2×An−3 +3×An−2 +4×An−1
ca
e os 4 primeiros termos s˜o por defini¸ao:
a c˜
A1 = 1 A2 = 2 A3 = 3 A4 = 4
Escreva uma fun¸˜o recursiva SEQ que receba um n´mero n e retorne o
ca u
termo An .
Solu¸˜o:
ca
Fun¸~o num´rico seq(n num´rico)
ca e e
Se n=4
ent~o Retorna n
a
sen~o Retorna seq(n-4)+2*seq(n-3)+3*seq(n-2)+4*seq(n-1)
a
fim_se
fim_fun¸~o
ca
Exerc.: Dois n´meros s˜o amigos entre si, se a soma dos divisores de cada
u a
um deles ´ igual ao outro. Exemplo, 220 e 284:
e
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
48. Fa¸a um algoritmo que leia dois n´meros e verifique se s˜o amigos.
c u a
Solu¸˜o:
ca
Algoritmo
Declare a,b num´rico
e
{ declara¸ao de fun¸oes }
c~ c~
Leia a,b
Se a=soma(b) E b=soma(a)
entao Escreva ’S~o amigos’
a
sen~o Escreva ’N~o s~o amigos’
a a a
fim_se
fim_algoritmo
Fun¸oes com solu¸ao n˜o recursiva:
c˜ c˜ a
Fun¸~o num´rico soma(n num´rico)
ca e e
Declare aux,ind num´rico
e
ind := 1
aux := 0
Repita
Se resto(n,ind)=0
ent~o aux := aux+ind
a
fim_se
ind := ind+1
at´ ind=n
e
Retorna aux
fim_fun¸~o
ca
Solu¸˜o recursiva (chamar soma(n,n-1)):
ca
Fun¸~o num´rico soma(num,cont num´rico)
ca e e
Se cont=1
ent~o Retorna 1
a
sen~o
a
Se RESTO(num,cont)=0
ent~o Retorna cont+soma(num,cont-1)
a
sen~o Retorna soma(num,cont-1)
a
fim_se
fim_se
fim_fun¸~o
ca
48
49. A B C
Figura 7: Torre de Hanoi
Exemplo: Torre de Hanoi (objetivo ´ mover os trˆs discos de A para C,
e e
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
Solu¸˜o (chamar move(3,1,3,2)):
ca
Sub-rotina move(num,origem,destino,interm num´rico)
e
Se num=1
ent~o Escreva ’move de ’,origem,’ para ’,destino
a
sen~o
a
move(num-1,origem,interm,destino)
move(1,origem,destino,interm)
move(num-1,interm,destino,origem)
49
50. 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 come¸ando em qualquer casa;
c
O problema das oito rainhas Colocar oito rainhas em um tabuleiro sem
que nenhuma ataque a outra.
11 Algoritmos de Ordena¸˜o
ca
Os algoritmos de ordena¸˜o (ou classifica¸˜o) permitem ordenar os dados em
ca ca
alguma ordem (crescente ou decrescente). Podem ser aplicados sobre dados
num´ricos ou alfab´ticos (neste caso deve-se associar uma ordem entre os
e e
simbolos alfab´ticos).
e
11.1 BUBLE SORT
´
E um tipo de algoritmo de ordena¸ao por troca com tempo de ordena¸ao
c˜ c˜
2
proporcional a O(N ) 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 ¸˜
SELECAO DIRETA
´
E um tipo de algoritmo de ordena¸ao por sele¸˜o com tempo de ordena¸˜o
c˜ ca ca
2
proporcional a O(N ) compara¸˜es.
co
. 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
51. Implementa¸ao:
c˜
Sub-rotina selec(vet(),inic,fim num´rico)
e
Declare elem,pos num´rico
e
Se inicfim
ent~o
a
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 ´ uma fun¸˜o que encontra o menor elemento e devolve seu ´
e ca ındice
na matriz.
Exerc´ıcio: Reescrever esta sub-rotina usando listas. Escrever tamb´m a
e
fun¸ao menor para este caso.
c˜
Exerc´ıcio: Implementar o Buble Sort.
11.3 QUICK SORT
´
E um tipo de algoritmo de ordena¸ao por troca e parti¸˜o com tempo de or-
c˜ ca
dena¸ao proporcional a O(n log2 n). Baseia-se no princ´ que ´ mais r´pido
c˜ ıpio e a
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
compara¸ao. O elemento de compara¸ao ´, normalmente, o primeiro ele-
c˜ c˜ e
mento do vetor. Depois o algoritmo ´ repetido para as duas partes, obtendo
e
a ordena¸ao completa.
c˜
O particionador come¸a em ambas as extremidades do vetor efetuando
c
trocas para colocar os elementos menores e maiores que o de compara¸ao em
c˜
seus lugares.
Exemplo de particionamento:
51
52. 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 num´rico
e
Declare x1,x2 lista
{ fun¸ao concat }
c~
{ 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
Fun¸ao concat:
c˜
Fun¸~o concat(x1,x2 lista) lista
ca
Se NIL(x1)
ent~o
a
Retorna x2
sen~o
a
Retorna CONS(CAR(x1),concat(CDR(x1),x2))
fim_se
fim_fun¸~o
ca
52
53. Fun¸oes auxiliares de partic:
c˜
Fun¸~o adiciona_final(l lista, e num´rico) lista
ca e
Se NIL(l)
ent~o
a
Retorna CONS(e,nil)
sen~o
a
Retorna CONS(CAR(l),adicional_final(CDR(l),e))
fim_fun¸~o
ca
Fun¸~o retira_ultimo(l lista) lista
ca
Se NIL(CDR(l))
ent~o
a
Retorna nil
sen~o
a
Retorna CONS(CAR(l),retira_ultimo(CDR(l)))
fim_se
fim_fun¸~o
ca
Particionador:
53
54. sub-rotina partic(x lista, CR x1 lista, CR elem num´rico,
e
CR x2 lista)
Declare esq l´gico
o
{ fun¸oes auxiliares }
c~
elem := x(0)
x := CDR(x)
esq := verdadeiro
x1 := nil
x2 := nil
Enquanto N~o NIL(x)
a
fa¸a
c
Se esq
ent~o
a
Se elemx(TAM(x)-1)
ent~o
a
x1 := concat(x1,CONS(x(TAM(x)-1),nil))
x := retira_ultimo(x)
esq := falso
sen~o
a
x2 := CONS(x(TAM(x)-1),x2)
x := retira_ultimo(x)
fim_se
sen~o
a
Se elemx(0)
ent~o
a
x2 := CONS(x(0),x2)
x := CDR(x)
esq := verdadeiro
sen~o
a
x1 := adiciona_final(x1,x(0))
x := CDR(x)
fim_se
fim_se
fim_enquanto
fim_sub-rotina
54
55. 12 Programa¸˜o Funcional
ca
Com os recursos de manipula¸ao de listas que j´ temos em nossa linguagem e
c˜ a
com alguns outros recursos podemos implementar programa¸˜o funcional em
ca
nossa linguagem. Programa¸ao funcional ´ um paradigma de programa¸ao
c˜ e c˜
em que as principais entidades s˜o fun¸˜es e listas. Programa¸ao funcio-
a co c˜
nal se baseia na avalia¸ao de express˜es simb´licas. Este paradigma est´
c˜ o o a
plenamente representado na linguagem de programa¸˜o LISP.
ca
Algumas caracter´ısticas de programa¸ao funcional pura:
c˜
• N˜o existe declara¸ao de tipos. Todos os dados s˜o dinˆmicos e a
a c˜ a a
linguagem efetua convers˜es de tipo impl´
o ıcitas;
• Homogeneidade das estruturas;
• N˜o h´ la¸os de repeti¸ao, apenas recursividade;
a a c c˜
• Baseado em nota¸˜o-λ (fun¸oes-λ).
ca c˜
A estrutura b´sica de programa¸ao funcional ´ o ´tomo que pode ser
a c˜ e a
num´rico ou literal (embora n˜o precise ser declarado como tal). Um par
e a
de elementos com lado esquerdo (CAR) e lado direito (CDR) ´ chamado
e
express˜o-S. A fun¸ao CONS serve para construir express˜es-S.
a c˜ o
12.1 Declara¸˜o de Fun¸˜es Lambda
ca co
Para declarar uma fun¸ao lambda:
c˜
Fun¸~o lambda nome’(’lista de par^metros’)’ ’(’ {defini¸ao} ’)’
ca a c~
Ex:
Fun¸~o lambda cuder(x)(CDR(x))
ca
Observe que n˜o ´ necess´rio declarar nenhum tipo de dado.
a e a
12.2 Estruturas de Programa¸˜o Funcional
ca
Substituindo a estrutura “Se-ent˜o-sen˜o” tradicional, existe uma fun¸˜o
a a ca
COND, que recebe trˆs argumentos:
e
COND(condi¸~o,fun¸ao 1,fun¸~o 2)
ca c~ ca
55