Está en la página 1de 8

Apuntes del Prof. Hugo A. Cuello Estructura de dato: Registro. Tratamiento de cadenas.

CLASE 6: Estructura de dato: Registro. Tratamiento de cadenas.

Estructuras de datos
El tipo registro
El tipo registro es una estructura de datos cuyas componentes se denominan campos, los cuales entre ellos pueden ser de diferentes tipos, por lo tanto, el tipo registro es una estructura heterognea. Podemos referirnos a todo el conjunto de datos bajo un solo nombre, esto es, la variable de tipo registro, adems podemos referirnos a solo una componente, usando la siguiente notacin: NombreRegistro.NombreCampo, en donde: NombreRegistro es una variable de tipo registro y NombreCampo es una de las componentes del registro. El tipo registro es una estructura de datos esttica, debido a que el compilador asignar una cantidad de byte en la memoria, del tamao de la longitud del registro, esto es la sumatoria de las longitudes de cada componente. Para definir un tipo registro se utiliza la palabra reservada record. Los campos del registro se definen dentro de su mbito, en la seccin type, por lo cual, los nombres de los campos sern de uso global, es decir, en cualquier lugar del programa, siempre nos referiremos a un campo con los mismos nombres definidos en la seccin type. No as con respecto al nombre del registro que podremos dar distintos nombres segn en el lugar del programa en que nos encontremos. La asignacin entre registros es vlida siempre y cuando sean del mismo tipo, si regA y regB son de tipo Reg, con campos cmp1, cmp2, ..., cmpn, entonces: regB ! regA, es vlida, y es lo mismo que hacer: regB.cmp1 ! regA.cmp1; regB.cmp2 ! regA.cmp2; ...; regB.cmpn ! regA.cmpn. Cada campo de un tipo registro podr ser de tipo simple o bien de tipo estructurado como es el tipo registro, en estos casos, los subcampos se definen bajo otro apartado record y la notacin ser, NomReg.NomCmp.NomSubCmp. El caso tpico es un campo fecha y los subcampos dia, mes y ao. Ejemplo: rAlumno.FecNac.aa, en donde: rAlumno es una variable de tipo RegAlu, FecNac es un campo de tipo Fecha y aa es un subcampo de tipo word. A continuacin se presenta una vista grfica de lo que podra ser un registro de una transaccin o novedad de una venta de un vendedor: rVendedor CodVen CantVen Word Word 2 b. 2 b.

CodArt 5 car. 6 b.

PreUni Real 6 b.

= 16 bytes

Pasaje de parmetros de tipo registro Las variables de tipo registro pueden ser pasadas como parmetros a los mdulos por valor o por referencia, tanto el registro completo como una de sus componentes simples o estructuradas. A continuacin se lista un programa que muestra el uso del tipo registro: Clase 6 AyE U.T.N. F.R.B.A. Pgina 1

Apuntes del Prof. Hugo A. Cuello Estructura de dato: Registro. Tratamiento de cadenas.

Program EjemploRegistro; Uses Crt; Type Str20 = string[20]; Fecha = record aa : word; mm, dd : byte end; RegAlu = record NroLeg : longint; ApeNom, Domic, Local : str20; FecNac : Fecha; EstCiv : char; Trabaja : boolean; NroDoc : longint end; procedure ProcAlum(var rAlu : RegAlu); begin writeln(rAlu.NroLeg); writeln(Ing. Apellido y nombre: ); readln(rAlu.ApeNom) end; procedure EmiteAlum(ApeN : str20); begin writeln(Apellido y Nombre: ,ApeN); delay(2000) end; var rAlumno, rAlumno2 : RegAlu; begin rAlumno.NroLeg := 123456; writeln(rAlumno.NroLeg); rAlumno.FecNac.mm := 5; rAlumno2 := rAlumno; if rAlumno.NroLeg = 123456 then ProcAlum(rAlumno) {Pasa todo el registro} Else EmiteAlum(rAlumno.ApeNom) {Pasa solo el campo ApeNom} Clase 6 AyE U.T.N. F.R.B.A. Pgina 2

Apuntes del Prof. Hugo A. Cuello Estructura de dato: Registro. Tratamiento de cadenas.

end.

Tratamiento de cadenas de caracteres


