1) O documento fornece uma lista de cábulas (algoritmos pré-programados) em Pascal para resolver problemas comuns em programação II, como ordenar vetores, inverter números, verificar se um número é primo, somar elementos de vetores e matrizes, entre outros.
2) Explica como usar essas cábulas para resolver rapidamente os exercícios e exames típicos do professor Chambel, evitando ter que programar tudo do zero.
3) Apresenta três exemplos de resolução de exercícios usando essas cábulas de forma
COMO PASSAR PROGRAMAÇÃO II COM O PROFESSOR CHAMBEL
1. 1
COMO PASSAR A PROGRAMAÇÃO II, COM O PROFESSOR CHAMBEL,
SEM PERCEBER NADA DE PASCAL
Como o professor Chambel faz sempre o mesmo tipo de exames, ou seja, usa sempre as
mesmas perguntas, só que em contextos diferentes, pode-se fazer um tipo de base de dados
(por outras palavras, uma boa cábula).
Um bom exemplo disso é o seguinte programa:
Verifique que uma matriz é mágica.
Ou seja que a soma da linhas, das colunas e das diagonais é igual.
Basta pegar na cábula e usar:
♦ Inserir dados numa matriz
♦ Soma das linhas de uma matriz
♦ Soma das colunas de uma matriz
♦ Soma das diagonais de uma matriz
♦ A diagonal de inclinação negativa
♦ A diagonal de inclinação positiva
Com pouco mais fica o programa feito.
ATENÇÂO:
Lembrem-se que cada pequeno programa que o professor pede, poderá, por vezes,
ser feito de maneira mais simples do que os desta cábula.
Só que os da cábula dão para todas as situações.
EXEMPLIFICAÇÃO: (este poderá ser o exemplo complicado)
Program Magica;
Type matriz = array [1..4,1..4] of integer;
vector = array [1..4] of integer;
Var A : matriz;
somaL,SomaC:vector;
i,j, diagonal1, diagonal2 : integer;
magica : boolean;
Begin
(* Inserir dados numa matriz *)
Writeln (‘Introduza os valores na matriz’);
For i:=1 to 4 do
For j:=1 to 4 do
Readln (A[i,j]);
(* Soma das linhas de uma matriz *)
For i:=1 to 4 do
Begin
somaL[i]:=0;
2. 2
For j:=1 to 4 do
somaL[i]:=somaL[i]+A[i,j]
End;
(* Soma das colunas de uma matriz *)
For j:=1 to 4 do
Begin
somaC[j]:=0;
For i:=1 to 4 do
somaC[j]:=somaC[j]+A[i,j]
End;
(* Soma das diagonais de uma matriz *)
( * A diagonal de inclinação negativa *)
diagonal1:=0;
For i:=1 to 4 do
diagonal1:=diagonal1+A[i,i];
(* A diagonal de inclinação positiva *)
diagonal2:=0;
For i:=1 to 4 do
diagonal2:=diagonal2+A[i,4-i+1];
(* ----------------------- *)
magica:=true;
If diagonal1<>diagonal2 then
magica:=false
Else
For i:=1 to 4 do
If (somaL<>diagonal1) or (somaC<>diagonal1) then
magica:=false;
If magica then
Writeln (‘A matriz é mágica’)
End.
ATENÇÃO:
Por vezes terão que mudar as variáveis para outras, por interferirem nas partes que já se fez
antes, mas isso é fácil, basta não esquecer de as mudar todas.
Se não forem mudadas o mal não será muito grande, porque a ideia ficou!!!
Neste exemplo tive que mudar a variável diagonal, para diagonal1 e diagonal2,
porque tinha que usar as duas diagonais.
As variáveis sublinhadas são mudadas por números.
Neste exemplo: em nLinhas pus 4, porque estou a usar uma matriz 4x4.
Não esquecer que têm que declarar as variáveis, nos programa que fazem.
3. 3
CÁBULAS – aconselho a levarem o seguinte para o exame.
Ordenar
For i:=primeiro to ultimo-1 do
For j:=primeiro+1 to ultimo do
If v[j]>v[i] then (* > crescente; < decrescente *)
Begin (* troca de elementos *)
aux:=v[i];
v[i]:=v[j];
v[j]:=aux
End;
----- ----- ----- ----- ----- ----- ----- ----- ----- -----
Inverter um número
aux:=numero div 10;
inv[1]:=numero mod 10;
i:=1;
While aux<>0 do
Begin
i:=i+1;
If (aux div 10) = 0 then
Begin
inv[i]:=aux mod 10;
aux:=0
End
Else
Begin
inv[i]:=aux mod 10;
aux:=aux div 10
End
End;
base:=1;
inverso:=inv[i];
For j:=i-1 downto 1 do
Begin
base:=base*10;
inverso:=inverso+inv[j]*base
End;
----- ----- ----- ----- ----- ----- ----- ----- ----- -----
Múltiplos de um número
multipos[1]:=numero;
i:=1;
k:=numero;
While i<>fim do
Begin
k:=k+numero;
i:=i+1;
multiplos[i]:=k
End;
----- ----- ----- ----- ----- ----- ----- ----- ----- -----
4. 4
Divisores de um número
divisores[1]:=1;
i:=1;
k:=1;
While k<>numero do
Begin
k:=k+1;
If (numero mod k) = 0 then
Begin
i:=i+1;
divisores[i]:=k
End
End;
----- ----- ----- ----- ----- ----- ----- ----- ----- -----
Soma de um vector
soma:=0;
For i:=1 to nPosicoes do
soma:=soma+V[i];
----- ----- ----- ----- ----- ----- ----- ----- ----- -----
Soma das posições de dois vectores
For i:=1 to nPosicoes do
V[i]:=V1[i]+V2[i];
----- ----- ----- ----- ----- ----- ----- ----- ----- -----
Multiplicação de matrizes
For i:=1 to nLinhas do
For j:=1 to nColunas do
Begin
M[i,j]:=0;
For k:=1 to nColunas do
M[i,j]:=M[i,j]+A[i,k]*B[k,j]
End;
----- ----- ----- ----- ----- ----- ----- ----- ----- -----
Soma das linhas de uma matriz
For i:=1 to nLinhas do
Begin
soma[i]:=0;
For j:=1 to nColunas do
soma[i]:=soma[i]+A[i,j]
End;
----- ----- ----- ----- ----- ----- ----- ----- ----- -----
Soma das colunas de uma matriz
For j:=1 to nColunas do
Begin
soma[j]:=0;
For i:=1 to nLinhas do
soma[j]:=soma[j]+A[i,j]
End;
----- ----- ----- ----- ----- ----- ----- ----- ----- -----
5. 5
Soma das diagonais de uma matriz
A diagonal de inclinação negativa
diagonal:=0;
For i:=1 to nLinhas do
diagonal:=diagonal+A[i,i];
A diagonal de inclinação positiva
diagonal:=0;
For i:=1 to nLinhas do
diagonal:=diagonal+A[i,nLinhas-i+1];
----- ----- ----- ----- ----- ----- ----- ----- ----- -----
Inserir dados num vector
Writeln (‘Introduza quant de valores’);
For i:=1 to quant do
Readln (V[i]);
----- ----- ----- ----- ----- ----- ----- ----- ----- -----
Inserir dados numa matriz
Writeln (‘Introduza os valores na matriz’);
For i:=1 to nLinhas do
For j:=1 to nColunas do
Readln (A[i,j]);
----- ----- ----- ----- ----- ----- ----- ----- ----- -----
Escrever os dados de uma matriz no ecrã (Análogo para os vectores)
For i:=1 to nLinhas do
For j:=1 to nColunas do
Writeln (A[i,j]);
----- ----- ----- ----- ----- ----- ----- ----- ----- -----
Média de um vector
soma:=0;
For i:=1 to fim do
soma:=soma+V[i];
media:=soma/fim;
----- ----- ----- ----- ----- ----- ----- ----- ----- -----
Trocos de uma quantia (200$, 100$, 50$, 20$, 10$, 5$, 1$)
duzentos:=quantia div 200;
auxiliar:=quantia mod 200;
cem:=auxiliar div 100;
auxiliar:=auxiliar mod 100;
cinquenta:=auxiliar div 50;
auxiliar:=auxiliar mod 50;
vinte:=auxiliar div 20;
auxiliar:=auxiliar mod 20;
dez:=auxiliar div 10;
auxiliar:=auxiliar mod 10;
cinco:=auxiliar div 5;
um:=auxiliar mod 5;
----- ----- ----- ----- ----- ----- ----- ----- ----- -----
Números Primos
primo:=true;
for i:=3 to numero-1 do
6. 6
if numero mod i=0 then
primo:=false;
----- ----- ----- ----- ----- ----- ----- ----- ----- -----
O menor num vector
menor:=maxint;
For i:=primeiro to ultimo do
If V[i]< menor then
menor:=V[i];
----- ----- ----- ----- ----- ----- ----- ----- ----- -----
O maior num vector
maior:= -maxint;
For i:=primeiro to ultimo do
If V[i]> maior then
maior:=V[i];
----- ----- ----- ----- ----- ----- ----- ----- ----- -----
RESOLUÇÃO DOS EXAMES DO CHAMBEL, USANDO ESTAS CÁBULAS
Exame 1999 – Trabalhadores estudantes
Listar os primeiros números defeituosos (n inteiro>=2 é defeituoso se a soma dos seus
divisores, incluindo o 1 e excluindo o número, é menor que n)
Program defeituosos;
Type vector = array [1..100] of integer;
Var i, k, n, soma, numero, w : integer;
divisores : vector;
Begin
Repeat
Write (‘Introduza o valor de n’);
Readln (n);
Until n>=2;
For numero:=2 to n-1 do (* n-1 pq o enunciado diz excluindo n *)
Begin
(* CÁBULA: Divisores de um número *)
divisores[1]:=1; (* 1 pq o enunciado diz incluindo 1 *)
i:=1;
k:=1;
While k<>numero do
Begin
k:=k+1;
If (numero mod k) = 0 then
Begin
i:=i+1;
divisores[i]:=k
7. 7
End
End;
(* CÁBULA: Soma de um vector *)
soma:=0;
For w:=1 to i do
soma:=soma+divisores[w];
(* ---------------------------- *)
If soma<n then
Writeln (‘O ‘,numero,’ é DEFEITUOSO’)
End
End.
Calcule os números capicuas de 4 dígitos que sejam múltiplos de 45
Program CapicuasMultiplos45;
Type vector = array [1..4] of integer;
Var inv : vector;
i, numero, aux, base : integer;
Begin
For numero:=1000 to 9999 do
Begin
(* CÁBULA: Inverter um número *)
aux:=numero div 10;
inv[1]:=numero mod 10;
i:=1;
While aux<>0 do
Begin
i:=i+1;
If (aux div 10) = 0 then
Begin
inv[i]:=aux mod 10;
aux:=0
End
Else
Begin
inv[i]:=aux mod 10;
aux:=aux div 10
End
End;
base:=1;
inverso:=inv[i];
For j:=i-1 downto 1 do
Begin
8. 8
base:=base*10;
inverso:=inverso+inv[j]*base
End;
( * -------------------------- *)
If (inverso=numero) and (inverso mod 45 = 0) then
Writeln (‘O ‘,numero,’ é capicua e múltiplo de 45.’)
End
End.
Lista com 100 inteiros e realize as seguintes tarefas:
a) Introduzir os elementos da lista
b) Ordenar por ordem crescente os 50 primeiros números da lista
c) Determinar o menor número da lista da posição 51º à 100º
d) Comparar o menor número dos 50 primeiros com o menor da 51º à 100º, aparecendo
no ecrã o local do menor das duas sublistas
Program inteiros100;
Type vector = array [1..100] of integer;
Var i, j, aux, menor1, menor2, posicao1, posicao2 : integer;
V:vector;
Begin
(*CÁBULA: Inserir dados num vector *)
Writeln (‘Introduza 100 inteiros’);
For i:=1 to 100 do
Readln (V[i]);
(* CÁBULA: Ordenar *)
For i:=1 to 50-1 do
For j:=1+1 to 50 do
If v[j]>v[i] then (* > crescente; < decrescente *)
Begin (* troca de elementos *)
aux:=v[i];
v[i]:=v[j];
v[j]:=aux
End;
(* CÁBULA: O menor num vector *)
menor2:=maxint;
For i:=51 to 100 do
If V[i]< menor2 then
begin
menor2:=V[i];
posicao2:=i (* para se saber a posição *)
9. 9
end;
(* CÁBULA: O menor num vector *)
menor1:=maxint;
For i:=1 to 50 do
If V[i]< menor1 then
begin
menor1:=V[i];
posicao1:=i (* para se saber a posição *)
end;
(* --------------------------- *)
If menor1<menor2 then
Writeln (‘O menor: V[‘,posicao1,’] = ‘,menor1)
Else
Writeln (‘O menor: V[‘,posicao2,’] = ‘,menor2)
End.