EXEMPLOS DE PROGRAMAS PASCAL by hcw25539

VIEWS: 10,112 PAGES: 18

									Programação de Computadores I                                                Prof. Pedro Manoel Silveira




                          EXEMPLOS DE PROGRAMAS PASCAL

Exemplo 1.
Este programa saúda o mundo, imprimindo Hello world! no dispositivo de saída.

        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 execução do programa acima provocaria a impressão
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 execução.

        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 números inteiros,
o operador / é capaz de operar com inteiros e reais.



Exemplo 3.
Este programa lê o número de um aluno e suas três notas, calcula a média das notas, ponderada pelos
pesos 2,3,4 respectivamente, e imprime o número do aluno, suas três notas e a média.

                                                   1
Programação de Computadores I                                                  Prof. Pedro Manoel Silveira



        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 execução.
        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 equação do 2. grau e calcula suas raízes 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
condição delta < 0 seja verdadeira, e a que foi especificada a seguir da palavra else, caso a mesma
condição revele-se falsa. No segundo caso, devem ser executados três comandos e no primeiro, apenas
um. Isso obriga a definição de um bloco de comandos pela introdução dos delimitadores begin e end.
Para efeitos sintáticos, um bloco de comandos tem o mesmo papel de um comando único. A sintaxe do
comando if exige que, após then ou else, apareça apenas um comando, ou um bloco delimitado de
comandos. Veja dois exemplos de execução.
        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




                                                    2
Programação de Computadores I                                                 Prof. Pedro Manoel Silveira



Exemplo 5.
O programa abaixo lê três números, representando os lados de um triângulo e calcula sua área, dada pela
fórmula

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

verificando se os lados formam um triângulo ou não, onde s é o semiperímetro do triângulo,
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 lógicos and e or no comando if. Um triângulo,
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 comparações: a condição deve ser válida 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 diferença
entre um write e um writeln pode ser facilmente percebida: o uso de write indica que o próximo trecho
impresso será uma continuação da mesma linha; o uso de writeln indica que o próximo trecho impresso
deverá aparecer na próxima linha. Para um triângulo 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 impossível, a execução 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 são numerados de 1 a 4, no sentido anti-horário, 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,

                                                        3
Programação de Computadores I                                                Prof. Pedro Manoel Silveira



                      ') 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 números do resultado com o formato :1:2. O resultado fica
mais elegante do que quando tentamos prever um número fixo de colunas. Neste caso, como o tamanho 1
fica sujeito a estourar, o Pascal usa quantas posições de impressão forem necessárias, tornando a
mensagem compacta e sem espaços em branco.
Aqui aparece um comando if que contém um outro comando if dentro de si. Comandos if assim
dispostos são chamados de IF's aninhados. A estrutura do comando if não 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 após 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 cláusula else. Atenção 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ê três números representando os lados de um triângulo, verifica se o mesmo é
possível e classifica-o quanto ao tipo: equilátero, isóceles 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 execução do programa acima.
                                                   4
Programação de Computadores I                                             Prof. Pedro Manoel Silveira




        Digite os valores dos lados do triangulo:3 4 5 ↵
        O triangulo eh escaleno

Exemplo 8.
O programa abaixo lê três números 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 execução onde os números fornecidos são 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 raízes quadradas para os números 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




                                                 5
Programação de Computadores I                                               Prof. Pedro Manoel Silveira




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 saída do programa.
        ABCDEFGHIJKLMNOPQRSTUVWXYZ

Exemplo 11.
O programa abaixo calcula o somatório dos N primeiros termos da seqüência

                      1 1 1
                 1+    + + + ...
                      2 4 8
        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 *)
                                                   6
Programação de Computadores I                                                Prof. Pedro Manoel Silveira




Veja dois exemplos de execução.

        8 ↵
        O valor excede 7. Nao posso calcular!

        6 ↵
        O fatorial de       6 eh 720

Exemplo 13.
Na Seqüência de Fibonacci, cada termo é a soma dos seus dois predecessores. O programa abaixo gera e
imprime os termos dessa seqüência que são menores do que um certo limite, começando 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 execução.
                                                   7
Programação de Computadores I                                               Prof. Pedro Manoel Silveira




        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 expressão

                            
                            
                            
                            
                            
          1                 
2+                          
                         
     
            1             
                           
   2+                    
     2 +  1
           
                         
                         
  
     
          2 + Λ        
                           