Una cadena es una disposicin o conjunto de caracteres o smbolos tomados de un alfabeto, que en el caso de las PC, ese alfabeto es el ASCII. Una computadora debe ser capaz no solo de procesar valores numricos, sino tambin de procesar datos no numricos, es en esta categora en donde entran las cadenas. El tratamiento de cadenas es bastante habitual, ms all de lo que podemos creer, p.e. al escribir un programa fuente en algn lenguaje de computadora, estamos utilizando cadenas, que posteriormente al compilarlo tomar esas cadenas para analizar si son palabras vlidas del lenguaje empleado. Por otro lado, un programa debe poder procesar frases o mensajes, como ser: Ingrese su nombre, Cmo est Ud. + Nom + ?, entre otras situaciones que se vern a continuacin. La cadena vaca es la cadena con longitud lgica = 0, y se la representa con dos apstrofos contiguos, p.e.: cad1 ! Un objeto variable se lo declara de tipo cadena por medio de la palabra reservada string que presenta dos formatos de uso: string o string[n], en el primer caso declara una variable con una longitud fsica de 256 bytes lo que permite almacenar hasta 255 caracteres y en el segundo caso declara una variable con una longitud fsica de n + 1 bytes lo que permite almacenar hasta n caracteres. El byte adicional est reservado para alamacenar el atributo de la longitud lgica de la cadena. Para el tratamiento de cadenas existen tres operaciones bsicas, a saber.

Longitud de la cadena Concatenacin de cadenas Sub-cadenas

Longitud de la cadena Toda cadena tiene una longitud finita de caracteres, determinar cul es la cantidad de caracteres que posee una cadena, es conocer su longitud lgica, por lo tanto la entrada es una cadena y su salida es un valor entero, que indica la cantidad de caracteres que contiene en un momento determinado del proceso, ese valor estar entre cero y el mximo permitido en su declaracin. La longitud lgica de una cadena es dinmica debido a que podr cambiar en tiempo de ejecucin. Por ejemplo, si cad1 ! super, para determinar la longitud lgica hacemos longitud(cad1), que responder con un valor entero de 5. Concatenacin de cadenas Es la operacin que permite unir dos o ms cadenas en una sola. La nueva cadena contendr cada una de las cadenas en el orden en que han sido unidas y su longitud lgica ser igual a la suma de c/u. de las longitudes lgicas de esas cadenas. As p.e. si cad1 ! super y cad2 ! man, cad ! concatenar(cad1,cad2) = cad1 + cad2 = superman cuya longitud lgica es de 8. La operacin de concatenacin generalmente, no es conmutativa, vale decir que, cad1 + cad2 <> cad2 + cad1, en cambio, si realizamos la siguiente operacin cad1 + = + cad1, notamos que genera la misma

Clase 6

AyE

U.T.N. F.R.B.A.

Pgina 3

Apuntes del Prof. Hugo A. Cuello Estructura de dato: Registro. Tratamiento de cadenas.

cadena resultado, o este otro ejemplo: aa + aaaaa = aaaaa + aa, produce la misma cadena resultado. Si el resultado de concatenar cadenas resulta una cadena con longitud mayor a lo esperado, en estos casos se trunca o corta la cadena hasta la longitud mxima aceptada, p.e. si cad est definida de tipo str7, realizar cad ! superman, truncar en superma. Sub-cadena Es la operacin que permite obtener una parte de una cadena, sin modificar la cadena original, en realidad se hace una copia. As p.e., podramos desarmar la operacin de la concatenacin. Para ello debemos saber que esta operacin requerir de las siguientes entradas: la cadena, el punto de inicio y la cantidad de caracteres a obtener, contando a partir del punto de inicio y obtendremos como resultado una cadena. Si queremos desarmar el contenido de cad del ejemplo anterior en sus dos partes, procederamos de la siguiente manera: cadUno ! subCadena(cad,1,longitud(cad1)) y cadDos ! subCadena(cad,longitud(cad1) + 1,longitud(cad2)) Nota: Las palabras longitud, concatenar y subCadena han sido seleccionadas del lenguaje castellano a efectos de dar claridad a los conceptos indicados anteriormente. Una cadena puede ser tratada de dos formas:

Completa, p.e.: cad Individual por sus componentes, es decir, por sus caracteres o smbolos-, siendo la notacin cad[i], en donde el subndice indica la componente i, cuyo valor debe estar en el intervalo [0; n], si i = 0 entonces hace referencia a la longitud lgica de la cadena.

Para las operaciones de cadena tratadas en forma completa cualquier cambio que se produzca en la longitud lgica es modificada automticamente, en cambio, cuando es tratada en forma individual y se produzca una modificacin en su longitud es necesario que lo realice el programador, forzando el cambio en la componente cero con el nuevo valor de longitud lgica. Representacin grfica de una variable cadena en memoria, dado el siguiente tipo de dato y la declaracin de variable de ese tipo de dato: type str20 = string[20]; var cad : str20; longitud fsica esttica, no cambia, definida en tiempo de compilacincad

9 10 11 12 13 14 15 16 17 18 19 20

Clase 6

AyE

U.T.N. F.R.B.A.

Pgina 4

Apuntes del Prof. Hugo A. Cuello Estructura de dato: Registro. Tratamiento de cadenas.

