4.2. Cadenas de texto (strings)
Curso: Programación en Pascal (v5), por Nacho Cabanes
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 *)
Ejercicio propuesto 4.2.1.1: Crea un programa que te pida tres palabras y las muestre separadas por espacios y en el orden contrario a como las has introducido (primero la tercera palabra, después la segunda y finalmente la primera).
Ejercicio propuesto 4.2.1.2: Crea un programa que pida al usuario su nombre y su apellido y luego los escriba al revés, separados por una coma. Por ejemplo si el usuario introduce Nacho como nombre y Cabanes como apellido, se escribirá Cabanes, 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 *)
Ejercicio propuesto 4.2.1.3: Crea un programa que pida al usuario su nombre. Si es Nacho, le dirá "Hola"; si es otro nombre, le responderá "No te conozco".
Ejercicio propuesto 4.2.1.4: Crea un programa que pida nombres al usuario. Cuando el usuario introduzca un nombre, por ejemplo "Juan", le responderá saludándole (por ejemplo, "Hola, Juan"). Terminará cuando el nombre que introduzca el usuario sea "fin".
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 *)
Ejercicio propuesto 4.2.2.1: Crea un programa que te pida tu nombre y lo muestre al revés (de la última letra a la primera).
Ejercicio propuesto 4.2.2.2: Crea un programa que te pida tu nombre y muestre las letras separadas por espacios (por ejemplo, "Nacho" se convertiría en "N a c h o".
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 *)
Ejercicio propuesto 4.2.3.1: Crea un programa que pida al usuario su nombre y su apellido, cree una cadena formada por el apellido, una coma y el nombre (por ejemplo si el usuario introduce Nacho como nombre y Cabanes como apellido, la cadena contendrá "Cabanes, Nacho"), y finalmente escriba esa cadena.
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 ---------- *)
Ejercicio propuesto 4.2.3.2: Crea un programa que cree y muestre una cadena formada por 20 símbolos de exclamación (!).
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" *)
Ejercicio propuesto 4.2.3.3: Crea un programa que te pida tu nombre y escriba un triángulo creciente, que empiece con una letra, siga con dos y vaya aumentando hasta mostrar todas las letras:
N
Na
Nac
Nach
Nacho
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 *)
Ejercicio propuesto 4.2.3.4: Crea un programa que pida al usuario una frase y diga si contiene la palabra "hola" y, en caso afirmativo, en qué posición.
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 *)
Ejercicio propuesto 4.2.3.5: Crea un programa que pida al usuario su nombre. Si el nombre incluye "Sr. ", deberás borrar esa partícula. Donde estuviera ese "Sr. ", deberás incluir "Usuario del sistema: ".
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.
Ejercicio propuesto 4.2.3.6: Crea un programa que pida al usuario su nombre y lo muestre en mayú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 *)
Ejercicio propuesto 4.2.4.1: Crea un programa que pida 5 frases al usuario y luego las muestre en orden contrario a como se introdujeron (de la última frase a la primera).
Ejercicio propuesto 4.2.4.2: Crea un programa que te pida 5 nombres, los guarde en un array y luego muestre sus iniciales.
Ejercicio propuesto 4.2.4.3: Crea un programa que pida al usuario el número de un mes (por ejemplo, 3) y responda la cantidad de días que tiene ese mes (31) y su nombre (marzo). Utiliza para ello dos arrays, uno que contenga números enteros y otro que contenga textos.
Ejercicio propuesto 4.2.4.4: Crea un programa que pida al usuario el nombre de un mes (por ejemplo, "marzo") y responda el nombre de ese mes en inglés ("march"), usando dos arrays de cadenas de texto.
Ejercicio propuesto 4.2.4.5: Crea un programa que pida al usuario el nombre de un mes (por ejemplo, "marzo") y responda el nombre de ese mes en inglés ("march"), usando un array bidimensional de cadenas de texto.
Actualizado el: 20-07-2014 12:14