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