byte de longitud lgica dinmica, su valor puede cambiar en tiempo de ejecucin-. Si bien el mximo valor es 255, en realidad no debe ser mayor al valor de la longitud fsica previamente definido, y no menor que cero, es decir, chr(0) <= cad[0] <= chr(n). El valor que se establezca no ha de ser numrico, sino, ha de ser de tipo caracter. A continuacin se presentan distintos valores que contendr la variable cad definida de tipo cadena de 20 -string[20]-. Valor asignado Longitud lgica en caso de emitir muestra cad ! asigna la cadena vaca. cero. nada cad ! super cinco. super cad ! cad + man ocho. superman cad[9] ! c ocho. superman cad[10] ! i ocho. superman cad[11] ! t ocho. superman cad[12] ! o ocho. superman cad[0] ! #15 quince superman??? cad[0] ! #12 doce. supermancito cad[0] ! #5 cinco. super Los 3 caracteres de signo de pregunta simbolizan el caracter que se encuentre en esas componentes. Una cadena puede ser comparada con otra, utilizando los distintos operadores de relacin (>, <, =, <>, >=, <=). Para que una cadena sea igual a otra se deben comparar todos sus caracteres correspondientes, esta tarea la realiza directamente el lenguaje Turbo Pascal. Al igual que los nmeros reales una cadena es no ordinal. Pero, ser ordinal si la tratamos individualmente?. Si asignamos a una variable destino una cantidad de smbolos mayor al que puede contener, los caracteres que sobrepasen el lmite superior se truncarn, es decir, se pierden todos aquellos caracteres que sobrepasen la cantidad mxima soportada por la variable destino, esto vale cuando la tratamos en forma completa, no as cuando la tratamos en forma individual y si sobrepasamos el lmite superior, entonces en estos casos estaremos invadiendo una posicin de memoria desconocida, produciendo efectos catastrficos, los cuales podran llegar a ser, que determinadas variables hayan modificado su valor, aparecer caracteres imprevistos en la pantalla, colgarse el programa, entre otros. Funciones y Procedimientos para el tratamiento de cadenas de caracteres Chr(x): Retorna el caracter correspondiente al cdigo ASCII x enviado. Ej. car ! chr(65), asigna el caracter A. Ord(car): Retorna el cdigo ASCII correspondiente al caracter enviado. Ej. x ! ord(A), asigna el valor 65. Es la funcin inversa de chr(x). Otra forma de obtener la longitud lgica de una cadena es aplicando esta funcin de la siguiente manera, x ! ord(cad[0]). Asigna a x un valor entre 0 y 255, el que se encuentre en esa posicin. UpCase(car): Retorna el carcter convertido a mayscula, si car es alfabtico minscula, sino el mismo caracter. car ! upcase(a), asigna A. car ! upcase(B), asigna B. car ! upcase(+), asigna +.

Clase 6

AyE

U.T.N. F.R.B.A.

Pgina 5

Apuntes del Prof. Hugo A. Cuello Estructura de dato: Registro. Tratamiento de cadenas.

