You are on page 1of 6

UFMG – ICEx – DCC – Programação de Computadores – 1º.

Sem 2005 – David Menoti 1
Universidade Federal de Minas Gerais - UFMG Data: 19/11/2005
Instituto de Ciências Exatas - ICEx
Disciplina: Programação de Computadores
Professor: David Menoti (menoti@dcc.ufmg.br)

Aluno: ___________________________________________________________ No. ______

• A prova é individual e sem consulta, exceto o contido em sua mente;
• A interpretação das questões faz parte da avaliação;
• Faça as observações que achar necessário, por escrito, na folha de reposta;
• É obrigatório que as variáveis usadas dentro das funções e nos programas sejam
diferentes;
• Em vez de apresentar o algoritmo em PORTUGOL, é permitido implementar as
funções e os algoritmos em PASCAL ou MATLAB. No entanto, somente uma
forma de expressão será aceita como resposta para cada questão.

3ª. Avaliação – 32/30 pontos (2 pontos extras)

1) (12 pontos) Dois números positivos X e Y são amigos quando cada um é igual a
soma dos divisores (exceto o próprio número) do outro e X ≠ Y. Por exemplo, 220
(tem divisores 1 + 2 + 4 + 5 + 10 + 20 + 11 + 22 + 44 + 55 + 110 = 284) e 284 (tem
divisores 1 + 2 + 4 + 71 + 142 = 220) são amigos. Escreva uma função que receba
dois números inteiros X e Y e determine (retorne 1 em caso positivo e 0 em caso
contrário) se eles são ou não amigos. A função não deve imprimir nada e deve retornar
0 em caso de inconsistência. Escreva também um algoritmo que utilizando essa função
determine (imprima) todos os pares de números amigos de até 4 algarismos / dígitos.

2) (10 pontos) Escreva uma função que receba três parâmetros A, B e C e determine o
MAIOR e o MENOR valor entre eles. Esses valores determinados devem ser
retornados por referencia. A função deve retornar 0 caso os números determinados
sejam iguais, ou seja quando o MAIOR é igual a MENOR e 1 em caso contrário.
Escreva também um algoritmo para testar a função criada.

UFMG – ICEx – DCC – Programação de Computadores – 1º. Sem 2005 – David Menoti 2
3) (10 pontos) A estrela de Koch (figura abaixo, as quatro primeiras iterações), criada em
1904 pelo matemático sueco Helge Von Koch, pode ser criada começando com um
triângulo eqüilátero de perímetro 3. e então recursivamente alterando-se cada
segmento da figura da seguinte forma:
- divide-se o segmento em três segmentos de tamanho igual;
- desenha-se um triangulo equitátero que tem como base o segmento do meio do passo
anterior (passo 1);
- remove-se o segmento que é a base do triângulo do passo anterior (passo 2).


Estrela de Koch

Então, pede-se que seja criada uma função recursiva (que necessariamente chama a si
própria) que seja capaz de calcular (somente retornar) o perímetro da estrela de Kock,
em sua N-ésima iteração (N é um parâmetro para a função). Sabe-se que para a
primeira iteração, o perímetro da estrela é 3, para a segunda, 4, para a terceira, 16/3 ≈
5,3333... . Caso o valor de N seja inválido, a função deve retornar -1. Crie também um
algoritmo para testar a função. Esse algoritmo deve verificar o retorno da função.


UFMG – ICEx – DCC – Programação de Computadores – 1º. Sem 2005 – David Menoti 3
algoritmo T3Q1;
var
inteiro : A, B, R;

função AMIGOS( inteiro : X, Y ) : inteiro;
var
inteiro : SX, SY, C, Z;
início
se ( X <= 0 ) ou ( Y <= 0 ) ou ( X = Y )
então
AMIGOS <- 0
senão
SX <- 0;
SY <- 0;
se ( X > Y ) então
Z <- X;
senão
Z <- Y;
fim-se
para C de 1 até Z - 1 faça
se (X mod C = 0) e (X <> C) então
SX <- SX + C;
fim-se
se (Y mod C = 0) e (Y <> C) então
SY <- SY + C;
fim-se
fim-para
se ( SX = Y ) e ( SY = X ) então
AMIGOS <- 1;
senão
AMIGOS <- 0;
fim-se
fim-se
fim

início
para A de 1 até 9999 faça
para B de 1 até A faça
R <- AMIGOS(A,B);
se ( R = 1 ) então
imprima(A," e ",B," sao amigos");
fim-se
fim-para
fim

program T3Q1;
var
A, B, R : integer;

function AMIGOS(X, Y : integer) : integer;
var
SX, SY, C, Z : integer;
begin
if ( X <= 0 ) or ( Y <= 0 ) or ( X = Y )
then
AMIGOS := 0
else
begin
SX := 0;
SY := 0;
if ( X > Y ) then
Z := X
else
Z := Y;
for C := 1 to Z - 1 do
begin
if (X mod C = 0) and (X <> C) then
SX := SX + C;
if (Y mod C = 0) and (Y <> C) then
SY := SY + C;
end;
if ( SX = Y ) and ( SY = X ) then
AMIGOS := 1
else
AMIGOS := 0;
end;
end;

begin
for A := 1 to 9999 do
for B := 1 to A do
begin
R := AMIGOS(A,B);
if ( R = 1 ) then
writeLn(A,' e ',B,' sao amigos');
end;
end.

