3º. Teste - DCC/UFMG

Propaganda
Universidade Federal de Minas Gerais - UFMG
Instituto de Ciências Exatas - ICEx
Disciplina: Programação de Computadores
Professor: David Menoti ([email protected])
Monitor: João Felipe Kudo ([email protected])
Data: 22/06/2005
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 – 25 pontos
1) (10 pontos) Escreva um procedimento em PORTUGOL que receba um número N, e
imprima os N-menores números primos. O procedimento deve emitir uma mensagem
de erro caso o parâmetro N passado seja inválido. Escreva também um algoritmo que
execute o procedimento, passando a ele um número.
2) (5 pontos) Uma função do primeiro grau, em ℜ2, pode ser definida por dois pontos
não coincidentes. Escreva uma função em PORTUGOL que receba quatro parâmetros
X1, Y1, X2 e Y2 que correspondam à estes dois pontos e calcule:
- o coeficiente angular (m);
- o coeficiente linear (k), onde:
Y − Y2
m= 1
k = Y1 − mX 1 = Y2 − mX 2
X1 − X 2
os valores de m e k devem ser retornados por referencia. A função deve retornar 1,
caso seja possível definir tal função, e 0 em caso contrário. Escreva também um
algoritmo para testar a função criada.
3) (10 pontos) O mínimo múltiplo comum (M.M.C.) entre dois números inteiros e
positivos X e Y é definido como sendo o menor inteiro positivo, que seja múltiplo
comum a X e Y. Pede-se que seja criada uma função recursiva (não serão aceitas
funções não recursivas) para o cálculo do M.M.C., onde a função deverá retornar 0
caso não seja possível computar o M.M.C. e o valor do M.M.C. entre X e Y em caso
contrário. Então, apresenta-se a seguinte definição recursiva que deve ser
implementada:
Z * M .M .C.( X / Z , Y / Z ), se X mod Z = 0 e Y mod Z = 0 para 1 < Z ≤ X , Y

M .M .C.( X , Y ) = Z * M .M .C.( X / Z , Y )
se X mod Z = 0 e Y mod Z ≠ 0 para 1 < Z ≤ X , Y
Z * M .M .C.( X , Y / Z )
se X mod Z ≠ 0 e Y mod Z = 0 para 1 < Z ≤ X , Y

