You are on page 1of 7

Ing.

William Chauca Nolasco

LP_2012

WIWI&DATA-INGS

PROBLEMAS PROPUESTOS DE MANEJO DE CARACTERES Y CADENAS EN FORTRAN 90


Autor: Ing. William Chauca Nolasco
A continuacin se tiene los siguientes programas escritos en fortran, transcrbalo, compile y ejecute, explique detalladamente que realiza cada programa. 1.- Pasar a maysculas un nombre que se lee por teclado usando las funciones intrnsecas IACHAR y ACHAR. Suponer que el nombre ledo puede tener mezcladas letras minsculas y maysculas .
PROGRAM problema_1 IMPLICIT NONE CHARACTER (LEN=20) :: nom,nom_mayus=" " INTEGER :: num,num_mayus,i PRINT*, "DAME UN NOMBRE EN MINUSCULAS" READ*,nom PRINT*, "EL NOMBRE TECLEADO ES ",nom DO i=1,LEN_TRIM(nom) num=IACHAR(nom(i:i)) IF (num >= 97 .AND. num <= 122) THEN num_mayus=num-32 nom_mayus(i:i)=ACHAR(num_mayus) ELSE nom_mayus(i:i)=ACHAR(num) END IF END DO PRINT*, "EL NOMBRE EN MAYUSCULAS ES ",nom_mayus END PROGRAM problema_1 2.- Invertir una palabra usando una subrutina. La palabra invertida debe almacenarse en la misma variable

usada para la palabra original.


PROGRAM Problemas2 IMPLICIT NONE CHARACTER (LEN=50) :: nombre INTEGER :: long,i=0 PRINT*, "DAME UN NOMBRE" READ*, nombre DO i=i+1 IF (nombre(i:i) == " ") EXIT END DO PRINT*, "LA PALABRA TIENE",i-1," CARACTERES" long=i-1 CALL invertir(nombre,long) PRINT*, "LA PALABRA INVERTIDA ES ",nombre END PROGRAM Problema2 SUBROUTINE invertir(nombre,long) IMPLICIT NONE INTEGER, INTENT(IN) :: long CHARACTER (LEN=long), INTENT(IN OUT) :: nombre CHARACTER (LEN=1) :: aux INTEGER :: cen,i,j j=long cen=long/2 DO i=1,cen aux=nombre(i:i) nombre(i:i)=nombre(j:j) nombre(j:j)=aux j=j-1 PRINT*, "NOMBRE ",nombre END DO END SUBROUTINE invertir

3.- Leer una slaba y una palabra y escribir en qu posicin de la palabra est la slaba si es que est,

empezando por la izquierda.


PROGRAM Probelema3 IMPLICIT NONE CHARACTER (LEN=6) :: sil=" " CHARACTER (LEN=30) :: pal=" " PRINT*, "PALABRA" READ*, pal PRINT*,"SILABA" READ*, sil PRINT*,INDEX(pal,TRIM(sil)) END PROGRAM Problema3

4.- Buscar un nombre en un array de cuatro nombres


PROGRAM Problema4 IMPLICIT NONE CHARACTER (LEN=15), DIMENSION(4) ::nom=(/'PEPE GOTERA','ROMPETECHOS','MORTADELO ','FILEMON '/) CHARACTER (LEN=15):: busca INTEGER :: switch,i=0,ipos

Ing. William Chauca Nolasco

LP_2012

WIWI&DATA-INGS

PRINT*,"DAME UN NOMBRE" READ*, busca !Los datos a buscar en mayusculas switch=0 DO i=i+1 IF (nom(i) == busca) THEN switch=1 ipos=i PRINT*,"EL NOMBRE SE ENCUENTRA EN LA POSICION ",ipos END IF IF (i == 4 .OR. switch == 1) EXIT END DO IF (switch == 0) THEN PRINT*,"EL NOMBRE NO ESTA EN LA LISTA" END IF END PROGRAM Problema4

