Propostas de Resolução de Exercícios e Desafios
São apresentadas propostas de resolução a exercícios e desafios. Os programas aqui apresentados não incluem comentários, excepto o número de linhas utilizado por cada um.
Ideia: As presentes resoluções são propostas pelo autor. Aceitam-se novas propostas de resolução, funcionais e dentro das normas de cada um.
Importante: Faltam propostas de resolução para os seguintes exercícios/desafios:
- Desafio 5;
Exercício 1
program ex1; // 33 linhas
uses crt;
var a, b : real;
oper : string[1];
valido : boolean;
begin
writeln('CALCULADORA SIMPLES');
write('Valor 1: ');
readln(a);
repeat
write('Operador (+, -, /, *): ');
readln(oper);
until (oper='+') or (oper='-') or (oper='/') or (oper='*');
repeat
write('Valor 2: ');
readln(b);
if (oper='/') and (b=0) then begin
valido := false;
writeln('ERRO! Divisao por zero!');
end else valido := true;
until valido;
write('Resultado: ');
if (oper='+') then writeln(a+b:0:10)
else begin
if (oper='-') then writeln(a-b:0:10)
else begin
if (oper='*') then writeln(a*b:0:10)
else writeln(a/b:0:10);
end;
end;
write('Prima ENTER para fechar...');
readln;
end.
Exercício 2
program ex2; // 18 linhas
uses crt;
var i, alunos, avaliacao, positivas : integer;
begin
writeln('CONTADOR DE AVALIACOES POSITIVAS');
write('Numero de alunos? ');
readln(alunos);
for i:=1 to alunos do begin
repeat
write('Nota do aluno ',i,': ');
readln(avaliacao);
until ((avaliacao>=0) and (avaliacao<=20));
if (avaliacao>=10) then positivas := positivas + 1;
end;
writeln;
writeln('Existem ',positivas,' positivas (',(positivas/alunos)*100:0:1,'%)');
readln;
end.
Exercício 3
program ex3; // 19 linhas
uses crt;
var numero, maior : real;
n, i : integer;
begin
repeat
write('Quantos numeros vai introduzir? (5-50) ');
readln(n);
until (n>=5) and (n<=50);
maior := 0;
for i:=1 to n do begin
write(i,'o numero: ');
readln(numero);
if (numero > maior) then maior := numero;
end;
writeln;
writeln('O maior numero foi: ',maior:0:10);
readln;
end.
Exercício 4
program ex4; // 24 linhas
uses crt;
var s : string;
i, j : integer;
begin
writeln('Este programa tira os espacos a mais de uma STRING');
writeln;
write('Escreva uma STRING: ');
readln(s);
j := 0;
for i:=1 to length(s) do
begin
j := j+1;
if (s[i] = ' ') then begin
s[j] := ' ';
while (s[i] = ' ') do
i := i+1;
j := j+1
end;
s[j] := s[i];
end;
writeln('Nova STRING: ',s);
readln;
end.
Exercício 5
program ex5; // 24 linhas
uses crt;
var numero : real;
function factorial(n : integer) : integer;
var i, temp : integer;
begin
if (n=0) or (n=1) then factorial := 1
else begin
temp := n;
for i:=n-1 downto 1 do begin
temp := temp * i;
end;
factorial := temp;
end;
end;
begin
repeat
write('Numero para calcular factorial: ');
readln(numero);
until (numero = ROUND(numero)) and (numero>=0);
writeln;
writeln('Factorial de ',ROUND(numero),': ',factorial(ROUND(numero)));
readln;
end.
Exercício 6
program ex6; // 46 linhas
uses crt;
var a, b : real;
oper : string[1];
begin
REPEAT
textcolor(15);
writeln('CALCULADORA SIMPLES');
write('Valor 1: ');
readln(a);
write('Operador (+, -, *, /): ');
readln(oper);
if (oper='/') then begin
repeat
write('Valor 2: ');
readln(b);
if (b=0) then begin
textcolor(12);
writeln('ERRO! Divisao por zero!');
textcolor(15);
end;
until (b<>0);
end else begin
write('Valor 2: ');
readln(b);
end;
writeln;
write('RESULTADO da operacao: ');
textcolor(14);
if (oper='+') then write(a+b:0:10)
else begin
if (oper='-') then write(a-b:0:10)
else begin
if (oper='*') then write(a*b:0:10)
else write(a/b:0:10);
end;
end;
textcolor(15);
writeln('1 > Repetir operacao');
writeln('0 > Sair');
repeat
readln(oper);
until (oper='1') or (oper='0');
if (oper='1') then writeln;
UNTIL (oper='0');
end.
Exercício 7
program ex7; // 17 linhas
uses crt;
var i, j : integer;
begin
for i:=1 to 20 do begin
for j:=1 to 45 do begin
case j of
1..15 : textbackground(1);
16..30 : textbackground(7);
31..45 : textbackground(4);
end;
write(' ');
end;
writeln;
end;
readln;
end.
Exercício 8
program ex8; // 60 linhas
uses crt;
var aluno : array[1..30] of record // RECORD referido no exercício
nome : string[60];
matematica : real;
portugues : real;
end;
media : record // RECORD facultativo: depende do método de cada programador
matematica : real;
portugues : real;
end;
quantos, i : integer;
begin
writeln('ESTATISTICA DA TURMA');
writeln;
repeat
write('Quantos alunos sao? (1-30) ');
readln(quantos);
until (quantos>=1) and (quantos<=30);
writeln;
for i:=1 to quantos do begin
writeln('ALUNO ',i);
with aluno[i] do begin
write('Nome: ');
readln(nome);
repeat
write('Media a Matematica: ');
readln(matematica);
until (matematica>=0) and (matematica <=20);
repeat
write('Media a Portugues: ');
readln(portugues);
until (portugues>=0) and (portugues<=20);
end;
writeln;
end;
for i:=1 to quantos do begin
media.matematica += aluno[i].matematica;
media.portugues += aluno[i].portugues;
end;
with media do begin
matematica := matematica / quantos;
portugues := portugues / quantos;
end;
writeln;
writeln('TURMA');
writeln('Media a Portugues: ',media.portugues:0:2);
writeln('Media a Matematica: ',media.matematica:0:2);
writeln;
writeln('ALUNOS APTOS A COMPARECER AO EXAME NACIONAL DE MATEMATICA:');
for i:=1 to quantos do begin
if (aluno[i].matematica>=9.5) then writeln(' ',aluno[i].nome);
end;
writeln;
writeln('ALUNOS APTOS A COMPARECER AO EXAME NACIONAL DE PORTUGUES:');
for i:=1 to quantos do begin
if (aluno[i].portugues>=9.5) then writeln(' ',aluno[i].nome);
end;
readln;
end.
Exercício 9
program ex9; // 48 linhas
uses crt;
var operacao : record
a : real;
b : real;
oper : char;
end;
opcao : char;
begin
REPEAT
textbackground(7);
textcolor(16);
clrscr;
writeln('CALCULADORA');
with operacao do begin
write(' Valor 1: ');
readln(a);
write(' Operacao (+, -, *, /): ');
repeat
oper := readkey;
until (char(oper)='+') or (char(oper)='-') or (char(oper)='*') or (char(oper)='/');
if (oper='/') then begin
repeat
write(' Valor 2: ');
readln(b);
until (b<>0);
end else begin
write(' Valor 2: ');
readln(b);
end;
write('Resultado: ');
if (char(oper)='+') then write(a+b:0:10)
else begin
if (char(oper)='-') then write(a-b:0:10)
else begin
if (char(oper)='*') then write(a*b:0:10)
else write(a/b:0:10);
end;
end;
end;
writeln;
writeln('1 > Repetir operacao');
writeln('0 > Sair');
repeat
opcao := readkey;
until (char(opcao)='1') or (char(opcao)='0');
UNTIL (char(opcao)='0');
end.
Exercício 10
program ex10; // 58 linhas
(* Há muitas mais propostas possíveis, inclusive mais interactivas.
O objectivo deste é tão-somente exemplificar a utilização dos métodos.*)
uses crt;
var s, sp : string[80];
a : string[80];
p, l : byte;
opc : char;
begin
write('A primeira frase nunca se altera. So pode trabalhar com esta!');
write('Escreva uma frase: ');
readln(s);
repeat
writeln;
writeln('1 - Procurar');
writeln('2 - Apagar');
writeln('3 - Inserir');
writeln('0 - Sair');
repeat
opc := readkey;
writeln;
if not (opc = '0') then begin
writeln('FRASE: ');
writeln(s); writeln;
end;
case opc of
'1' : begin
write('Procurar: ');
readln(sp);
p := Pos(sp, s);
if not (p = 0) then writeln('Primeira ocorrencia na posicao ', p)
else writeln('Nao existe na frase');
end;
'2' : begin
write('Posicao onde comecar a apagar: ');
readln(p);
write('Quantas letras apagar: ');
readln(l);
a := s;
Delete(a, p, l);
writeln('Frase final: ', a);
end;
'3' : begin
write('Posicao onde comecar a inserir: ');
readln(p);
write('Expressao a inserir: ');
readln(sp);
a := s;
Insert(sp, s, p);
writeln('Frase final: ', a);
end;
end;
until (opc in ['0'..'3']);
write('Deseja repetir? (S/N) ');
repeat
opc := readkey;
until (UpCase(opc) in ['S', 'N']);
writeln; writeln;
until (UpCase(opc) = 'N');
end.
Exercício 11
program ex11; // 20 linhas
uses crt;
var face : array[1..6] of integer;
i : integer;
begin
randomize;
for i:=1 to 1000000 do
inc(face[random(6)+1]);
for i:=1 to 6 do writeln('Face ',i,': ',face[i]);
readln;
end.
Exercício 12
program ex12; // 35 linhas
type TLetra = record
Qual : char;
Vezes : word;
end;
const vogais : set of char = ['A', 'E', 'I', 'O', 'U'];
consoantes : set of char = ['A'..'Z'] - ['A', 'E', 'I', 'O', 'U'];
var Linha : string[80];
Letras : array [1..26] of TLetra;
i : integer;
procedure IniciarLetras(var L : array of TLetra);
var j : integer;
begin
for j:=1 to 26 do begin
L[j].Qual := char(j+64);
L[j].Vezes := 0;
end;
end;
begin
write('Introduza linha de texto: ');
readln(Linha);
IniciarLetras(Letras);
for i:=1 to length(Linha) do
inc(Letras[ord(UpCase(Linha[i]))-63].Vezes);
writeln('VOGAIS:');
for i:=1 to 26 do
if (Letras[i].Qual in vogais) and (Letras[i].Vezes > 0) then
writeln(Letras[i].Qual,' = ',Letras[i].Vezes);
writeln('CONSOANTES:');
for i:=1 to 26 do
if (Letras[i].Qual in consoantes) and (Letras[i].Vezes > 0) then
writeln(Letras[i].Qual,' = ',Letras[i].Vezes);
readln; // pausa
end.
Exercício 13
{$MODE DELPHI}
program ex13; // 27 linhas
uses windows, sysutils, strutils;
var Num : integer;
Rom : string;
Mensagem : pchar;
begin
try
writeln('INTEIRO --> ROMANO');
write('Numero? ');
readln(Num);
writeln('Romano = ', IntToRoman(Num));
writeln;
writeln('ROMANO --> INTEIRO');
write('Romano? ');
readln(Rom);
Rom := UpCase(Rom);
writeln('Numero = ', RomanToInt(Rom));
except
ON ex:exception do begin
Mensagem := @ex.message[1];
MessageBox(0, Mensagem, 'Ocorreu um erro', 0 + MB_ICONHAND);
end;
end;
readln; // pausa
end.
Desafio 1
program des1; // 21 linhas
uses crt;
var texto : string;
procedure ler(var s : string);
begin
readln(s);
end;
procedure escrever(s : string);
var i : integer;
begin
for i:=length(s) downto 1 do write(s[i]);
end;
begin
write('Escreva linha de texto: ');
ler(texto);
writeln;
write('Texto por ordem inversa: ');
escrever(texto);
writeln;
readln;
end.
Desafio 2
program des2; // 23 linhas
uses crt;
var i, j : integer;
key : char;
begin
writeln('Cores disponiveis: ');
writeln;
for i:=1 to 8 do write(i,' ');
writeln;
for i:=1 to 16 do begin
for j:=1 to 8 do begin
textcolor(i);
textbackground(j);
if (i>=1) and (i<=9) then write('0');
write(i,' TESTE ');
end;
writeln;
end;
textbackground(8);
textcolor(7);
writeln;
readln;
end.
Desafio 3
program des3; // 16 linhas
uses crt;
var i, j : integer;
begin
writeln('Tabela ASCII do presente computador:');
writeln;
for i:=32 to 255-9 do begin
write(i,' ',char(i),' ',i+1,' ',char(i+1),' ',i+2,' ',char(i+2));
write(' ',i+3,' ',char(i+3),' ',i+4,' ',char(i+4));
write(' ',i+5,' ',char(i+5),' ',i+6,' ',char(i+6));
write(' ',i+7,' ',char(i+7),' ',i+8,' ',char(i+8));
writeln(' ',i+9,' ',char(i+9));
i := i+9;
end;
readln;
end.
Desafio 4
program des4; // 19 linhas
uses crt;
function BolToBin(v : boolean) : integer;
begin
case v of
true : BolToBin := 1;
false : BolToBin := 0;
end;
end;
function BinToBol(v : integer) : boolean;
begin
case v of
1 : BinToBol := true;
0 : BinToBol := false;
end;
end;
begin
// programa
end.
Desafio 5
Desafio 6
program des6;
uses crt;
var numero : integer;
function multiplo(mult, num : integer) : boolean;
begin
if (mult mod num = 0) then multiplo := true
else multiplo := false;
end;
procedure mostrar_primos(n : integer);
var lista : set of byte;
primos : set of byte;
i : integer;
j : integer;
l : integer;
begin
lista := [2..n];
primos := [];
i:=2;
while ([i] <= lista) do begin
primos += [i];
for j:=i to n do begin
if multiplo(j,i) then lista -= [j];
end;
l:=2;
while (not ([l] <= lista)) and (l<=n) do l += 1;
i := l; // Assim que determinado, é atribuído a I, que é primo.
end;
write('PRIMOS: ');
for i:=2 to n do begin
if ([i] <= primos) then write(i,', ');
end;
end;
begin
repeat
write('Calcular numeros primos ate: '); readln(numero);
until (numero in [2..maxint]);
writeln;
mostrar_primos(numero);
writeln;
write('ENTER para sair...'); readln;
end.
Algoritmo proposto no artigo da Wiki sobre o Crivo de Eratosthenes - o programa está comentado neste artigo.