M .M .C.(1,1) =
1
Escreva também um algoritmo para testar a função criada.
UFMG – ICEx – DCC – Programação de Computadores – 1º. Sem 2005 – David Menoti 1
início
inteiro : N;
procedimento NPRIMO(inteiro : N);
início
inteiro : I, J, K ;
lógico : SIT;
se ( N <= 0 ) então
imprima("erro, N (",N,") invalido!");
senão
K <- 2; { numero primo candidato }
I <- 1;
enquanto (I <= N) faça:
SIT <- verdadeiro;
J <- 2;
enquanto ( SIT ) e ( J < K ) faça:
se ( K mod J = 0 ) então
SIT <- falso;
fim-se
J <- J + 1;
fim-enquanto
se ( SIT ) então
imprima(I,"o. numero primo eh: ",K);
I <- I + 1;
fim-se
K <- K + 1;
fim-enquanto
fim-se
fim
leia(N);
NPRIMO(N);
fim
program T3Q1;
var
N : integer;
procedure NPRIMO(N : integer);
var
I, J, K: integer ;
SIT: boolean;
begin
if N <= 0 then
writeLn('erro, N (',N,') invalido!')
else
begin
K := 2; { numero primo candidato }
I := 1;
while (I <= N) do
begin
SIT := true;
J := 2;
while ( SIT ) and ( J < K ) do
begin
if ( K mod J = 0 ) then
SIT := false;
J := J + 1;
end;
if ( SIT ) then
begin
writeLn(I,'o. numero primo eh: ',K);
I := I + 1;
end;
K := K + 1;
end;
end;
end;
begin
write('Digite um numero: ');
read(N);
NPRIMO(N);
end.
UFMG – ICEx – DCC – Programação de Computadores – 1º. Sem 2005 – David Menoti 2
início
real : X1L, Y1L, X2L, Y2L, ML, KL;
função EQ1(real : X1, Y1, X2, Y2; var real : M, K ) : real;
início
se ( X1 - X2 = 0 ) então
EQ1 <- 0;
senão
EQ1 <- 1;
M <- ( Y1 - Y2 ) / ( X1 - X2);
K <- Y1 - M * X1;
fim-se
fim
leia(X1L,Y1L);
leia(X2L,Y2L);
se ( EQ1(X1L,Y1L,X2L,Y2L,ML,KL) = 0 ) então
imprima("Impossivel calcular M e K");
senão
imprima("M = ",ML,", K = ",KL);
fim-se
fim
program T3Q2;
var
X1L, Y1L, X2L, Y2L, ML, KL : real;
function EQ1(X1, Y1, X2, Y2 : real; var M, K : real) : real;
begin
if ( X1 - X2 = 0 ) then
EQ1 := 0
else
begin
EQ1 := 1;
M := ( Y1 - Y2 ) / ( X1 - X2);
K := Y1 - M * X1;
end;
end;
begin
write('Ponto 1 ( X1 , Y1 ): ');
readLn(X1L,Y1L);
write('Ponto 2 ( X2 , Y2 ): ');
readLn(X2L,Y2L);
if EQ1(X1L,Y1L,X2L,Y2L,ML,KL) = 0 then
writeLn('Impossivel calcular M e K')
else
writeLn('M = ',ML:4:4,', K = ',KL:4:4);
end.
UFMG – ICEx – DCC – Programação de Computadores – 1º. Sem 2005 – David Menoti 3
início
inteiro : A, B , VAL ;
função MMC(inteiro : X, Y) : inteiro;
início
lógico : SIT;
inteiro : Z;
se ( X <= 0 ) ou ( Y <= 0 ) então
MMC <- 0;
senão
se ( X = 1 ) e ( Y = 1 ) então
MMC <- 1;
senão
Z <- 2;
SIT <- verdadeiro;
enquanto ( SIT ) e ( ( Z <= X ) ou ( Z <= Y ) ) faça:
se ( X mod Z = 0 ) ou ( Y mod Z = 0 ) então
SIT <- falso;
senão
Z <- Z + 1;
fim-se
fim-enquanto
se ( X mod Z = 0 ) e ( Y mod Z = 0 ) então
MMC <- Z * MMC(X div Z,Y div Z);
senão
se ( X mod Z = 0 ) e (Y mod Z <> 0 ) então
MMC <- Z * MMC(X div Z, Y);
senão { ( X mod Z <> 0 ) e ( Y mod Z = 0 ) }
MMC <- Z * MMC(X, Y div Z);
fim-se
fim-se
fim-se
fim-se
fim
leia(A,B);
VAL <- MMC(A,B);
se ( VAL <> 0 ) então
imprima(VAL);
senão
imprima("Impossivel calcular MMC de ",A," e ",B);
fim-se
fim
UFMG – ICEx – DCC – Programação de Computadores – 1º. Sem 2005 – David Menoti 4
program T3Q3;
var
A, B , VAL : integer;
function MMC(X,Y: integer) : integer;
var
SIT : boolean;
Z : integer;
begin
if ( X <= 0 ) or ( Y <= 0 ) then
MMC := 0
else
begin
if ( X = 1 ) and ( Y = 1 ) then
MMC := 1
else
begin
Z := 2;
SIT := true;
while ( SIT ) and ( ( Z <= X ) or ( Z <= Y ) ) do
begin
if ( X mod Z = 0 ) or ( Y mod Z = 0 ) then
SIT := false
else
Z := Z + 1;
end;
if ( X mod Z = 0 ) and ( Y mod Z = 0 ) then
MMC := Z * MMC(X div Z,Y div Z)
else
if ( X mod Z = 0 ) and (Y mod Z <> 0 ) then
MMC := Z * MMC(X div Z, Y)
else { ( X mod Z <> 0 ) and ( Y mod Z = 0 ) }
MMC := Z * MMC(X, Y div Z);
end;
end;
end;
begin
write('Entre com um numero: ');
readLn(A);
write('Entre com um numero: ');
readLn(B);
VAL := MMC(A,B);
if ( VAL <> 0 ) then
writeLn(VAL)
else
writeLn('impossivel calcular MMC de ',A,' e ',B);
end.
UFMG – ICEx – DCC – Programação de Computadores – 1º. Sem 2005 – David Menoti 5
Download