5.- Inicializar los cdigos y los nombres de diez provincias en dos vectores carcter. A continuacin, se pide al usuario un cdigo por teclado y el programa debe mostrar el nombre de la provincia correspondiente. Si no existe el cdigo ledo, mostrar un mensaje que avise de ello. El programa se ejecuta mientras el usuario lo desee.
PROGRAM Problemas5 IMPLICIT NONE INTEGER:: i CHARACTER (LEN=1) :: resp CHARACTER(LEN=2):: cod CHARACTER (LEN=2), DIMENSION(10) ::tcod=(/'A ','IC ','MO','T ','LI','AR ','LL','TU','PI','CA'/) CHARACTER (LEN=12),DIMENSION(10) :: tnom=(/'ANCASH ','ICA ','MOQUEGUA','TACNA ', 'LIMA', & & 'AREQUIPA','LA LIBERTAD','TUMBES ','PIURA ', 'CAJAMARCA'/) DO PRINT*,"DAME UN CODIGO DE PROVINCIA" READ*, cod ! ***BUSQUEDA EN EL ARRAY i=0 DO i=i+1 IF (cod == tcod(i) .OR. i == 10) EXIT END DO IF (cod /= tcod(i)) THEN PRINT*, "ERROR. NO EXISTE ESE CODIGO" ELSE PRINT*, "LA PROVINCIA ES ",tnom(i) END IF PRINT*, "CONTINUAR(S/N)?" READ*,resp IF (resp /= "S" .AND. resp /= "s") EXIT END DO END PROGRAM Problema5

6.- Ordenar ascendentemente los nombres de tres personas que se introducen por teclado. Utilizar el mtodo de la burbuja.
PROGRAM Problema6 IMPLICIT NONE INTEGER, PARAMETER::N=3 CHARACTER (LEN=20), DIMENSION(N) :: nom INTEGER:: i CALL leer(nom,N) CALL ordenar(nom,N) PRINT*, "LA LISTA ORDENADA ASCENDENTEMENTE ES" PRINT*,(nom(i),i=1,N) END PROGRAM Problema6 SUBROUTINE ordenar(x,n) !Segunda subrutina IMPLICIT NONE INTEGER, INTENT(IN):: n CHARACTER (LEN=*), DIMENSION(n), INTENT(IN OUT) :: x CHARACTER (LEN=20)::aux INTEGER:: i,j DO i=n-1,1,-1 DO j=1,i SUBROUTINE leer(x,tam) !Primera subrutina IMPLICIT NONE INTEGER, INTENT(IN):: tam CHARACTER (LEN=20), DIMENSION(tam), INTENT(OUT) :: x INTEGER:: i DO i=1,tam PRINT*,"DAME NOMBRE ENTRE APOSTROFES",i READ*,x(i) END DO RETURN END SUBROUTINE leer

Ing. William Chauca Nolasco


IF (LGT(x(j),x(j+1))) THEN aux=x(j) x(j)=x(j+1) x(j+1)=aux END IF END DO END DO RETURN END SUBROUTINE ordenar

LP_2012

WIWI&DATA-INGS

PROBLEMAS PROPUESTOS 1.- Hacer un programa que lea dos palabras y las muestre ordenadas alfabticamente. (No usar ningn mtodo de ordenamiento) 2.- Programa que pida una frase y cuente el nmero de palabras. 3.- Programa que lea una frase y cuente el nmero de vocales de cada palabra mostrando la de mayor nmero por pantalla. Usa una subrutina para leer la frase y otra para determinar la palabra que contiene ms vocales. 4.- Programa que lea una palabra aguda y diga si requiere tilde o no segn las reglas de acentuacin. El programa se ejecuta hasta que el usuario introduzca la palabra FIN. Usa programacin modular para la construccin del programa. 5.- Programa que lea una palabra y el idioma en que est escrita (ingls/castellano) y muestre su traduccin (castellano/ingls). Suponer que el diccionario est formado por las palabras siguientes: Computador, ratn, pantalla, teclado, programa, ejecutar. Computer, mouse, screen, keyboard, program, execute. Usa programacin modular para la construccin del programa.
6.- Despus de transcribir, compilar y ejecutar el programa (modificar si es necesario), escriba el enunciado que correspondera al programa
PROGRAM LongitudCadena IMPLICIT NONE CHARACTER (LEN=50) :: cad PRINT*, "Escribe algn texto" READ*, cad PRINT*, "La cadena puede almacenar un mximo de ",LEN(cad)," caracteres" PRINT*, "Has escrito ",LEN_TRIM(cad)," caracteres" PRINT*, "Has escrito ",LEN(TRIM(cad))," caracteres" END

