0% encontró este documento útil (0 votos)
145 vistas16 páginas

Caracteres y Cadenas en Fortran 90/95

Este documento describe el uso de caracteres y cadenas en Fortran. Explica cómo declarar variables y constantes de caracteres, así como arrays de caracteres. También describe operadores y funciones para manipular cadenas como la concatenación, comparación, asignación y funciones intrínsecas como LEN, TRIM e INDEX.

Cargado por

Gonzalo Sanzoon
Derechos de autor
© Attribution Non-Commercial (BY-NC)
Nos tomamos en serio los derechos de los contenidos. Si sospechas que se trata de tu contenido, reclámalo aquí.
Formatos disponibles
Descarga como PDF, TXT o lee en línea desde Scribd
0% encontró este documento útil (0 votos)
145 vistas16 páginas

Caracteres y Cadenas en Fortran 90/95

Este documento describe el uso de caracteres y cadenas en Fortran. Explica cómo declarar variables y constantes de caracteres, así como arrays de caracteres. También describe operadores y funciones para manipular cadenas como la concatenación, comparación, asignación y funciones intrínsecas como LEN, TRIM e INDEX.

Cargado por

Gonzalo Sanzoon
Derechos de autor
© Attribution Non-Commercial (BY-NC)
Nos tomamos en serio los derechos de los contenidos. Si sospechas que se trata de tu contenido, reclámalo aquí.
Formatos disponibles
Descarga como PDF, TXT o lee en línea desde Scribd

6 CARACTERES Y CADENAS 6.

1 Caracteres y cadenas

En el captulo 1 se indic cmo tratar con variables y constantes carcter en Fortran 90/95. Recordar que la declaracin de este tipo de variables, como ocurre con cualquier otro, puede incluir una inicializacin de las mismas. Por otro lado, las constantes carcter pueden tener nombres simblicos si se aade el atributo PARAMETER en su sentencia de declaracin y deben encerrarse entre comillas dobles o simples. Posteriormente, en el captulo 4 se estudi que la forma de declarar un array es idntica para cualquier tipo de datos. Ejemplo. Escribir sentencias de declaracin de diferentes datos carcter.

CHARACTER (len=15):: apellido ! declara variable carcter CHARACTER:: seguir=S ! declara e inicializa var carcter CHARACTER (len=10), PARAMETER:: archivo=entrada ! declara nombre simblico para constante carcter CHARACTER (len=25), DIMENSION(50)::alumnos ! declara array de 50 ! elementos cada uno de los cuales puede ser un conjunto de 25 !caracteres como mximo

Una cadena de caracteres o simplemente cadena es una sucesin explcita de caracteres. Una subcadena de caracteres o simplemente subcadena es una porcin contigua de caracteres de una cadena. Para referenciar una subcadena de una cadena, la sintaxis general es. nombre es el nombre de una variable o elemento de array carcter. pos_inicial es una expresin numrica que especifica la posicin inicial (ms a la izquierda) del primer carcter de la subcadena. Si no se especifica, se toma como valor por defecto la posicin del primer carcter. pos_final es una expresin numrica que especifica la posicin final (ms a la derecha) del ltimo carcter de la subcadena. Si no se especifica, se toma como valor por defecto la longitud de nombre. Los valores de pos_inicial y pos_final deben cumplir la condicin: Ejemplo. Sea la declaracin:

nombre ( [pos_inicial]: [pos_final] )


1 pos_inicial pos_final longitud_nombre

CHARACTER (len=10):: nombre=Susana

139

Caracteres y cadenas

nombre(2:4) nombre(:)

hace referencia a usa hace referencia a Susana____ 7

6.2 Expresin carcter

Los operadores disponibles en Fortran 90/95 para operar con cadenas son:

el operador de concatenacin // para concatenar cadenas. La sintaxis general de una expresin carcter que emplea este operador para concatenar variables carcter es: Ejemplo. Sea la declaracin:

var1_caracter // var2_caracter

