Professional Documents
Culture Documents
38
2005/06
:
:
:
:
writeln(2,3 euros );
writeln(2,8 euros );
writeln(3 euros );
writeln(3,2 euros )
Um exemplo mais completo o do programa abaixo que, dada uma data, calcula a data do dia seguinte:
Especificaes:
Dados: data no formato dia ms ano
Resultados: data do dia seguinte ao dado.
bvio que a primeira coisa a fazer delimitar um domnio para os sculos abrangidos pelo programa.
Seja ele,
Domnio =1900 .. 2100
Comecemos por descrever o algoritmo a implementar no programa:
o
o
o
ms =
4,6,9,11
ultimodia 31
ms =2
ultimo 30
(bissexto?)
ano mod 4 = 0 e ano 1900,2100
ultimo 28
o
seno
dia 1
se mes = 12
mes 1
ano ano + 1
o
escrever dia/ms/ano.
seno
mes mes + 1
dia dia +1
seno
ultimo 29
Mtodos de Programao I
39
2005/06
REPETIO - CICLOS
Ciclo Enquanto : instruo while - do
while
expresso
lgica
do
instruo
Esta estrutura permite repetir uma instruo simples, ou um bloco de instrues delimitado por begin-end
(instruo composta). Essa repetio efectuada enquanto a expresso lgica se mantiver verdadeira:
while TRUE do
INSTRUO;
Temos, portanto, duas partes principais nesta estrutura: o teste lgico, efectuado antes de qualquer outra
coisa - cabea do ciclo - e a segunda parte que consiste na instruo (ou bloco de instrues) - corpo do
ciclo - que s executada se o teste fr verdadeiro. Isto significa que, se na primeira vez que a expresso
fr testada, fr avaliada para falso, o ciclo nunca efectuado (h um salto sequencial directo para a
primeira instruo aps o ciclo).
Mtodos de Programao I
40
2005/06
Um ciclo normalmente utilizado para calcular valores atravs de frmulas iterativas - frmulas que
usam valores anteriores para calcular novos valores. Um exemplo tpico o do clculo de potncias como,
por exemplo,
21 = 2, 22 = 21x2 = 4, 23 = 22x2 = 8, , 2i = 2i-1x2, ,
onde cada novo valor obtido multiplicando por 2 o valor anterior.
Vamos ento construir um programa para imprimir uma tabela de potncias sucessivas de 2, desde que
inferiores a 1000:
contador
i
1
potencia
inicializaes
2
cabea do ciclo
( teste lgico )
escrever i, potencia
i i+1
potencia
potencia * 2
frmulas
iterativas
corpo do ciclo
Neste caso vamos usar duas frmulas iterativas: uma para calcular a potncia i em curso - que varia desde
1 at ao limite (2i < 1000) - e outra para o clculo do valor concreto - multiplicao - da potncia. Nestes
casos e em qualquer outro:
toda a frmula iterativa tem de ser inicializada antes do ciclo.
A implementao deste algoritmo em Pascal , portanto, a seguinte:
instruo
composta
instruo
until
expresso
lgica
;
UMA OU MAIS INSTRUES
Mtodos de Programao I
41
2005/06
As principais diferenas entre esta estrutura e a anterior residem nos dois pontos seguintes:
Contrariamente ao que acontecia na repetio anterior, esta estrutura permite repetir, ou uma
instruo simples, ou uma srie sequencial de instrues, e essa repetio efectuada at que a
expresso lgica se torne verdadeira:
repeat
instrues;
until TRUE
O teste lgico do repeat (a cabea deste ciclo) no final do ciclo o que significa que o ciclo
sempre executado pelo menos uma vez.
inicializao
corpo do ciclo
teste do ciclo
escrever soma
Implementao:
program somar (input, output);
varnumero, soma : integer;
begin
soma := 0;
repeat readln( numero );
soma := soma + numero;
until numero = 0;
writeln( soma : 10 );
end.
Figura 2.8: programa para somar inteiros
Mtodos de Programao I
42
2005/06
Descrio do algoritmo:
ler nmero
n nmero
inverso 0
cpia para
destruir
digito n mod 10
inverso inverso*10 + digito
n
n div 10
at que numero = 0
nmero = inverso
capicua
seno
no
Implementao:
program capicua (input, output);
vardigito : 0 .. 9;
numero, n, inverso : 0 .. maxint;
begin
read( numero );
n := numero;
inverso := 0;
repeat
digito := n mod 10;
inverso := inverso * 10 + digito;
n := n div 10
until n = 0;
(* a cpia do nmero foi destruida *)
if numero = inverso
then writeln( numero, Capicua )
else writeln ( numero, No e capicua )
end.
Figura 2.9: programa para encontar capicuas
Exerccios:
1. Identifique a frmula recursiva que est envolvida no algoritmo acima e qual a sua inicializao.
2. Faa a simulao manual do programa para uma capicua e para outro nmero diferente do seu inverso.
3. Modifique o programa para usar um while-do em vez do repeat-until (Note que nmeros de um s
algarismo tambm so capicuas).