You are on page 1of 6

Ing.

William Chauca Nolasco

LP_2012

WIWI&DATA-INGS

PROBLEMAS PROPUESTOS DE SUBPROGRAMAS


Autor: Ing. William Chauca Nolasco
1.-Elabore un programa principal y un subprograma function sin argumentos que cuando es llamado por el programa principal retorne siempre el valor lgico verdadero, es decir: T. 2.-Elabore un programa principal que permita el ingres de dos nmeros enteros, y a su vez llame a un subprograma function que determine cual es el mayor de los dos, es conveniente que cada valor ingresado se visualice con el nombre de la variable que se almacena segn sea el caso. (observe una posible salida del programa)
INGRESE DOS NUMEROS ENTEROS 10 100 EL MAYOR DE LOS NUMEROS INGRESADOS ES B = Press any key to continue 100

Nota: el prrafo de color rojo es un mensaje, y los de color verde corresponde a los valores que son almacenados en las variables respectiva. 3.-Se tiene el siguiente programa, el cual contiene a un subprograma function, escriba el programa, luego compile y ejecute, observe el resultado de la ejecucin del programa, explique porque los valores cambian (obligatorio la explicacin)
PROGRAM programa IMPLICIT NONE INTEGER::x,y x=1 y=1 PRINT*,suma(x,y) PRINT* PRINT*,suma(x,y) CONTAINS INTEGER FUNCTION suma(a,b) IMPLICIT NONE INTEGER::a,b a=a+b suma=a RETURN END FUNCTION END PROGRAM programa

4.-Elabore un programa principal que llame a una subrutina que imprima los caracteres W y w, estos caracteres se almacenaran en diferentes matrices, en el programa principal debe ingresar la cantidad de caracteres que se imprimirn. (observe una posible ejecucin del programa)
INGRESE M Y N 55 WWWWW wwwww WWWWW wwwww WWWWW wwwww WWWWW wwwww WWWWW wwwww

5.- Elabore un programa que pida dos nmeros naturales y use una funcin lgica para saber si ambos son cuadrones pares o no. A saber: dos nmeros son cuadrones pares si al sumarlos y restarlos se obtienen cuadrados perfectos. Ejemplo: 10 y 26 son cuadrones pares pues: 10+26 =36 (cuadrado perfecto) y 26-10 = 16 (cuadrado perfecto). 6.- Modifica el ejercicio anterior para obtener todos los nmeros cuadrones pares hasta 1000.

Ing. William Chauca Nolasco

LP_2012

WIWI&DATA-INGS

7.- Elabore un programa que lee por teclado una matriz 3x3 y calcula su determinante. Utilizar la funcin siguiente para calcular adjuntos: INTEGER FUNCTION adjto (a,b,c,d) INTEGER, INTENT(IN):: a,b,c,d adjto=a*d-b*c RETURN END FUNCTION adjto 8.- Elabore un programa que lee por teclado una matriz 3x3 y calcula su determinante. Utilizar la subrutina siguiente para calcular adjuntos: SUBROUTINE adjto (a,b,c,d,det2) INTEGER, INTENT(IN):: a,b,c,d INTEGER, INTENT(OUT):: det2 det2=a*d-b*c RETURN END SUBROUTINE adjto 9.- Elabore un programa que pida 5 nmeros por teclado y averige si son primos o no utilizando el algoritmo de Wilson. A saber: un nmero K es primo si (K-1)!+1 es divisible entre K. Utilizar una funcin que devuelva a travs de su nombre los valores .TRUE: si el nmero dado es primo y .FALSE. si no lo es. 10.- Programa que pida por teclado una matriz cuadrada de 4X4 y calcule su traza y la suma de los elementos por encima y por debajo de la diagonal principal. Usar una subrutina para la lectura de la matriz, una funcin para calcular la traza y una subrutina para las dos sumas pedidas. 11.- Programa que desplace los valores de las componentes del vector A(5,10,15,20,25,30,35) una posicin hacia la derecha de modo que el valor de la ltima componente pase a la primera, es decir, despus del desplazamiento, el vector resultante es A(35,5,10,15,20,25,30). Usar una subrutina para realizar el desplazamiento a la derecha. 12.-Elabore un programa que calcule el producto de 2 matrices de 3X2 y 2X3, respectivamente. Usar una subrutina para la lectura de las dos matrices a multiplicar y otra subrutina para calcular la matriz producto. 13.- Programa que pida al usuario por teclado el nmero de filas y columnas de dos Matrices A y B (iguales para ambas) y sus componentes. Dimensiona dinmicamente las matrices. A continuacin, el programa presentar estas opciones: 1. Mostrar por monitor la Matriz A. 2. Mostrar por monitor la Matriz B. 3. Mostrar por monitor la traspuesta de la Matriz A. 4. Mostrar por monitor la traspuesta de la Matriz B. 5. Mostrar por monitor Matriz A + Matriz B. 6. Mostrar por monitor Matriz A - Matriz B. 7. Salir. Usa el mismo subprograma para responder a las opciones 1 y 2 del men anterior, otro subprograma para responder a las opciones 3 y 4 y otro para responder a las opciones 5 y 6. Antes de acabar el programa libera el espacio reservado en memoria previamente para las matrices A y B.

