4.2. Cadenas de texto (strings)
4.2.1. ¿Qué es una cadena de texto?
Un string es una secuencia de caracteres. Se usan para almacenar texto. En algunas versiones de Pascal existe un límite de 255 letras, y, en ese caso, cada string ocupa 256 bytes. En otras versiones esa limitación es mucho más suave, con tamaños por encima de 32.000 letras, como es el caso de GNU Pascal. En Pascal estándar, el formato era string[n] (o string(n) en algunos compiladores), donde n es la anchura máxima que queremos almacenar en esa cadena de caracteres (de 0 a 255), y en ese caso ocupará n+1 bytes en memoria.
Vamos a ver un primer ejemplo que pida al usuario su nombre y le salude:
(* SALUDO.PAS, Pedir nombre al usuario y saludarle *) (* Parte de CUPAS5, por Nacho Cabanes *) program Saludo; var nombre: string[30]; begin writeLn('Introduce tu nombre, por favor'); readLn(nombre); write('Hola ',nombre); end. (* Ejemplo de ejecucion: Introduce tu nombre, por favor Nacho Hola Nacho *)
Podemos dar un valor a una cadena, o comparar el valor de una cadena con un texto prefijado, si indicamos el texto entre comillas simples, así:
(* STRING1.PAS, Dar valor prefijado a un string *) (* Parte de CUPAS5, por Nacho Cabanes *) program String1; var saludo: string; begin saludo := 'Hola, soy un texto'; writeLn( saludo ); end. (* Resultado: Hola, soy un texto *)
4.2.2. Acceder a las letras de una cadena
Podemos acceder a las letras que forman una cadena usando corchetes, como si se tratara de un array de caracteres, en el que el primer elemento está en la posición 1 y la cantidad de letras se sabe con "length":
(* STRING2.PAS, Acceder a las letras de un string *) (* Parte de CUPAS5, por Nacho Cabanes *) program String2; var saludo: string; begin saludo := 'Hola, soy un texto'; writeLn( 'El texto tiene ', length(saludo), ' letras' ); writeLn( 'La primera es ', saludo[1] ); end. (* Resultado: El texto tiene 18 letras La primera es H *)
4.2.3. Operaciones habituales con cadenas
Podemos crear una cadena a partir de varias (concatenar), usando el símbolo de la suma o la orden concat, que a la que indicaremos varias subcadenas entre paréntesis:
(* STRING3.PAS, Concatenar cadenas *) (* Parte de CUPAS5, por Nacho Cabanes *) program String3; var palabra1, palabra2, espacio: string; resultado1, resultado2: string; begin palabra1 := 'Hola'; espacio := ' '; palabra2 := 'Pascal'; resultado1 := palabra1 + espacio + palabra2 + '!'; resultado2 := concat(palabra1, '-', palabra2); writeLn( resultado1 ); writeLn( resultado2 ); end. (* Resultado: Hola Pascal! Hola-Pascal *)
Si necesitamos partir de una cadena vacía (por ejemplo, para irle añadiendo letras) o bien queremos vaciar una cadena ya existente, lo podemos hacer usando dos comillas simples que no contengan nada entre medias (ni siquiera un espacio):
(* STRING4.PAS, Vaciar una cadena *) (* Parte de CUPAS5, por Nacho Cabanes *) program String4; var texto: string; i: integer; begin texto := ''; writeLn( 'El texto es ', texto ); for i := 1 to 10 do texto := texto + '-'; writeLn( 'Ahora el texto es ', texto ); end. (* Resultado: El texto es Ahora el texto es ---------- *)
Podemos extraer una subcadena (un fragmento del texto original) con la orden copy, que debe recibir tres parámetros: la cadena, la posición de comienzo y la cantidad de caracteres a extraer:
(* STRING5.PAS, Extraer una subcadena *) (* Parte de CUPAS5, por Nacho Cabanes *) program String5; var texto: string; begin texto := 'Hola, esto es un ejemplo'; writeLn( 'La primera palabra es ', copy(texto,1,4) ); writeLn( 'Otro fragmento es "', copy(texto,9,5), '"' ); end. (* Resultado: La primera palabra es Hola Otro fragmento es "to es" *)
También es posible ver si contiene una subcadena, usando pos, que recibe como datos la subcadena a buscar y la cadena que la contiene, y devolverá 0 si no aparece, o un número mayor que cero (la posición) en caso de que sí esté contenida:
(* STRING6.PAS, Posicion de una subcadena *) (* Parte de CUPAS5, por Nacho Cabanes *) program String6; var texto: string; begin texto := 'Hola, esto es un ejemplo'; writeLn( 'La palabra "esto" aparece en la posicion ', pos('esto', texto)); end. (* Resultado: La palabra "esto" aparece en la posicion 7 *)
Finalmente, también tenemos la posibilidad de insertar una subcadena, usando insert, o de borrar una subcadena, con delete. A "insert" se le indican 3 datos: el texto a insertar, la cadena dentro de la que queremos incluirlo, y la posición en la que debe aparecer; a "delete" se le detalla la cadena, la posición en la que empezar a borrar y la cantidad de letras a eliminar:
(* STRING7.PAS, Insertar y borrar en una cadena *) (* Parte de CUPAS5, por Nacho Cabanes *) program String7; var texto: string; begin texto := 'Hola, esto es un ejemplo'; writeLn( 'El texto original es ', texto ); insert( ' amigo,', texto, 6); writeLn( 'Tras insertar queda ', texto ); delete( texto, 14, 5); writeLn( 'Y tras borrar queda ', texto ); end. (* Resultado: El texto original es Hola, esto es un ejemplo Tras insertar queda Hola, amigo, esto es un ejemplo Y tras borrar queda Hola, amigo, es un ejemplo *)
Además, algunas versiones de Pascal permiten convertir un texto a minúsculas o a mayúsculas de forma simple. Por ejemplo, con FreePascal se puede usar upperCase(x) para convertir un string a mayúsculas y lowerCase(x) para convertir a minúsculas.
4.2.4. Arrays de cadenas
Podemos crear un array formado por varias cadenas de texto, igual que los creábamos a partir de datos numéricos. El manejo será idéntico. La única peculiaridad que merece la pena comentar es que si queremos acceder a una letra concreta de una de esas cadenas deberemos usar dos pares de corchetes: la primera pareja indicará la posición en que está la frase dentro del array, y la segunda pareja de corchetes detallará qué letra dentro de esa cadena:
(* ARRAYST.PAS, Contacto con array de strings *) (* Parte de CUPAS5, por Nacho Cabanes *) Program ArraySt; var datos: array[1..4] of string; begin datos[1] := 'Hola'; datos[2] := 'Adios'; datos[3] := '1234'; datos[4] := '(.,)'; writeLn('La tercera letra de la segunda cadena es ', datos[2][3]); end. (* Resultado: La tercera letra de la segunda cadena es i *)(Ya sabes... más detalles y ejercicios propuestos, en la página oficial del curso)
No hay comentarios:
Publicar un comentario