program calculosm;
{----programa que calcula estatisticas num ciclo ----}
uses crt;
var
num, total, numeros, maior, menor, pares, impares: integer;
{----------------------------------------------------------------------}
procedure inicializacao;
begin
total:= 0; pares:= 0; impares:= 0;
maior:= -9999; menor:= 9999;
writeln('Este programa vai calcular valores num ciclo até input=-999');
end;
{-------------------------------------------------------------------}
procedure ler_dados;
begin
writeln('Entrar um número: '); readln(num);
end;
{-------------------------------------------------------------------}
procedure maior_menor;
begin
if (num < menor) then
menor:= num;
if (num > maior) then
maior:= num;
end;
{-----------------------------------------------------------------}
procedure media;
begin
writeln('M‚dia dos números introduzidos: ', total / numeros:0:2);
end;
{----------------------------------------------------------------}
procedure par_impar;
begin
if ((num mod 2) = 0) then
pares:= pares + 1
else
impares:= impares + 1;
end;
{-----------------------------------------------------------------}
procedure total_numeros;
begin
total:= total + num;
end;
{-----------------------------------------------------------------}
procedure estatisticas;
begin
writeln(' Estatisticas ');
writeln(' ------------ ');
writeln('Total de números introduzidos: ', numeros);
writeln('Números pares: ', pares);
writeln('Número impares: ', impares);
writeln('Número menor: ', menor);
writeln('Número maior: ', maior);
media;
readln;
end;
{-----------------------------------------------------------------}
begin {secção principal do programa }
clrscr;
inicializacao;
ler_dados;
while (num <> -999) do {ciclo do programa }
begin
numeros:= numeros + 1;
total_numeros;
maior_menor;
par_impar;
ler_dados;
end;
estatisticas; {mostrar resultados }
end.
PROGRAM Calculadora;
uses crt;
var op1, op2, c: real;
opcao: integer;
{-------------------------------------}
PROCEDURE Somar;
begin
c := op1 + op2;
WriteLn(' ', op1:0:2 , ' + ', op2:0:2 , ' = ',c:0:2);
end;
{------------------------------------------------------------}
PROCEDURE Dividir;
begin
c := op1 / op2;
WriteLn(' ', op1:0:2 ,' / ', op2:0:2 , ' = ',c:0:2);
end;
{------------------------------------------------------------}
PROCEDURE Multiplicar;
begin
c := op1 * op2;
WriteLn( ' ', op1:0:2 , ' * ', op2:0:2 , ' = ',c:0:2);
end;
{------------------------------------------------------------}
PROCEDURE Subtrair;
begin
c := op1 - op2;
WriteLn(' ', op1:0:2 , ' - ', op2:0:2 , ' = ',c:0:2);
end;
{------------------------------------------------------------------------}
FUNCTION graus_radians(angulo: real): real;
{funcao que devolve o valor em radians dum angulo em graus }
begin
graus_radians:= (angulo * PI) / 180;
end;
{-------------------------------------------------------------------------}
PROCEDURE seno(angulo: real); {funcao trabalho com radians e nao graus}
var r : real;
begin
r:= graus_radians(angulo); {chama funcao que converte graus em radianes}
writeln('Seno de ',angulo:0:2, ' = ', sin(r):0:4);
end;
{-------------------------------------------------------------------------}
PROCEDURE coseno(angulo: real); {funcao trabalha com radians }
var r : real;
begin
r:= graus_radians(angulo);
writeln('coseno de ',angulo:0:2, ' = ', cos(r):0:4);
end;
{-----------------------------------------------------------------------}
PROCEDURE valor_absoluto( valor: real);
begin
writeln('Valor absoluto de ',valor:0:2, ' = ', (abs(valor)):0:2);
end;
{---------------------------------------------------------------------}
PROCEDURE raiz_quadrada(valor: real);
begin
writeln('Raiz quadrada de ', valor:0:2, ' = ',sqrt(valor):0:2);
end;
{---------------------------------------------------------------------}
PROCEDURE ler_operandos;
var OK :char;
begin
OK:= 'x';
repeat
if (opcao < 5) then
begin
Write('favor entrar operando 1: '); readln(op1);
Write('favor entrar operando 2: '); readln(op2);
end
else
begin
write('Favor entrar valor a converter: '); readln(op1);
end;
write(' Esta seguro(a) dos seus operandos? '); readln(OK);
until ((OK = 's') or (OK = 'S'));
end;
end;
{--------------------------------------------------------------------}
begin { programa principal }
{--------------------------------------------------------------------}
Repeat
clrscr;
WriteLn(' Escolhe uma opcao:');
WriteLn('(1) adicionar (2) multiplicar');
WriteLn('(3) dividir (4) subtrair');
WriteLn('(5) valor absoluto (6) raiz quadrada');
WriteLn('(7) seno dum angulo (8) coseno dum angulo');
Writeln('(0) sair');
write(' Qual ‚ a sua op‡Æo?: ');
ReadLn(opcao);
if (opcao <> 0) then
begin
ler_operandos;
Case opcao of
1: Somar;
2: Multiplicar;
3: Dividir;
4: Subtrair;
5: valor_absoluto(op1);
6: raiz_quadrada(op1);
7: seno(op1);
8: coseno(op1);
else
writeln('Erro no input. Repeta s.f.f.');
end;
readln;
end;
until (opcao = 0);
WriteLn('Obrigado e bom dia');
readln;
end.
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 que a variavel a e divisivel
pela variavel b *)
primo :=
FALSE;
(* fim do 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. É relativamente fácil melhorar a eficiência
do algoritmo: se encontramos uma vez que o resultado do (n Mod i)=0, não
precisamos de continuar com o ciclo até verificar todos os números
entre 0 e (n-1) Não é ?. Imagine vamos determinar se o número
10000 é primo. Só calculando 10000 Mod 2 sabemos que o número
não é primo e podemos acabar com os cálculos. Vamos
implementar esta idea.
Temos duas 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;
end.
A notar que na condição " if (primo) ...", em vez de primo=TRUE podemos escrever só primo, porque esta já uma variável do tipo boleana. Assim o código acima fica mais legível.
4a. 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.
var
total, num: real;
n : integer;
begin
clrscr;
total:= 0; n:= 0;
write('entrar um numero s.f.f: ');
readln(num);
if (num > 1000) then
begin
total:= num; {situacao especial para primeira vez, caso o primeiro
número > 1000 }
n:= 1;
end
else
repeat
{também podia ser implementado com
o ciclo while ...do }
total:=
total + num;
if
(total <= 1000) then
begin
n:= n + 1;
writeln('---- Total parcial: ', total:0:2);
if (total < 1000) then
begin
write('numero: '); readln(num);
end;
end;
until (total >= 1000);
writeln('Chegamos ao numero ', total:0:2);
writeln('Numero de valores introduzidos:
', n);
readln;
end.