Você está na página 1de 18

Programao de Computadores I Prof.

Pedro Manoel Silveira


1
EXEMPLOS DE PROGRAMAS PASCAL

Exemplo 1.
Este programa sada o mundo, imprimindo Hello world! no dispositivo de sada.

program dizalo ;
begin
writeln ('Hello world!')
end.

Este um exemplo extremamente simples. O conjunto de comandos do programa, formado neste caso
por apenas um writeln, aparece entre begin e end. A execuo do programa acima provocaria a impresso
da mensagem

Hello world!
Exemplo 2.
O programa ilustra o uso dos operadores / e div.

program testdiv ;
var
v1, v2 : integer ;
begin
write ('Entre com dois numeros inteiros: ');
readln (v1, v2);
writeln ('A expressao ', v1:1, ' / ', v2:1,
' vale ', v1 / v2 :1:2 ) ;
writeln ('A expressao ', v1:1, ' DIV ', v2:1,
' vale ', v1 div v2 )
end. (* testdiv *)

Veja agora alguns exemplos de sua execuo.

Entre com dois numeros inteiros: 0 3
A expressao 0 / 3 vale 0.00
A expressao 0 DIV 3 vale 0

Entre com dois numeros inteiros: 1 3
A expressao 1 / 3 vale 0.33
A expressao 1 DIV 3 vale 0

Entre com dois numeros inteiros: 2 3
A expressao 2 / 3 vale 0.67
A expressao 2 DIV 3 vale 0

Entre com dois numeros inteiros: 6 3
A expressao 6 / 3 vale 2.00
A expressao 6 DIV 3 vale 2

Embora neste exemplo tenhamos usado apenas nmeros inteiros,
o operador / capaz de operar com inteiros e reais.

Exemplo 3.
Este programa l o nmero de um aluno e suas trs notas, calcula a mdia das notas, ponderada pelos
pesos 2,3,4 respectivamente, e imprime o nmero do aluno, suas trs notas e a mdia.

Programao de Computadores I Prof. Pedro Manoel Silveira
2
program Notas ;
var
numal : integer ;
n1, n2, n3, media : real ;
begin
writeln
('Digite o numero do aluno seguido das tres notas') ;
readln ( numal, n1, n2, n3 ) ;
media := ( 2*n1 + 3*n2 + 4*n3 ) / 9 ;
writeln ('Aluno: ', numal:4) ;
writeln ('Notas: ', n1:6:2, n2:6:2, n3:6:2) ;
writeln ('Media: ', media:6:2 ) ;
end.

Veja abaixo um exemplo de execuo.

Digite o numero do aluno seguido das tres notas
1015 6.5 8.3 10
Aluno: 1015
Notas: 6.50 8.30 10.00
Media: 8.66
Exemplo 4.
O exemplo a seguir l os coeficientes de uma equao do 2. grau e calcula suas razes reais.

program Raizes ;
var
a, b, c: real;
x1, x2, delta : real;
begin
writeln ('Entre com os coeficientes a, b, c');
readln (a, b, c);
delta := b * b - 4 * a * c;
if delta < 0
then writeln ('Nao tem raizes reais')
else begin
x1 := (-b + sqrt (delta)) / (2*a);
x2 := (-b - sqrt (delta)) / (2*a);
writeln ('As raizes sao ', x1:8:4, ' e ', x2:8:4);
end;
end. (* Raizes *)

Observe que o comando if tem duas alternativas: a que foi especificada a seguir da palavra then, caso a
condio delta < 0 seja verdadeira, e a que foi especificada a seguir da palavra else, caso a mesma
condio revele-se falsa. No segundo caso, devem ser executados trs comandos e no primeiro, apenas
um. Isso obriga a definio de um bloco de comandos pela introduo dos delimitadores begin e end.
Para efeitos sintticos, um bloco de comandos tem o mesmo papel de um comando nico. A sintaxe do
comando if exige que, aps then ou else, aparea apenas um comando, ou um bloco delimitado de
comandos. Veja dois exemplos de execuo.

Entre com os coeficientes a, b, c
2 3 4
Nao tem raizes reais