CHARACTER (len=10):: c1,c2 c1 = aero c2 = plano WRITE(*,*) c1//c2 !se escribe por pantalla aeroplano_

los operadores relacionales (ver Tabla 2.1) para comparar cadenas. Sin embargo, su uso est desaconsejado pues el resultado de la comparacin puede variar de computador a computador. En su lugar, se aconseja comparar cadenas utilizando las funciones intrnsecas lxicas cuyos resultados son independientes del procesador. Estas funciones se estudian en la seccin 6.4. Ejemplo. Sean las declaraciones:

CHARACTER (len=15):: apellido1,apellido2 apellido1 < apellido2 !Expresin carcter que compara las 2 variables

6.3 Asignacin carcter

Una sentencia de asignacin carcter asigna el valor de una expresin carcter a una variable o elemento de array del mismo tipo. La sintaxis general es: El funcionamiento es:

variable_carcter = expresin_carcter

Se evala la expresin carcter.

Cada gu in b ajo r epr esen ta un b lanco.

140

C a r a c t ere s y c ad en as

Se asigna el valor obtenido a la variable carcter. Si la longitud de la variable es mayor que la de la expresin, el valor de la expresin se ajusta a la izquierda de la variable y se aaden blancos hasta completar la longitud total de la variable. Si la longitud de la variable es menor que la de la expresin, el valor de la expresin es truncado.

Ejemplo. Sea la declaracin:

CHARACTER (len=10):: c1,c2,c3 c1 = aero c2 = plano c3=c1//c2 WRITE(*,*) c3 !se escribe por pantalla aeroplano_ c3=demasiado largo WRITE(*,*) c3 !se escribe por pantalla demasiado_

6.4 Funciones intrnsecas carcter

A continuacin, se definen algunas funciones intrnsecas tiles para manipular caracteres: IACHAR, ACHAR, LEN, LEN_TRIM TRIM, INDEX.

IACHAR(caracter) convierte el carcter de entrada en un nmero que corresponde a su posicin en el cdigo ASCII. ACHAR(numero) es la funcin inversa de IACHAR, pues convierte el nmero de entrada en un carcter segn su posicin en el cdigo ASCII. LEN(cadena) devuelve la longitud declarada para la variable carcter. LEN_TRIM(cadena) devuelve un nmero entero que corresponde a la longitud de la cadena eliminando los blancos. TRIM(cadena) devuelve la cadena eliminado los blancos. INDEX(cadena1,subcadena2[,.TRUE.]) devuelve la primera coincidencia del patrn subcadena2 en la cadena1. Si el tercer argumento no est, la bsqueda se realiza de izquierda a derecha. Si el tercer argumento est presente, la bsqueda se realiza de derecha a izquierda. Si no se encuentra coincidencia devuelve un 0.

Ejemplo.

CHARACTER (len=10)::pal1=raton WRITE(*,*) IACHAR(A),IACHAR(Z),IACHAR(a),IACHAR(z) !se escribe por pantalla 65,90,97,122 141

Caracteres y cadenas

WRITE(*,*) ACHAR(65),ACHAR(90),ACHAR(97),ACHAR(122) !se escribe por pantalla A,Z,a,z WRITE(*,*) LEN(pal1),LEN_TRIM(pal1) !se escribe por pantalla 10 5 WRITE(*,*) pal1,TRIM(pal1) !se escribe por pantalla raton_____raton WRITE(*,*) INDEX(pal1,a) !se escribe por pantalla 2

Las funciones intrnsecas lxicas permiten comparar cadenas y son las siguientes: LLT (Lexically Less Than), LLE (Lexically Less or Equal than), LGT (Lexically Great Than) y LGE (Lexically Great or Equal than). Estas funciones son equivalentes a los operadores relaciones <, <=, > y >=, respectivamente. Ahora bien, mientras las funciones lxicas utilizan siempre el cdigo ASCII como base para realizar las comparaciones, los operadores relacionales pueden utilizar este cdigo o cualquier otro, segn el computador. La comparacin entre cadenas se realiza de la siguiente manera:

