Universidade Federal de Minas Gerais - UFMG Data: 22/06/2005 Instituto de Ciências Exatas - ICEx Disciplina: Programação de Computadores Professor: David Menoti (menoti@dcc.ufmg.br) Monitor: João Felipe Kudo (joao.felipe.kudo@terra.com.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 iá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 R 2, pode ser definida por dois pontos não coincidentes. Escreva uma função em PORTUGOL que receba quatro parâmetros X 1, Y 1, X 2 e Y 2 que correspondam à estes dois pontos e calcule: - o coeficiente angular (m); - o coeficiente linear (k), onde: Y1 Y2 m = k = Y1 mx1 = Y2 mx 2 X 1 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 X / Z, Y / Z), se X mod Z = 0 e Y mod Z = 0 para 1 < Z X, Y M. M. X, Y ) = Z X / Z, Y ) se X mod Z = 0 e Y mod Z 0 para1 < Z X, Y Z X, Y / Z ) se X mod Z 0 e Y mod Z = 0 para1 < Z X, Y M. M. 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
inteiro : N; procedimento NPRIMO(inteiro : N); inteiro : I, J, K ; lógico : SIT; se ( N <= 0 ) então imprima("erro, N (",N,") invalido!"); 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; J <- J + 1; -enquanto se ( SIT ) então imprima(i,"o. numero primo eh: ",K); I <- I + 1; K <- K + 1; -enquanto leia(n); NPRIMO(N); program T3Q1; N : integer; procedure NPRIMO(N : integer); I, J, K: integer ; SIT: boolean; if N <= 0 then writeln('erro, N (',N,') invalido!') K := 2; { numero primo candidato } I := 1; while (I <= N) do SIT := true; J := 2; while ( SIT ) and ( J < K ) do if ( K mod J = 0 ) then SIT := false; J := J + 1; if ( SIT ) then writeln(i,'o. numero primo eh: ',K); I := I + 1; K := K + 1; write('digite um numero: '); read(n); NPRIMO(N); UFMG ICEx DCC Programação de Computadores 1º. Sem 2005 David Menoti 2
real : X1L, Y1L, X2L, Y2L, ML, KL; função EQ1(real : X1, Y1, X2, Y2; real : M, K ) : real; se ( X1 - X2 = 0 ) então EQ1 <- 0; EQ1 <- 1; M <- ( Y1 - Y2 ) / ( X1 - X2); K <- Y1 - M * X1; leia(x1l,y1l); leia(x2l,y2l); se ( EQ1(X1L,Y1L,X2L,Y2L,ML,KL) = 0 ) então imprima("impossivel calcular M e K"); imprima("m = ",ML,", K = ",KL); program T3Q2; X1L, Y1L, X2L, Y2L, ML, KL : real; function EQ1(X1, Y1, X2, Y2 : real; M, K : real) : real; if ( X1 - X2 = 0 ) then EQ1 := 0 EQ1 := 1; M := ( Y1 - Y2 ) / ( X1 - X2); K := Y1 - M * X1; 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') writeln('m = ',ML:4:4,', K = ',KL:4:4); UFMG ICEx DCC Programação de Computadores 1º. Sem 2005 David Menoti 3
inteiro : A, B, VAL ; função MMC(inteiro : X, Y) : inteiro; lógico : SIT; inteiro : Z; se ( X <= 0 ) ou ( Y <= 0 ) então MMC <- 0; se ( X = 1 ) e ( Y = 1 ) então MMC <- 1; 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; Z <- Z + 1; -enquanto se ( X mod Z = 0 ) e ( Y mod Z = 0 ) então MMC <- Z * MMC(X div Z,Y div Z); se ( X mod Z = 0 ) e (Y mod Z <> 0 ) então MMC <- Z * MMC(X div Z, Y); { ( X mod Z <> 0 ) e ( Y mod Z = 0 ) } MMC <- Z * MMC(X, Y div Z); leia(a,b); VAL <- MMC(A,B); se ( VAL <> 0 ) então imprima(val); imprima("impossivel calcular MMC de ",A," e ",B); UFMG ICEx DCC Programação de Computadores 1º. Sem 2005 David Menoti 4
program T3Q3; A, B, VAL : integer; function MMC(X,Y: integer) : integer; SIT : boolean; Z : integer; if ( X <= 0 ) or ( Y <= 0 ) then MMC := 0 if ( X = 1 ) and ( Y = 1 ) then MMC := 1 Z := 2; SIT := true; while ( SIT ) and ( ( Z <= X ) or ( Z <= Y ) ) do if ( X mod Z = 0 ) or ( Y mod Z = 0 ) then SIT := false Z := Z + 1; if ( X mod Z = 0 ) and ( Y mod Z = 0 ) then MMC := Z * MMC(X div Z,Y div Z) if ( X mod Z = 0 ) and (Y mod Z <> 0 ) then MMC := Z * MMC(X div Z, Y) { ( X mod Z <> 0 ) and ( Y mod Z = 0 ) } MMC := Z * MMC(X, Y div Z); write('entre com um numero: '); readln(a); write('entre com um numero: '); readln(b); VAL := MMC(A,B); if ( VAL <> 0 ) then writeln(val) writeln('impossivel calcular MMC de ',A,' e ',B); UFMG ICEx DCC Programação de Computadores 1º. Sem 2005 David Menoti 5