13 septiembre 2014

Pascal - 4b: Cadenas de texto

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)