7.- Despus de transcribir, compilar y ejecutar el programa (modificar si es necesario), escriba el enunciado que correspondera al programa
PROGRAM Caracter IMPLICIT NONE CHARACTER :: car PRINT*, "Teclea un carcter: " READ*, car PRINT*, "El cdigo ASCII de ",car," es ",IACHAR(car) END PROGRAM Caracter

8.- Despus de transcribir, compilar y ejecutar el programa (modificar si es necesario), escriba el enunciado que correspondera al programa
PROGRAM EliminaB1 IMPLICIT NONE CHARACTER(LEN=100) :: cad INTEGER :: pos

Ing. William Chauca Nolasco

LP_2012

WIWI&DATA-INGS

! Leemos la cadena de entrada PRINT*,"Dime la cadena" READ*,cad pos=1 ! Damos un valor para obligar a entrar la primera vez al bucle DO WHILE (pos/=0) pos=INDEX(cad,'b') ! Posicin de la letra 'b' IF (pos==0) pos=INDEX(cad,'B') ! Si no hay 'b' buscamos la 'B' ! Si hay 'b' o 'B' la eliminamos de cad IF (pos/=0) cad=cad(:pos-1)//cad(pos+1:) ENDDO ! Escribimos el resultado PRINT*,"La cadena resultante es: ",cad END PROGRAM

9.- Despus de transcribir, compilar y ejecutar el programa (modificar si es necesario), escriba el enunciado que correspondera al programa
PROGRAM Conversion IMPLICIT NONE CHARACTER(LEN=100) :: cad INTEGER :: i PRINT*, "Dime una cadena de caracteres" READ*, cad DO i=1, LEN_TRIM(cad) IF (cad(i:i)>='a' .AND. cad(i:i)<='z') THEN cad(i:i) = ACHAR(IACHAR(cad(i:i))-32) ELSE IF (cad(i:i)=='') THEN cad(i:i) = '' ELSE IF (cad(i:i)=='') THEN cad(i:i) = '' ELSE IF (cad(i:i)=='') THEN cad(i:i) = '' ELSE IF (cad(i:i)=='') THEN cad(i:i) = '' ELSE IF (cad(i:i)=='') THEN cad(i:i) = '' ELSE IF (cad(i:i)=='') THEN cad(i:i) = '' ELSE IF (cad(i:i)=='') THEN cad(i:i) = '' ENDIF ENDDO PRINT*, "La cadena en maysculas es: ", TRIM(cad) END

10.- Despus de transcribir, compilar y ejecutar el programa (modificar si es necesario), escriba el enunciado que correspondera al programa, adems debe analizar lnea por lnea las sentencias del programa (obligatorio)
CHARACTER (70) Line REAL, PARAMETER :: Pi = 3.1415927 REAL:: dx, X INTEGER::N,Trips dx = Pi/20.0 Trips = INT(2.0*Pi/dx + dx/2.0 ) + 1.0 X=0 PRINT "(' X', T37, 'SIN(X)')" !Titulo PRINT* DO I = 1, Trips WRITE( line, '(F4.2)' ) X ! Line es una archivo interno N = NINT( 25 * (1 + SIN(X)) ) + 15 Line(40:40) = ':' Line(N:N) = '*' PRINT 10, Line

Ing. William Chauca Nolasco


X = X + dx END DO 10 FORMAT( A70 ) END

LP_2012

WIWI&DATA-INGS

11.- Despus de transcribir, compilar y ejecutar el programa (modificar si es necesario), escriba el enunciado que correspondera al programa
CHARACTER(80) Line INTEGER :: Blanks = 0 INTEGER I PRINT*,"INGRESE TEXTO CONTENIeNDO ESPACIOS EN BLANCOS" READ*, Line ! use quotes if text contains blanks DO I = 1, LEN_TRIM( Line ) IF (Line(I:I) == " ") Blanks = Blanks + 1 END DO PRINT*,Blanks END

12.- Despus de transcribir, compilar y ejecutar el programa (modificar si es necesario), escriba el enunciado que correspondera al programa
INTEGER:: I, PosStop CHARACTER(LEN=80):: Sentence READ*,Sentence ! enclose in quotes if blanks in text PRINT*, Sentence PosStop = INDEX(Sentence, "." ) PRINT*, PosStop DO I = PosStop-1, 1, -1 WRITE (*, "(A1)", ADVANCE = "NO") Sentence( I:I ) END DO END