Se comparan las dos cadenas carcter a carcter, comenzando por el primer carcter (el que se encuentra ms a la izquierda) y continuando hasta que se encuentra un carcter distinto o hasta que finaliza la cadena. Si se encuentran caracteres distintos, el operando que contiene el carcter menor 8, ser considerado el operando menor. Por tanto, el orden de los operandos viene marcado por el primer carcter que difiere entre ambos operandos. Si se alcanza el final de uno de los operandos y no hay caracteres distintos, la ordenacin de las cadenas se har en funcin de sus longitudes. As, si ambas cadenas tienen la misma longitud, las cadenas son iguales, mientras que si las cadenas tienen longitudes diferentes, la comparacin contina como si la cadena ms corta estuviera rellena de blancos hasta la longitud de la cadena ms larga.

Ejemplo. Sean las declaraciones:

CHARACTER (len=15):: pal1,pal2

Un car cter es me nor qu e o tro si la po sicin qu e o cupa el p r imero en el cd igo ASCI I es menor qu e la qu e o cupa el segundo .

142

C a r a c t ere s y c ad en as

LOGICAL:: result1,result2 pal1=Begoa pal2=Paula result1=pal1<pal2 result2=LLT(pal1,pal2) El valor de result1 puede variar de procesador a procesador, pero el valor de result2 es siempre .TRUE. en cualquier procesador.

143

EJERCICIOS RESUELTOS

Objetivos:

Aprender a usar variables y arrays carcter en Fortran y a transferirlos a procedimientos externos. Manejar las funciones intrnsecas ms importantes relacionadas con este tipo de variables.

145

Caracteres y cadenas

1. Pedir el nombre y apellido de una persona. Hallar la longitud de la cadena nombre. Guardar el nombre completo en una nica variable y decir cuantas aes tiene.

PROGRA M c ap 6_1 IM PL IC IT NON E CHARAC TER (LEN= 10) :: nom, apel CHARAC TER (LEN= 20) :: nomc INTEGER :: long1,long2= 0,i,conta=0

W R IT E( * ,* ) ' D A M E TU N O MBR E' R EAD( *,*) nom

lo ng 1= le n_ tr im( no m) WR IT E( * ,* ) ' no m,' t ien e ' ,lo ng 1 ,c ar acte res ! otr o mo do de ca lc ula r la longit ud de u na ca den a DO i= 1,LEN( nom) I F (no m( i: i) /= ' ') TH EN long2= lo ng2+1 E N D IF END DO WR IT E( * ,* )' no m,' t iene ' ,lon g2 ,c ar acte re s !............................................. W R IT E( * ,* ) ' D A M E TU A P EL L ID O ' R EA D ( * ,*) a pe l

n o mc= TR IM (n om) //' '//a pe l W R IT E( * ,* ) ' TU N O MBR E C O MPLET O E S ' , no m c

DO i= 1,LEN_TR IM( nomc) I F ( n o m c ( i: i)= = ' A ' .O R . n o mc ( i : i) = = ' a ' ) T H EN c ont a=co nta+ 1 E N D IF END DO WR ITE( *,*) ' LA CANTIDAD D E A EN ' ,nomc,' ES' ,conta

E ND PROGRA M ca p6_ 1

146

Caracteres y cadenas

El operador de concatenacin // permite concatenar el nombre y apellido en una expresin carcter y asignar el resultado a la variable nomc. Repasar en la seccin 6.1 la forma de referenciar una subcadena de una cadena. En este ejercicio, para extraer de una en una las letras de la variable nomc, se escribe nomc(i:i), con la posicin inicial igual a la posicin final, dentro de un bucle, en el que el ndice i toma los valores desde 1 hasta la longitud de la cadena nombre.
2. Escribir por pantalla la tabla de caracteres ASCII usando la funcin intrnseca IACHAR.