Length(cad): Retorna la longitud lgica de la cadena cad enviada. El valor retornado estar entre 0 y 255 como mximo. Length(cad) = ord(cad[0]. Pos(subCad,cad): Retorna cero si la subcadena subCad no se encontr en la cadena cad, sino retorna un valor > 0 indicando que en esa posicin se encontro a partir de ah la subcadena en la cadena. Ej.: x ! pos(ma,mi mama me ama), asigna 4 a x. x ! pos(abc,xyzabrscbaqrbcmds), asigna cero a x. Copy(cad,i,x): Retorna una cadena armada a partir de la cadena cad desde la posicin i, con x caracteres contando a partir de la posicin i. Ej.: cad1 ! copy(superman,3,3), asigna per a cad1. Concat(cad1,cad2,...): Retorna una cadena, resultado de unir cada una de las cadenas enviadas en el orden dado. Otra forma de lograr el mismo propsito es utilizando el operador de concatenacin +. Ej.: cad ! concat(super,man). cad ! super + man. SizeOf(objeto): Retorna un valor entero que indica el tamao fsico del objeto enviado que puede ser un tipo o una variable. Ej.: x ! sizeof(integer), asigna dos a x. x ! sizeof(real), asigna 6 a x. x ! sizeof(cad), asigna 21 a x si cad se defini como string[20]. x ! sizeof(str20), asigna 21 a x si str20 se defini como string[20]. Succ(exprOrd): Retorna el sucesor de exprOrd que debe ser de tipo ordinal. Salvo el ltimo elemento que no tiene sucesor, en tal caso sera error averiguarlo, todos los dems elementos tienen sucesor. El primer elemento de una lista tiene valor ordinal cero, salvo con los enteros negativos que tendrn valores ordinales negativos. Ej.: x ! succ(4), asigna 5 a x. X ! succ(succ(10)), asigna 12 a x. Pred(exprOrd): Retorna el predecesor de exprOrd que debe ser de tipo ordinal. Salvo el primer elemento que no tiene predecesor, en tal caso sera error averiguarlo, todos los dems elementos tienen predecesor. El primer elemento de una lista tiene valor ordinal cero, salvo con los enteros negativos que tendrn valores ordinales negativos. Ej.: x ! pred(4), asigna 3 a x. X ! pred(pred(9)), asigna 7 a x. Car ! pred(C), asigna B a car. Delete(cad,i,x): Procedimiento que elimina de la cadena cad los caracteres desde la posicin i una cantidad x de caracteres contando a partir de la posicin i, actualiza la longitud lgica de cad. Ej.: cad ! superman. delete(cad,3,3), cad contiene suman y su longitud lgica es 5, se eliminaron los caracteres p, e y r. Insert(subCad,cad,i): Procedimiento que inserta la subcadena subCad en la cadena cad a partir de la posicin i, actualiza la longitud lgica de cad. Ej.: insert(per,cad,3), ahora cad volver a contener superman y su longitud lgica volver a ser de 8. Str(x,cad): Procedimiento que convierte un nmero x a una cadena, el resultado queda en cad. Ej.: str(725,cad), asigna a cad la cadena 725 y su longitud lgica pasa a ser de 3. str(3825.425:0:2,cad), asigna a cad la cadena 3825.425, en cambio str(3825.425,cad), asigna a cad la cadena 3.8254250 que no es lo que se pretendera hacer. Val(cad,x,cod): Procedimiento que convierte una cadena cad a un valor numrico, guardando el resultado en x, si la conversin tuvo xito, en ese caso Clase 6 AyE U.T.N. F.R.B.A. Pgina 6

Apuntes del Prof. Hugo A. Cuello Estructura de dato: Registro. Tratamiento de cadenas.

a cod se asigna cero. Puede ocurrir que no tenga xito la conversin, en este otro caso se detiene la conversin, en x se asigna cero y en cod se asigna un valor > 0, indicando que en esa posicin ocurri un error, debido a que el caracter encontrado no pudo ser convertido a un dgito o signo + o o el punto decimal. Ej.: cad ! 5318. Val(cad,x,cod), asigna el valor 5318 a x, y a cod el valor 0, en cambio si cad ! 3a92. Val(cad,x,cod), asigna 0 a x, y a cod el valor 2, ya que, en la posicin 2 se encontr un caracter que no pudo ser convertido. Funciones de tratamiento de cadenas creadas por el usuario Al igual que con las funciones numricas en que el usuario puede crear sus propias funciones, sucede lo mismo con las cadenas de caracteres. A continuacin se presentan algunas funciones de cadenas. Funcin que retorna el carcter enviado convertido a minscula si es alfabtico mayscula, sino el mismo carcter. LowCase( car : char) : char

Car in [A..Z] LowCase ! chr(ord(car) + 32) R Funcin que retorna invertida una palabra enviada: LowCase ! car

InvPal( pal : string ) : string

palInv !
i ! 1 length(pal)

palInv ! pal[i] + palInv InvPal ! palInv R

Clase 6

AyE

U.T.N. F.R.B.A.

Pgina 7

Apuntes del Prof. Hugo A. Cuello Estructura de dato: Registro. Tratamiento de cadenas.

Una posible aplicacin de la funcin InvPal sera comprobar si una palabra es palndromo, es decir, capica, p.e.: capicua ! pal = InvPal(pal), habiendo declarado a capicua de tipo boolean, contendr false si la palabra pal no es capica, sino ser true. Pero, podra ocurrir que al invertir una cadena, palabra de un lenguaje, la nueva cadena creada sea una palabra que pertenezca a ese mismo lenguaje?. p.e.: palreves ! invpal(lmina), obviando el tilde, asigna animal, o esta otra, palreves ! invpal(roma), asigna amor. Funcin que dado un caracter car y un nmero n, retorna el carcter car repetido n veces, es decir, retorna una cadena de longitud n, en donde cada componente es el caracter car. replicate( car : char; n : byte): string

cad !
i!1n

cad ! cad + car replicate ! cad R

Tambin podra realizarse la siguiente funcin que retorna espacios en blanco: space( n : byte): string

cad !
i!1n

cad ! cad + space ! cad R

Una posible aplicacin de la funcin space o replicate podra ser rellenar una variable de cadena con espacios a derecha, a partir de la longitud lgica + 1 hasta el final, p.e.: cad ! Algoritmos. cad ! cad + space(pred(sizeof(cad)) length(cad)).

Clase 6

AyE

U.T.N. F.R.B.A.

Pgina 8

También podría gustarte