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".
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".
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
Y si necesitamos el valor numérico de una cadena de texto, lo podemos hacer con "VAL", que se usa VAL(texto, valor, codigoDeError). En "valor" obtendremos el valor de la cadena, si es que se puede convertir claramente a un número. Si no se pudiera convertir, el valor sería 0 y "codigoDeError" tendría un valor distinto de cero (que indica la posición de la cadena en la que ha fallado la conversión).
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.