Cadenas de Caracter e Sen CPP

Descargar como pdf o txt
Descargar como pdf o txt
Está en la página 1de 4

Metodologa de la Programacin / Informtica.

Curso 2008-2009

Prctica 10. Cadenas de caracteres en C++


En el lenguaje C++ se pueden manejar cadenas de caracteres con las mismas herramientas que ofrece el lenguaje C, es decir, como vectores de char con una caracterstica especial: el ltimo elemento del vector debe ser el carcter especial \0. Adems de esta forma de trabajar con cadenas, el lenguaje C++ ofrece un tipo de dato de ms alto nivel, la clase string. Nosotros trabajaremos con cadenas de caracteres considerndolas como vectores de char. Como hemos dicho, trataremos las cadenas como cadenas de caracteres terminadas en \0. La marca \0 es utilizada por el compilador como marca de final de la cadena: al encontrar el \0, el compilador sabe que la cadena que est tratando ha terminado. La necesidad de introduccin de este carcter especial obliga a que tengamos cuidado al declarar vectores de caracteres que vayan a almacenar cadenas. Si queremos almacenar una cadena que tiene 10 caracteres, debemos declarar un vector de tamao 11 para que se pueda guardar tambin el \0. Es necesario observar que las cadenas son vectores de caracteres, pero que no necesariamente todos los vectores de caracteres son cadenas: para que un vector de caracteres sea una cadena debe tener el carcter \0 como ltimo elemento. Adems, C++ s que reconoce constantes de cadena, que son los caracteres que aparecen entre comillas dobles (). Por ejemplo, Hola. Inicializacin de vectores para almacenar cadenas Si al declarar un vector de caracteres deseamos darle un valor inicial de tipo cadena, tenemos dos posibilidades: 1. Especificar la cadena entre comillas dobles, omitiendo el \0, aunque manteniendo el tamao del vector como si estuviera: char cadena[5]=Hola; 2. Especificar la cadena entre comillas dobles, omitiendo el \0, y sin especificar el tamao para el vector. El compilador tomar el tamao adecuado, reservando tambin espacio para el \0: char cadena[]=Hola; Aunque la segunda forma es la ms recomendable, ya que nos evita tener que contar los caracteres de la cadena con que estamos inicializando, la primera ser necesaria cuando queramos que el vector tenga un tamao mayor que el de la cadena inicial (si por ejemplo pensamos que ms adelante en el programa se pueda almacenar una cadena de ms caracteres en el mismo vector).

Metodologa de la Programacin / Informtica. Curso 2008-2009

Lectura de cadenas. Funciones de C para el manejo de cadenas. El operador cin, presenta un problema a la hora de introducir una cadena de caracteres por teclado y es que no admite espacios en blanco ( recordar que cin utiliza los espacios en blanco como separadores, los lee pero no los almacena). Observa el siguiente ejemplo: char cadena1[15], cadena2[15]; cin>>cadena1; cin>>cadena2; Si introducimos por teclado la cadena HOLA A TODOS, tras la primera lectura el valor de cadena ser HOLA, es decir, que se omite todo lo que va detrs del primer espacio en blanco. Esto es debido a que los espacios en blanco actan como marca de fin de cadena. En la segunda lectura, el valor que se lee para la cadena sera A. Para evitar este problema, utilizaremos la funcin gets(<cadena>) para lectura. Por ejemplo, char cadena[20]; gets(cadena); Notas: - Como era de esperar, tanto cin como gets aaden el carcter de fin de cadena \0. - Si necesitamos leer varias cadenas seguidas (por ejemplo tenemos un while en el que se guarda cadenas), debemos utilizar la instruccin fflush(stdin), para borrar o liberar lo que haya en el buffer del teclado antes de leer cada cadena. Por ejemplo:
char nombre[20]; while(a<=10) { cout<<Introduce el nombre<<endl; fflush(stdin); gets(nombre); }

Funcin strlen (string length, longitud de cadena)

Devuelve el nmero de caracteres de la cadena que se le pasa como parmetro sin contar el carcter \0. Por ejemplo, strlen(Hola) devuelve 4. Funcin strcpy (string copy, copia de cadena)

Excepto en el momento de la inicializacin, en C no es posible dar valor a una variable cadena en una sentencia de asignacin. As, char cadena[10]; cadena=Hola;

/*ERROR!!!*/

Metodologa de la Programacin / Informtica. Curso 2008-2009

es incorrecto. La nica forma de hacer esto es a travs de la funcin strcpy, que copia en la variable cadena que se le pasa como primer parmetro el valor de la cadena que se le pasa como segundo parmetro. La forma correcta de hacer la asignacin anterior es pues: char cadena[10]; strcpy(cadena,Hola); /*CORRECTO!!!*/ Funcin strcmp (string compare, comparacin de cadenas)

Sirve para comparar dos cadenas lexicogrficamente (es decir, por orden alfabtico). No compara cadenas por tamao. Devuelve un entero negativo si la primera es menor que la segunda, un entero positivo si la primera es mayor que la segunda y cero si las dos cadenas son la misma. strcmp(Ala,Hola); /*Devuelve un valor <0*/ strcmp(Hola,Ala); /*Devuelve un valor >0*/ strcmp(Hola,Hola); /*Devuelve 0*/ Todas ellas tienen su prototipo en el fichero de cabecera <cstring>. EJERCICIOS: A) Ejercicios sobre manipulacin de cadenas de caracteres 1) Traduce el siguiente algoritmo a C++ (dado un dni, calcula la letra del NIF correspondiente):
algoritmo calculoNIF variables dni : entero letranif :carcter principio leer(dni) letranifcalculoletranif(dni) escribir(letranif) fin funcin calculoletranif (dni :entero) devuelve carcter variables tabla : vector[1..23] de carcter resto : entero principio {inicializar tabla a TRWAGMYFPDXBNJZSQVHLCKE} restodni MOD 23 devuelve(tabla[resto+1]) fin

2) Disear un programa que lea una cadena de caracteres y la invierta. 3) Crear un programa que compruebe si un texto introducido por teclado es o no un palndromo.

Metodologa de la Programacin / Informtica. Curso 2008-2009

B) Ejercicios sobre cadenas de caracteres, vectores y registros Dada la siguiente estructura de datos :

tipos
tEmpleado=registro nombre:cadena dni:cadena horasTrabajadas:entero precioHora:real freg

tEmpresa=vector[1..50] de tEmpleado variables empresa:tEmpresa


1) Escribir un subprograma para leer los datos de los empleados de la empresa. Terminar al introducir un dni cero.

2) Escribir un subprograma que muestre el sueldo de una persona dado su dni.

3) Escribir un subprograma que compruebe si los datos de los empleados de la empresa estn almacenados o no alfabticamente.

También podría gustarte