UFMG – ICEx – DCC – Programação de Computadores – 1º. Sem 2005 – David Menoti 4
function T3Q1;
for A = 1 : 9999
for B = 1 : A
R = AMIGOS(A,B);
if ( R == 1 )
fprintf(1,'%d e %d sao amigos',A,B);
end
end
end

function AMIGO = AMIGOS( X, Y )
if ( X <= 0 ) | ( Y <= 0 ) | ( X == Y )
AMIGO = 0;
else
SX = 0;
SY = 0;
if ( X > Y )
Z = X;
else
Z = Y;
end
for C = 1 : Z
if (mod(X,C) == 0) & (X ~= C)
SX = SX + C;
end
if (mod(Y,C) == 0) & (Y ~= C)
SY = SY + C;
end
end
if ( SX == Y ) & ( SY == X )
AMIGO = 1;
else
AMIGO = 0;
end
end

algoritmo T3Q2;
var
real : X, Y, Z, MA, ME;
inteiro : R;

função MM( real : A, B, C ;
var real : MAIOR, MENOR )
: inteiro;
início
se (A >= B) e (A >= C) então
MAIOR <- A;
se (B >= C) então
MENOR <- C;
senão
MENOR <- B;
fim-se
senão-se (B >= A) e (B >= C) então
MAIOR <- B;
se (A >= C) então
MENOR <- C;
senão
MENOR <- A;
fim-se
senão-se (C >= B) e (C >= B) então
MAIOR <- C;
se (A >= B) então
MENOR <- B;
senão
MENOR <- A;
fim-se
fim-se
se ( MAIOR = MENOR ) então
MM <- 0;
senão
MM <- 1;
fim-se
fim

início
leia(X,Y,Z);
R <- MM(X,Y,Z,MA,ME);
se ( R = 1 ) então
imprima("Maior ",MA,", Menor = ",ME);
senão
imprima("Maior = Menor = ",MA);
fim-se
fim

UFMG – ICEx – DCC – Programação de Computadores – 1º. Sem 2005 – David Menoti 5
program T3Q2;
var
X, Y, Z, MA, ME : real;
R : integer;

function MM( A, B, C : real;
var MAIOR, MENOR : real )
: integer;
begin
if (A >= B) and (A >= C) then begin
MAIOR := A;
if (B >= C) then
MENOR := C
else
MENOR := B; end
else if (B >= A) and (B >= C) then begin
MAIOR := B;
if (A >= C) then
MENOR := C
else
MENOR := A; end
else if (C >= B) and (C >= B) then begin
MAIOR := C;
if (A >= B) then
MENOR := B
else
MENOR := A; end;
if ( MAIOR = MENOR ) then
MM := 0
else
MM := 1;
end;

begin
write('Digite tres valores: ');
readLn(X,Y,Z);
R := MM(X,Y,Z,MA,ME);
if ( R = 1 ) then
writeLn('Maior ',MA,', Menor = ',ME)
else
writeLn('Maior = Menor = ',MA);
end.

function T3Q2;
X = input('Digite um valor: ');
Y = input('Digite um valor: ');
Z = input('Digite um valor: ');
[R,MA,ME] = MM(X,Y,Z);
if ( R == 1 )
fprintf(1,'Maior %f, Menor = %f\n',MA,ME)
else
fprintf(1,'Maior = Menor = %f\n',MA);
end

function [M,MAIOR,MENOR] = MM(A, B, C)
if (A >= B) & (A >= C)
MAIOR = A;
if (B >= C)
MENOR = C;
else
MENOR = B;
end
elseif (B >= A) & (B >= C)
MAIOR = B;
if (A >= C)
MENOR = C;
else
MENOR = A;
end
elseif (C >= B) & (C >= B)
MAIOR = C;
if (A >= B)
MENOR = B;
else
MENOR = A;
end
end
if ( MAIOR == MENOR )
M = 0
else
M = 1;
end;
























UFMG – ICEx – DCC – Programação de Computadores – 1º. Sem 2005 – David Menoti 6
algoritmo T3Q3;
var
inteiro : X;
real : R;

função KOCH( inteiro : N ) : real;
início
se ( N <= 0 ) então
KOCH <- 1;
senão-se ( N = 1 ) então
KOCH <- 3;
senão
KOCH <- 4/3 * KOCH(N-1);
fim-se
fim

início
leia(X);
R <- KOCH(X);
se ( R <> -1 ) então
imprima("Perimetro da ",X,
" iteracao eh ",R);
senão
imprima("Erro!");
fim-se
fim

program T3Q3;
var
X : integer;
R : real;

function KOCH( N : integer ) : real;
begin
if ( N <= 0 ) then
KOCH := 1
else if ( N = 1 ) then
KOCH := 3
else
KOCH := 4/3 * KOCH(N-1);
end;

begin
write('Estrela de Koch, perimetro de qual
iteracao: ');
readLn(X);
R := KOCH(X);
if ( R <> -1 ) then
writeLn('Perimetro da ',X,' iteracao eh
',R)
else
writeLn('Erro!');
end.



















function T3Q3;
X = input('Estrela de Koch, perimetro de
qual iteracao: ');
R = KOCH(X);
if ( R ~= -1 )
fprintf(1,'Perimetro da %d iteracao eh
%f\n',X,R);
else
disp('Erro!');
end

function KOC = KOCH(N)
if ( N <= 0 )
KOC = 1;
elseif ( N == 1 )
KOC = 3;
else
KOC = 4/3 * KOCH(N-1);
end