Nota: Nas preguntas test, cada pregunta totalmente contestada de forma incorrecta desconta 0.1.
>> a=[1 2;3 4]; >> b=[1 2;2 3]; >> c=a.*(b^2)a) c = 5 16; 24 52
function z=exame(x,y) z=3.0+x.*y+k;Indicar cáis das seguintes afirmacións son certas:
q, t : punteiros a nodo ref : tipo X band : lóxica se p /= NULO q = p; band = SI mentres q^.dato /= ref e band == SI se q^.enlace /= NULO t = q q = q^.enlace se non band = NON fin se fin mentres fin_seOnde p é o punteiro ó primeiro nodo da lista. A quén apunta o punteiro t en cada iteración do bucle mentres? Cando se remata a estrutura iterativa mentres? Cando vale NON a bandeira band? Qué ocurre cando a lista está baleira?
SOLUCIÓN:
a) O punteiro t apunta, en cada iteración, ó nodo anterior ó nodo q, recorrendo a lista: cando remata a iteración, se se acada a final, entón q apunta ó último nodo e t ó penúltimo.
b) A estrutura mentres remata ou ben se se atopa o nodo con dato ref buscado (q.dato == ref) ou ben se se acada a final da lista sen atopa-lo nodo buscado (q.enlace == NULO, caso en que band == NON).
c) A bandeira band == NON cando se acada a final da lista (q.enlace == NULO), momento en que se executa a sentencia band = NON.
d) Cando a lista está baleira, p == NULO e xa non se cumple a condición do se inicial, polo cal non se executa ningunha sentencia.
module meu_modulo type persoa character(len = 100) :: nome integer :: idade end type persoa interface operator (>) module procedure f end interface public operator (>) contains logical function f(x, y) type(persoa), intent(in) :: x, y if(x%idade > y%idade) then f = .true. else f = .false. end if return end function f end module meu_modulo
SOLUCIÓN:
a) O módulo define un tipo de datos derivado persoa e unha interfaz que permite sobrecarga-lo operador > para as variábeis deste tipo. Esta sobrecarga se efectúa usando a función f, que retorna un valor lóxico igual a .true. se x%persoa > y%persoa e .false. en caso contrario.
b) Se dende outro programa se escribe x > y, sendo x e y de tipo persoa, e ademais inclúe a sentencia use meu_modulo, entón o valor x > y será .true. se x%persoa > y%persoa e .false. en caso contrario. Se non se inclúe a sentencia use meu_modulo, dará erro de compilación, porque por defecto o operador > non está definido para datos deste tipo derivado.
SOLUCIÓN: Resultado de tipo logical. Orde de execución: n*y, (1 - n*y), m**2, (y - z), m**2.ne.2, (y - z).gt.(1 - n*y), .and.
SOLUCIÓN: Usando a función intrínseca associated(p), onde p é o punteiro, función que volta .true. se p apunta a algures, e .false. en caso contrario.
SOLUCIÓN: O número de iteracións é:
N = max0, | (1) |
SOLUCIÓN: Implementación en F90:
do sentencias if(condición) exit end do
SOLUCIÓN: O que fai é recorrer tódolos elementos a(i, j) da matriz a e, para aqueles que sexan estrictamente positivos, executar a(i, j) = 1.0/a(i, j), elemento a elemento.
SOLUCIÓN: Para que unha función sexa recursiva en Fortran 90, é dicir, para que poda chamarse a si mesma directamente (non indirectamente, como en Fortran 77), a función debe te-lo atributo recursive. Ademais, o valor devolto pola función debe ser distinto do nome da función, xa que éste nome emprégase como nome de función para chamarse a si mesma: polo tanto, a sentencia result (var) debe indicar o nome da variábel var que voltará a función. A cabeceira da función sería entón: recursive function f(...) result (var)
SOLUCIÓN:
a) 3f7.2
b) a100
c) 2i4, $
SOLUCIÓN: Os argumentos ficticios in son argumentos de só lectura, e polo tanto non poden ser modificados dentro do subprograma, éste só pode le-los seus valores. Os argumentos out non teñen valor inicial asignado, e polo tanto o subprograma non pode le-los seus valores, só pode modificalos, é dicir, darlle valores. Os argumentos inout teñen un valor inicial, e poden ser lidos polo subprograma, que ademais pode modificalos, por isto son argumentos de entrada e saída.