13.- Despus de transcribir, compilar y ejecutar el programa (modificar si es necesario), escriba el enunciado que correspondera al programa
PROGRAM Zeller CHARACTER (9), DIMENSION(0:6) :: DayOfWeek = & (/ "Sunday ", "Monday ", "Tuesday ", & "Wednesday", "Thursday ", "Friday ", "Saturday " /) INTEGER::Centy, Day, Month, Year, F PRINT*, "Enter day, month, year:" READ*, Day, Month, Year Month = Month - 2 IF (Month <= 0) Month = Month + 12 IF (Month >= 11) Year = Year - 1 Centy = Year / 100 Year = MOD( Year, 100 ) ! year in century now F = INT(2.6 * Month - 0.2) + Day + Year + Year / 4 & & + Centy / 4 - 2 * Centy F = MOD( F, 7 ) PRINT*, DayOfWeek(F) END

14.- Despus de transcribir, compilar y ejecutar el programa (modificar si es necesario), escriba el enunciado que correspondera al programa PROGRAM BinToDec CHARACTER(LEN=80)::StrBin ! maximum length is 80 INTEGER, ALLOCATABLE :: Bin(:) INTEGER Dec, I, N PRINT*,"INGRESE UN NUMERO EN BINARIO" READ*, StrBin N = LEN_TRIM( StrBin ) ! number of binary digits

Ing. William Chauca Nolasco

LP_2012

WIWI&DATA-INGS

ALLOCATE( Bin(N) ) READ(StrBin, "(80I1)") Bin ! reads first N digits Dec = 0 DO I = 1, N Dec = Dec + Bin(I) * 2 ** (N-I) END DO PRINT*, Dec END 15.- Despus de transcribir, compilar y ejecutar el programa (modificar si es necesario), escriba el enunciado que correspondera al programa program caracteres implicit none integer i, num, num1,symbol character*30 line character titulo*80 titulo="CANAL DE SECCION RECTANGULAR" print "(t26,a)", titulo print* num=20 num1=10 symbol=219 !la parte superior del canal, caracteres horizontales do i=1,num1 line(i:i)=achar(symbol) end do print 101, line, line 101 format(t21,a,t49,a) !caracteres verticales do i=1,num1 print 10, achar(symbol),achar(symbol) 10 format(t30,a,t49,a) end do !caracteres en la parte inferior do i=1,num line(i:i)=achar(symbol) end do print 200, line 200 format(t30,a) end program caracteres

16.-Teniendo en cuenta el programa numero 15, realice un programa que muestre un canal de seccin triangular. 17.-Teniendo en cuenta el programa numero 15, realice un programa que muestre un canal de seccin Trapezoidal

Ing. William Chauca Nolasco

LP_2012

WIWI&DATA-INGS

Informacin terica

Datos carcter La longitud de una constante carcter puede ser de 0 a 2000. Pueden usarse como delimitadores un apstrofo (') o comillas (").
PRINT "(' ', I3, ' isn''t', I3)", i,j
Se

permiten asignaciones del tipo

res(3:5) = res(1:3) ! solapamiento res(3:3) = res(3:2) ! no asignacin de una subcadena nula

Funciones intrnsecas de caracteres CHAR(I,[kind]) Carcter en la posicin I en la secuencia del procesador. ICHAR(C) Posicin que ocupa el carcter C en la secuencia del procesador. INDEX(STR,SUB_STR,[back]) Posicin de comienzo de SUB_STR en STR. LGE, LGT, LLE, LLT(STR_A,STR_B) Comparaciones lexicograficas. Nuevas: ACHAR(I) Carcter en la posicin I en la secuencia ASCII IACHAR(C) Posicin que ocupa el carcter C en la secuencia ASCII. ADJUSTL(STR) Ajusta a la izquierda moviendo los blancos iniciales al final. ADJUSTR(STR) Ajusta a la derecha moviendo los blancos finales al principio. LEN_TRIM(STR) Longitud de STR sin los blancos finales. REPEAT(STR,N) Concatena STR consigo mismo N veces SCAN(STR,SET,[BACK]) Posicin del primer carcter por la izquierda de STR que est en SET. 0 si ninguno est. TRIM(STR) Subcadena inicial obtenida al suprimir los blancos finales. VERIFY(STR,SET,[BACK]) Posicin del primer carcter por la izquierda de STR que no est en SET. 0 si estn todos. ACHAR coincide con CHAR

You might also like