Introdução a Computação

Soluções da aula prática 6



1.(as novas instruções são escrito em fonte grossa). Queremos executar o ciclo no mínimo uma vez. Então, vamos usar o ciclo Repeat-Until:
PROGRAM Calculator;

Var a, b, c: real;
    option: integer;

begin
  Write('numero 1: ');
  ReadLn(a);
  Write('numero 2: ');
  ReadLn(b);
  Repeat
    WriteLn('Escolhe uma opcao:');
    WriteLn('1) addicionar');
    WriteLn('2) mulitplicar');
    WriteLn('3) dividir');
    WriteLn('4) subtrair');
    WriteLn('0) sair');
    ReadLn(opcao);
    Case opcao of
      1: begin
           c := a + b;
           WriteLn('A soma e ',c:0:1);
         end;
      2: begin
           c := a * b;
           WriteLn('O produto e ',c:0:1);
         end;
      3: begin
           c := a / b;
           WriteLn('A divisao da ',c:0:1);
         end;
      4: begin
           c := a - b;
           WriteLn('A diferenca e ',c:0:1);
         end;
    end;
  until (opcao=0);
  WriteLn('Obrigado e bom dia');
end.

numero 1: -1
numero 2: 3
Escolhe uma opcao:
1) addicionar
2) multiplicar
3) dividir
4) subtrair
0) sair
 1
A soma e 2.0
Escolhe uma opcao:
1) addicionar
2) multiplicar
3) dividir
4) subtrair
0) sair
 2
O produto e -3
Escolhe uma opcao:
1) addicionar
2) multiplicar
3) dividir
4) subtrair
0) sair
 0
Obrigado e bom dia



2.
PROGRAM WithProcedure;

PROCEDURE HelloWorld;
begin
  WriteLn('Ola Mundo');
end;

begin
  HelloWorld;
end.

Ola Mundo



3. Não sabemos quantas vezes vamos executar as instruções do ciclo. Pode ser mesmo 0 vezes! Então, vamos usar o ciclo While-Do

PROGRAM BooleanAlgebra;

Var comeco, fim, incremento,
    euro, escudo: real;

begin
  Write('Comeco da tabela (Escudo): ');
  ReadLn(comeco);
  Write('Fim da tabela (Escudo): ');
  ReadLn(fim);
  Write('Incremento: ');
  ReadLn(incremento);
   (* inicializar a variável: *)
  escudo := comeco;
  While (escudo<=fim) Do
    begin
      Write(escudo:0:0, ' Escudos = ');
      euro := escudo/200.482;
      WriteLn(euro:0:2, 'Euros');
        (* NÂO esquece dar uma possibilidade de *)
        (* sair do ciclo: *)
      escudo := escudo + incremento;
    end;
end.

Comeco da tabela (Escudos): 0
Fim da tabela (Escudos): 100
Incremento: 20
0 Escudos = 0.00 Euros
20 Escudos = 0.10 Euros
40 Escudos = 0.20 Euros
60 Escudos = 0.30 Euros
80 Escudos = 0.40 Euros
100 Escudos = 0.50 Euros



4. O programa a seguir está melhor organizado do que o programa do exercício 1. Olhe a legibilidade da estrutura Case-Of. O output será igual ao output do exercício 1.

PROGRAM Calculator;

Var a, b, c: real;
    option: integer;

PROCEDURE Somar;
begin
  c := a + b;
  WriteLn('A soma e ',c:0:1);
end;

PROCEDURE Dividir;
begin
  c := a/b;
  WriteLn('O produto e ',c:0:1);
end;

PROCEDURE Multiplicar;
begin
  c := a*b;
  WriteLn('A divisao da ',c:0:1);
end;

PROCEDURE Subtrair;
begin
  c := a-b;
  WriteLn('A diferenca e ',c:0:1);
end;