é um exemplo de função contínua. Valores aproximados desta fração podem ser calculados tomando-se,
por exemplo, S1=2, S2=2+1/S1,...,Sn=2+1/Sn-1. O programa abaixo calcula e imprime os valores das
aproximações até que o valor absoluto da diferença entre uma aproximação 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 execução:
        Aproximacoes calculadas:
              2.000000
              2.500000
              2.400000
              2.416667

                                                   8
Programação de Computadores I                                             Prof. Pedro Manoel Silveira



                2.413793
                2.414286
                2.414201
                2.414216

Exemplo 16.
O próximo programa imprime uma pirâmide 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 número 153 é um Número de Armstrong porque o somatório dos cubos de cada um dos seus
algarismos 13 + 53 + 33 = 1+125+27 = 153 é igual ao próprio número. O programa abaixo encontra e
imprime todos os números 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 execução é mostrado abaixo.
        Numeros de Armstrong no intervalo [100,999]:
        153
        370
        371
        407

                                                 9
Programação de Computadores I                                                Prof. Pedro Manoel Silveira



Exemplo 18.
O programa lê um conjunto de números para um vetor e imprime o conjunto ordenado pelo Método das
Permutações 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 números a ordenar, deve-se fornecer uma lista, ocupando uma ou
mais linhas, que deve ser encerrada pelo valor zero (o programa pára a leitura quando encontra um).
        Entre com os numeros a ordenar encerrando com zero

                                                  10
Programação de Computadores I                                               Prof. Pedro Manoel Silveira



        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 números primos até n é a seguinte. O método é baseado na manutenção de
uma tabela, indicando para cada número, de 2 até n, se o mesmo é primo ou não. Inicialmente, todos
estão marcados como primos. O processo de marcação dos não primos consiste em, a partir do primeiro
primo encontrado, marcar todos os seus múltiplos como não primos, até alcançar n. A seguir, busca-se o
próximo não marcado, que deve corresponder a um número primo, e repete-se o processo, marcando
todos os seus múltiplos. O processo termina quando não houver mais possibilidade de marcar número
algum. A lista de números primos até n pode então ser obtida pelo exame da tabela.
Veja, por exemplo, o caso dos números primos até 10. O primeiro é 2. A partir deste, seriam marcados
os números 4, 6, 8, 10. O próximo não marcado seria o número 3. A partir deste, seriam marcados os
números 6 e 9. O próximo não marcado seria o 5, que causaria a marcação do 10. Agora o próximo não
marcado seria o 7, que não causaria a marcação de nenhum outro, pois o seu menor múltiplo, 14, excede o
limite da tabela que é 10. Não haveria mais números não marcados a partir do número 7. Na tabela,
teríamos ainda como não marcados os números 2, 3, 5, 7, que são os números primos até 10.
Observe que, desse modo, os números 6 e 10 foram marcados mais de uma vez, quando foram
considerados os primos 2, 3 e também quando foi considerado o primo 5, o que não é muito eficiente. Há
formas melhores de fazê-lo, evitando-se algumas redundâncias !
O programa abaixo implementa este algoritmo e imprime os primos encontrados tomando dez números
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
                                                    11
Programação de Computadores I                                                Prof. Pedro Manoel Silveira



                       end
        end. (* Primos *)

A saída 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 versão recursiva do cálculo do fatorial de um número 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 execução.

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

Observe que agora podemos calcular o fatorial de números maiores, uma vez que utilizamos o tipo real
para acumular o resultado.

Exemplo 21.
O pagamento dos operários de uma fábrica deve ser feito em dinheiro, previamente envelopado de acordo
com os valores líquidos dos salários. O programa abaixo prepara um relatório que indica, para cada
funcionário, quantas notas de cada valor devem ser envelopadas.
Para simplificar a idéia, vamos supor que só existem notas cujos valores são 100, 50, 10, 5 e 1. Também
assumimos que os valores a serem pagos são inteiros. O programa emite um relatório onde aparecem o
nome do funcionário, o valor a ser pago e a quantidade de notas que deverão estar no seu envelope. Estes
totais são acumulados no final. Os dados de entrada, nome e valor a pagar são obtidos de um arquivo
que é lido até que a condição de fim-de-arquivo seja verdadeira.
        program envelopes ;
        type
             notas = ( cem, cinquenta, dez, cinco, hum ) ;
        var
             contanotas,
             acumnotas : array [ cem .. hum ] of integer ;

                                                    12