PROGRA M c ap 6_2 IM PL IC IT NON E CHARAC TER (LEN= 27) :: abc='ABCD EFGH IJK LMNOPQR STUVW XYZ' ,& a bc m= ' abcd efg h i jk l mn o pq rst uvw x yz ' INTEGER:: i W R IT E( * ,* ) ' N A SC I I DO i= 1 ,27 WR ITE( *,100) IACHAR( abc( i: i)) ,abc( i: i) ,IACHAR( abcm( i:i)) ,abcm( i:i) PAUSE END DO 1 00 FOR MA T ( 2 X , I4 ,8X , A 2 ,8 X , I 4 , 6 X ,A 2 ) E ND PROGRA M ca p6_ 2 LETRA N A SC I I LETRA'

La sentencia PAUSE suspende temporalmente la ejecucin del programa. La sentencia FORMAT permite mostrar con formatos especficos la lista de variables dada de forma que stas quedan en columnas bien alineadas. Esta sentencia se explica en detalle en el captulo 7. Qu nmeros corresponden a las letras y ? Qu relacin existe entre el nmero asociado a una letra minscula y su correspondiente mayscula?
3. Pasar a minsculas 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.

PROGRA M c ap 6_3 IM PL IC IT NON E

147

Caracteres y cadenas
CHARAC TER (LEN= 20) :: nom=' ' ,nom_ma yu s I N T E GER : : nu m ,n u m_ m a yu s , i WR ITE( *,*) 'DA M E UN NOMBR E EN MA YU SCU LAS' R EA D ( * ,*) n o m_ ma yu s W R IT E( * ,* ) ' E L N OMBR E T EC LEA D O E S ' ,n o m_ ma yu s D O i= 1 ,L EN _ TR IM( no m _ ma yu s ) num_ma yus=IACHAR( nom_ma yu s( i: i)) I F ( nu m_ m a yu s > = 6 5 .A N D .nu m _ ma yu s < = 9 0) THE N n u m= nu m _ ma yu s + 3 2 nom( i:i)=ACHAR(num) ELSE nom( i: i ) = ACHAR( n u m_ma yus ) E N D IF END DO WR ITE( *,*) ' EL NOMBR E EN MINU SCULA S ES ' ,nom E ND PROGRA M ca p6_ 3

Para saber si cada letra del nombre es mayscula, se obtiene su nmero asociado y se testea si pertenece al intervalo [65-90] (se prescinde de la ). En caso afirmativo, se suma 32 al nmero, se reconvierte a letra y se coloca en la posicin adecuada de la variable declarada para almacenar el nombre en minsculas.
4. 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.

PROGRA M c ap 6_4 IM PL IC IT NON E CHARAC TER (LEN= 20) :: nom,nom_ma yus= ' ' I N T E GER : : nu m ,n u m_ m a yu s , i WR ITE( *,*) 'DA M E UN NOMBR E EN MINU SCU LAS' R EAD( *,*) nom W R IT E( * ,* ) ' E L N OMBR E T EC LEA D O E S ' ,n o m DO i= 1,LEN_TR IM( nom) num= IACHAR( nom( i: i)) IF (nu m >= 9 7 .AND . n u m <= 12 2) TH EN num_ma yus= num-32 nom_ma yus( i: i)=ACHAR( num_ma yu s) ELSE

148

Caracteres y cadenas
nom_ma yus( i: i)=ACHAR( num) E N D IF END DO WR ITE( *,*) ' EL NOMBR E EN MAYU SCULAS ES ' ,nom_ma yu s E ND PROGRA M ca p6_ 4

Se usa el mismo procedimiento que en el ejercicio anterior. Para pasar a maysculas una letra minscula basta restar 32 al nmero correspondiente segn la tabla ASCII. Qu ocurre si restamos un valor constante distinto de 32 a cada nmero? puede servir este mtodo para encriptar mensajes?
5. Invertir una palabra usando una subrutina. La palabra invertida debe almacenarse en la misma variable usada para la palabra original.

