60
Algoritmos Carlos A. P. Campani 6 de setembro de 2006 Sum´ ario 1 Introdu¸c˜ ao 2 2 Conceitos B´ asicos 3 2.1 Comando de Escrita ....................... 4 2.2 Constantes ............................. 6 2.3 Vari´ aveis .............................. 6 2.4 Atribui¸c˜ ao ............................. 7 2.5 Comando de Leitura ....................... 8 2.6 Express˜oesAritm´ eticas ...................... 10 2.7 Express˜oesL´ogicas ........................ 13 3 Estrutura Condicional 14 4 Estrutura de Repeti¸c˜ ao 16 5 Algoritmos com Acumulador 19 6 Refinamentos Sucessivos 21 7 Usando Matrizes 24 7.1 Declara¸c˜ ao de Matrizes ...................... 25 7.2 Tratando com Matrizes ...................... 26 1

Algoritmos

Embed Size (px)

DESCRIPTION

Curso de 1 semestre de algoritmos e programação

Citation preview

Page 1: Algoritmos

Algoritmos

Carlos A. P. Campani

6 de setembro de 2006

Sumario

1 Introducao 2

2 Conceitos Basicos 32.1 Comando de Escrita . . . . . . . . . . . . . . . . . . . . . . . 42.2 Constantes . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 62.3 Variaveis . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 62.4 Atribuicao . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 72.5 Comando de Leitura . . . . . . . . . . . . . . . . . . . . . . . 82.6 Expressoes Aritmeticas . . . . . . . . . . . . . . . . . . . . . . 102.7 Expressoes Logicas . . . . . . . . . . . . . . . . . . . . . . . . 13

3 Estrutura Condicional 14

4 Estrutura de Repeticao 16

5 Algoritmos com Acumulador 19

6 Refinamentos Sucessivos 21

7 Usando Matrizes 247.1 Declaracao de Matrizes . . . . . . . . . . . . . . . . . . . . . . 257.2 Tratando com Matrizes . . . . . . . . . . . . . . . . . . . . . . 26

1

Page 2: Algoritmos

8 Usando Listas 298.1 Constantes Lista . . . . . . . . . . . . . . . . . . . . . . . . . 308.2 Operacoes com Listas . . . . . . . . . . . . . . . . . . . . . . . 308.3 Declaracao de Variavel Lista . . . . . . . . . . . . . . . . . . . 308.4 Tratando Listas . . . . . . . . . . . . . . . . . . . . . . . . . . 32

9 Sub-algoritmos 359.1 Sub-rotinas . . . . . . . . . . . . . . . . . . . . . . . . . . . . 379.2 Funcoes . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 39

10 Recursividade 44

11 Algoritmos de Ordenacao 5011.1 BUBLE SORT . . . . . . . . . . . . . . . . . . . . . . . . . . 5011.2 SELECAO DIRETA . . . . . . . . . . . . . . . . . . . . . . . 5011.3 QUICK SORT . . . . . . . . . . . . . . . . . . . . . . . . . . . 51

12 Programacao Funcional 5512.1 Declaracao de Funcoes Lambda . . . . . . . . . . . . . . . . . 5512.2 Estruturas de Programacao Funcional . . . . . . . . . . . . . . 5512.3 Escrevendo Funcoes . . . . . . . . . . . . . . . . . . . . . . . . 56

Bibliografia

• FARRER, H. et alii. Algoritmos Estruturados. Rio de Janeiro, EditoraGuanabara, 1989;

• WIRTH, N. Programacao Sistematica. Rio de Janeiro, Ed. Campus,1978.

1 Introducao

Algoritmos sao ferramentas importantes no estudo de ciencia da computacao.A compreensao das tecnicas de desenvolvimento e construcao de algoritmose uma ferramenta valiosa, nao so para o aprendizado de linguagens de pro-gramacao, mas para o estudo das mais variadas disciplinas da area. Umexemplo poderia ser dado se lembrarmos que boa parte da teoria matematica

2

Page 3: Algoritmos

da computacao baseia-se no conceito de “algoritmo”, como uma ideia primi-tiva.

Nesta disciplina, desenvolveremos os algoritmos usando uma linguagemhipotetica, cuja estrutura e funcionamento serao descritos ao longo do desen-volvimento da disciplina. A linguagem adotada aqui foi projetada para quefosse facil a implementacao dos exemplos apresentados em uma linguagem deprogramacao usual, particularmente visando Python como linguagem alvo.

2 Conceitos Basicos

Algoritmo e a descricao de um conjunto de comandos que, efetuados, resul-tam numa sucessao finita de acoes. Uma outra forma: Algoritmo e umalista de instrucoes (comandos) ordenadas que tem por finalidade resolverum determinado problema. Exemplos de algoritmos: Uma receita culinaria;Instrucoes para montar algo.

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 nao esta detalhado. Uma versao mais aceitavel e:

1. Retirar um ovo da geladeira;

2. Colocar a frigideira no fogo;

3. Colocar oleo;

4. Esperar ate o oleo ficar quente;

5. Quebrar o ovo separando a casca;

6. Colocar o conteudo na frigideira;

7. Esperar um minuto;

8. Retirar o ovo da frigideira;

9. Apagar o fogo.

3

Page 4: Algoritmos

Esta versao e mais completa e detalhada que a anterior. Para que umalgoritmo possa ser executado e necessario que seu usuario conheca a termi-nologia nele utilizada. No exemplo anterior, para que o algoritmo seja util,e necessario que o usuario conheca o significado dos verbos Retirar, Colocar,Esperar assim como dos substantivos utilizados.

Os algoritmos estudados em aula serao algoritmos computacionais, listasde 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 programacaochama-se sintaxe da linguagem de programacao.

Os algoritmos estudados na disciplina de Algoritmos serao desenvolvidosutilizando uma sintaxe que sera apresentada progressivamente ao longo dosemestre. Esta sintaxe pode ser chamada de portugues estruturado e osalgoritmos nela desenvolvidos podem ser facilmente adaptaveis as diversaslinguagens de programacao existentes.

A forma geral dos algoritmos a ser adotada em aula e:

Algoritmo

{ lista-de-comandos }

fim_algoritmo

onde { lista-de-comandos } e uma lista com um ou mais comandos. Notea endentacao dos comandos dentro do ambiente Algoritmo-fim_algoritmo.

Vamos imaginar uma maquina virtual que executa os comandos de nossosalgoritmos, lendo os dados de uma entrada fictıcia, e imprimindo os resulta-dos em uma tela virtual. Embora esta maquina nao exista no mundo real,com ela poderemos mentalmente executar os nossos algoritmos. Com relati-vamente pouca dificuldade e possıvel traduzir os algoritmos de sala de aulapara uma linguagem de programacao real.

2.1 Comando de Escrita

O comando de escrita e utilizado quando se deseja que o algoritmo escrevaalgo. Esta “escrita” pode ser em uma impressora, um terminal de vıdeo ououtra saıda qualquer. O formato do comando e:

Escreva { lista-de-express~oes }

4

Page 5: Algoritmos

onde { lista-de-express~oes } e uma lista de uma ou mais expressoes euma expressao pode ser uma constante, uma expressao aritmetica, variavelou chamada de funcao.

Ex: (dica: use endentacao)

Algoritmo

Escreva ’Jo~ao Vitor’,’ ’,’Luana’ Escreva ’1’

Escreva 1 + 2

fim_algoritmo

Ao ser executado este algoritmo o resultado sera:

Jo~ao Vitor Luana

1

3

O exemplo e composto de tres comandos de escrita. Observe que podemoscolocar mais de um comando por linha (opcao nao muito interessante poisesconde a estrutura do algoritmo e confunde a sua leitura).

O primeiro comando manda escrever uma lista de tres constantes, nosegundo deve escrever uma constante e no terceiro deve escrever o resultadode uma expressao aritmetica. Quando um comando de escrita tiver mais deum valor a ser escrito como no primeiro, os diversos valores sao separadospor vırgula.

Observe que ’Jo~ao Vitor’ e um literal, ou seja, tudo que estiver entredois ’ sera impresso exatamente da forma com que esta escrito. A utilidadedo ’ ’ e efetuar a separacao entre os diversos termos a serem impressos jaque o comando Escreva imprime os termos sem espacos entre eles.

Ex2:

Algoritmo

Escreva ’Jo~ao Vitor’,’Luana’

Escreva 1+2

Escreva ’1+2’

fim_algoritmo

Produzindo:

Jo~ao VitorLuana

3

1+2

5

Page 6: Algoritmos

Observe o efeito da ausencia de ’ ’ entre ’Jo~ao Vitor’ e ’Luana’.Os comandos como Algoritmo e fim_algoritmo sao chamados palavras

reservadas da linguagem. A linguagem trata maiusculas e minusculas comoiguais.

2.2 Constantes

Uma constante e um valor que nao se modifica com o tempo. As constan-tes com que trabalharemos podem ser de tres tipos diferentes, numericas,logicas ou literais. Constantes numericas podem conter quaisquer valoresnumericos, reais ou inteiros, positivos ou negativos, etc. Exemplos de cons-tantes numericas sao:

25

3.14

