Ir para o conteúdo

PARTE II - Componente Prática para Aplicação de Conhecimentos

Nesta continuação será dada ênfase à parte prática da programação em Pascal. Serão colocados igualmente Propostas de Exercícios. Esta parte do Tutorial não terá constantes explicações dos códigos para poder exercitar a leitura lógica de um programa em Pascal.

1. Hello World!

Como em qualquer linguagem, onde se começa regra geral com o famoso “Olá Mundo!”, ir-se-á realizá-lo em Pascal. Primeiramente, há que saber que, neste programa, apenas será escrita uma mensagem, pelo que bibliotecas não são necessárias. Esta parte é, então, omitida nas declarações iniciais:

program hello_world;  // Declara-se o programa, no geral.
// bibliotecas não são necessárias
// não são necessárias variáveis

begin
     writeln('Hello World!');  // escreve o texto “Hello World!”
     readln;  // sem isto, o programa é encerrado repentinamente: é necessário pressionar ENTER.
end.

“Embeleze-se” o programa, onde já se irá pedir o nome do utilizador e dar uma mensagem final.

program hello_world;  // Declara-se o programa, no geral.
uses crt;  // dependendo do IDE/compilador, este biblioteca será necessária ou não neste exemplo
var nome:string;

begin
     write('Introduza o seu nome: ');  // escreve o texto, e o cursor fica à frente deste, pois falta o sufixo LN (LiNe)
     readln(nome);
     writeln;  // faz mais um parágrafo sem escrever texto
     writeln('Hello World!');
     writeln('Seja bem-vindo, Sr.(a) ',nome);  // escreve o texto, seguido do conteúdo da variável NOME
     readln;
end.

2. A primeira calculadora – uso do If… Then… Else…

Crie-se a primeira calculadora. O utilizador não vai escolher o operador. Simplesmente o utilizador introduz os dois valores e aparecem os resultados das quatro operações básicas. Necessitar-se-á de uma condição If… Then… Else… por causa da divisão. Se o denominador for 0 (zero), o programa, ao tentar fazer a conta, irá abaixo: a condição vai evitar este bug.

program primeira_calculadora;
uses crt;
var num1,num2:real;

Ou seja, utilizar-se-á duas variáveis reais que alojarão os dois valores necessários.

program primeira_calculadora;
uses crt;
var num1,num2:real;

begin
     writeln('CALCULADORA SIMPLES');
     write('Primeiro valor: ');
     readln(num1);
     write('Segundo valor: ');
     readln(num2);
end.

Neste momento, o utilizador é convidado a introduzir os dois valores que farão parte das quatro operações.

Resta, então, realizar os cálculos e mostrá-los ao utilizador:

program primeira_calculadora;
uses crt;
var num1,num2:real;

begin
     writeln('CALCULADORA SIMPLES');
     write('Primeiro valor: ');
     readln(num1);
     write('Segundo valor: ');
     readln(num2);
     writeln;
     writeln(num1:0:3,' + ',num2:0:3,' = ',num1+num2:0:3);
     writeln(num1:0:3,' - ',num2:0:3,' = ',num1-num2:0:3);
     writeln(num1:0:3,' * ',num2:0:3,' = ',num1*num2:0:3);
end.

Contudo, chega a fase de antever a situação de num2 = 0 por causa da divisão. Criar-se-á, então, a condição à parte.

write(num1:0:3,' / ',num2:0:3,' = ');
// não faz parágrafo, à frente ficará o resultado ou uma mensagem de erro
if (num2 = 0) then begin  // SE num2=0 ENTÃO
   write('Infinito');  // escrever “INFINITO”
end
else begin  // SE NÃO
     writeln(num1/num2:0:3);  // escrever resultado
end;

Inclua-se no código do programa:

program primeira_calculadora;
uses crt;
var num1,num2:real;

begin
     writeln('CALCULADORA SIMPLES');
     write('Primeiro valor: ');
     readln(num1);
     write('Segundo valor: ');
     readln(num2);
     writeln;
     writeln(num1:0:3,' + ',num2:0:3,' = ',num1+num2:0:3);
     {a cláusula “:0:3” dá duas indicações: ocupar o espaço mínimo de 0 caracteres, arredondando o número a 3 casas decimais}
     writeln(num1:0:3,' - ',num2:0:3,' = ',num1-num2:0:3);
     writeln(num1:0:3,' * ',num2:0:3,' = ',num1*num2:0:3);
     write(num1:0:3,' / ',num2:0:3,' = ');
     if (num2 = 0) then begin  // SE num2=0 ENTÃO
        writeln('Infinito');  // escrever “INFINITO”
     end
     else begin  // SE NÃO
          writeln(num1/num2:0:3);  // escrever resultado
     end;
     readln;  // esperar pelo ENTER