Programação de Computadores I                                                    Prof. Pedro Manoel Silveira



                    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 contém os seguintes dados
        Isaac Newton
        258
        Albert Einstein
        312
        Sigmund Freud
        431
        Charles Darwin
        327
        Alan Turing
        1768

e o resultado da execução 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
                                                       13
Programação de Computadores I                                                  Prof. Pedro Manoel Silveira



        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 espiões combinaram entre si um código para enviar mensagens. A codificação de uma mensagem
envolve dois passos, descritos a seguir.

Inicialmente, cada caractere aparecendo na mensagem original é substituído por seu código ASCII. Por
exemplo,
        UVA → 85 86 65
Na segunda etapa, o valor para cada letra é somado a um certo número, de acordo com uma tabela e de
acordo com a posição relativa da letra na mensagem original. Assim, para uma tabela de 4 elementos
formada pelos números
        407 411 415 419
a codificação para o exemplo acima seria
        U →85 + 407
        V →86 + 411
        A → 65 + 415
Os códigos de fim-de-linha (line feed) tem valor 13. A mensagem termina com o código 0, que deve
sempre aparecer no final. A tabela deve ser usada circularmente, ou seja, quando a posição de uma letra
excede o número de elementos, retorna-se ao primeiro e assim por diante. O quadro abaixo mostra um
exemplo com mais detalhes.
                  Letra             Código
                    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 codificação das mensagens. Observe que fins-de-linha são
detectados através da função eoln, que retorna o valor true quando o próximo caractere na entrada é fim-
de-linha. A condição de fim-de-arquivo, na entrada, é testada pela função eof, que retorna o valor true
quando não há mais caracteres para serem lidos no arquivo.
A tabela dos números usados na codificação tem 50 elementos e não é armazenada pelo programa, mas
sim gerada tomando-se a parte inteira da expressão
                              −2
                   6 +n. 10
                 e
onde n é a posição do elemento que se quer calcular. Observe que, para uma letra cuja posição seja
superior a 50, deve-se considerar o aspecto circular da tabela.
        program espiao;
        const
             SizeTab = 50;
        var
           letra : char;

                                                     14
Programação de Computadores I                                    Prof. Pedro Manoel Silveira



            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 codificação antes de
seguir adiante neste exemplo. Atenção para o código 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));
                                           15
Programação de Computadores I                                                Prof. Pedro Manoel Silveira



                       ordem := ordem + 1;
                       read (codigo);
             end;
        end. (* AntiEspiao *)

Vejamos um exemplo de execução dos dois programas listados acima. Inicialmente, suponha que o
arquivo de entrada para o programa de codificação contém os seguintes dados.
        Atacaremos ao amanhecer
        Se a vaca nao for para o brejo.

O arquivo que é gravado com os códigos conteria as informaões como mostrado abaixo. Para racionalizar
o espaço, listamos os números em várias colunas, embora originalmente o arquivo conteria um código por
linha. Assim, o primeiro número 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 execução do programa despiao tendo como entrada um arquivo de códigos como o que está mostrado
acima, resulta na impressão da mensagem original
        Atacaremos ao amanhecer
        Se a vaca nao for para o brejo.

Exemplo 24.
É possível obter uma aproximação de Π pela fórmula abaixo

                         1 1 1   1 
                     12.1 − + − + Λ 
                         4 9 16 25 

Quanto maior for o número de termos que se utilize no cálculo, melhor será a precisão do valor
aproximado obtido. O programa abaixo calcula Π calculando os 500 primeiros termos da série.
        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 execução aparece na seguinte mensagem.
        Aproximacao calculada = 3.141589
                                                   16
Programação de Computadores I                                                  Prof. Pedro Manoel Silveira



Exemplo 25.
Outra forma de calcular uma aproximação de Π é pela fórmula

                        0
                  Π         1
                  4
                    =   ∫       2
                                    dx
                        1   x
O valor da integral pode ser obtido pelo somatório

                  1              1         2              n −1      
                      f (0)+ 2 f  n  + 2 f  n  + Λ + 2 f  n  + f (1)
                  2n                                                

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

O programa abaixo efetua os cálculos 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 funções standard do Pascal não há uma que permita calcular a expressão xy. Este exemplo
mostra como poderíamos escrever tal função a partir das funções 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 função.

        program teste;
        var

                                                       17
Programação de Computadores I                            Prof. Pedro Manoel Silveira



            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.




                                              18

								
To top