-2.57

-0.0003

-10

Constantes literais podem conter um ou mais caracteres alfabeticos ounumericos. Sao delimitados por aspas. Exemplos de constantes literais sao:

’Jose da Silva’

’1245’

’1 2 3 de oliveira’

Constantes logicas podem conter somente dois valores, verdadeiro efalso. Normalmente sao utilizadas em testes em algoritmos.

2.3 Variaveis

Uma variavel e um valor que pode ser alterado em um algoritmo. Cadavariavel tem um nome associado a ela que a identifica. O identificador deuma variavel deve comecar por uma letra e pode conter letras ou dıgitos. Ex:

A

X5

Joao

6

Page 7: Algoritmos

Assim como as constantes as variaveis tambem podem ser de tres tipos:numericas, logicas ou literais.

Para utilizar uma variavel em um algoritmo e necessario que ela sejadeclarada no inıcio do algoritmo, ou seja, defina-se no inıcio do algoritmoqual o tipo de valor com que a variavel ira trabalhar ( numerico, logico ouliteral ). O formato do comando de declaracao e:

Declare <lista de identificadores> <tipo das variaveis>

Ex:

Declare Nota,Codigo,X5 Numerico

Declare Teste,Sim Logico

Declare Nome,End1,End2 Literal

Assim, a forma geral de um algoritmo passa a ser:

Algoritmo

{ declarac~oes }

{ corpo do algoritmo }

fim_algoritmo

2.4 Atribuicao

Uma variavel pode armazenar qualquer valor e seu valor pode ser alterado aqualquer momento no algoritmo. O comando utilizado para alterar o valorde uma variavel e o comando de atribuicao. Sua forma geral e a seguinte:

<identificador de variavel> := <express~ao>

onde <express~ao> pode ser uma constante, expressao aritmetica, variavelou chamada de funcao. Por exemplo:

A := 5

O comando acima (le-se “A recebe cinco”) faz com que a variavel A passea valer 5. O valor anterior da variavel A e perdido e seu novo valor passa aser 5.

Assim, por exemplo:

{A=10}

A := 5

{A=5}

7

Page 8: Algoritmos

E fica perdido o valor anterior da variavel (10).Entao, como trocar dois valores? Resposta: Usando uma variavel auxiliar.

Ex: trocar os valores de a e b.

aux := a

a := b

b:= aux

Outros exemplos de atribuicao sao:

A := 3 + 2

A := B

X5 := A + 1

No primeiro exemplo a variavel A recebe o resultado da expressao aritmetica3 + 2, expressao esta que contem somente constantes. No segundo exemplo avariavel A recebe o conteudo da variavel B e no terceiro exemplo a variavel X5recebe o resultado da expressao aritmetica A + 1, expressao esta que contema variavel A e a constante 1.

Um exemplo interessante:

{A=10}

A := A+1

{A=11}

Ou seja, a expressao A+1 e avaliada, tendo como resultado 10 + 1 = 11 e ovalor e atribuido a variavel A.

2.5 Comando de Leitura

O comando de leitura e utilizado quando o algoritmo deve receber um valorexterno, por exemplo, de um teclado. Seu formato geral e:

Leia <lista-de-variaveis>

Este comando faz com que a primeira variavel da lista receba o primeirovalor digitado no teclado, a segunda variavel receba o segundo valor e assimpor diante.

Ex:

Leia A,B

8

Page 9: Algoritmos

Ao executar este comando o computador espera que sejam fornecidos doisvalores na entrada virtual ( p.ex: 10 e 20 ). A variavel A recebera entao oprimeiro valor (10) e a variavel B recebera o segundo valor (20).

Ex 2.8 - Escrever um algoritmo que le tres numeros, calcula as mediasaritmetica, harmonica e geometrica e escreve os numeros lidos e as mediascalculadas.

MA =A + B + C

3MG = 3

√A×B × C MH =

31A

+ 1B

+ 1C

Ex 2.9 - Escrever um algoritmo que le o nome de um funcionario, onumero do funcionario, seu numero de horas trabalhadas, o valor que recebepor hora, o numero de filhos com idade menor que 14 anos e calcula o salariodeste funcionario.

Ex 2.10 - Escrever um algoritmo que calcula o fatorial de 5.Ex 2.11 - Escrever um algoritmo que le tres valores, a, b e c e calcula:

1. A area do triangulo que tem a por base e b por altura;

2. A area do cırculo de raio c;

3. A area do trapezio que tem a e b por bases e c por altura;

4. A area do quadrado de lado b;

5. A area do retangulo de lados a e b;

6. A area da superfıcie de um cubo que tem c por aresta.

Ex 2.12 - Escrever um algoritmo que escreve os numeros ımpares entre10 e 20.

Ex 2.13 - Escrever um algoritmo que le p, u e r, respectivamente o primeirotermo de uma progressao aritmetica, o ultimo termo da progressao e a razaodesta progressao. Determinar a soma dos termos desta progressao aritmetica.

soma =an + a1

2× n n =

an − a1

r+ 1

Ex 2.14 - Escrever um algoritmo que le o codigo da peca 1, o numero depecas 1, o valor unitario da peca 1, o codigo da peca 2, o numero de pecas2, o valor unitario da peca 2 e a percentagem do IPI a ser acrescentado ecalcula o valor total a ser pago.

9

Page 10: Algoritmos

Operacao Sımbolo Precedencia

Adicao + 3Subtracao - 3

Multiplicacao * 2Divisao / 2

Potenciacao ** 1

Tabela 1: Operacoes Aritmeticas

2.6 Expressoes Aritmeticas

Para que uma expressao possa ser avaliada em um algoritmo ela deve seguiruma sintaxe bem definida. As operacoes utilizadas nas expressoes aritmeticasem nossa linguagem sao as mostradas na Tabela 1 junto com as suas pre-cedencias. A precedencia dos operadores indica a ordem que eles serao ava-liados em uma expressao.

A precedencia dos operadores e relevante para o resultado da avaliacaode uma expressao. Por exemplo, a avaliacao da expressao 3 + 4 * 2 poderesultar 14 se a soma for efetuada em primeiro lugar ou 11 se a multiplicacaofor efetuada em primeiro lugar. Para isto se define a prioridade das operacoes.Ao avaliar uma expressao primeiro sao efetuada as potenciacoes, apos sao efe-tuadas as multiplicacoes e divisoes e por fim as adicoes e subtracoes. Quandohouverem duas operacoes de mesma prioridade para serem efetuadas, a or-dem de execucao e da esquerda para a direita.

E possıvel alterar a ordem de execucao das operacoes em uma expressaocom o uso de parenteses. Em uma expressao com parenteses em primeirolugar sao efetuadas as operacoes entre parenteses.

Ex: Expressao para o calculo das raızes de uma equacao de segundo grausegundo a formula de Bascara (usar o - unario).

X1 := (-B+(B**2-4*A*C)**(1/2))/(2*A)

X2 := (-B-(B**2-4*A*C)**(1/2))/(2*A)

Alem das operacoes acima descritas a nossa ’linguagem’ oferece as funcoespre-definidas da Tabela 2.

Ex: ABS(-2)= 2, QUOCIENTE(7,2)= 3, RESTO(5,2)= 1, TRUNCA(3.9)=3, ARREDONDA(3.4)= 3 e ARREDONDA(3.5)= 4.

10

Page 11: Algoritmos

Funcao Especificacao

LOG(x) logaritmo de x na base 10LN(x) logaritmo natural de xEXP(x) e elevado na x-esima potenciaABS(x) modulo ( valor absoluto ) de x

TRUNCA(x) valor inteiro de xARREDONDA(x) inteiro mais proximo a x

SINAL(x) −1 se x < 00 se x = 01 se x > 0

QUOCIENTE(x,y) quociente inteiro da divisao de x por yRESTO(x,y) resto da divisao inteira de x por y

Tabela 2: Funcoes Pre-definidas

Ex 2.16 - Escrever um algoritmo para calcular os sucessivos valores deE usando a serie abaixo considerando primeiro 3 termos, depois 4 termos efinalmente 5 termos:

E =1

1!+

1

2!+

1

3!+

1

4!

Ex 2.17 - Escrever um algoritmo que le o valor de um emprestimo ecalcula o valor de cada amortizacao considerando 24 amortizacoes a umataxa de 48%. Depois fazer o mesmo algoritmo lendo os valores da taxa e donumero de amortizacoes.

VAMORT = VEMPREST× TAXA/NAMORT

onde VAMORT e o valor da amortizacao, VEMPREST e o valor do empres-timo, TAXA e a taxa, e NAMORT e o numero de amortizacoes.

Ex 2.18 - Escrever um algoritmo que le um valor em cruzeiros e calculaqual o menor numero possıvel de notas de 5000, 1000, 500, 200, 100, 50, 10,5 e 1 em que o valor lido pode ser decomposto. Escrever o valor lido e arelacao de notas necessarias.

Ex 2.19 - Escrever um algoritmo que le o numero do vendedor, o seusalario fixo, o total de vendas por ele efetuadas e o percentual que ganhasobre o total de vendas. Calcular o salario total do vendedor. Escrever onumero do vendedor e o salario total.