PROGRA M c ap 6_5 IM PL IC IT NON E CHARAC TER (LEN= 50) :: nombre INTEGER :: long,i= 0 WR ITE( *,*) 'DA M E UN NOMBR E' R EA D ( * ,*) n o mb re

DO i = i+1 IF (nombre(i: i) == ' ') EXIT END DO WR ITE( *,*) ' LA PALABRA TIENE' ,i- 1 ,' CARAC TER ES' long= i-1 CA LL in ve r t ir( no mbre ,lon g) WR ITE( *,*) ' LA PALABRA IN VERTID A ES ' ,nombre E ND PROGRA M ca p6_ 5

SUBROU T IN E inve rt ir(nombre,long) IM PL IC IT NON E I N T E G ER , I N T EN T ( IN ) : : l o n g CHARAC TER (LEN= long) , INTENT( IN OUT) :: nombre CHARAC TER (LEN= 1) :: aux INTEGER : : cen , i , j

149

Caracteres y cadenas
j= lo ng c en= l on g /2 DO i= 1 ,cen a ux= no mb re (i: i) n o mb re( i: i)= no m bre ( j : j) n o mb re( j: j)= aux j = j-1 W R IT E( * ,* ) ' N O MB R E ' , no mb re END DO END SUBROU T IN E inve rt ir

El algoritmo usado para la inversin consiste en localizar la posicin central de la palabra e intercambiar las posiciones de las letras ltima y primera, penltima y segunda y as sucesivamente hasta llegar a la posicin central de la palabra. El bucle DO del programa principal permite calcular la longitud de la palabra a invertir. La funcin intrnseca LEN_TRIM (cadena) realiza la misma tarea. Al llamar a la subrutina, se transfiere la direccin de memoria del primer carcter de la variable nombre.
6. 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.

PROGRA M c ap 6_6 IM PL IC IT NON E CHARAC TER (LEN= 6) :: sil=' ' CHARAC TER (LEN= 30) :: pal=' ' WR ITE( *,*) ' PA LABRA' R EAD( *,*) pal WR ITE( *,*) ' SILABA' R EAD( *,*) sil W RIT E( * ,*) I NDE X(p al,T RI M ( si l ) ) E ND PROGRA M ca p6_ 6

7. Buscar un nombre en un array de cuatro nombres.

PROGRA M c ap 6_7 IM PL IC IT NON E

150

Caracteres y cadenas
CHARAC TER (LEN= 15), D IMENSION( 4) :: & n o m= ( /' P EP E G O T ER A ' , ' R O M P ET ECH O S ' ,'M ORTAD EL O ' ,' F IL EM ON CHARAC TER (LEN= 15):: busca INTEGER : : sw itch , i= 0, i p o s ' /)

WR ITE( *,*) 'DA M E UN NOMBR E' R EA D ( * ,*) b us ca sw itch=0 DO i = i+1 IF (nom(i) == busca) THEN sw itch=1 ipos= i WR ITE(*,*) ' EL NOMBRE SE ENCU ENTRA EN LA PO SIC ION ',ip os E N D IF IF (i == 4 .OR. sw itch == 1) EXIT END DO IF (sw itch == 0) TH EN WR IT E( * ,* ) ' EL N OMBR E NO ESTA EN LA L ISTA' E N D IF E ND PROGRA M ca p6_ 7

En este programa nom es el identificador de un array de 4 componentes, cada una de las cuales es un nombre de 15 caracteres como mximo. Todos los elementos deben tener la misma longitud. El algoritmo usado en este ejercicio es el mismo que el del programa cap4_3 para buscar un nmero en un vector de nmeros. Al igual que all, la variable switch funciona de interruptor, de modo que el programa acta segn su contenido.
8. 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.

PROGRA M c ap 6_8 IM PL IC IT NON E INTEGER:: i CHARAC TER (LEN= 1) :: resp

151