begin
  Write('numero 1: ');
  ReadLn(a);
  Write('numero 2: ');
  ReadLn(b);
  Repeat
    WriteLn('Escolhe uma opcao:');
    WriteLn('1) addicionar');
    WriteLn('2) mulitplicar');
    WriteLn('3) dividir');
    WriteLn('4) subtrair');
    WriteLn('0) sair');
    ReadLn(opcao);
    Case opcao of
      1: Addicionar;
      2: Multiplicar;
      3: Dividir;
      4: Subtrair;
    end;
  until (opcao=0);
  WriteLn('Obrigado e bom dia');
end.



5. Não sabemos o número de vezes temos de executar o ciclo, mas no mínimo uma vez: Ciclo Repeat-Until
PROGRAM CalcMedia;

Var soma, media, numero: real;
    n: real;

begin
  WriteLn('Introduz uma serie de numeros e termina com -1');
   (* inicializar as variáveis *)
  soma := 0.0;
  n := 0.0;
  Repeat
    ReadLn(numero);
     (* Os calculos devem excluir o numero -1: *)
    if (numero<>-1.0) then
      begin
        soma := soma + numero;
        n := n + 1.0;
      end;
  Until (numero=-1.0);
  media := soma/n;
  WriteLn('A media e ', media:0:1);
end.

Introduz uma serie de numeros e termina com -1
 33
 11
 6
 9
 24
 -1
A media e 16.6



6a. Um numero é divisível pelo outro número se o resto da divisão é zero. (Na aula teórica 7 foram explicados os operadores para divisões, Div e Mod.) Um número n é primo se não for divisível pelo todos os números entre 2 e n-1. Com estes duas ideas vamos resolver o problema. Sabemos exactamento quantas vezes temos de executar o ciclo: Então, Ciclo For.

PROGRAM DeterminePrimo;

Var i, n: integer;
    primo: boolean;

begin
  Write('numero: ');
  ReadLn(n);
  primo := TRUE;
  For i := 2 To n-1 Do
    if (n Mod i) = 0 then  (* a Mod b = 0 significa a e divisivel pelo b *)
      primo := FALSE;
  (* aqui acaba o ciclo For *)
  if primo then
    WriteLn(n, ' e primo')
  else
    WriteLn(n, ' nao e primo');
end.
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|

|
Para os especialistas:
Existem algorítmos muito mais inteligentes para determinar se um número é primo. O programa acima é o mais simples. Já é muito fácil melhorar a eficiência do algoritmo: se encontramos uma vez que o resultado do (n Mod i)=0, não precisa continuar com o ciclo. Imagine vamos determinar se o número 10000 é primo. Já com calculo 10000 Mod 2 sabemos que o número não é primo e podemos acabar com os cálculos. Vamos implementar esta idea. Agora temos dois condições para sair do ciclo 1) chegamos ao fim com os números (i=n-1) ou 2) encontrámos um resultado do Mod que deu 0. Vamos combinar estas duas condições e temos de usar um outro tipo do ciclo (com ciclos For não é possivel combinar condições):

PROGRAM MelhorPrimo;

Var i, n: integer;
    primo: boolean;

begin
  Write('numero: ');
  ReadLn(n);
  primo := TRUE;
  i := 2;
  While ((i<=n-1) AND (primo=TRUE)) Do
    begin
      if (n Mod i) = 0 then
        primo := FALSE;
      i := i + 1;
    end;
  if primo then
    WriteLn(n, ' e primo')
  else
    WriteLn(n, ' nao e primo');
end.
Nota que, na condição, em vez de primo=TRUE podemos escrever só primo, porque primo é já uma variável do tipo boolean. Mas o código acima fica mais legível.

6a. Agora vamos por tudo num (outro) ciclo for:
PROGRAM DeterminePrimo;

Var i, n: integer;
    primo: boolean;

begin
  WriteLn('Numeros primos ate 10000:');
  for n := 3 to 10000 do
    begin
      primo := TRUE;
      for i := 2 to n-1 do
        if (n Mod i) = 0 then
          primo := FALSE;
      (* aqui acaba o ciclo For i *)
      if primo then
        Write(n,'   ');
    (* aqui acaba o ciclo For n *)
    end;
end.