end.

3. Avaliações 1 – uso do Case… Of…

Considere-se uma escala de avaliações, numa escola, de 0 a 20 (de zero a vinte) valores. Considere-se a negativa uma avaliação abaixo de 10 e a positiva acima deste valor, inclusive. Utilizar-se-á apenas e tão-somente, neste exemplo, avaliações inteiras (números inteiros).

program avaliacoes;
uses crt;
var nota : integer;

begin
     write('Escreva a avaliacao, inteira, de 0 a 20: ');
     readln(nota);
     case nota of
          // falta a selecção de casos
     else writeln('Nota invalida');
     end;
     readln;
end.

Para seleccionar os casos, pode-se utilizar a noção de intervalo1, existente no Pascal. Evita-se escrever o caso de ser 0, de ser 1, 2, 3 e por aí adiante. Se se quiser que o caso de a avaliação ser “FRACO” seja no intervalo de 0 a 3, inclusive, pode-se escrever este intervalo como 0..3

Então, faça-se a selecção de casos no programa:

program avaliacoes;
uses crt;
var nota : integer;

begin
     write('Escreva a avaliacao, inteira, de 0 a 20: ');
     readln(nota);
     case nota of
          0..3 : writeln('Fraco');
          4..9 : writeln('Insuficiente');
          10..12 : writeln('Pouco Suficiente');
          13..15 : writeln('Suficiente');
          16..18 : writeln('Bom');
          19..20 : writeln('Excelente')
     else writeln('Nota invalida');
     end;
     readln;
end.

4. Avaliações 2 – uso do Repeat… Until…

Pegue-se no programa anterior e acrescentasse-lhe dois ciclos Repeat… Until…. Um para analisar a nota assim que é introduzida, e outro para controlar o fecho do programa: caso o utilizador escreva “1” o programa volta a pedir uma avaliação, caso contrário fecha o programa. A estrutura para analisar a introdução da avaliação terá de ser a seguinte:

repeat
      write('Escreva a avaliacao, inteira, de 0 a 20: ');
      readln(nota);
until (nota>=0) and (nota<=20);

Pode-se ainda avisar o utilizador caso falhe a introdução da avaliação com uma estrutura de decisão:

repeat
      write('Escreva a avaliacao, inteira, de 0 a 20: ');
      readln(nota);
      if not ((nota>=0) and (nota<=20)) then begin
         writeln('Erro! Nao esta no intervalo 0 a 20!');
         writeln;
      end;
until (nota>=0) and (nota<=20);

Para controlar o fecho do programa, necessita-se de uma variável de controlo, à qual chamar-se-á fecho e será do tipo integer.

repeat
      // programa todo
      write('“1” para reiniciar, outro número para sair: ');
      readln(fecho);
until (fecho<>1);

Implemente-se agora estas duas estruturas no programa:

program avaliacoes;
uses crt;
var nota, fecho : integer;

begin
     repeat
           repeat
                 write('Escreva a avaliacao, inteira, de 0 a 20: ');
                 readln(nota);
                 if not ((nota>=0) and (nota<=20)) then begin
                   writeln('Erro! Nao esta no intervalo 0 a 20!');
                   writeln;
                 end;
           until (nota>=0) and (nota<=20);
           case nota of
                0..3 : writeln('Fraco');
                4..9 : writeln('Insuficiente');
                10..12 : writeln('Pouco Suficiente');
                13..15 : writeln('Suficiente');
                16..18 : writeln('Bom');
                19..20 : writeln('Excelente')
           else writeln('Nota invalida');
           end;
           writeln;
           write('“1” para reiniciar, outro número para sair: ');
           readln(fecho);
     until (fecho<>1);
end.