Caracteres y cadenas
CHARAC TER(LEN= 2):: cod CHARAC TER (LEN= 2) , D IMEN SION( 10) : : & t cod= ( /'A ','A L' ,'A V' ,'B ' ,'BA' ,'C ' ,'CA' ,'CC','C O' ,'C S' /) CHARAC TER (LEN= 9) ,D IMEN SION( 10) : : & t nom=( /'ALICA NTE ','A LMER IA '& ,'C ORUA ' ,'CAD IZ ' ,'A VILA ' ,'BARC ELONA' , 'BADA JOZ

' ,'CACERES ' ,'CORDOBA ' , 'CA STELLON ' /)

DO WR ITE( *,*) 'DAME UN COD IGO D E PROVINC IA' R EAD( *,*) cod ! ***BU SQU EDA EN EL ARRA Y i=0 DO i = i+1 I F (co d == t cod ( i) .OR . i == 1 0) E X I T END DO IF (cod /= tcod( i)) TH EN W R IT E(* , * ) ' ER R OR. NO EXISTE ESE CODIGO' ELSE WR IT E(* , *) ' LA PRO V INC IA ES ' ,t no m( i) E N D IF WR ITE( *,*) 'CON TINUAR( S/N) ?' R EAD( *,*) res p IF (re sp /= ' S' .AND . r es p /= 's ') EXIT END DO E ND PROGRA M ca p6_ 8

9. Ordenar ascendentemente los nombres de tres personas que se introducen por teclado. Utilizar el mtodo de la burbuja.

PROGRA M c ap 6_9 IM PL IC IT NON E INTEGER , PARAMETER::N= 3 CHARAC TER (LEN= 20), D IMENSION(N) :: nom INTEGER:: i CA LL le er(n o m,N) C A LL o rd en ar ( no m ,N ) WR ITE( *,*) ' LA LISTA ORD ENADA A SC ENDENTEMENTE ES' WR IT E( * ,* ) ( no m( i) , i=1 ,N )

152

Caracteres y cadenas
E ND PROGRA M ca p6_ 9

SUBROU T IN E leer( x ,tam) IM PL IC IT NON E INTEGER, I NT ENT ( IN) : : t am CHARAC TER (LEN= 20), D IMENSION(t a m), INTEN T(OU T) :: x INTEGER:: i DO i= 1,tam WR ITE( *,*) 'DAME NOMB R E E N T R E A PO S T R O F ES' , i R EAD( *,*) x ( i) END DO END SUBROU T IN E leer

SUBROU T IN E ordenar(x,n) IM PL IC IT NON E I N T E GER , I N T EN T( IN ) : : n CHARAC TER (LEN= *) , D IMEN SION( n) , IN TENT( IN OUT) :: x CHARAC TER (LEN= 20)::aux INTEGER:: i,j DO i= n - 1, 1,- 1 DO j= 1,i I F ( LG T( x( j) ,x( j+ 1))) TH EN aux=x(j) x(j)= x(j+1) x(j+ 1)=aux E N D IF END DO END DO END SUBROU T IN E ordenar

El mtodo de la burbuja ya se implement para ordenar nmeros en el captulo 4 (ver cap4_7). Cmo cambia el programa si se quiere realizar un ordenamiento descendente y el nmero de personas es siete?

153

Caracteres y cadenas

EJERCICIOS PROPUESTOS 1) Programa que codifica la frase 'EXAMEN DE INFORMATICA'. 2) Programa que descodifica la frase codificada en el ejercicio anterior. Utiliza una subrutina para codificar y descodificar la frase. 3) Programa que lea dos palabras y las muestre ordenadas alfabticamente. (No usar ningn mtodo de ordenamiento). 4) Programa que pida una frase y cuente el nmero de palabras. 5) Programa que lea una palabra y verifique si es un palndromo o no. Utilizar el programa cap6_5 para invertir la palabra. Usar una funcin lgica para determinar si la palabra dada es un palndromo o no. 6) 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. 7) 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. 8) 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, raton, pantalla, teclado, programa, ejecutar. Computer, mouse, screen, keyboard, program, execute. Usa programacin modular para la construccin del programa.

154

También podría gustarte