Universidade Federal de Minas Gerais - UFMG Instituto de Ciências Exatas - ICEx Disciplina: Programação de Computadores Professor: David Menoti ([email protected]) Data: 26/11/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. Exame Especial – 100 pontos 1) (30 pontos – 52ª. Questão da Lista 03a (Repetição)) Construir um algoritmo em PORTUGOL para calcular e imprimir o sen(X). O valor de X deverá ser digitado em graus, no entanto, utilizado em rad’s na série. O valor do seno de X será calculado pela soma dos 15 primeiros termos da série a seguir: sen( X ) = x − x 3 x 5 x 7 x 9 x 11 + − + − + ... 3! 5! 7! 9! 11! 2) (40 pontos – 20ª. Questão da 4ª. Lista (Vetores) alterada – Resolvidas em Sala de Aula) Construa um algoritmo para calcular a média dos valores, de 50 números que serão digitados pelo usuário. Esses dados devem ser armazenados em um vetor. Ao final o algoritmo deve mostrar a média. O algoritmo deve mostrar também o maior número e o segundo maior número digitado. Além disso, devem ser impressos os valores acima da média calculada. Os dados no vetor devem ser ordenados para a impressão. 3) (30 pontos – 2ª. Questão do 3º. teste do 1º. semestre de 2005 – Resolvida em Sala de Aula) 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. UFMG – ICEx – DCC – Programação de Computadores – 2º. Sem 2005 – David Menoti 1 algoritmo EEQ1; var inteiro: I, J, FAT; real: X, SEN; início SEN ← 0; leia(X); para I de 1 até 15 faça FAT ← 1; para J de 2 até 2*I – 1 faça FAT ← FAT * J; fim-para se ( I mod 2 = 0 ) então SEN ← SEN – ( X ** ( 2 * I – 1 ) ) / FAT; { termo par } senão SEN ← SEN + ( X ** ( 2 * I – 1 ) ) / FAT; { termo ímpar } fim-se fim-para imprima("SEN(",X,") = ",SEN); fim program EEQ1; var I, J: integer; X, SN, FAT, XE: real; begin writeLn('Sen(x)'); write('Digite um valor para X: '); read(X); X := X * 0.01745329252; {converte de graus para radianos} SN := 0; XE := X; for I := 1 to 15 do begin FAT := 1; for J := 2 to 2 * I - 1 do FAT := FAT * J; if ( I mod 2 = 0 ) then SN := SN - XE / FAT { termo par } else SN := SN + XE / FAT; { termo impar } XE := XE * X * X; end; writeLn('Sen(',X:5:4,') = ',SN:9:8); writeLn('Sin(',X:5:4,') = ',Sin(X):9:8); end. %I, J: integer; %X, SN, FAT: real; disp('Sen(x)'); X = input('Digite um valor para X: '); X = X * pi/180; SN = 0; for I = 1 : 15 FAT = 1; for J = 2 : 2 * I - 1 FAT = FAT * J; end if ( mod(I,2) == 0 ) SN = SN - X ^ ( 2 * I - 1 ) / FAT; % termo par else SN = SN + X ^ ( 2 * I - 1 ) / FAT; % termo impar end end fprintf(1,'Sen(%d) = %f\n',X,SN); fprintf(1,'Sin(%d) = %f\n',X,sin(X)); UFMG – ICEx – DCC – Programação de Computadores – 2º. Sem 2005 – David Menoti 2 algoritmo EE2; constante N = 5; var inteiro : C, D; real : SOMA, MEDIA, M1, M2, AUX, VET[1..N]; início SOMA <- 0; para C de 1 até N faça leia (VET[C]); se ( ( VET[C] > M1 ) ou ( C = 1) ) então M2 <-M1; M1 <- VET[C]; senão-se ( ( VET[C] > M2 ) ou ( C = 2) ) então M2 <- VET[C]; fim-se SOMA <- SOMA + VET[C]; fim-para imprima("1o. Maior: ",M1); imprima("2o. Maior: ",M2); MEDIA := SOMA / N; imprima("A media dos valores digitados eh: ",MEDIA); para C de 1 até N-1 faça para D de 1 até N-C-1 faça se ( VET[D] > VET[D+1] ) então AUX <- VET[D]; VET[D] <- VET[D+1]; VET[D+1] <- AUX; fim-se fim-para fim-para imprima("Valores maiores que a media"); para C de 1 até N faça se ( VET[C] > MEDIA ) então imprima(VET[C]); fim-se fim-para fim UFMG – ICEx – DCC – Programação de Computadores – 2º. Sem 2005 – David Menoti 3 program EE2; const N = 50; var C, D : integer; SOMA, MEDIA, M1, M2, AUX : real; VET: array [1..N] of real; begin SOMA := 0; for C := 1 to N do begin write('Digite um valor: '); readLn(VET[C]); if ( ( VET[C] > M1 ) or ( C = 1) ) then begin M2 := M1; M1 := VET[C]; end else if ( ( VET[C] > M2 ) or ( C = 2) ) then begin M2 := VET[C]; end; SOMA := SOMA + VET[C]; end; writeLn('1o. Maior: ',M1); writeLn('2o. Maior: ',M2); MEDIA := SOMA / N; writeln('A media dos valores digitados eh: ',MEDIA); for C := 1 to N-1 do for D := 1 to N-C-1 do if ( VET[D] > VET[D+1] ) then begin AUX := VET[D]; VET[D] := VET[D+1]; VET[D+1] := AUX; end; writeLn('Valores maiores que a media'); for C := 1 to N do if ( VET[C] > MEDIA ) then writeLn(VET[C],' '); end. N = 50; SOMA = 0; for C = 1 : N VET(C) = input ('Digite um valor: '); if ( ( VET(C) > M1 ) | ( C == 1) ) M2 := M1; M1 := VET(C); elseif ( ( VET(C) > M2 ) | ( C == 2) ) M2 := VET(C); end SOMA := SOMA + VET(C); end; fprintf(1,'1o. Maior: %f\n',M1); fprintf(1,'2o. Maior: %f\n',M2); MEDIA := SOMA / N; fprintf(1,'A media dos valores digitados eh: %f\n',MEDIA); for C = 1 : N-1 for D 1 : N-C-1 if ( VET(D) > VET(D+1) ) AUX = VET(D); VET(D) = VET(D+1); VET(D+1) = AUX; end end end fprintf(1,'Valores maiores que a media\n'); for C = 1 : N if ( VET(C) > MEDIA ) fprinf(1,'%d ',VET(C)); end end fprintf(1,'\n'); end UFMG – ICEx – DCC – Programação de Computadores – 2º. Sem 2005 – David Menoti 4 algoritmo EEQ3; 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 início 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 EEQ3; 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. function EEQ3; X1L = input('Ponto 1 - X : '); Y1L = input('Ponto 1 - Y’: '); X2L = input('Ponto 2 - X : '); Y2L = input('Ponto 2 - Y’: '); [RET, ML,KL] = EQ1(X1L,Y1L,X2L,Y2L,ML,KL) if ( RET = 0 ) fprintf(1,'Impossivel calcular M e K'); else fprintf(1,'M = %f, K = %f\n',ML,KL); end function [R,M,K] = EQ1(X1, Y1, X2, Y2) if ( X1 - X2 = 0 ) R = 0; else R = 1; M = ( Y1 - Y2 ) / ( X1 - X2); K = Y1 - M * X1; end UFMG – ICEx – DCC – Programação de Computadores – 2º. Sem 2005 – David Menoti 5