Ing. William Chauca Nolasco

LP_2012

WIWI&DATA-INGS

14.- El siguiente programa contiene un programa principal, un modulo y una subrutina, escriba el programa , compile y ejectelo, luego explique en forma detalla que sucede con las variables en cada unidad de programa
MODULE datos INTEGER :: numval REAL, ALLOCATABLE, DIMENSION(:) :: valores END MODULE datos PROGRAM prog_compartir USE datos IMPLICIT NONE INTEGER :: i PRINT*,"INGRESE CANTIDAD DE VALORES" READ *, numval ALLOCATE (valores(numval)) DO i = 1, numval valores(i)=i**i END DO CALL escribe END PROGRAM prog_compartir SUBROUTINE escribe USE datos IMPLICIT NONE INTEGER :: i DO i = 1, numval print '(f12.1)', valores(i) ! carcter global END DO END SUBROUTINE escribe

15.- El siguiente programa contiene una subrutina dentro del programa principal, escriba, compile y ejecute, luego haga un anlisis de las variable, funciones que participan en el programa
PROGRAM pro_sort INTEGER, PARAMETER :: num=5 INTEGER, DIMENSION(num):: inicial=(/10,5,1,4,2/) INTEGER, DIMENSION(num):: ordenado ordenado=sort(inicial) print*,ordenado CONTAINS FUNCTION sort(entrada) RESULT (salida) INTEGER,DIMENSION(:),INTENT(IN) :: entrada INTEGER,DIMENSION(SIZE(entrada)) :: salida LOGICAL :: no_camb INTEGER :: i,t salida = entrada DO no_camb = .TRUE. DO i=1,SIZE(salida)-1 IF (salida(i) > salida(i+1)) THEN t=salida(i) salida(i)=salida(i+1) salida(i+1)=t no_camb = .FALSE. END IF END DO IF (no_camb) EXIT END DO END FUNCTION sort END PROGRAM pro_sort

Ing. William Chauca Nolasco


PROGRAM ABSOLUTO IMPLICIT NONE INTEGER:: X PRINT*,INGRESE VALOR DE X READ *, X ABSO = ABSOL (X) PRINT*,) X RETURN END PROGRAM ABSOLUTO FUNCTION ABSOL(A) IMPLICIT NONE INTEGER, INTENT(InOut) :: A INTEGER :: ABSOL ABSOL =SQTR (ABSOL**2) RETURN END FUNCTION ABSOL

LP_2012

WIWI&DATA-INGS

16.- Realice las mismas actividades de la pregunta 15

17.-Realice las mismas actividades de la pregunta 16, y complete ultima subrutina


PROGRAM MATRICES IMPLICIT NONE INTEGER:: N= 10, I, J REAL, DIMENSIN (N,N):: A,B READ *, ((A(I, J), I=1, N), J=1, N) READ *, ((B(I, J), I=1, N), J=1, N) CALL SMATRIZ (A, B, S, N) Aqu podemos apreciar el CALL RMATRIZ (A, B, R, N) llamado a cuatro diferentes CALL P MATRIZ (A, B, P, N) sub-programas ( sub-rutinas). CALL SALIDAM (A, B, S, R, P, N) END PROGRAM MATRICES SUBROUTINE SMATRIZ (X, Y, SUMA, M) IMPLICIT NONE INTEGER, INTENT(IN)::M REAL, INTENT(IN); DIMENSION (M, M):: SUMA SUMA = X + Y RETURN END SUBROUTINE SMATRIZ SUBROUTINE RMATRIZ (X, Y, RESTA, M) IMPLICIT NONE INTEGER, INTENT(IN)::M REAL, INTENT(IN); DIMENSION (M, M):: RESTA RESTA = X - Y RETURN END SUBROUTINE RMATRIZ SUBROUTINE PMATRIZ (X, Y, PRODUCTO, M) IMPLICIT NONE INTEGER, INTENT(IN)::M REAL, INTENT(IN); DIMENSION (M, M):: PRODUCTO PRODUCTO = X * Y RETURN END SUBROUTINE PMATRIZ Se deja de tarea elaborar el subprograma que despliegue resultados en forma matricial. Ayuda: SUBROUTINE SALIDAM (X, Y, SUMA, RESTA, PRODUCTO, M) IMPLICIT NONE INTEGER:: I, J INTEGER, INTENT (IN) ::M REAL, INTENT (IN), DIMENSION (M, M) :: SUMA, RESTA, PRODUCTO ----------RETURN ENDSUBROUTINE SALIDAM