Entre com os coeficientes a, b, c
2 3 -4
As raizes sao 0.8508 e -2.3508

Programao de Computadores I Prof. Pedro Manoel Silveira
3
Exemplo 5.
O programa abaixo l trs nmeros, representando os lados de um tringulo e calcula sua rea, dada pela
frmula

) ).( ).( ( c s b s a s s A =

verificando se os lados formam um tringulo ou no, onde s o semipermetro do tringulo,
s=(a+b+c)/2.

program Area ;
var a, b, c, s : real ;
ar : real ;
begin
write ('Forneca os lados do triangulo: ') ;
readln (a, b, c) ;
write ('O triangulo de lados ', a:6:2,b:6:2, c:6:2) ;
if (a < b + c)
and (b < a + c)
and (c < a + b)
then begin
s := (a + b + c)/2 ;
ar := sqrt (s * (s - a) * (s - b) * (s - c)) ;
writeln (' tem area ', ar:6:2)
end
else writeln (' nao existe') ;
end. (* Area *)

Uma novidade aqui ilustrar o emprego dos conectores lgicos and e or no comando if. Um tringulo,
para existir, deve ter a soma de qualquer de seus lados menor do que a soma dos outros dois lados. Por
isso, empregou-se and nas comparaes: a condio deve ser vlida para o lado a, para o lado b e para o
lado c.
Outro ponto a observar neste exemplo o emprego do comando write. Note que a linha impressa por
aquele comando ser completada por algum dos comandos writeln que o seguem. Assim, a diferena
entre um write e um writeln pode ser facilmente percebida: o uso de write indica que o prximo trecho
impresso ser uma continuao da mesma linha; o uso de writeln indica que o prximo trecho impresso
dever aparecer na prxima linha. Para um tringulo de lados 3, 4 e 5, a mensagem impressa seria

Forneca os lados do triangulo: 3 4 5
O triangulo de lados 3.00 4.00 5.00 tem area 6.00

Para um exemplo impossvel, a execuo seria como abaixo.

Forneca os lados do triangulo: 1 2 4
O triangulo de lados 1.00 2.00 4.00 nao existe

Exemplo 6.

O programa abaixo l as coordenadas x,y de um ponto P e indica o quadrante ao qual P pertence. Os
quadrantes so numerados de 1 a 4, no sentido anti-horrio, sendo o quadrante 1 para x e y positivos.

program Quadrante ;
var
x, y : real ;
begin
write ('Entre com as coordenadas x, y do ponto: ');
readln (x, y);
write ( 'O ponto (', x:1:2, ',' , y:1:2,
Programao de Computadores I Prof. Pedro Manoel Silveira
4
') pertence ao quadrante ');
if x >= 0
then if y >= 0
then writeln ('1')
else writeln ('4')
else if y >= 0
then writeln ('2')
else writeln ('3') ;
end. (* Quadrante *)

Para valores 5.1 e -3.2, por exemplo, o programa imprimiria

O ponto (5.10,-3.20) pertence ao quadrante 4

Observe o efeito de termos imprimido os nmeros do resultado com o formato :1:2. O resultado fica
mais elegante do que quando tentamos prever um nmero fixo de colunas. Neste caso, como o tamanho 1
fica sujeito a estourar, o Pascal usa quantas posies de impresso forem necessrias, tornando a
mensagem compacta e sem espaos em branco.
Aqui aparece um comando if que contm um outro comando if dentro de si. Comandos if assim
dispostos so chamados de IF's aninhados. A estrutura do comando if no muda porque h este
aninhamento. Observe que o trecho

if y > 0
then writeln ('1')
else writeln ('4')

um comando Pascal e, como tal, pode ser usado aps a palavra then do comando mais externo. Da
mesma forma, o trecho

if y >= 0
then writeln ('2')
else writeln ('3')

pode ser usado para a clusula else. Ateno especial para o uso do terminador ; no caso de comandos
aninhados. Nos exemplos seguintes, este uso ser melhor ilustrado.
Exemplo 7.
O programa abaixo l trs nmeros representando os lados de um tringulo, verifica se o mesmo
possvel e classifica-o quanto ao tipo: equiltero, isceles ou escaleno. Conforme o caso, a mensagem
adequada impressa.

program classifica ;
var
a, b, c : real;

begin
write ('Digite os valores dos lados do triangulo:');
readln (a, b, c);
if ( a >= b+c )
or ( b >= a+c )
or ( c >= a+b )
then writeln ('O triangulo eh impossivel')
else if ( a = b ) and ( a = c )
then writeln ('O triangulo eh equilatero')
else if
( a = b ) or ( a = c ) or ( b = c )
then writeln ('O triangulo eh isoceles')
else writeln ('O triangulo eh escaleno')
end. (* classifica *)

Aqui est um exemplo de execuo do programa acima.
Programao de Computadores I Prof. Pedro Manoel Silveira
5

Digite os valores dos lados do triangulo:3 4 5
O triangulo eh escaleno
Exemplo 8.
O programa abaixo l trs nmeros e imprime-os em ordem crescente.

program ordenatres ;
var
a, b, c: real;
begin
write ('Forneca os numeros a ordenar: ');
readln (a, b, c);
write ('Numeros ordenados ...');
if a <= b
then if b <= c
then writeln (a:7:2, b:7:2, c:7:2)
else if a <= c
then writeln (a:6:2, c:6:2, b:6:2)
else writeln (c:6:2, a:6:2, b:6:2)
else if a <= c
then writeln (b:6:2, a:6:2, c:6:2)
else if b <= c
then writeln (b:6:2, c:6:2, a:6:2)
else writeln (c:6:2, b:6:2, a:6:2);
end. (* ordenatres *)

Um exemplo de execuo onde os nmeros fornecidos so 20, 4 e 7 mostrado abaixo.

Forneca os numeros a ordenar: 20 4 7
Numeros ordenados ... 4.00 7.00 20.00
Exemplo 9.
Este exemplo mostra um programa que imprime uma tabela de razes quadradas para os nmeros de 2 at
100.

program tabela ;
var
n : integer;
begin
writeln ('Numero':7, 'Raiz Quadrada':18);
for n := 2 to 100 do
writeln (' ':2, n:3, ' ':8, sqrt(n):9:6 );
writeln ('Fim da Tabela');
end. (* Tabela *)

O resultado seria da forma abaixo.

Numero Raiz Quadrada
2 1.414214
3 1.732051
.. ........
.. ........
97 9.848858
98 9.899495
99 9.949874
100 10.000000
Fim da Tabela
Programao de Computadores I Prof. Pedro Manoel Silveira
6

Exemplo 10.
Este programa imprime as letras do alfabeto, de A at Z, em ordem.

program Alfabeto ;
var
letra : char;
begin
for letra := 'A' to 'Z' do
write (letra);
writeln
end. (* Alfabeto *)

Veja como seria a sada do programa.

ABCDEFGHIJKLMNOPQRSTUVWXYZ
Exemplo 11.
O programa abaixo calcula o somatrio dos N primeiros termos da seqncia

...
8
1
4
1
2
1
1 + + + +

program serie ;
const
N = 20;
var
i : integer;
soma, termo : real;
begin
termo := 1;
soma := 1;
for i := 2 to N do
begin
termo := termo / 2;
soma := soma + termo;
end;
writeln ('O somatorio vale ', soma:8:6);
end. (* Serie *)

Para N=20, o resultado seria uma mensagem como

O somatorio vale 1.999998
Exemplo 12.
O exemplo que mostramos a seguir calcula o fatorial de n, para n <= 7.

program fatorial ;
var
fat, i, n : integer;
begin
readln (n);
if n > 7
then writeln ('O valor excede 7. Nao posso calcular!')
else begin
fat := 1;
for i := n downto 2 do fat := fat * i;
writeln ('O fatorial de ', n:2, ' eh ', fat)
end
end. (* Fatorial *)
Programao de Computadores I Prof. Pedro Manoel Silveira
7

Veja dois exemplos de execuo.

8
O valor excede 7. Nao posso calcular!

6
O fatorial de 6 eh 720
Exemplo 13.
Na Seqncia de Fibonacci, cada termo a soma dos seus dois predecessores. O programa abaixo gera e
imprime os termos dessa seqncia que so menores do que um certo limite, comeando pelos termos 0
e 1. O programa assume que o limite maior do que zero.

program fibonacci ;
const
Limite = 500;
var
Pen, Ult, Soma : integer;
begin
Pen := 0;
Ult := 1;
writeln ('Termos da Sequencia de Fibonacci');
write (Pen:1);
while Ult < Limite do
begin
write (' ', Ult:1);
Soma := Pen + Ult;
Pen := Ult;
Ult := Soma;
end;
writeln
end. (* Fibonacci *)

O resultado impresso seria da forma

Termos da Sequencia de Fibonacci
0 1 1 2 3 5 8 13 21 34 55 89 144 233 377
Exemplo 14.
Este programa lista uma tabela de senos, lendo os valores inicial e final do argumento juntamente com o
intervalo.

program tabsenos ;
var
xi, xf, int : real ;
begin
write ('Forneca os valores inicial e final e o intervalo: ');
readln ( xi, xf, int );
writeln ('Tabela de Senos');
writeln ('----------------');
writeln (' x seno(x)');
while xi <= xf do
begin
writeln ( xi:6:3, '':3, sin(xi):6:4 );
xi := xi + int;
end;
writeln ('----------------');
writeln ('Fim da Tabela')
end.

Agora veja um exemplo da execuo.
Programao de Computadores I Prof. Pedro Manoel Silveira
8

Forneca os valores inicial e final e o intervalo: 0 1 0.01
Tabela de Senos
----------------
x seno(x)
0.000 0.0000
0.010 0.0100
0.020 0.0200
..... ......
..... ......
0.970 0.8249
0.980 0.8305
0.990 0.8360
1.000 0.8415
----------------
Fim da Tabela
Exemplo 15.
A expresso

)
`

+
+
+
+
2
1
2
1
2
1
2

um exemplo de funo contnua. Valores aproximados desta frao podem ser calculados tomando-se,
por exemplo, S
1
=2, S
2
=2+1/S
1
,...,Sn=2+1/S
n-1
. O programa abaixo calcula e imprime os valores das
aproximaes at que o valor absoluto da diferena entre uma aproximao e outra seja inferior a 10
-6
.

program FraContinua ;
const
Delta = 1.0E-6;
var
S, Sant : real;
begin
writeln ('Aproximacoes calculadas:');
Sant := 0;
S := 2;
while abs(S - Sant) >= Delta do
begin
writeln (' ':6, S:8:6) ;
Sant := S ;
S := 2 + 1 / Sant ;
end;
end. (* FraContinua *)

Exemplo de execuo:

Aproximacoes calculadas:
2.000000
2.500000
2.400000
2.416667
Programao de Computadores I Prof. Pedro Manoel Silveira
9
2.413793
2.414286
2.414201
2.414216
Exemplo 16.
O prximo programa imprime uma pirmide de algarismos como a que mostrada abaixo.

1
121
12321
1234321
123454321
12345654321

program piramide ( output );
const
Limite = 6;
var
i, j : integer ;
begin
for i := 1 to Limite do
begin
write (' ':(Limite - i + 1));
for j := 1 to i do write ( j:1 );
for j := i - 1 downto 1 do write ( j:1 );
writeln
end
end. (* Piramide *)
Exemplo 17.
O nmero 153 um Nmero de Armstrong porque o somatrio dos cubos de cada um dos seus
algarismos 1
3
+ 5
3
+ 3
3
= 1+125+27 = 153 igual ao prprio nmero. O programa abaixo encontra e
imprime todos os nmeros de Armstrong no intervalo [100,999].

program Armstrong ;
var
c, d, u : integer ;
centena, dezena : integer ;
begin
writeln ('Numeros de Armstrong no intervalo [100,999]:');
for c := 1 to 9 do
begin
centena := 100 * c ;
for d := 0 to 9 do
begin
dezena := 10 * d ;
for u := 0 to 9
do if (c*c*c + d*d*d + u*u*u)
=
centena + dezena + u
then writeln (c:1, d:1, u:1);
end
end
end. (* Armstrong *)

O resultado da execuo mostrado abaixo.

Numeros de Armstrong no intervalo [100,999]:
153
370
371
407
Programao de Computadores I Prof. Pedro Manoel Silveira
10
Exemplo 18.
O programa l um conjunto de nmeros para um vetor e imprime o conjunto ordenado pelo Mtodo das
Permutaes Adjacentes.

program ordena ;
type
vetortype = array [1..100] of integer;

var
vetor : vetortype;
i, n, temp, contador : integer;
trocou : boolean;
procedure listanumeros;
var
i, posicao : integer;
begin
posicao := 1;
for i := 1 to contador do
begin
write ( vetor [i]:5 );
if posicao = 9
then begin
writeln;
posicao := 1;
end
else posicao := posicao + 1;
end;
if posicao <> 1
then writeln;
end; (* listanumeros *)

begin
writeln
('Entre com os numeros a ordenar encerrando com zero');
contador := 0;
read (n);
while n <> 0 do
begin
contador := contador + 1;
vetor[contador] := n;
read (n);
end;
readln;
writeln ('Numeros lidos');
listanumeros;
repeat
trocou := false;
for i:= 2 to contador do
if vetor [i-1] > vetor [i]
then begin
temp := vetor [i];
vetor [i] := vetor [i-1];
vetor [i-1] := temp;
trocou := true
end;
until not trocou;
writeln ('Numeros ordenados');
listanumeros;
end. (* ordena *)

Quando o programa pergunta pelos nmeros a ordenar, deve-se fornecer uma lista, ocupando uma ou
mais linhas, que deve ser encerrada pelo valor zero (o programa pra a leitura quando encontra um).

Entre com os numeros a ordenar encerrando com zero
Programao de Computadores I Prof. Pedro Manoel Silveira
11
9 8
5
3 5 7 3 2
1
0
Numeros lidos
9 8 5 3 5 7 3 2 1
Numeros ordenados
1 2 3 3 5 5 7 8 9
Exemplo 19.
Uma forma de encontrar os nmeros primos at n a seguinte. O mtodo baseado na manuteno de
uma tabela, indicando para cada nmero, de 2 at n, se o mesmo primo ou no. Inicialmente, todos
esto marcados como primos. O processo de marcao dos no primos consiste em, a partir do primeiro
primo encontrado, marcar todos os seus mltiplos como no primos, at alcanar n. A seguir, busca-se o
prximo no marcado, que deve corresponder a um nmero primo, e repete-se o processo, marcando
todos os seus mltiplos. O processo termina quando no houver mais possibilidade de marcar nmero
algum. A lista de nmeros primos at n pode ento ser obtida pelo exame da tabela.
Veja, por exemplo, o caso dos nmeros primos at 10. O primeiro 2. A partir deste, seriam marcados
os nmeros 4, 6, 8, 10. O prximo no marcado seria o nmero 3. A partir deste, seriam marcados os
nmeros 6 e 9. O prximo no marcado seria o 5, que causaria a marcao do 10. Agora o prximo no
marcado seria o 7, que no causaria a marcao de nenhum outro, pois o seu menor mltiplo, 14, excede o
limite da tabela que 10. No haveria mais nmeros no marcados a partir do nmero 7. Na tabela,
teramos ainda como no marcados os nmeros 2, 3, 5, 7, que so os nmeros primos at 10.
Observe que, desse modo, os nmeros 6 e 10 foram marcados mais de uma vez, quando foram
considerados os primos 2, 3 e tambm quando foi considerado o primo 5, o que no muito eficiente. H
formas melhores de faz-lo, evitando-se algumas redundncias !
O programa abaixo implementa este algoritmo e imprime os primos encontrados tomando dez nmeros
por linha.

program primos ;
const
Limite = 999;

var
i, j : integer;
tabela : array [2..Limite] of boolean;

begin
for i := 2 to Limite do
tabela [i] := True;

for i := 2 to trunc (sqrt (Limite)) do
begin
if tabela [i]
then for j := i to (Limite div i) do
tabela [i*j] := False;
end;
writeln ('Numeros primos ate''', Limite:4);
j := 1;
for i := 2 to Limite do
if tabela [i]
then begin
write (i:5);
if j = 10
then begin
j := 1;
writeln
end
else j := j + 1
Programao de Computadores I Prof. Pedro Manoel Silveira
12
end
end. (* Primos *)

A sada do programa fica como mostrada abaixo.

Numeros primos ate' 500
2 3 5 7 11 13 17 19 23 29
31 37 41 43 47 53 59 61 67 71
73 79 83 89 97 101 103 107 109 113
127 131 137 139 149 151 157 163 167 173
179 181 191 193 197 199 211 223 227 229
233 239 241 251 257 263 269 271 277 281
283 293 307 311 313 317 331 337 347 349
353 359 367 373 379 383 389 397 401 409
419 421 431 433 439 443 449 457 461 463
467 479 487 491 499
Exemplo 20.
O exemplo a seguir a verso recursiva do clculo do fatorial de um nmero n.

program fatfunct ;
var
n : integer;

function fat ( arg : integer ) : real ;
begin
if arg <= 1
then fat := 1
else fat := arg * fat ( arg - 1 ) ;
end;

begin
write ('Digite um numero para calculo do fatorial: ');
readln (n);
writeln ('O fatorial de ', n:2, ' eh ', fat (n) )
end. (* fatfunct *)

Veja um exemplo de execuo.

Digite um numero para calculo do fatorial: 20
O fatorial de 20 eh 2.4329020082E+18

Observe que agora podemos calcular o fatorial de nmeros maiores, uma vez que utilizamos o tipo real
para acumular o resultado.
Exemplo 21.
O pagamento dos operrios de uma fbrica deve ser feito em dinheiro, previamente envelopado de acordo
com os valores lquidos dos salrios. O programa abaixo prepara um relatrio que indica, para cada
funcionrio, quantas notas de cada valor devem ser envelopadas.
Para simplificar a idia, vamos supor que s existem notas cujos valores so 100, 50, 10, 5 e 1. Tambm
assumimos que os valores a serem pagos so inteiros. O programa emite um relatrio onde aparecem o
nome do funcionrio, o valor a ser pago e a quantidade de notas que devero estar no seu envelope. Estes
totais so acumulados no final. Os dados de entrada, nome e valor a pagar so obtidos de um arquivo
que lido at que a condio de fim-de-arquivo seja verdadeira.

program envelopes ;
type
notas = ( cem, cinquenta, dez, cinco, hum ) ;
var
contanotas,
acumnotas : array [ cem .. hum ] of integer ;
Programao de Computadores I Prof. Pedro Manoel Silveira
13
nome : string ;
salario,
saldo,
totsalario : integer ;
i : notas ;

begin
totsalario := 0 ;
for i := cem to hum do acumnotas [i] := 0 ;
writeln ('Nome', ' ':19, ' Salario ',
'Cr100':6, 'Cr50':6, 'Cr10':6, 'Cr5':6, 'Cr1':6 );

while not eof (input) do
begin
readln (nome);
readln (salario);
saldo := salario ;
contanotas [cem] := saldo div 100 ;
saldo := saldo mod 100 ;
contanotas [cinquenta] := saldo div 50 ;
saldo := saldo mod 50 ;
contanotas [dez] := saldo div 10 ;
saldo := saldo mod 10 ;
contanotas [cinco] := saldo div 5 ;
saldo := saldo mod 5 ;
contanotas [hum] := saldo ;

totsalario := totsalario + salario ;
for i := cem to hum do
acumnotas [i] := acumnotas [i] + contanotas [i] ;

write ( nome, ' ':(21 - Length (nome)), salario:9, ' ' );
for i := cem to hum do
write ( contanotas [i]:6 );
writeln;

end ;

writeln;
write ( 'Totais acumulados:':21 );
write ( totsalario:9, ' ' );
for i := cem to hum do
write (acumnotas [i]:6 );
writeln;

end. (* envelopes *)

Considere que o arquivo de entrada contm os seguintes dados

Isaac Newton
258
Albert Einstein
312
Sigmund Freud
431
Charles Darwin
327
Alan Turing
1768

e o resultado da execuo ser da forma abaixo.

Nome Salario Cr100 Cr50 Cr10 Cr5 Cr1
Isaac Newton 258 2 1 0 1 3
Albert Einstein 312 3 0 1 0 2
Programao de Computadores I Prof. Pedro Manoel Silveira
14
Sigmund Freud 431 4 0 3 0 1
Charles Darwin 327 3 0 2 1 2
Alan Turing 1768 17 1 1 1 3

Totais acumulados: 3096 29 2 7 3 11
Exemplo 22.
Dois espies combinaram entre si um cdigo para enviar mensagens. A codificao de uma mensagem
envolve dois passos, descritos a seguir.

Inicialmente, cada caractere aparecendo na mensagem original substitudo por seu cdigo ASCII. Por
exemplo,
UVA 85 86 65
Na segunda etapa, o valor para cada letra somado a um certo nmero, de acordo com uma tabela e de
acordo com a posio relativa da letra na mensagem original. Assim, para uma tabela de 4 elementos
formada pelos nmeros
407 411 415 419
a codificao para o exemplo acima seria
U 85 + 407
V 86 + 411
A 65 + 415
Os cdigos de fim-de-linha (line feed) tem valor 13. A mensagem termina com o cdigo 0, que deve
sempre aparecer no final. A tabela deve ser usada circularmente, ou seja, quando a posio de uma letra
excede o nmero de elementos, retorna-se ao primeiro e assim por diante. O quadro abaixo mostra um
exemplo com mais detalhes.

Letra Cdigo
U 85 + 407
V 86 + 411
A 65 + 415
32 + 419
R 82 + 407
O 79 + 411
S 83 + 415
A 65 + 419
13 + 407

O programa a seguir mostra como feita a codificao das mensagens. Observe que fins-de-linha so
detectados atravs da funo eoln, que retorna o valor true quando o prximo caractere na entrada fim-
de-linha. A condio de fim-de-arquivo, na entrada, testada pela funo eof, que retorna o valor true
quando no h mais caracteres para serem lidos no arquivo.
A tabela dos nmeros usados na codificao tem 50 elementos e no armazenada pelo programa, mas
sim gerada tomando-se a parte inteira da expresso
e
n
10
2
. 6

+


onde n a posio do elemento que se quer calcular. Observe que, para uma letra cuja posio seja
superior a 50, deve-se considerar o aspecto circular da tabela.

program espiao;
const
SizeTab = 50;
var
letra : char;
Programao de Computadores I Prof. Pedro Manoel Silveira
15
ordem : integer;
linha : string;
i : integer;

function codigo ( numero, ordem : integer ) : integer;
var
posicao : integer;
begin
posicao := ordem mod SizeTab;
if posicao = 0
then posicao := SizeTab;
codigo := numero + trunc( exp( 6 + posicao * 0.01 ) );
end; (* Codigo *)

begin
ordem := 1;
while not eof(input) do
begin
readln (linha);
for i := 1 to length (linha) do
begin
writeln ( codigo(ord(linha [i]), ordem) );
ordem := ordem + 1;
end;
writeln ( codigo(13, ordem) );
ordem := ordem + 1;
end;
writeln ( 0 );
end. (* Espiao *)

Certifique-se de que voc entendeu perfeitamente o programa de codificao antes de
seguir adiante neste exemplo. Ateno para o cdigo 0 no final do arquivo contendo a
mensagem codificada.
Exemplo 23.
Agora, mostramos o programa que descodifica as mensagens codificadas como explicado
acima.

program antiespiao ;
const
SizeTab = 50;
var
ordemletra : integer;
ordem : integer;
codigo : integer;

function anticodigo ( ordem, codigo : integer ) : integer ;
var
posicao : integer;
begin
posicao := ordem mod SizeTab;
if posicao = 0
then posicao := SizeTab;
anticodigo := codigo - trunc( exp( 6 + posicao * 0.01 ) );
end; (* AntiCodigo *)

begin
ordem := 1;
read (codigo);
while codigo <> 0 do
begin
ordemletra := anticodigo(ordem, codigo);
if ordemletra = 13
then writeln
else write ( char(ordemletra));
Programao de Computadores I Prof. Pedro Manoel Silveira
16
ordem := ordem + 1;
read (codigo);
end;
end. (* AntiEspiao *)

Vejamos um exemplo de execuo dos dois programas listados acima. Inicialmente, suponha que o
arquivo de entrada para o programa de codificao contm os seguintes dados.

Atacaremos ao amanhecer
Se a vaca nao for para o brejo.

O arquivo que gravado com os cdigos conteria as informaes como mostrado abaixo. Para racionalizar
o espao, listamos os nmeros em vrias colunas, embora originalmente o arquivo conteria um cdigo por
linha. Assim, o primeiro nmero gravado 472, o segundo 527, e assim por diante.

472 482 596 647 721 521
527 551 603 654 646 512
512 570 621 658 732 521
518 496 525 598 723 530
521 565 601 682 746 470
542 582 624 675 736 441
533 575 560 695 677 0
546 592 630 621 762
552 591 571 697 690
560 593 662 712 763

A execuo do programa despiao tendo como entrada um arquivo de cdigos como o que est mostrado
acima, resulta na impresso da mensagem original

Atacaremos ao amanhecer
Se a vaca nao for para o brejo.
Exemplo 24.
possvel obter uma aproximao de pela frmula abaixo

|
.
|

\
|
+ +
25
1
16
1
9
1
4
1
1 . 12

Quanto maior for o nmero de termos que se utilize no clculo, melhor ser a preciso do valor
aproximado obtido. O programa abaixo calcula calculando os 500 primeiros termos da srie.

program calculaPi ;
var
soma, pi_calc : real;
i : integer;
begin
soma := 1;
for i := 2 to 2000 do
if (i mod 2) = 0
then soma := soma - 1 / i / i
else soma := soma + 1 / i / i;
pi_calc := sqrt (12 * soma);
writeln ('Aproximacao calculada = ', pi_calc:8:6);
writeln ('PI= ', PI);
writeln ('Diferenca= ', PI-pi_calc);
end. (* calculaPi *)

O resultado da execuo aparece na seguinte mensagem.

Aproximacao calculada = 3.141589
Programao de Computadores I Prof. Pedro Manoel Silveira
17
Exemplo 25.
Outra forma de calcular uma aproximao de pela frmula

4

= dx
x

0
1
2
1


O valor da integral pode ser obtido pelo somatrio

(

+
|
.
|

\
|
+ +
|
.
|

\
|
+
|
.
|

\
|
+ ) 1 (
1
2
2
2
1
2 ) 0 (
2
1
f
n
n
f
n
f
n
f f
n


onde f(x) = 1 / (1 + x
2
)

O programa abaixo efetua os clculos para n=500.

program calculaPi ;
const
N = 500;
var
soma, pi : real;
i : integer;

function f ( x : real ) : real ;
begin
f := 1 / ( 1 + x * x );
end; (* function f *)

begin
soma := f(0) + f(1);
for i := 1 to N-1 do
soma := soma + 2 * f(i/N);
pi := 4 / (2 * N) * soma;
writeln ('Aproximacao calculada = ', pi:8:6);
end. (* calculaPi *)

O programa produz a mensagem abaixo.

Aproximacao calculada = 3.141592
Exemplo 26.
Dentre as funes standard do Pascal no h uma que permita calcular a expresso x
y
. Este exemplo
mostra como poderamos escrever tal funo a partir das funes exp e ln.

function xtoy ( x, y : real ) : real ;
const
e = 2.718281828 ;
var
temp : real ;
begin
temp := ln ( x ) ;
xtoy := exp ( y * temp ) ;
end ; (* xtoy *)

Veja o exemplo de um programa que utiliza essa funo.

program teste;
var
Programao de Computadores I Prof. Pedro Manoel Silveira
18
I : byte;

function xtoy ( x, y : real ) : real ;
const
e = 2.718281828 ;
var
temp : real ;
begin
temp := ln ( x ) ;
xtoy := exp ( y * temp ) ;
end ; (* xtoy *)

begin
writeln (' Tabela de potencias de 2');
for I := 1 to 20 do
begin
writeln (I:6, ' ', xtoy (2, I):8:0);
end;
end.