Propostas de Exercícios 1. Crie a sua própria calculadora. Contudo, o utilizador terá de escolher a operação a realizar e, no caso de esta ser a divisão, o programa terá de impedir o utilizador de introduzir denominador 0 (zero), obrigando-o a introduzir outro valor para tornar a divisão possível. Mostre uma mensagem de erro neste caso. As variáveis para os valores das operações a realizar terão de ser reais, e a que selecciona a operação deverá ser uma string. Mostre ao utilizador o maior número de informações possíveis sobre a calculadora. Mas não sobre o que o programa está a processar no momento, como “A realizar a soma”. Normas:

  • Limite máximo de linhas de código (exclusive comentários e linhas em branco): 40 linhas.

5. Ordenação crescente de uma lista – uso do ciclo For… To… Do…

Para ordenar uma lista de valores, peça-se ao utilizador para criar uma lista de dez números inteiros, e de seguida mostra-se a lista por ordem crescente. Comece-se por definir as variáveis necessárias:

program crescente;
var lista : array [1..10] of integer;  // lista de 10 inteiros
    i, j : integer;  // dois contadores para os ciclos FOR

begin

end.

O programa será feito, doravante, por partes. Começa-se por pedir os 10 valores da lista ao utilizador:

     writeln('INTRODUZA OS 10 VALORES DA LISTA:');
     for i:=1 to 10 do begin
         write('Valor nº', i, ': ');
         readln(lista[i]);
     end;

Para ordenar a lista pode-se utilizar o seguinte método. Começando pelo primeiro valor, analisa-se cada número com todos os restantes valores da lista. Caso encontre um menor que este, trocam-se directamente. De seguida, analisa o segundo valor, e compara-o com os seguintes, mas NÃO com os anteriores (neste caso, o primeiro). O processo repete-se até ao último valor da lista. Exemplo:

Lista: 7 » 9 » 5 » 2 Processo: 1. “Pega” no primeiro valor da lista e compara:

  • 9 < 7 – falso: 7 » 9 » 5 » 2
  • 5 < 7 – verdade: 5 » 9 » 7 » 2

Agora o primeiro valor é o 5, e a análise continua:

  • 2 < 5 – verdade: 2 » 9 » 7 » 5

Como se verifica, o número mais baixo da lista ficou em primeiro lugar. 2. Compara com o segundo valor da lista:

  • 7 < 9 – verdade: 2 » 7 » 9 » 5

Agora o segundo valor é o 7.

  • 5 < 7 – verdade: 2 » 5 » 9 » 7

3. Agora, com o terceiro valor:

  • 7 < 9 – verdade: 2 » 5 » 7 » 9

E termina aqui a análise. Como se verifica, este processo coloca a lista toda por ordem crescente. Em código, necessitar-se-á de uma variável auxiliar para realizar a troca, chamada aux:

     for i:=1 to 10 do begin
         for j:=i to 10 do begin
             if (lista[j]<lista[i]) then begin
                aux:=lista[j];
                lista[j]:=lista[i];
                lista[i]:=aux;
             end;
         end;
     end;

Só resta mostrar a lista por ordem crescente obtida:

     write('Lista por ordem crescente: ');
     for i:=1 to 10 do begin
         write(lista[i],'; ');
     end;

Resta implementar estas partes no programa final:

program crescente;
var lista : array [1..10] of integer;  // lista de 10 inteiros
    i, j : integer;  // dois contadores para os ciclos FOR
    aux : integer;  // auxiliar para troca de valores em lista

begin
     writeln('INTRODUZA OS 10 VALORES DA LISTA:');
     for i:=1 to 10 do begin  // lê a lista
         write('Valor nº', i, ': ');
         readln(lista[i]);
     end;

     for i:=1 to 10 do begin  // coloca a lista por ordem crescente
         for j:=i to 10 do begin
             if (lista[j]<lista[i]) then begin
                aux:=lista[j];
                lista[j]:=lista[i];
                lista[i]:=aux;
             end;
         end;
     end;

     write('Lista por ordem crescente: ');
     for i:=1 to 10 do begin  // mostra a lista, agora ordenada
         write(lista[i],'; ');
     end;
     writeln;
     write('ENTER para sair. . .');
     readln;
end.

Propostas de Exercícios 2. Crie um contador de avaliações positivas de uma turma. O utilizador deverá introduzir o número de alunos que a turma tem, e de seguida o programa pedirá a avaliação de cada aluno. Para tal, o programa deverá ter um controlo da avaliação introduzida, para que esta esteja dentro de intervalo 0 a 20 valores. No final, o programa irá devolver quantas avaliações positivas existem, apresentando a percentagem, arredondada às décimas. Normas:

  • O programa não deverá ter mais do que um ciclo for;
  • Limite máximo de linhas de código (exclusive comentários e linhas em branco): 20 linhas.

