Vous êtes sur la page 1sur 5

Mtodos de Programao I

Departamento de Matemtica, FCTUC

38

2005/06

type tipoveiculo = (bicicleta, motociclo, motorizada, automovel,


autocomreb, camioneta, autocarro, camiao, reboque);
var veiculo : tipoveiculo;
Se chegar um veculo qualquer portagem, o programa, dependendo de onde chega e em funo do seu
tipo, tem de decidir qual a portagem que vai pagar:
case veiculo of
bicicleta, motociclo
autocomreb, camioneta
autocarro, camiao
reboque
end;

:
:
:
:

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

ler dia , ms, ano ;


escrever Dia seguinte a dia/ms/ano : ;
determinar o nmero de dias desse ms:
caso ms?
ms =
1,3,5,7,8,10,12

ms =
4,6,9,11

ultimodia 31

ms =2

ultimo 30

(bissexto?)
ano mod 4 = 0 e ano 1900,2100

ultimo 28
o

actualizar dia, ms e ano para seguintes:


se dia = ultimo

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

Departamento de Matemtica, FCTUC

39

2005/06

program dia_seguinte (input, output);


var dia : 1 .. 31 ;
mes : 1 .. 12 ;
ano : 1900 .. 2100 ;
ultimo : 28 .. 31 ;
begin
(* leitura e escrita da data dada *)
read( dia, mes, ano);
write( Dia seguinte a , dia :2, /, mes:2, /, ano:4, ::3);
(* determinao do numero de dias do mes *)
case mes of
1,3,5,7,8,10,12 : ultimo := 31;
4,6,9,11 : ultimo := 30;
2 : if (ano mod 4 = 0) and (ano <> 1900) and (ano <> 2100)
then ultimo := 29
else ultimo := 28
end;
if ( dia = ultimo )
then begin
necessitamos usar
dia := 1;
vrias intrues
if ( mes = 12 )
then begin
dia := 1;
ano := ano + 1
end
else mes := mes + 1
end
else dia := dia + 1;
writeln(dia:2, /, mes:2, /, ano:4); writeln;
end.
Figura 2.6: programa para calcular data do dia deguinte

REPETIO - CICLOS
Ciclo Enquanto : instruo while - do

while

expresso
lgica

do

instruo

UMA INSTRUO (SIMPLES OU COMPOSTA)

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

Departamento de Matemtica, FCTUC

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

enquanto potencia < 1000

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

program tabela (output);


var i, potencia : 0 .. 1000;
begin
i := 1;
potencia := 2;
while potencia < 1000 do
begin
writeln( i, potencia);
i := i +1;
potencia := potencia * 2
end
end.
Figura 2.7: programa para imprimir potncias de 2 menores que 1000

Ciclo At que : instruo repeat - until


repeat

instruo

until

expresso
lgica

;
UMA OU MAIS INSTRUES

Mtodos de Programao I

Departamento de Matemtica, FCTUC

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.

Passamos a apresentar alguns exemplos ilustrativos deste ciclo.


1. Calcular a soma de vrios nmeros inteiros, dados um em cada linha, sendo o final dado por uma
linha que s contm zero:
Descrio do algoritmo:
soma 0
frmula
iterativa

ler numero, mudar de linha


soma soma + numero
at que numero = 0

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

2. Ler um nmero inteiro e verificar se uma capicua:


2451542 uma capicua ( igual ao seu inverso)

Mtodos de Programao I

Departamento de Matemtica, FCTUC

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).