11

Page 12: Algoritmos

Ex 2.20 - Escrever um algoritmo que le 3 valores a, b e c que sao lados deum triangulo e calcule a area deste triangulo.

area =√

s(s− a)(s− b)(s− c)

onde s = (a + b + c)/2 (semi-perımetro).Ex 2.21 - Um sistema de equacoes lineares do tipo:

{ax + by = cdx + ey = f

pode ser resolvido segundo mostrado abaixo:

x =ce− bf

ae− bdy =

af − cd

ae− bd

Escrever um algoritmo que le os coeficientes a, b, c, d, e, e f , e calcula eescreve os valores de x e y.

Ex 2.22 - O custo ao consumidor, de um carro novo, e a soma do custode fabrica com a porcentagem do distribuidor e dos impostos ( aplicados aocusto de fabrica ). Supondo que a percentagem do distribuidor seja de 28%e os impostos de 45%, escrever um algoritmo para ler o custo de fabrica deum carro e escrever o custo ao consumidor. Depois fazer o mesmo algoritmolendo os valores da porcentagem do distribuidor e dos impostos.

Ex 2.23 - Uma revendedora de carros usados paga a seus funcionariosvendedores, um salario fixo por mes, mais uma comissao tambem fixa paracada carro vendido e mais 5% do valor das vendas por ele efetuadas. Escreverum algoritmo que le o nome do vendedor, o numero do vendedor, o numerode carros por ele vendidos, o valor total de suas vendas, o salario fixo e ovalor que recebe por carro vendido e calcula o salario mensal do vendedor,escrevendo-o juntamente com o seu nome e seu numero de identificacao.

Ex 2.24 - Considerando que o aumento dos funcionarios e de 80% do INPCe mais um percentual de produtividade discutido com a empresa. Escreverum algoritmo que le o nome do funcionario, o numero do funcionario, seusalario atual, o valor do INPC e o ındice de produtividade conquistado eescreve o nome do funcionario, seu aumento e o valor do novo salario.

Ex 2.25 - Escrever um algoritmo que le 3 valores a, b e c e os escreve.Encontre a seguir o maior dos tres valores e o escreva com a mensagem: ”Eo maior”.

maior =a + b + |a− b|

2

12

Page 13: Algoritmos

Relacional Significado

= Igual a<> ou 6= Diferente de

> Maior que< Menor que>= Maior ou igual a<= Menor ou igual a

Tabela 3: Relacionais

Operador Significado

N~ao Inverte o valor logico do operandoE Verdadeiro se e somente se os

dois opeandos sao verdadeirosOu Verdadeiro se pelo menos um dos

dois operandos e verdadeiro

Tabela 4: Operadores Logicos

2.7 Expressoes Logicas

Expressoes logicas sao expressoes que avaliadas resultam em um valor logico( verdadeiro ou falso ). Assim como as expressoes aritmeticas elas tambemdispoem de um conjunto de operadores, sımbolos e prioridades. Os operado-res sao divididos em operadores relacionais e operadores logicos.

Operadores relacionais atuam sobre operandos numericos mas resultamem valores logicos. Sao operadores de comparacao entre dois operandos. ATabela 3

Operadores logicos atuam sobre valores logicos e resultam em valoreslogicos (veja Tabela 4).

Exemplos de expressoes logicas:

A > 0 E B > 3

Teste OU A * B > C

A precedencia de operadores da nossa linguagem e apresentada na Ta-bela 5.

13

Page 14: Algoritmos

Operador Precedencia

Operadores Aritmeticos 1Operadores Relacionais 2

Nao 3E 4

OU 5

Tabela 5: Operadores e suas Precedencias

Ex: Se A = 1, B = 2 e C = 2 qual o resultado da avaliacao da expressaoseguinte?

A + B = 0 E C <> 0

3 = 0 E C <> 0

Falso E Verdadeiro

Falso

3 Estrutura Condicional

Utilizada quando um trecho de algoritmo so deve ser executado em determi-nadas condicoes. Formas Gerais:

1. Se <condic~ao>

ent~ao <lista-de-comandos>

fim_se

2. Se <condic~ao>

ent~ao <lista-de-comandos>

sen~ao <lista-de-comandos>

fim_se

onde <condic~ao> e uma expressao logica qualquer.Ex:

Se a>b

ent~ao Escreva a

sen~ao Escreva b

fim_se

14

Page 15: Algoritmos

Ao ser executado este comando a expressao a > b e avaliada e depen-dendo do resultado da avaliacao e executado o primeiro comando (escrevaa) ou o segundo comando (escreva b). Observe que as estruturas podem ser“aninhadas”.

Ex2:

Se a<>b

ent~ao Se a>b

ent~ao Escreva ’a maior que b’

sen~ao Escreva ’a menor que b’

fim_se

sen~ao Escreva ’a igual a b’

fim_se

Ex3: Algoritmo que calcula a raiz da equacao y = ax + b.

Algoritmo

Declare A,B,X numerico

Leia A,B

Se A = 0

ent~ao Escreva ’N~ao ha raizes’

sen~ao X := -B/A

Escreva ’Raiz=’,X

fim_se

fim_algoritmo

15

Page 16: Algoritmos

Ex4: Algoritmo que calcula as raizes da equacao y = ax2 + bx + c.

Algoritmo

Declare A,B,C,Delta numerico

Leia A,B,C

Delta := B**2-4*A*C

Se Delta = 0

ent~ao Escreva ’So ha uma raiz’,-B/(2*A)

fim_se

Se Delta < 0

ent~ao Escreva ’ha duas raizes complexas’

Escreva -B/(2*A),’+-’,ABS((-Delta)**0.5/(2*A)),’J’

fim_se

Se Delta > 0

ent~ao Escreva ’Ha duas raizes reais’

Escreva (-B+Delta**0.5)/(2*A),’ E ’,\

(-B-(Delta**0.5))/(2*A)

fim_se

fim_algoritmo

Observe o \ no algoritmo. Ele serve para indicar que a linha continua naseguinte. Isto e util quando a linha de um algoritmo e muito grande.

4 Estrutura de Repeticao

Utilizada quando um trecho de um algoritmo deve ser repetido um deter-minado numero de vezes. Esta estrutura tambem e chamada de laco derepeticao. Forma geral:

1. Enquanto <condic~ao>

faca { lista-de-comandos }

fim_enquanto

2. Repita

{ lista de comandos }

ate <condic~ao>

16

Page 17: Algoritmos

Na primeira forma os comandos sao executados repetitivamente enquantoa condicao e verdadeira, e a condicao e testada antes (pode nao executar ne-nhuma vez). Na segunda forma os comandos sao executados repetitivamenteate a condicao tornar-se verdadeira (testa depois de executar, assim sempree executado pelo menos uma vez).

Ex: Escrever os numeros de 1 a 10.

Algoritmo

Declare I numerico

I := 1

Repita

Escreva I

I := I + 1

ate I > 10

fim_algoritmo

A variavel I e quem controla o numero de repeticoes do laco. E chamadavariavel contadora. Uma variavel contadora e uma variavel que recebe umvalor inicial, e incrementada de um valor constante no laco e tem seu valortestado em algum ponto do laco. Ao chegar a um determinado valor o laco einterrompido. A inicializacao da variavel contadora deve ir, necessariamente,fora do laco.

Existem diversas maneiras de implementar o mesmo laco, mas todo lacocom variavel de controle deve conter:

• inicializacao;

• incremento (ou decremento);

• teste de valor final.

Abaixo sao mostradas outras tres maneiras de implementar o algoritmoanterior:

17

Page 18: Algoritmos

1. Algoritmo

Declare I numerico

I := 0

Repita

I := I + 1

Escreva I

ate I = 10

fim_algoritmo

2. Algoritmo

Declare I numerico

I := 0

Enquanto I < 10

faca

I := I + 1

Escreva I

fim_enquanto

fim_algoritmo

3. Algoritmo

Declare I numerico

I := 1

Enquanto I < 11

faca

Escreva I

I := I + 1

fim_enquanto

fim_algoritmo

Ainda existe uma possibilidade adicional de abandonar um laco de re-peticao (tanto o Repita quanto o Enquanto) em qualquer lugar por meio deum comando Interrompa:

18

Page 19: Algoritmos

Enquanto verdadeiro

faca

Leia x

Se x>0 ent~ao Interrompa fim_se

Escreva ’Valor invalido’

Escreva ’Digite novamente’

fim_enquanto

significando que o laco (condicao de parada do laco e verdadeiro) sera in-terrompido (pelo comando Interrompa) apenas quando o usuario fornecerum numero maior que zero.

Ex. 4.7 Escrever um algoritmo que gera e escreve os numeros imparesentre 100 e 200.

Exerc. Escrever um algoritmo para calcular o fatorial de um numero.

5 Algoritmos com Acumulador

Quando o algoritmo necessitar efetuar alguma totalizacao usa-se uma variavelchamada acumulador. A variavel acumuladora tambem deve ser inicializada(normalmente com zero) e pode ser incrementada ou nao de um valor variavelno laco.

Ex: Somar os numeros de 1 a 10.

S := 0

I := 0

Enquanto I<10

faca

I := I + 1

S := S + I

fim_enquanto

Assim, os valores de S e I ao longo da execucao do algoritmo sao mostra-dos na Tabela 6.

Ex. 4.6 - Escrever um algoritmo que le 5 valores para a, um de cada vez,e conta quantos destes valores sao negativos, escrevendo esta informacao.

Ex. 4.8 - Escrever um algoritmo que le 10 valores, um de cada vez,e conta quantos deles estao no intervalo [10,20] e quantos deles estao foradeste intervalo, escrevendo estas informacoes.

19

Page 20: Algoritmos

Volta do laco Valor de I (ao final) Valor de S (ao final)

1 1 12 2 33 3 64 4 10...

......

10 10 55

Tabela 6: Execucao Programa de Soma

Ex. 4.9 - Escrever um algoritmo que le um numero nao conhecido de va-lores, um de cada vez, e conta quantos deles estao em cada um dos intervalos[0,25], (25,50], (50,75], (75,100].

Ex. 4.10 - Escrever um algoritmo semelhante ao anterior que calcula asmedias aritmeticas de cada intervalo e as escreve, juntamente com o numerode valores de cada intervalo.

Exercıcio: A serie de Fibonacci e uma sequencia de numeros em que osdois primeiros sao 0 e 1 e a partir daı cada numero e a soma dos anteriores,ou seja

tn = tn−1 + tn−2

Escrever um algoritmo que escreve os 10 primeiros termos da serie.Ex. 4.11 - Escrever um algoritmo que gera os 10 primeiros termos da

Serie de Fibonacci e calcula e escreve a soma destes termos.Exercıcio: Escrever um algoritmo que leia um numero N e escreva o

numero de divisores de N.

20

Page 21: Algoritmos

Algoritmo

Declare N,acum,I numerico

Leia N

acum := 0

I := 1

Repita

Se Resto(N,I)=0

entao acum := acum+1

fim_se

I := I+1

ate I>N

escreva acum

fim_algoritmo

Escrever um algoritmo que leia um numero e escreva uma mensagemdizendo: “O numero e primo” ou “O numero nao e primo” conforme o caso.

Ex. 4.12 - Escrever um algoritmo que gera os 30 primeiros termos daserie de Fibonacci e escreve os termos gerados com a mensagem: “E primo”ou “Nao e primo” conforme o caso.

6 Refinamentos Sucessivos

E uma tecnica para desenvolver um algoritmo em diversos passos aumentandoo nıvel de detalhamento a cada passo. A partir do problema gerar umapossıvel solucao e detalha-la ate um nıvel aceitavel.

Ex: Escrever um algoritmo que leia um numero e escreva a mensagem “Eprimo” ou “Nao e primo”. Primeira Versao:

Algoritmo

Declare numero

Leia numero

{Verifica se numero e primo}

Se {numero e primo}

ent~ao escreva ’numero e primo’

sen~ao escreva ’numero n~ao e primo’

fim_se

fim_algoritmo

21

Page 22: Algoritmos

Detalhamentos:

{ Verifica se numero e primo }

Um numero e primo se e divisıvel somente por si e pela unidade (1). Umamaneira de descobrir isto e contando o numero de divisores do numero. Sepossuir apenas dois divisores (1 e o proprio numero ) ele e primo.

{ Verifica se numero e primo } ⇒ { Conta numero de divisores }{ Conta numero de divisores }

acum := 0

i := 1

Repita

Se Resto(Numero,i)=0

ent~ao acum:=acum+1

fim_se

i:=i+1

ate i>numero

{ Numero e primo }

Se acum=2

ent~ao...

O refinamento para { Conta numero de divisores } nao e bom, por-que basta verificar que existem mais de dois divisores do numero para elenao ser primo. Assim, rebatizando { Conta numero de divisores } para{ Verifica se ha mais de dois divisores }, obtemos, usando o coman-do Interrompa:

{ Verifica se ha mais de dois divisores }

acum := 1

i := 1

Enquanto i <= TRUNCA(numero/2)

Faca

Se Resto(Numero,i)=0

ent~ao acum:=acum+1

fim_se

Se acum>2 ent~ao Interrompa fim_se

i:=i+1

fim_enquanto

22

Page 23: Algoritmos

Principal

rrffffffffffffffffffffffffff

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

²²{ Verifica se ha mais de dois divisores }

Figura 1: Diagrama de Refinamentos para o Exemplo

Isto melhora a performance do algoritmo, pois ele abandona o laco assimque percebe que ja existem mais de dois divisores e faz divisoes apenas ateTRUNCA(numero/2).

A Figura 1 apresenta o diagrama de refinamentos para este exemplo.Montando as partes obtemos a versao final:

Algoritmo

Declare numero,i,acum numerico

Leia numero

acum := 1

i := 1

Enquanto i <= TRUNCA(numero/2)

Faca

Se Resto(Numero,i)=0

ent~ao acum:=acum+1

fim_se

Se acum>2 ent~ao Interrompa fim_se

i:=i+1

fim_enquanto

Se acum=2

ent~ao escreva ’numero e primo’

sen~ao escreva ’numero n~ao e primo’

fim_se

fim_algoritmo

23

Page 24: Algoritmos

Usar refinamentos sucessivos:Ex 1.12.30. Escrever um algoritmo para gerar e escrever uma tabela

com os valores do seno de um angulo A em radianos, utilizando a serie deMac-Laurin truncada com 20 termos:

sin(A) =A1

1!− A3

3!+

A5

5!− A7

7!· · ·

Os valores dos angulos A devem variar de 0.0 a 6.3 de 0.1 em 0.1.Exerc.: Repetir o exercıcio anterior, truncando a serie considerando uma

precisao de 0,0001 na aproximacao obtida (dica: considere o valor absolutodo ultimo termo).

Ex. 1.12.40. Fazer um algoritmo que calcule e escreva o cosseno de Ausando a serie truncada com 20 termos:

cos(A) = 1− A2

2!+

A4

4!− A6

6!+

A8

8!· · ·

Ex. 1.12.32. O valor aproximado de ? pode ser calculado usando-se aserie:

S =1

13− 1

33+

1

53− 1

73+

1

93· · ·

sendo π ≈ 3√

S × 32. Fazer um algoritmo para calcular e escrever o valor deπ com 51 termos.

7 Usando Matrizes

Matriz e um conjunto de variaveis, cada uma podendo representar o valorde uma constante, como se fossem variaveis simples, mas todas elas com-partilhando um nome comum. Indices sao associados a este nome comumpermitindo individualizar os elementos do conjunto.

Ex: conjunto de 5 elementos e nome a

a1 a2 a3 a4 a5

Qual e a utilidade dos matrizes? Resposta: Tratar com dados em seriedo mesmo tipo.

Ex: Deseja-se calcular a media de notas de 10 alunos e determinar quantosficaram acima da media. Portanto, deve-se calcular a media de 10 numeroslidos e determinar quantos destes numeros estao acima da media.

Para calcular a media podemos usar o seguinte algoritmo:

24

Page 25: Algoritmos

Algoritmo

Declare cont,soma,num numerico

cont := 10

soma := 0

Repita

Leia num

soma := soma+num

cont := cont-1

Ate cont=0

Escreva soma/10

fim_algoritmo

Problema: Quando os numeros sao lidos nao conhecemos ainda o valorda media. Ao final do programa anterior nao temos mais acesso aos numeroslidos (pois ja foram lidos). Le-los novamente seria perda de tempo.

Como fazer este algoritmo sem matrizes?Resposta: Ler os 10 numeros e guarda-los em 10 variaveis para testar

uma a uma apos obter a media.Problema: E se fossem 1000 alunos? Teriamos dificuldades de manipular

1000 variaveis diferentes.Solucao: uso de uma matriz para armazenar os valores das notas para

posteriormente processa-los.

7.1 Declaracao de Matrizes

Deve-se definir nas declaracoes:

1. Quais variaveis do algoritmo sao do tipo matriz;

2. Quantas dimensoes possui cada uma delas;

3. Qual o tamanho de cada dimensao;

4. O tipo dos componentes individuais da matriz.

Notacao:

Declare <Nome> ’(’ <tamanho> ’)’ <tipo>

Declare <Nome> ’(’ <tamanho> ’,’ <tamanho> ... ’)’ <tipo>

25

Page 26: Algoritmos

Ex: Declare a(5),m(6,8) numerico.Convencao: O primeiro ındice representa a linha e o segundo a coluna.

O menor ındice e o 1.

7.2 Tratando com Matrizes

Para ler uma matriz e necessario ler cada um dos seus componentes indivi-duais.

Ex: Ler 5 elementos da matriz a.

Algoritmo

Declare i,a(5) numerico

i := 1

Enquanto i<6

faca

Leia a(i)

i:=i+1

fim_enquanto

fim_algoritmo

Observacao: a variavel i e chamada de ındice.Ex: Ler os 48 elementos da matriz m(6, 8). Devemos usar duas variaveis

de ındice.

Algoritmo

Declare i,j,m(6,8) numerico

i:=1

Enquanto i<7

faca

j:=1

Enquanto j<9

faca

Leia m(i,j)

j:=j+1

fim_enquanto

i:=i+1

fim_enquanto

fim_algoritmo

26

Page 27: Algoritmos

Observe que este algoritmo usa dois lacos aninhados.Ex: Somar os elementos da diagonal principal de m(10, 10), lendo a matriz

antes e escrevendo a soma ao final.

Algoritmo

Declare soma,i,j,m(10,10) numerico

i:=1

Repita

j:=1

Repita

Leia m(i,j)

j:=j+1

ate j>10

i:=i+1

ate i>10

soma:=0

i:=1

Repita

soma:=soma+m(i,i)

i:=i+1

ate i>10

Escreva soma

fim_algoritmo

Exerc.: Calcular a media de 10 alunos de uma disciplina, entrando anota e o nome do aluno. Determinar o numero de alunos que tiveram notasuperior a media e imprimir o nome dos alunos que tiveram este feito.

Ex. 2.5.1.4. Dado um conjunto de 100 valores numericos disponıveis naentrada, fazer um algoritmo para armazena-los em uma matriz e calcular eimprimir o valor do somatorio dado a seguir:

S = (v1 − v100)3 + (v2 − v99)

3 + (v3 − v98)3 + · · ·+ (v50 − v51)

3

Determinar a posicao, dentro de uma matriz quadrada, de um elementopode ser muito util em alguns tipos de algoritmos. Por exemplo, determi-nar se determinado elemento esta acima ou abaixo da diagonal principal damatriz.

27

Page 28: Algoritmos

Figura 2: Posicoes em uma Matriz

Algumas relacoes sao importantes para determinar a posicao dos elemen-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 secundaria – i + j = n + 1;

• Abaixo da diagonal principal – i > j;

• Acima da diagonal principal – i < j;

• Acima da diagonal secundaria – i + j < n + 1;

• Abaixo da diagonal secundaria – i + j > n + 1.

Exerc. Escrever um algoritmo para ler um valor n e a seguir ler umamatriz n × n. Entao, determinar a soma de todos os elementos acima dadiagonal principal e imprimi-lo.

Exerc. Escrever um algoritmo para ler uma matriz a de tamanho n×me outra matriz b de tamanho m× p. Entao, determinar e imprimir a matrizproduto c de tamanho n× p.

cij =m∑

k=1

aikbkj

28

Page 29: Algoritmos

CAR CDR

3 nil

nila

1 2 c

b

Figura 3: Representacao Grafica da Lista

8 Usando Listas

Uma estrutura formada por uma sequencia de elementos de tipos diversos echamada de lista. Importante observar que um elemento de uma lista podeser outra lista.

Por exemplo:

[1,2,3,[’a’,’b’],’c’]

que e uma lista com cinco elementos e o quarto elemento da lista e uma outralista de dois elementos.

Na representacao interna de lista, cada elemento de uma lista e formadopor um nodo com dois elementos (CAR e CDR – pronuncia-se “cuder”) quepodem ser preenchidos com valores constantes (numericos, literais ou logicos)ou elos. Um elo e um indicador da posicao de um outro nodo na memoria damaquina. Existe um elo especial (nil) que nao aponta para nenhum lugar ee usado para indicar o fim de uma lista. nil pode indicar tambem uma listavazia. Observe que uma matriz nao pode ser um elemento de uma lista.

Exemplo:

[1,2,3,[’a’,’b’],’c’]

seria armazenado internamente na memoria da maquina como ilustrado naFigura 3.

Comumente se chama a parte CAR de cabeca da lista e a parte CDR deresto ou rabo da lista.

29

Page 30: Algoritmos

8.1 Constantes Lista

As constantes listas sao qualquer sequencia de numericos, literais ou logicos,separados por vırgulas e delimitados por [ e ]. Uma constante lista pode terem um ou mais de seus termos outras listas e assim por diante. Ex:

[1,2,[’a’,’b’,[1,’b’]],3]

8.2 Operacoes com Listas

Estao definidas em nossa linguagem de algoritmos as funcoes e operacoessobre listas da Tabela 7. Ex:

CAR(CDR([1,2,3]))=2

CDR(CDR([’a’,’b’,’c’,’d’]))=[’c’,’d’]

CDR(CAR(CDR([1,[2,3],4])))=[3]

CONS(’a’,[’b’,’c’])=[’a’,’b’,’c’]

CONS(’a’,nil)=[’a’]

CONS([1,2],[’a’,’b’])=[[1,2],’a’,’b’]

NIL([1,2])=falso

[1,2,3,4,5](2)=3

A Figura 4 apresenta a interpretacao grafica das operacoes CAR e CDR paraa avaliacao CDR(CAR(CDR([a,[b,[c]],d]))).

8.3 Declaracao de Variavel Lista

Uma variavel lista e declarada da seguinte forma:

Declare x lista

Podemos agora manipular a variavel lista em uma atribuicao.Ex:

x := [2,3,4]

x := CONS(1,x)

que resulta em x igual a [1,2,3,4].Observacao: Nao podemos atribuir um valor a uma posicao qualquer da

lista. So podemos trocar sua cabeca:

x := [1,2,3,4]

x := CONS(10,CDR(x))

que resulta em x igual a [10,2,3,4].

30

Page 31: Algoritmos

a

b d nil

nil

nilc

primeiro CDR

CAR

segundo CDR

Figura 4: Interpretacao Grafica de CAR e CDR

31

Page 32: Algoritmos

Operacao Significado

CAR(x) Obtem a cabeca de uma lista(devolve o CAR de x)

CDR(x) Obtem o resto de uma lista(devolve a lista CDR de x)

CONS(x,y) Constroi um nodo tendo comoCAR x, e como CDR y

(segundo argumento deve ser uma lista)x(i) Devolve a i-esima posicao da lista x

(o ındice da primeira posicao e zero)TAM(x) Tamanho da lista x

NIL(x) Verifica se a lista e vazia(testa se x e igual a nil,

retornando verdadeiro ou falso)

Tabela 7: Funcoes e Operacoes sobre Listas

8.4 Tratando Listas

Listas sao uma estrutura dinamica muito poderosa e flexıvel para construiralgoritmos que tratem com situacoes em que os dados estao constantementesendo inseridos e retirados (pilhas e filas sao exemplos).

Tambem sao uma boa alternativa as matrizes, em casos em que o tama-nho dos dados e conhecido apenas em tempo de execucao. Por exemplo, sedesejamos encontrar o numero de elementos que sao menores que a media deum conjunto de numericos:

32

Page 33: Algoritmos

Algoritmo

Declare x,n,i,acum,m numerico

Declare a lista

Escreva ’Entre a quantidade de valores’

Leia n

i := 1

a := nil

acum := 0

Enquanto i<n+1

faca

Escreva ’Entre com valor ’,i

Leia x

a := CONS(x,a)

i := i+1

acum:=acum+x

fim_enquanto

m := acum/n

acum := 0

Enquanto N~ao NIL(a)

faca

Se a(0)<m ent~ao acum := acum+1 fim_se

a := CDR(a)

fim_enquanto

Escreva acum

fim_algoritmo

Exercıcio: Escreva um trecho de algoritmo que apague o ultimo elementode uma lista qualquer.

Exercıcio: Escrever um algoritmo que leia uma lista de 10 elementos edepois apague da lista todos os elementos que forem menores que 100.

33

Page 34: Algoritmos

Solucao:

Algoritmo

Declare x,i numerico

Declare a,b lista

i := 1

a := nil

Enquanto i<11

faca

Leia x

a := CONS(x,a)

i := i+1

fim_enquanto

i := 1

b := nil

Enquanto N~ao NIL(a)

faca

Se CAR(a)>=100

ent~ao b:=CONS(CAR(a),b)

fim_se

a := CDR(a)

fim_enquanto

Escreva b

fim_algoritmo

Exercıcio: Escreva um trecho de algoritmo que encontre o maior valor deuma lista de numericos.

Exercıcio: Escrever um trecho de algoritmo que inverta uma lista.E se precisassemos fazer a concatenacao de duas listas? Assim, se a=[1,2,3]

e b=[4,5] sua concatenacao sera [1,2,3,4,5].Atencao: CONS(a,b) nao vai funcionar. Por que?Exercıcio: Escrever um trecho de algoritmo para concatenar duas listas.

34

Page 35: Algoritmos

9 Sub-algoritmos

Sub-algoritmos sao trechos de algoritmos que efetuam um ou mais calculosdeterminados em sua declaracao ou definicao. Ao inves de escrever-se umalgoritmo grande, escrevem-se varios algoritmos menores, os quais, nao iso-ladamente, mas em conjunto, resolvem o problema proposto. E convenienteusa-los quando uma determinada tarefa e efetuada em diversos lugares nomesmo algoritmo. Ao inves de escrever-se o mesmo trecho diversas vezes,escreve-se o sub-algoritmo e o mesmo e chamado diversas vezes.

As vantagens sao:

• Eles reduzem o tamanho do algoritmo;

• Facilitam a compreensao e visualizacao do algoritmo;

• Isolam determinadas partes do algoritmo para que possam ser desen-volvidas e testadas em separado.

O sub-algoritmo e definido apos as declaracoes de variaveis e antes docorpo principal do algoritmo. Assim, a estrutura dos nossos algoritmos pas-sara a ser:

Algoritmo

{ Declarac~oes de variaveis }

{ Definic~oes de sub-algoritmos }

{ corpo do algoritmo }

fim_algoritmo

Argumentos (ou parametros) sao valores enviados ao sub-algoritmo paraserem processados, e/ou recebidos do sub-algoritmo como resultados do pro-cessamento.

Um sub-algoritmo pode conter declaracoes de variaveis, mas as variaveisdeclaradas nele (chamadas variaveis locais do sub-algoritmo) so podem seracessadas dentro dele. Alem de suas variaveis locais, um sub-algoritmopode acessar variaveis declaradas fora dele, no algoritmo principal (chama-das variaveis globais). Os parametros usados na definicao do sub-algoritmosao chamados parametros formais, e os parametros usados na chamada dosub-algoritmo sao chamados de parametros reais.

Ex:

35

Page 36: Algoritmos

Algoritmo

Declare a,b numerico

Sub-rotina y(c,d numericos)

Declare e,f numerico

{ comandos de y }

fim_sub-rotina

Sub-rotina z(e numerico)

Declare f numerico

{ comandos de z }

fim_sub-rotina

y(1,2)

z(10)

fim_algoritmo

Onde: a, b – variaveis globais (acessadas pelo algoritmo e pelos dois sub-algoritmos);

e, f – variaveis locais a y (acessadas apenas pelo sub-algoritmo y);c, d – parametros formais de y (usados na hora da chamada de y)

declarados como numericos;f – variavel local a z (acessada somente pelo sub-algoritmo z, nao

possuindo qualquer relacao com a outra variavel f (local a y);e – parametro formal de z, declarado como numerico;y(1, 2) – chamada de y com parametros reais 1 e 2 (1 sera atribuido a

c e 2 sera atribuido a d);z(10) – chamada de z.

Existem varios tipos de passagem de parametros para sub-algoritmo:

Passagem por valor Envia um valor para o sub-algoritmo e nao retornavalores pelo parametro formal (so entrada). No momento da chamadaos valores dos parametros reais sao copiados para os parametros formaispara serem usados dentro do sub-algoritmo sem que se modifiquem osvalores armazenados nos parametros reais. Ex: PASCAL (padrao);

Passagem Copia-restaura Envia e recebe valores do sub-algoritmo (en-trada e saıda). Na chamada os valores passados sao copiados para osparametros formais e usados. Ao final (no retorno do sub-algoritmo)

36

Page 37: Algoritmos

os valores finais dos parametros formais sao copiados de volta nosparametros reais (e obvio que os parametros reais, neste caso, deveraoser variaveis);

Passagem por referencia Envia e recebe valores do sub-algoritmo (en-trada e saıda) usando uma referencia a variavel (nao faz copia; usa oproprio parametro real dentro do sub-algoritmo). Ex: PASCAL (VAR).

Nos nossos algoritmos usaremos passagem Copia-restaura e por valor.Indicaremos o tipo copia-restaura antecedendo a palavra reservada CR aosparametros deste tipo.

Existem dois tipos de sub-algoritmos: sub-rotinas (ou procedures) e fun-coes.

9.1 Sub-rotinas

Retornam valores apenas pelos argumentos (caso sejam passados como copia-restaura).

Declaracao:

sub-rotina <nome>[’(’<lista de parametros formais>’)’]

{ declarac~oes locais a sub-rotina }

{ comandos }

fim_sub-rotina

Observe que podemos definir uma sub-rotina sem parametros formais(para qual nao precisamos passar nenhum parametro na chamada). Observetambem que e possıvel definir um sub-algoritmo dentro de outro (aninha-mento), pois nao faremos nenhuma restricao ao que pode ser declarado den-tro de um sub-algoritmo. Sub-algoritmos declarados dentro de outros saolocais a estes (desconhecidos fora).

Ex.: Sub-rotina troca

sub-rotina troca(x,y numerico)

Declare aux numerico

aux:=x

x:=y

y:=aux

fim_sub-rotina

37

Page 38: Algoritmos

Esta sub-rotina nao funciona. Porque? Resposta: falta definir a passagemde parametros Copia-restaura).

sub-rotina troca(CR x,y numerico)

Declare aux numerico

aux:=x

x:=y

y:=aux

fim_sub-rotina

Exemplo: Um algoritmo para ordenar 3 valores em ordem crescente.

Algoritmo

Declare a,b,c : numerico

sub-rotina troca(CR x,y numerico)

Declare aux numerico

aux:=x

x:=y

y:=aux

fim_sub-rotina

Leia a,b,c

Se a>b

ent~ao troca(a,b)

fim_se

Se a>c

ent~ao troca(a,c)

fim_se

Se b>c

ent~ao troca(b,c)

fim_se

Escreva a,b,c

fim_algoritmo

38

Page 39: Algoritmos

9.2 Funcoes

Retornam um valor pelo seu nome (alem de pelos parametros declaradoscomo copia-restaura).

Ex: ABS(x), TRUNCA(x) (funcoes pre-definidas)Declaracao:

func~ao <tipo> <nome>[’(’<lista de parametros formais’)’]

{ declarac~oes locais }

{ comandos }

fim_func~ao

Observe que devemos declarar o tipo que sera retornado pela funcao.Chamada:

a := TRUNCA(3.5)

ou

se SINAL(x)<=0 ...

Retorno do valor usando a palavra reservada Retorna.Ex: Funcao fatorial(n):

func~ao numerico fatorial(n numerico)

Declare fat numerico

fat:=1

Enquanto n>1

faca

fat:=fat*n

n:=n-1

fim_enquanto

Retorna fat

fim_func~ao

Usando sub-algoritmos:Ex 3.3: Escrever um algoritmo que leia as medidas dos tres lados a, b

e c de um paralelepıpedo, calcule e escreva o valor de sua diagonal (vejaFigura 5).

39

Page 40: Algoritmos

c

a

bd

dia

Figura 5: Paralelepıpedo

Ex 3.4: Escrever uma funcao logica que recebe uma variavel unidimen-sional M de numericos, o numero N de elementos de M , e um valor X eretorne verdadeiro se X pertence a M ou falso em caso contrario.

Como passar uma matriz como parametro real?Resposta: encontra(m(),n,x numerico) (nao indicar seu tamanho –

decidido na hora da chamada).Ex 3.5: Escrever uma funcao que calcule a distancia entre dois pontos de

um plano, sendo fornecidas as coordenadas (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 area dos 10 triangulos,usando a funcao do exercıcio anterior. Usar duas funcoes:

1. A do exercıcio anterior;

2. Uma que chame a anterior tres vezes e use a formula do semi-perımetropara calcular a area.

Ex 3.6: escrever um algoritmo que:

• Leia varios pares de numeros inteiros positivos, M e P ;

40

Page 41: Algoritmos

• calcule e escreva o numero de arranjos e combinacoes de M elementosP a P , dado pelas formulas:

APM =

M !

(M − P )!CP

M =M !

P (M − P )!

Se M < P , por definicao:

APM = 0 CP

M = 0

Ao final de cada calculo de um par e perguntado se deseja continuar. Aresposta deve ser ’S’ ou ’N’.

Exerc. Utilizando as seguintes series, com 20 termos:

ex = 1 + x +x2

2!+

x3

3!+ · · ·

ln(x) =(

x− 1

x

)1

+ 1/2(

x− 1

x

)2

+ 1/3(

x− 1

x

)3

+ · · ·

Faca um algoritmo que gere uma tabela de x, ex, e ln(x), para x variandoentre 1 e 100 com intervalos de 0.5 (x = 1, x = 1.5, x = 2, . . . , x = 100).Defina sub-algoritmos onde for necessario.

Solucao (observe as funcoes aninhadas e seu escopo):

Algoritmo

Declare x numerico

{ declarac~oes das func~oes }

x := 1

Repita

Escreva x,’ ’,exp2(x),’ ’,ln2(x)

x := x+0.5

ate x>100

fim_algoritmo

41

Page 42: Algoritmos

Funcoes:

Func~ao numerico exp2(x numerico)

Declare soma,ind numerico

Func~ao numerico fatorial(n numerico)

Declare fat numerico

fat := 1

Enquanto n>1

faca

fat := fat*n

n := n-1

fim_enquanto

Retorna fat

fim_func~ao

soma := 1

ind := 1

Repita

soma := soma+(x**ind)/fatorial(ind)

ind := ind+1

ate ind>19

Retorna soma

fim_func~ao

Func~ao numerico ln2(x numerico)

Declare soma,ind numerico

soma := 0

ind := 1

Repita

soma := soma+(((x-1)/x)**ind)/ind

ind := ind+1

ate ind>20

Retorna soma

fim_func~ao

Observe que o laco da funcao exp2 tem como condicao de parada ind>19,pois serao somados 20 termos e o primeiro e 1 e ja foi somado (soma := 1).

42

Page 43: Algoritmos

Exerc. A partir das seguintes series do sin e cos, e usando funcoes, escrevaum 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 valoresdo sin e do cos com erro maximo de 0.0001 (≈ modulo do ultimo termo).

sin(x) = x− x3

3!+

x5

5!− x7

7!+ · · ·

cos(x) = 1− x2

2!+

x4

4!− x6

6!+ · · ·

Relacoes:

tan(x) =sin(x)

cos(x)cot(x) =

1

tan(x)sec(x) =

1

cos(x)csc(x) =

1

sin(x)

Solucao:

Algoritmo

Declare x numerico

{ declarac~oes de func~oes }

x := 0.5

Repita

Escreva x,’ ’,sen(x),’ ’,cos(x),’ ’,sen(x)/cos(x),’ ’,\

cos(x)/sen(x),’ ’,1/cos(x),’ ’,1/sen(x)

x := x+0.1

ate x>1.5

fim_algoritmo

Funcoes:

Func~ao numerico fatorial(n numerico)

Declare fat,cont numerico

cont := 1

fat := 1

Repita

fat := fat*cont

cont := cont+1

ate cont>n

Retorna fat

fim_func~ao

43

Page 44: Algoritmos

Func~ao numerico sen(x numerico)

Declare acum,soma,ind,termo,sinal numerico

acum := 0

ind := 1

sinal := 1

Enquanto abs(termo)>0.0001

faca

termo := sinal*(x**ind)/fatorial(ind)

acum := acum+termo

sinal := -sinal

ind := ind+2

fim_enquanto

Retorna acum

fim_func~ao

Func~ao numerico cos(x numerico)

Declare acum,ind,termo,sinal numerico

acum := 1

ind := 2

sinal := -1

Enquanto abs(termo)<0.0001

faca

termo := sinal*(x**ind)/fatorial(ind)

acum := acum+termo

ind := ind+2

sinal := -sinal

fim_enquanto

Retorna acum

fim_func~ao

10 Recursividade

Uma funcao e dita recursiva quando contem, em seu corpo, uma chamada a simesma (este tipo de recursividade e chamada recursividade direta). Sao uti-lizadas quando e possıvel decompor o problema a ser resolvido em problemasmenores, um dos quais e semelhante ao problema inicial.

44

Page 45: Algoritmos

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) n > 1 (Passo recursivo)

Outro ex.: A soma dos numeros de 1 a n pode ser definida de formarecursiva como:

{soma(1) = 1soma(n) = n + soma(n− 1) n > 1

A soma dos numeros ımpares de 1 a n pode ser definida de forma recursivapor:

somaimp(1) = 1somaimp(n) = somaimp(n− 1) n par ∧ n > 1somaimp(n) = n + somaimp(n− 2) n impar ∧ n > 2

Algoritmo da funcao fatorial definida recursivamente:

Func~ao numerico fatorial(n numerico)

Se n=0 OU n=1

ent~ao Retorna 1

sen~ao Retorna n*fatorial(n-1)

fim_se

fim_func~ao

A execucao desta funcao para uma chamada fatorial(3) e a mostradana Figura 6.

Exerc.: Definir recursivamente a funcao que devolve a soma dos numerosımpares de 1 a n.

Exerc.: Definir recursivamente a funcao que determina o n-esimo termoda serie de fibonacci (veja a Tabela 8).

45

Page 46: Algoritmos

fatorial(3)

²²3 ∗ fatorial(2)

²²

// 3× 2 = 6 // 6

2 ∗ fatorial(1)

²²

// 2× 1 = 2

88qqqqqqqqqqqq

fatorial(1) = 1

66mmmmmmmmmmmmm

Figura 6: Execucao de fatorial(3)

n fibonacci(n)

0 01 12 13 24 35 56 8...

...

Tabela 8: Tabela do Fibonacci

46

Page 47: Algoritmos

Solucao:

Func~ao numerico fibonacci(n numerico)

Se n=0 OU n=1

ent~ao Retorna n

sen~ao Retorna fibonacci(n-1)+fibonacci(n-2)

fim_se

fim_func~ao

Exerc.: Considere uma sequencia de numeros onde cada termo e dado pelacombinacao dos 4 termos anteriores An = An−4+2×An−3+3×An−2+4×An−1

e os 4 primeiros termos sao por definicao:

A1 = 1 A2 = 2 A3 = 3 A4 = 4

Escreva uma funcao recursiva SEQ que receba um numero n e retorne otermo An.

Solucao:

Func~ao numerico seq(n numerico)

Se n<=4

ent~ao Retorna n

sen~ao Retorna seq(n-4)+2*seq(n-3)+3*seq(n-2)+4*seq(n-1)

fim_se

fim_func~ao

Exerc.: Dois numeros sao amigos entre si, se a soma dos divisores de cadaum deles e igual ao outro. Exemplo, 220 e 284:

Divisores de 220 Divisores de 2841 12 24 45 7110 14211 Soma 22020224455110Soma 284

47

Page 48: Algoritmos

Faca um algoritmo que leia dois numeros e verifique se sao amigos.Solucao:

Algoritmo

Declare a,b numerico

{ declarac~ao de func~oes }

Leia a,b

Se a=soma(b) E b=soma(a)

entao Escreva ’S~ao amigos’

sen~ao Escreva ’N~ao s~ao amigos’

fim_se

fim_algoritmo

Funcoes com solucao nao recursiva:

Func~ao numerico soma(n numerico)

Declare aux,ind numerico

ind := 1

aux := 0

Repita

Se resto(n,ind)=0

ent~ao aux := aux+ind

fim_se

ind := ind+1

ate ind=n

Retorna aux

fim_func~ao

Solucao recursiva (chamar soma(n,n-1)):

Func~ao numerico soma(num,cont numerico)

Se cont=1

ent~ao Retorna 1

sen~ao

Se RESTO(num,cont)=0

ent~ao Retorna cont+soma(num,cont-1)

sen~ao Retorna soma(num,cont-1)

fim_se

fim_se

fim_func~ao

48

Page 49: Algoritmos

CBA

Figura 7: Torre de Hanoi

Exemplo: Torre de Hanoi (objetivo e mover os tres discos de A para C,movendo um por vez e sem nunca colocar um disco maior sobre um menor;veja Figura 7).

Mover 3 discos de A para C=

Mover 2 discos de A para B=

Mover 1 de A para C

Mover 1 de A para B

Mover 1 de C para B

Mover 1 disco de A para C=

Mover 1 de A para C

Mover 2 discos de B para C=

Mover 1 de B para A

Mover 1 de B para C

Mover 1 de A para C

Solucao (chamar move(3,1,3,2)):

Sub-rotina move(num,origem,destino,interm numerico)

Se num=1

ent~ao Escreva ’move de ’,origem,’ para ’,destino

sen~ao

move(num-1,origem,interm,destino)

move(1,origem,destino,interm)

move(num-1,interm,destino,origem)

49

Page 50: Algoritmos

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 semocupar nunca duas vezes a mesma casa comecando em qualquer casa;

O problema das oito rainhas Colocar oito rainhas em um tabuleiro semque nenhuma ataque a outra.

11 Algoritmos de Ordenacao

Os algoritmos de ordenacao (ou classificacao) permitem ordenar os dados emalguma ordem (crescente ou decrescente). Podem ser aplicados sobre dadosnumericos ou alfabeticos (neste caso deve-se associar uma ordem entre ossimbolos alfabeticos).

11.1 BUBLE SORT

E um tipo de algoritmo de ordenacao por troca com tempo de ordenacaoproporcional a O(N2) trocas.

10 19 13 12 7 .10 13 12 7 . 1910 12 7 . 13 1910 7 . 12 13 197 . 10 12 13 19

11.2 SELECAO DIRETA

E um tipo de algoritmo de ordenacao por selecao com tempo de ordenacaoproporcional a O(N2) comparacoes.

. 10 19 13 12 77 . 19 13 12 107 10 . 13 12 197 10 12 . 13 197 10 12 13 . 19

50

Page 51: Algoritmos

Implementacao:

Sub-rotina selec(vet(),inic,fim numerico)

Declare elem,pos numerico

Se inic<>fim

ent~ao

pos := menor(vet,inic,fim)

elem := vet(pos)

vet(pos) := vet(inic)

vet(inic) := elem

selec(vet,inic+1,fim)

fim_se

fim_sub-rotina

e menor e uma funcao que encontra o menor elemento e devolve seu ındicena matriz.

Exercıcio: Reescrever esta sub-rotina usando listas. Escrever tambem afuncao menor para este caso.

Exercıcio: Implementar o Buble Sort.

11.3 QUICK SORT

E um tipo de algoritmo de ordenacao por troca e particao com tempo de or-denacao proporcional a O(n log2 n). Baseia-se no princıpio que e mais rapidoordenar 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 primeirodos valores menores e um segundo dos valores maiores que um elemento decomparacao. O elemento de comparacao e, normalmente, o primeiro ele-mento do vetor. Depois o algoritmo e repetido para as duas partes, obtendoa ordenacao completa.

O particionador comeca em ambas as extremidades do vetor efetuandotrocas para colocar os elementos menores e maiores que o de comparacao emseus lugares.

Exemplo de particionamento:

51

Page 52: Algoritmos

60 83 25 98 94 36 99 73 45 15 22 1010 60

60 8322 60

60 9815 60

60 9445 60

60 9910 22 25 15 45 36 60 73 99 94 98 83

Algoritmo:

Sub-rotina quick(CR x lista)

Declare elem numerico

Declare x1,x2 lista

{ func~ao concat }

{ sub-rotina partic }

Se TAM(x)>1

partic(x,x1,elem,x2)

quick(x1)

quick(x2)

x := concat(x1,CONS(elem,x2))

fim_se

fim_sub-rotina

Funcao concat:

Func~ao concat(x1,x2 lista) lista

Se NIL(x1)

ent~ao

Retorna x2

sen~ao

Retorna CONS(CAR(x1),concat(CDR(x1),x2))

fim_se

fim_func~ao

52

Page 53: Algoritmos

Funcoes auxiliares de partic:

Func~ao adiciona_final(l lista, e numerico) lista

Se NIL(l)

ent~ao

Retorna CONS(e,nil)

sen~ao

Retorna CONS(CAR(l),adicional_final(CDR(l),e))

fim_func~ao

Func~ao retira_ultimo(l lista) lista

Se NIL(CDR(l))

ent~ao

Retorna nil

sen~ao

Retorna CONS(CAR(l),retira_ultimo(CDR(l)))

fim_se

fim_func~ao

Particionador:

53

Page 54: Algoritmos

sub-rotina partic(x lista, CR x1 lista, CR elem numerico,\

CR x2 lista)

Declare esq logico

{ func~oes auxiliares }

elem := x(0)

x := CDR(x)

esq := verdadeiro

x1 := nil

x2 := nil

Enquanto N~ao NIL(x)

faca

Se esq

ent~ao

Se elem>x(TAM(x)-1)

ent~ao

x1 := concat(x1,CONS(x(TAM(x)-1),nil))

x := retira_ultimo(x)

esq := falso

sen~ao

x2 := CONS(x(TAM(x)-1),x2)

x := retira_ultimo(x)

fim_se

sen~ao

Se elem<x(0)

ent~ao

x2 := CONS(x(0),x2)

x := CDR(x)

esq := verdadeiro

sen~ao

x1 := adiciona_final(x1,x(0))

x := CDR(x)

fim_se

fim_se

fim_enquanto

fim_sub-rotina

54

Page 55: Algoritmos

12 Programacao Funcional

Com os recursos de manipulacao de listas que ja temos em nossa linguagem ecom alguns outros recursos podemos implementar programacao funcional emnossa linguagem. Programacao funcional e um paradigma de programacaoem que as principais entidades sao funcoes e listas. Programacao funcio-nal se baseia na avaliacao de expressoes simbolicas. Este paradigma estaplenamente representado na linguagem de programacao LISP.

Algumas caracterısticas de programacao funcional pura:

• Nao existe declaracao de tipos. Todos os dados sao dinamicos e alinguagem efetua conversoes de tipo implıcitas;

• Homogeneidade das estruturas;

• Nao ha lacos de repeticao, apenas recursividade;

• Baseado em notacao-λ (funcoes-λ).

A estrutura basica de programacao funcional e o atomo que pode sernumerico ou literal (embora nao precise ser declarado como tal). Um parde elementos com lado esquerdo (CAR) e lado direito (CDR) e chamadoexpressao-S. A funcao CONS serve para construir expressoes-S.

12.1 Declaracao de Funcoes Lambda

Para declarar uma funcao lambda:

Func~ao lambda <nome>’(’<lista de parametros>’)’ ’(’ {definic~ao} ’)’

Ex:

Func~ao lambda cuder(x)(CDR(x))

Observe que nao e necessario declarar nenhum tipo de dado.

12.2 Estruturas de Programacao Funcional

Substituindo a estrutura “Se-entao-senao” tradicional, existe uma funcaoCOND, que recebe tres argumentos:

COND(<condic~ao>,<func~ao 1>,<func~ao 2>)

55

Page 56: Algoritmos

Caso a condicao seja verdadeira, e avaliada a funcao 1, caso contrario eavaliada a funcao 2.

Ex:

COND(NIL(x),nil,CAR(x))

que devolve nil se a lista x e vazia e o CAR de x caso contrario.O valor logico “falso” e representado por nil e o valor logico “verdadeiro”

por qualquer coisa diferente de nil. Assim, podemos testar a condicao listavazia, no exemplo anterior, sem usar a funcao NIL(x), embora por elegancianao seja recomendavel faze-lo:

COND(x,nil,CAR(x))

Alem da funcao NIL(x), estao definidas na linguagem as funcoes N~AO(x)que inverte o valor logico, IGUAL(x,y) que testa se x e y sao iguais, e ZERO(x)que testa se x = 0. Estao disponıveis tambem as operacoes aritmeticas jadefinidas na nossa linguagem de algoritmos.

A Tabela 9 sumariza as estruturas disponıveis em nossa linguagem dealgoritmos para programacao funcional.

12.3 Escrevendo Funcoes

A seguir sao apresentados exemplos de funcoes usando a notacao-λ apresen-tada.

Ex1: Calcula o fatorial.

Func~ao lambda fat(x)(

COND(ZERO(x),1,x*fat(x-1))

)

Ex2: Determina o tamanho de uma lista (implementa TAM(x)).

Func~ao lambda tamanho(x)(

COND(NIL(x),0,tamanho(CDR(x))+1)

)

Ex3: Concatena duas listas.

Func~ao lambda concat(x1,x2)(

COND(NIL(x1),x2,CONS(CAR(x1),concat(CDR(x1),x2)))

)

Com propositos de comparacao, apresentamos a solucao tradicional daconcatenacao de listas:

56

Page 57: Algoritmos

Estrutura Descricao

Func~ao lambda Define uma funcao nova<nome>’(’<list param>’)’

’(’{def func~ao}’)’

COND(<cond>,<f1>,<f2>) Condicional; Testa um valor;Se <cond> e diferente de nil

entao avalia <f1>, senao avalia <f2>

Funcao CAR(x) Devolve o CAR de uma lista x

Funcao CDR(x) Devolve o CDR de uma lista x

Funcao CONS(x,y) Devolve o CONS de x e y

Funcao TAM(x) Devolve o tamanho de uma lista x

Funcao NIL(x) Testa se a lista x e vaziaFuncao N~ao(x) Inverte o valor logico de x

Funcao ZERO(x) Testa se o argumento x e zeroFuncao IGUAL(x,y) Testa se x e y sao iguais

nil ou [] Lista vazia e/ou valor logico falsoOperador x(i) Devolve a i-esima posicao da lista x

Operador + Soma aritmeticaOperador - Subtracao aritmeticaOperador * Multiplicacao aritmeticaOperador / Divisao aritmeticaOperador ** Potenciacao aritmetica

Tabela 9: Resumo das Estruturas de Programacao Funcional

57

Page 58: Algoritmos

Func~ao concat(x1,x2 listas) lista

Declare ind numerico

Declare x lista

ind := TAM(x2)

x := nil

Enquanto ind>0

faca

x := CONS(x2(ind-1),x)

ind:=ind-1

x2 := retira_ultimo(x2)

fim_enquanto

ind := TAM(x1)

Enquanto ind>0

faca

x := CONS(x1(ind-1),x)

ind:=ind-1

x1 := retira_ultimo(x1)

fim_Enquanto

Retorna x

fim_func~ao

Ex4: Verifica se um elemento e pertence a uma lista l.

Func~ao lambda membro(e,l)(

COND(NIL(l),nil,

COND(IGUAL(e,CAR(l)),N~AO(nil),

membro(e,CDR(l))

)

)

)

Exercıcio: Escrever uma funcao lambda que inclua um elemento no finalde uma lista.

Exercıcio: Escrever uma funcao lambda que apaga o ultimo elemento deuma lista.

Exercıcio: Escrever uma funcao que obtem a derivada de um polinomioordem n. Ex:

d

dx

(3x5 + 2x3 − x + 1

)= 15x4 + 6x2 − 1

58

Page 59: Algoritmos

Representado como [[5,3],[3,2],[1,-1],[0,1]], que produzira[[4,15],[2,6],[0,-1]], que representa 15x4 + 6x2 − 1.

Exercıcio: Inverter uma lista. Ex: [1,2,3,4]⇒[4,3,2,1].Solucao:

Func~ao lambda inverte(x)(

COND(NIL(x),nil,concat(inverte(CDR(x)),CONS(CAR(x),nil)))

)

Exercıcio: Escrever uma funcao lambda que ordene uma lista por selecaodireta.

59

Page 60: Algoritmos

Copyright c©2005-2006 Carlos A. P. Campani.E garantida a permissao para copiar, distribuir e/ou modificar este do-

cumento sob os termos da Licenca de Documentacao Livre GNU (GNU FreeDocumentation License), Versao 1.2 ou qualquer versao posterior publicadapela Free Software Foundation; sem Secoes Invariantes, Textos de Capa Fron-tal, e sem Textos de Quarta Capa. Uma copia da licenca e incluıda na secaointitulada ”GNU Free Documentation License”.

veja: http://www.ic.unicamp.br/~norton/fdl.html.

60