caracter cadenas

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 continuación se tiene los siguientes programas escritos en fortran, transcríbalo, compile y ejecute, explique detalladamente que realiza cada programa. 1.- Pasar a mayúsculas un nombre que se lee por teclado usando las funciones intrínsecas IACHAR y ACHAR. Suponer que el nombre leído puede tener mezcladas letras minúsculas y mayúsculas. 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 3.- Leer una sílaba y una palabra y escribir en qué posición de la palabra está la sílaba 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 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

Upload: miguel-chero-morales

Post on 22-Oct-2015

9 views

Category:

Documents


2 download

TRANSCRIPT

Page 1: Caracter Cadenas

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 continuación se tiene los siguientes programas escritos en fortran, transcríbalo, compile y ejecute, explique detalladamente que realiza cada programa.

1.- Pasar a mayúsculas un nombre que se lee por teclado usando las funciones intrínsecas IACHAR y

ACHAR. Suponer que el nombre leído puede tener mezcladas letras minúsculas y mayúsculas. 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

3.- Leer una sílaba y una palabra y escribir en qué posición de la palabra está la sílaba 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

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

Page 2: Caracter Cadenas

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 códigos y los nombres de diez provincias en dos vectores carácter. A continuación, se pide al usuario un código por teclado y el programa debe mostrar el nombre de la provincia correspondiente. Si no existe el código leído, 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

método 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

Page 3: Caracter Cadenas

Ing. William Chauca Nolasco LP_2012 WIWI&DATA-INGS

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

PROBLEMAS PROPUESTOS

1.- Hacer un programa que lea dos palabras y las muestre ordenadas alfabéticamente. (No usar ningún método de ordenamiento) 2.- Programa que pida una frase y cuente el número de palabras. 3.- Programa que lea una frase y cuente el número de vocales de cada palabra mostrando la de mayor número por pantalla. Usa una subrutina para leer la frase y otra para determinar la palabra que contiene más vocales. 4.- Programa que lea una palabra aguda y diga si requiere tilde o no según las reglas de acentuación. El programa se ejecuta hasta que el usuario introduzca la palabra FIN. Usa programación modular para la construcción del programa. 5.- Programa que lea una palabra y el idioma en que está escrita (inglés/castellano) y muestre su traducción (castellano/inglés). Suponer que el diccionario está formado por las palabras siguientes: Computador, ratón, pantalla, teclado, programa, ejecutar. Computer, mouse, screen, keyboard, program, execute. Usa programación modular para la construcción del programa.

6.- Después de transcribir, compilar y ejecutar el programa (modificar si es necesario), escriba el enunciado que correspondería al programa PROGRAM LongitudCadena IMPLICIT NONE CHARACTER (LEN=50) :: cad PRINT*, "Escribe algún texto" READ*, cad PRINT*, "La cadena puede almacenar un máximo de ",LEN(cad)," caracteres" PRINT*, "Has escrito ",LEN_TRIM(cad)," caracteres" PRINT*, "Has escrito ",LEN(TRIM(cad))," caracteres" END

7.- Después de transcribir, compilar y ejecutar el programa (modificar si es necesario), escriba el enunciado que correspondería al programa PROGRAM Caracter IMPLICIT NONE CHARACTER :: car PRINT*, "Teclea un carácter: " READ*, car PRINT*, "El código ASCII de ",car," es ",IACHAR(car) END PROGRAM Caracter

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

Page 4: Caracter Cadenas

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') ! Posición 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.- Después de transcribir, compilar y ejecutar el programa (modificar si es necesario), escriba el enunciado que correspondería 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 mayúsculas es: ", TRIM(cad) END

10.- Después de transcribir, compilar y ejecutar el programa (modificar si es necesario), escriba el enunciado que correspondería al programa, además debe analizar línea por línea 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

Page 5: Caracter Cadenas

Ing. William Chauca Nolasco LP_2012 WIWI&DATA-INGS

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

11.- Después de transcribir, compilar y ejecutar el programa (modificar si es necesario), escriba el enunciado que correspondería 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.- Después de transcribir, compilar y ejecutar el programa (modificar si es necesario), escriba el enunciado que correspondería 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.- Después de transcribir, compilar y ejecutar el programa (modificar si es necesario), escriba el enunciado que correspondería 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.- Después de transcribir, compilar y ejecutar el programa (modificar si es necesario), escriba el enunciado que correspondería 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

Page 6: Caracter Cadenas

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.- Después de transcribir, compilar y ejecutar el programa (modificar si es necesario), escriba el enunciado que correspondería 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 sección triangular.

17.-Teniendo en cuenta el programa numero 15, realice un programa que muestre un

canal de sección Trapezoidal

Page 7: Caracter Cadenas

Ing. William Chauca Nolasco LP_2012 WIWI&DATA-INGS

Información teórica

Datos carácter La longitud de una constante carácter puede ser de 0 a 2000.

Pueden usarse como delimitadores un apóstrofo (') 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 asignación de una subcadena nula

Funciones intrínsecas de caracteres

CHAR(I,[kind]) Carácter en la posición I en la secuencia del procesador.

ICHAR(C) Posición que ocupa el carácter C en la secuencia del procesador.

INDEX(STR,SUB_STR,[back]) Posición de comienzo de SUB_STR en STR.

LGE, LGT, LLE, LLT(STR_A,STR_B) Comparaciones lexicograficas.

Nuevas:

ACHAR(I) Carácter en la posición I en la secuencia ASCII

IACHAR(C) Posición que ocupa el carácter 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]) Posición del primer carácter 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]) Posición del primer carácter por la izquierda de STR que

no está en SET. 0 si están todos.

ACHAR coincide con CHAR