Ing. William Chauca Nolasco

LP_2012

WIWI&DATA-INGS

18.- Para el problema 17, modificarlos utilizando un programa principal y un modulo conteniendo a los subprogramas 19.-Transcriba el programa y realice el anlisis respectivo
MODULE ARREGLO IMPLICIT NONE SAVE INTEGER, PAREMETER::N=10 REAL, DIMENSION (N,N)::VECTOR END MODULE ARREGLO PROGRAM USE ARREGLO IMPLI CIT NONE VECTOR = (/1,2,3,4,5,6,7,8,9,10/) CALL SALIDA END PROGRAM APLICACIN SUBROUTINE SALIDA USE SALIDA IMPLICIT NONE PRINT*, VECTOR RETURN END SUBROUTINE SALIDA

20.- Responda a las siguientes preguntas


a.- Qu es una funcin en Fortran 90-95? b.- Cuntos tipos de funciones existen? c.- Cmo se representa grficamente una funcin? d.- Qu diferencia existe entre una funcin usuario y un subprograma? e.-Qu es un subprograma? f.- Cmo se representa grficamente un subprograma? g.- Describa lo que sucede si un parmetro tiene nombre distinto en el programa principal l y en la funcin y/o subprograma? h.- Qu sucede si el modulo de un programa es distinto en programa principal y en la funcin y/o subprograma? i.- Se puede llamar a un subprograma desde una funcin y viceversa? j.-Puede tener el mismo nombre una funcin y/o un subprograma vs. Programa Principal ? k.- Qu son los argumentos ficticios (parmetros)? l.- Qu son los argumentos reales (parmetros)? ll.- Qu son las Funciones de biblioteca m- Para que sirve el comando RETURN? n.- Cmo refuerza un subprograma el paso de parmetros? .- Para que sirve el comando intent (in)? o.- Para que sirve el comando intent (out)? p- Para que sirve el comando intent (inout)? q.-Para que sirve el comando MODULE? r.- Para que sirve el comando USE? S.-Para que sirve el comando CONTAINS?

21.- En los siguientes programas, una vez ejecutado, escribir el enunciado o pregunta que tendra cada programa.
Problema 1 PROGRAM Sumar2Numeros IMPLICIT NONE INTEGER :: a, b, c, d PRINT*, "Dame dos nmeros enteros" READ*, a, b CALL Sumar(a,b,c) ! Primera llamada a la subrutina. CALL Sumar(2,c,d) ! Segunda llamada a la subrutina. PRINT*, "La suma vale ",c PRINT*, "2 + ",c," = ",d CONTAINS !**************************************************** !** Subrutina para sumar dos nmeros enteros x e y **

Ing. William Chauca Nolasco

LP_2012

WIWI&DATA-INGS

!** Parmetros E/: ** !** x, y : nmeros enteros ** !** Parmetros /S: ** !** z : resultado de la suma x+y ** !**************************************************** SUBROUTINE Sumar(x,y,z) INTEGER :: x, y ! Datos de E/ INTEGER :: z ! Dato de /S z = x+y END SUBROUTINE Sumar END PROGRAM Sumar2Numeros Problema 2 PROGRAM EjemploMenu IMPLICIT NONE ! Ejemplo de uso de una subrutina ! No hay variables ! Comienzo del programa principal PRINT*, "Aqu tienes el menu de opciones:" CALL MostrarMenu() ! Llamada a la subrutina ! Fin del programa principal CONTAINS !************************************************ !** Subrutina para mostrar un menu de opciones ** !** Parmetros: ** !** NINGUNO ** !************************************************ SUBROUTINE MostrarMenu() ! No hay parmetros PRINT*, " 1 - Listado de alumnos" PRINT*, " 2 - Buscar un alumno" PRINT*, " 3 - Aadir un alumno" PRINT*, " 4 - Borrar un alumno" PRINT*, " 5 - Finalizar" END SUBROUTINE MostrarMenu END

Problema 3
PROGRAM EjemploIntercambio IMPLICIT NONE INTEGER :: a, b PRINT*, "Dame dos nmeros enteros" READ*, a, b CALL Intercambiar(a,b) ! Llamada a la subrutina. PRINT*, "Los nmeros intercambiados son: ",a, b CONTAINS !******************************************************************** !** Subrutina para intercambiar el valor de dos nm. enteros x e y ** !** Parmetros E/S: ** !** x, y : nmeros enteros ** !******************************************************************** SUBROUTINE Intercambiar(x,y) INTEGER :: x, y ! Datos de E/S INTEGER :: tmp ! Variable local auxiliar tmp = x x = y y = tmp END SUBROUTINE Intercambiar END PROGRAM

You might also like