Algoritmos

5,745 views

Published on

Curso de 1 semestre de algoritmos e programação

Published in: Technology
0 Comments
1 Like
Statistics
Notes
  • Be the first to comment

No Downloads
Views
Total views
5,745
On SlideShare
0
From Embeds
0
Number of Embeds
3
Actions
Shares
0
Downloads
156
Comments
0
Likes
1
Embeds 0
No embeds

No notes for slide

Algoritmos

  1. 1. Algoritmos Carlos A. P. Campani 6 de setembro de 2006 Sum´rio a 1 Introdu¸˜o ca 2 2 Conceitos B´sicos a 3 2.1 Comando de Escrita . . . . . . . . . . . . . . . . . . . . . . . 4 2.2 Constantes . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 6 2.3 Vari´veis . . . . . . . . a . . . . . . . . . . . . . . . . . . . . . . 6 2.4 Atribui¸ao . . . . . . . c˜ . . . . . . . . . . . . . . . . . . . . . . 7 2.5 Comando de Leitura . . . . . . . . . . . . . . . . . . . . . . . 8 2.6 Express˜es Aritm´ticas o e . . . . . . . . . . . . . . . . . . . . . . 10 2.7 Express˜es L´gicas . . o o . . . . . . . . . . . . . . . . . . . . . . 13 3 Estrutura Condicional 14 4 Estrutura de Repeti¸˜o ca 16 5 Algoritmos com Acumulador 19 6 Refinamentos Sucessivos 21 7 Usando Matrizes 24 7.1 Declara¸ao de Matrizes . . . . . . . . . . . . . . . . . . . . . . 25 c˜ 7.2 Tratando com Matrizes . . . . . . . . . . . . . . . . . . . . . . 26 1
  2. 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. 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. 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. 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. 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. 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. 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. 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. 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. 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. 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. 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. 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. 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. 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. 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. 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. 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. 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. 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. 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. 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. 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. 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. 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. 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. 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. 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. 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. 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. 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. 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. 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. 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. 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. 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. 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. 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. 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. 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. 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. 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. 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. 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
  46. 46. fatorial(3) 3 ∗ fatorial(2) /3×2=6 / 6 8 qqq qqq qqq qqq 2 ∗ fatorial(1) /2×1=2 6 mmmmm mmmmm mmm fatorial(1) = 1 Figura 6: Execu¸ao de fatorial(3) c˜ n fibonacci(n) 0 0 1 1 2 1 3 2 4 3 5 5 6 8 . . . . . . Tabela 8: Tabela do Fibonacci 46
  47. 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. 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. 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. 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. 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. 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. 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. 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. 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

×