Correção do º Exame de INTRODUÇÃO À PROGRAMAÇÃO Licenciatura em Engenharia Mecânica 3 de Junho de 26, 2º Semestre. (2.) Perguntas de resposta rápida de Fortran (.4 valores cada).. Todos os componentes de uma ficha (tipo derivado ou estrutura) têm de ser do mesmo tipo simples (V/F). Falso.2 Qual a saída produzida pela construção IF em baixo se n=89? E se n=? IF (n >= 9) THEN WRITE(*,*) Excelente ELSE IF (n >= 8) THEN WRITE(*,*) Bom ELSE IF (n >= 7) THEN WRITE(*,*) Suficiente ELSE WRITE(*,*) Mau END IF Bom e Mau.3. O que está errado neste ciclo DO, se é que está alguma coisa errada? DO I =, WRITE(*,*) I I = I + END DO Alterar o calor da variável de controlo I dentro do ciclo..4. Defina uma estrutura chamada Data cujos componentes são o nome do Mês, o Dia e o Ano. Escreva uma forma simples de carregar a variável Hoje do tipo Data com 3, Junho e 26. TYPE Data INTEGER :: Dia CHARACTER(9) :: Mes INTEGER :: Ano END TYPE Data TYPE(Data) :: Hoje Hoje = Data(3, Junho, 26)
.5. Considere a seguinte declaração: INTEGER, DIMENSION(2,3) :: H, & A = RESHAPE((/, 2, 3, 4, 5, 6/), (/2, 3/)) Diga qual é o valor de H, dado por: WHERE (A < 4) H = A + ELSEWHERE H = A - END WHERE H = 3 49 2 39 59 2. (2.) Perguntas de resposta rápida de Matlab (.4 valores cada). 2. Suponha que x = 3 e y = 4. Escreva as linhas de código em Matlab necessárias para avaliar a expressão: x y 2 3 ( x y) x = 3; y = 4; (.2) res = x^2 * y^3 / (x y)^2 2 2.2 Qual o valor da matriz a depois das seguintes atribuições: a = eye(3,3); b = [ 2 3]; a(2,:) = b; a = 2 3 2.3 Considerando a matriz M, escreva o código que lhe permite obter a submatriz sombreada. M 5 = 9 3 2 6 4 3 7 5 4 8 2 6 M(:2,2:3) 2
2.4 Diga se o código em baixo está correcto ou incorrecto. No caso de estar correcto, indique o resultado da execução. No caso de estar incorrecto, diga qual é o erro. cor = amarelo ; switch (cor) case vermelho, disp( Parar agora! ); case amarelo, disp( Preparar para parar. ); case verde, disp( Seguir para o cruzamento. ); otherwise disp( Cor ilegal encontrada. ); end >> Preparar para parar. 2.5 Considere a seguinte definição da matriz a: a{,} = [ 2 3; 4 5 6; 7 8 9]; a{,2} = { Linha de comentario }; a{2,} = j; a{2,2} = a{,} a{,}(2,2) Uma das expressões em baixo está incorrecta. Diga o que está incorrecto nessa expressão, e escreva o resultado da outra. 2*a{2,2} 2*a(2,2) 4 3 2 2*a{2,2} = 2* 2 3 4 = 8 6 4 2 2 4 6 8 2*a(2,2) é ilegal, pois não se pode multiplicar uma estrutura por um valor. 3
3. (.5) Quais são as vantagens de utilizar sub-programas? Descreva os tipos de subprogramas existentes em Fortran 9 e em Matlab, explicando sucintamente quando deverá utilizar cada um deles. Os problemas complexos devem ser divididos em sub-problemas, seguindo a filosofia topo-base, onde um problema deve ser dividido em sub-problemas mais simples, os quais deverão ter um dado nome. Qualquer linguagem de programação contém sub-programas, os quais permitem o desenvolvimento deste tipo de filosofia de programação. Estes sub-programas são unidades para tarefas específicas dentro do programa principal, cuja forma básica é semelhante, tendo as mesmas regras de alcance. Recebem qualquer número de argumentos, e podem ser usadas noutros subprogramas. No caso do Fortran 9 temos: Funções (function) Este sub-programa é caracterizado por retornar sempre um valor através do seu nome, sendo chamada directamente pelo seu nome. Subrotinas (subroutine) As subrotinas podem retornar mais (ou menos) do que um valor ao programa. São chamadas pela instrução CALL. No caso do Matlab temos: Funções (function) Este sub-programa é caracterizado por retornar sempre um valor através do nome. Pode ter de zero a um número especificado de entradas, tendo de ter sempre uma saída. Em comparação com o Fortran, estas funções são muito mais versáteis, e podem implementar tarefas de subrotinas em Fortran. Script files podem ser utilizadas com programa principal ou para procedimentos parciais de programação. 4. (.5) Diga quais os vários tipos de documentação que deve ter um programa e descreva-os sucintamente. Um programa deve ter documentação para o utilizador, que permita a este saber o que faz o programa, quais os dados de que precisa, que resultados devolve, e como deve ser operado. 2 Deve também ter documentação técnica externa, isto é, um manual do programador, que explique o algoritmo utilizado, descreva a estrutura do código e as estruturas de informação empregues, e justifique as opções de codificação tomadas. 3 Por fim, deve ter documentação técnica interna, isto é, comentários que esclareçam os pontos difíceis do código e que expliquem sumariamente a finalidade de cada programa ou subprograma. 4
5. (.5) Escreva um algoritmo que lê um texto caracter a caracter e conta o número de caracteres, palavras e frases desse texto. Algoritmo ProcessaTexto NumeroCaracteres = NumeroPalavras = NumeroFrases = Repete o seguinte: Se terminou o texto acaba o ciclo Ler próximo Caracter NumeroCaracteres = NumeroCaracteres + Se Caracter é espaço ou fim de linha então NumeroPalavras = NumeroPalavras + Se Caracter é ponto final então NumeroFrases = NumeroFrases + 6. (.5) Um número primo é um inteiro que apenas é divisível por ele próprio e pela unidade. Escreva um programa em Fortran 9 que recebe um inteiro e determina se ele é um número primo. PROGRAM NumeroPrimo!-----------------------------------------------------------! Programa que verifica se um numero dado pelo utilizador! e primo.!! Entrada: Numero inteiro dado pelo utilizador! Saida: Resposta se o numero e primo ou nao!---------------------------------------------------------- IMPLICIT NONE INTEGER :: Numero, Divisor = WRITE(*,*) Escreva um numero para verificar se e primo: READ(*,*) Numero DO Divisor = Divisor + IF ((Divisor == Numero).OR. (MOD(Numero,Divisor)==)) EXIT END DO IF (Divisor = Numero) then WRITE(*,*) O numero, Numero, e primo. ELSE WRITE(*,*) O numero, Numero, nao e primo. END IF END PROGRAM NumeroPrimo 5
7. (.5) Escreva a seguinte função de uma forma não recursiva. Resolução:!--Factorial---------------------------------------! Funcao que calcula factoriais recursivamente!! Recebe: inteiro n >=! Retorna: n!!-------------------------------------------------- RECURSIVE FUNCTION Factorial(n) RESULT(Fact) INTEGER :: Fact! Variavel com resultado INTEGER, INTENT(IN) :: n IF (n == ) THEN Fact = ELSE Fact = n * Factorial(n - ) END IF END FUNCTION Factorial!--Factorial---------------------------------------! Funcao que calcula o factorial N! de N,! que e se N =, e * 2 * * N se N >.!! Recebe: Inteiro N! Retorna: Inteiro N!!------------------------------------------------ FUNCTION Factorial(N) INTEGER :: Factorial INTEGER, INTENT(IN) :: N INTEGER :: I Factorial = DO I = 2, N Factorial = Factorial * I END DO END FUNCTION Factorial 6
8. (3.) Escreva uma função em Fortran 9 para calcular o seno, usando a seguinte expressão: 3 5 7 + 2n+ x x x x sin x = x + + = 3! 5! 7! 2! n= n ( ) ( n + ) de modo a que o mesmo difira do valor calculado pela função SIN no máximo de,. Pode implementar uma função chamada meu_seno se considerar conveniente. Assuma que pode calcular o factorial usando a seguinte função que já existe:!--factorial---------------------------------------! Funcao que CALCULA O factorial de n!-------------------------------------------------- RECURSIVE FUNCTION Factorial(n) RESULT(Fact) INTEGER :: Fact! Variavel com resultado INTEGER, INTENT(IN) :: n IF (n == ) THEN Fact = ELSE Fact = n * Factorial(n - ) END IF END FUNCTION Factorial FUNCTION Meu_Seno(angulo)! REAL :: Meu_Seno REAL, INTENT(IN) :: angulo REAL :: Valor INTEGER :: n Valor = SIN(angulo) n = Meu_Seno = DO Meu_Seno = Meu_Seno + (-)**n * angulo**(2*n+)/factorial(2*n+) IF (ABS(Meu_Seno - Valor) <.) EXIT n = n + END DO END FUNCTION Meu_Seno 7
9. (.) Apresente os resultados devolvidos pelo Matlab em cada uma das seguintes linhas de código:» a = :3 a = :3 b = [a; a.*a; 2*a-a] x = sum(b(:,2)) a = 2 3» b = [a; a.*a; 2*a - a] b = 2 3 4 9 2 3» x = sum(b(:,2)) x = 8. (.) Considerando as matrizes A, B e C, escreva o código em Matlab que lhe permite obter a matriz D. 2 6 2 5 5 A = B = 3 9 C = 3 4 7 3 2 3 D = 6 9 3 2 4 5 7 5 3 R (uma possível):» A=[2 6;3 9];» B=[ 2;3 4];» C=[-5 5;7 3];» D = [A ones(2,2) zeros(2,2);zeros(2,2) B... zeros(2,2);zeros(2,2) ones(2,2) C] 8
. (2.) Escreva uma função em Matlab que recebe o valor de dois ângulos e devolve a classificação de um triângulo (equilátero, isósceles ou escaleno) que contém esses ângulos. function triangulo(ang, ang2) % TRIANGULO indica a classificacao de um triangulo % Funcao HIPOTENUSA recebe os valores dde dois angulos (em graus) % de um triangulo e indica ao utilizador se o triangulo e % equilátero, isósceles ou escaleno. % Chamada da função: % triangulo(ang,ang2) % Variaveis: % ang, ang2 entradas de dois angulos do triangulo % ang3 - valor do terceiro angulo do triangulo ang3 = 8 - (ang + ang2); if (ang == ang2) && (ang2 == ang3) disp('o triangulo e equilatero') elseif (ang == ang2) (ang2 == ang3) (ang == ang3) disp('o triangulo e isosceles') else disp('o triangulo e escaleno') end 2. (.) Escreva um script file para fazer o gráfico da função sen(x)/x para valores de x entre π/ e π. x = pi/:pi/:*pi; plot(x,sin(x)./x) % atenção porque se não se fizer./ a divisão entre dois % vectores é completamente diferente 9
3. (.5) Escreva um script file que recebe os valores dos catetos de um triângulo e escreve no écran o valor da hipotenusa, usando a seguinte função: function h = hipotenusa(a,b) %HIPOTENUSA devolve o valor da hipotenusa num triângulo rectângulo % Funcao HIPOTENUSA recebe os valores dos catetos a e b, e devolve % o comprimento da hipotenusa. % Chamada da função: % h = hipotenusa(a,b) % Variaveis: % a, b - comprimentos dos catetos % h - comprimento da hipotenusa h = sqrt((a^2)+(b^2)); end % script testa_hipotenusa % recebe o valor dos catetos de um triangulo e escreve no ecran % o valor da hipotenusa recorrendo à função hipotenusa(a,b) cat = input('insira o valor de um cateto = '); cat2 = input('insira o valor do outro cateto = '); hip = hipotenusa(cat,cat2); fprintf('o valor da hipotenusa é = %f \n',hip)