3. Crie um programa que debite o maior de todos os n valores introduzidos pelo utilizador, sendo os n números a introduzir definidos pelo utilizador. O limite mínimo é 5 e o máximo é 50. Normas:

  • O programa não deverá ter nenhum ciclo for;
  • Limite máximo de linhas de código (exclusive comentários e linhas em branco): 25 linhas.

6. Contagem de espaços e palavras numa frase – uso de string

Imagine-se que é necessário saber quantos espaços e quantas palavras tem uma frase: é necessário um programa que conte o número de espaços que se encontra numa frase. Pede-se ao utilizador para escrever uma frase, e o programa dirá o número de espaços e de palavras que encontrou.

Primeiro, o contador de espaços:

program contador;
uses crt;
var frase : string;
    i, contaespacos, contapalavras : integer;

begin
     write('Introduza uma frase a sua escolha: ');
     readln(frase);
     for i:=1 to length(frase) do begin  // contador de espaços
         if (frase[i]=' ') then contaespacos:=contaespacos+1;
     end;
end.

Uma palavra está entre espaços, e esta é a base para a análise de palavras neste programa:

program contador;
uses crt;
var frase : string;
    i, contaespacos, contapalavras : integer;

begin
     write('Introduza uma frase a sua escolha: ');
     readln(frase);

     contaespacos:=0;
     for i:=1 to length(frase) do begin  // contador de espaços
         if (frase[i]=' ') then contaespacos:=contaespacos+1;
     end;

     contapalavras:=0;
     if (frase[1]=' ') and (frase[2]<>' ') then contapalavras:=1;
     // Poderá haver um espaço a começar a string "frase". Este código prevê esta situação.
     if frase[1]<>' ' then contapalavras:=1;
     // verifica igualmente se o primeiro caracter NÃO é um espaço, contando então uma palavra.
     for i:=2 to length(frase) do begin  // análise da restante string, já com a existência da primeira palavra prevista
         if (frase[i]=' ') and (upcase(frase[i+1]) in ['A'..'Z']) then contapalavras:=contapalavras+1;
         {se o actual caracter da frase é um espaço e o próximo é uma letra, então acabou a palavra - soma 1 ao contador}
     end;

     writeln('A frase contem ',contapalavras,' palavras, assim como ',contaespacos,' espacos');
     readln;
end.

Propostas de Exercícios 4. Crie um programa que elimine os espaços a mais. O utilizador introduz uma frase à sua escolha, e o programa irá eliminar os espaços a mais, reduzindo-os a um só, entre cada palavra. Normas:

  • Terá de utilizar somente ciclos for;
  • Limite máximo de linhas de código (exclusive comentários e linhas em branco): 30 linhas.

7. Cálculo da tangente – uso de uma função

Para treinar a criação de uma função, um bom exemplo é o da tangente de um número (ângulo), já que o Pascal não tem uma. Ter-se-á de ter em atenção que cos(a) não pode ser 0 (zero), pois:

tg(a) = sen(a) / cos(a)

Nesse caso, o programa dirá que a tangente não é possível. Para saber se é possível, criar-se-á outra função que indica tal.

program tangente;
uses crt;
var a : real;

function tan(angulo:real):real;  // tangent = seno / co-seno
begin
     tan:=sin(angulo)/cos(angulo);
end;

function tangente_possivel(angulo:real):boolean;  // a tangente é possível se o co-seno for diferente de zero
begin
     if (cos(angulo)=0) then tangente_possivel:=false
     else tangente_possivel:=true;
end;

begin
     write('Introduza angulo, em radianos: ');
     readln(a);
     if tangente_possivel(a) then writeln('Tangente de ',a:0:10,': ',tan(a):0:10)
     else writeln('Tangente de ',a:0:10,': infinito');
     readln;
end.

Propostas de Exercícios 5. Crie um programa que calcule o factorial de um número. O programa deverá analisar se o valor introduzido é inteiro ou não, e se é positivo, ou seja, a variável que lê o número é real. Deverá prever a situação especial do factorial de zero. Normas:

  • Terá de utilizar uma função para cálculo do factorial;
  • Limite máximo de linhas de código (exclusive comentários e linhas em branco): 30 linhas.


  1. Mais propriamente Conjunto, só abordado na Parte V.