Resuelto 4-b 4.- Calcular la media de cinco números (leídos por teclado) utilizando para ello una función. ¿Qué cambios hay que hacer en el programa para usar perfil asumido en el array formal xx?
Resuelto 5 5.- Lo mismo que en el ejercicio CAP5_1 pero usando una subrutina. Sumar dos números enteros usando una subrutina para calcular la suma. Notar la forma de llamar a la subrutina usando la sentencia CALL. La ejecución de la llamada ocurre de la misma manera que en el caso de una función. El resultado de la suma de las dos variables se transfiere al programa principal a través del argumento Z. ¿En qué tipo de problemas usarías subprogramas función y en cuáles subprogramas subrutina? ¿Es indiferente?
Resuelto 6 6.- Intercambiar los valores de dos variables enteras. Usar una subrutina para realizar el intercambio.
Resuelto 7 7.- Lo mismo que en el ejercicio 4 pero usando una subrutina. Calcular la media de cinco números (leídos por teclado) utilizando para ello una subrutina. En la llamada a la subrutina, la dirección de memoria del primer elemento de vector se pasa al argumento formal num y la solución calculada, media de los cinco números de ese array, se pasa a su vez al programa principal a través del argumento formal solu.
Resuelto 8 8.- Calcular la cantidad de números positivos, negativos y ceros que hay en una matriz, sabiendo que el número de filas y columnas es como máximo 10. Usar una subrutina para leer el número de filas y columnas de la matriz, así como sus elementos y otra subrutina para calcular el número de positivos, negativos y ceros que tiene la matriz. Un bucle controla que se introduce el tamaño permitido para la matriz, es decir, como máximo 10X10. Se usan tres contadores para calcular las cantidades pedidas.
Resuelto 9 9.- Generar aleatoriamente un número de 1 a 100. Se trata de adivinar qué número es, con sucesivos intentos. random_seed() y random_number(arg) son dos subrutinas intrínsecas FORTRAN. La primera inicializa el procedimiento aleatorio y la segunda genera un número aleatorio real arg tal que 0< =arg< 1.
Resuelto 10 10.- Leer por teclado el coeficiente de convección (h), la diferencia de temperatura (dT), el radio y la altura de un cilindro y calcular la pérdida de calor, según la fórmula q=hxAxdT, donde A es el área del cilindro.. El programa principal realiza la llamada a una función que, a su vez, llama a otra función. En concreto, la función area realiza la llamada a la función circulo para completar el cálculo del área del cilindro que se requiere.
Resuelto 11-1º 11.- Cargar por teclado la temperatura T de 25 puntos del espacio con coordenadas (X, Y) en un instante de tiempo dado. Se pide: a) Visualizar la temperatura T de un punto del espacio (X, Y) dado por el usuario por teclado. b) Visualizar los puntos del espacio (X, Y), si los hay, que tienen el mismo valor de temperatura T, dada por el usuario por teclado. c) Calcular la mayor (en valor absoluto) de las diferencias de las temperaturas respecto de la temperatura media. Usar programación modular. Unidades: (X, Y, T) = (m, m, C).
Resuelto 11-2º a) Visualizar la temperatura T de un punto del espacio (X, Y) dado por el usuario por teclado.
Resuelto 11-3º b) Visualizar los puntos del espacio (X, Y), si los hay, que tienen el mismo valor de temperatura T, dada por el usuario por teclado.
Resuelto 11- 4º c) Calcular la mayor (en valor absoluto) de las diferencias de las temperaturas respecto de la temperatura media. La utilidad de la función media aumentaría si la función difm calculara las medias de varios conjuntos de temperaturas. La función media es un argumento actual de la función difm. Para especificarlo se usa el atributo EXTERNAL.
Compartir datos con módulos Los módulos para compartir datos son útiles cuando se necesita compartir grandes cantidades de datos entre muchas unidades de programa, pero manteniéndolos invisibles para las demás. Además de las listas de argumentos, un programa Fortran puede intercambiar datos a través de módulos. Un módulo es una unidad de programa, compilada por separado del resto, que contiene, al menos, las declaraciones e inicializaciones necesarias de los datos que se quieren compartir entre las unidades de programa. La sintaxis general de un módulo es: Para poder usar los datos de módulos en una unidad de programa hay que escribir, como primera sentencia no comentada inmediatamente después del cabecero de la unidad de programa, la sentencia: MODULE nombre_modulo [SAVE] Declaración e inicialización de datos compartidos Cuerpo del módulo END MODULE nombre_modulo USE nombre_modulo1[,nombre_modulo2], Cada vez que se sale de un procedimiento, los valores de sus variables locales se pierden, a menos que se utilice la sentencia SAVE. Sirve para preservar los valores de los datos del módulo cuando éste se comparte entre varias unidades de programa.
Compartir datos con módulos. Ejemplo Escribir un módulo de datos para compartir dos vectores con valores iniciales v1(1 1 1 1 1) y v2(10 11 12 13 14) y una matriz m entre el programa principal y una subrutina sub. El programa principal debe calcular el vector suma de v1 y v2 y la subrutina debe volcar el vector suma en la primera columna de la matriz y el vector v2 en la segunda columna. El uso de la instrucción SAVE impide que se vuelvan a inicializar los valores de las variables.
Procedimientos módulo Además de datos, un modulo puede contener procedimientos (subrutinas y/o funciones), que se denominan entonces procedimientos módulo. Un procedimiento contenido en un módulo se dice que tiene una interfaz explícita, pues el compilador conoce todos los detalles de su lista de argumentos. Como consecuencia, cuando se usa el módulo en cualquier unidad de programa, el compilador chequea la concordancia de número, tipo y orden entre las listas de argumentos actuales y sus correspondientes formales, así como usos indebidos de los últimos según el valor del atributo INTENT. La sintaxis general de un procedimiento módulo es: MODULE nombre_modulo [SAVE] Declaración e inicialización datos compartidos CONTAINS Estructura general procedimiento1 [Estructura general procedimiento2] END MODULE nombre_modulo USE nombre_modulo1[,nombre_modulo2], Para hacer accesibles procedimientos módulos a una unidad de programa hay que escribir, como primera sentencia no comentada inmediatamente después del cabecero de la unidad de programa, la sentencia: Por contraposición, un procedimiento externo que no está en un módulo se dice que tiene una interfaz implícita. El compilador desconoce los detalles de las listas de argumentos y, por tanto, no puede chequear errores de concordancias en las mismas. Es responsabilidad del programador encargarse de chequearlo.
Ejemplo de procedimiento en un módulo Ejemplo. Sumar dos números enteros usando un procedimiento módulo que contenga una subrutina que calcule la suma. Comprobar que si se declaran los argumentos actuales del tipo REAL, el compilador encuentra el error de concordancia de tipos. Sin embargo, si se repite el ejercicio con la subrutina sub1 como procedimiento externo, el compilador no encuentra errores.
Resuelto 1 1.- Calcular la media de cinco números (leídos por teclado) utilizando para ello una función. ¿Qué cambios hay que hacer en el programa para usar perfil asumido en el array formal xx?
Ejemplo modulos: (Gp:) PROGRAM test_random0 (Gp:) MODULE ran001 (Gp:) SUBROUTINE random0 (Gp:) SUBROUTINE seed (Gp:) Llama a: (Gp:) usan
Compilación: %ifort c random0.f90 (compila el módulo) %ifort test_random0.f90 o test_random0 random0.o Crea: random0.o ran001.mod Ejemplo en http://venus.ifca.unican.es/~gserrano/PEC
Página anterior | Volver al principio del trabajo | Página siguiente |