libro programacion cadenas

8
Cap ´ ıtulo 12 Cadenas de car´ acteres Hasta ahora se ha trabajado con tipos de datos primitivos y arreglos. Entre los tipos de datos primitivos se encuentran los caracteres que se denieron matem´aticamente como ASCII  . Los caracteres ASCII   (American Standard Code for Information Interc hange) permiten representar letras, numeros y s´ ımbolos. Inicialmente se denieron de 7 bits (128 caracteres) y luego se extendieron a 8 bits (256 caracteres). Decir que  x  ∈  ASCII  , en  C++ equivale a decir  char x. Sobre los caracteres se pueden tener las siguientes operaciones: char letra = ’A’; //Asigna el caracter ’A’ char letra2 = 65; // Asigna la letra A //a letra 2, pues A // es el caracter en decimal // 65 del ASCII cout << letra + letra2 //imprime el numero 130 cout << (ch ar) (le tra + letra2 ) //i mpr ime e tildada if(le tra == letra 2){ //Se pue den hacer cout << "igual"; //comparaciones entre char } cout << ’0’ + ’1’ //imprime 97 cout << (ch ar) (’0 ’ + ’1’) //i mpr ime ’a’ Como se vi´ o en la parte de ujos, existen tambien caracteres especiales como los si- guientes: 181

Upload: camilo-andres-vargas

Post on 12-Oct-2015

16 views

Category:

Documents


0 download

TRANSCRIPT

  • Captulo12Cadenas de caracteres

    Hasta ahora se ha trabajado con tipos de datos primitivos y arreglos. Entre los tiposde datos primitivos se encuentran los caracteres que se definieron matematicamente comoASCII.

    Los caracteres ASCII (American Standard Code for Information Interchange) permitenrepresentar letras, numeros y smbolos. Inicialmente se definieron de 7 bits (128 caracteres)y luego se extendieron a 8 bits (256 caracteres). Decir que x ASCII, en C++ equivale adecir char x.

    Sobre los caracteres se pueden tener las siguientes operaciones:

    char letra = A; //Asigna el caracter A

    char letra2 = 65; // Asigna la letra A

    //a letra 2, pues A

    // es el caracter en decimal

    // 65 del ASCII

    cout

  • 182 CAPITULO 12. CADENAS DE CARACTERES

    cout

  • 183

    A* crear_arreglo(int n){

    return new A[n];

    };

    Con cadenas pasa lo mismo:

    crear cadena N ASCII(n)z xx ASCIIn ASCIIEn C++ se traduce:

    char* crear_cadena(int n){

    return new char[n];

    };

    Funciones Liberadoras: Estas funciones permiten devolver la memoria empleada porun TDA al sistema operativo. Los tipos de datos primitivos no requieren esta defi-nicion pero tipos de datos como los arreglos o los TDA escritos por un programadordeben ser liberados. Estan asociadas al operador delete en C++. Para arreglos setena:

    liberar arreglo A N (x,n)zEn C++ se traduce:

    void liberar_arreglo(A* x, int n){

    delete[] x;

    };

    Para las cadenas se tiene lo mismo, pero sin tener el n de tamano.

    liberar cadena ASCII (x,n)zEn C++ se traduce:

    void liberar_arreglo(char* x){

    delete[] x;

    };

  • 184 CAPITULO 12. CADENAS DE CARACTERES

    Funciones de persistencia: Aca esta la diferencia con arreglos. No se le preguntara alusuario cuantos caracteres tiene el nombre ni leerlos letra por letra, nos toca apro-ximar un n que en este caso tambien lo enviamos como parametro (vease el mainmas adelante). Lo interesante de las cadenas con respecto a los arreglos de enterosy reales es que podemos leer toda la cadena con una sola instruccion de la libreraiostream:

    leer cadena IS ASCII N ASCII(is, x, n)z xx = leer cadena(is, n)char* leer_cadena(istream& is, char* x, int n){

    is.getline(x, n);

    };

    En este caso el n puede ser aproximado por el programador, observese que no seempleo is >> x pues no podra leer nombres por ejemplo Sandra MilenaquedaraSandra, getline leera el flujo hasta encontrar un salto de linea o cumplirse lalongitud de cadena dada.

    Para imprimir una cadena si podemos utilizar el operador

  • 12.1. CODIGO COMPLETO 185

    longitud cadena ASCII N(x)z longitud cadena parcial(x,0)En C++ se traduce:

    int longitud_cadena_p(char* str, int i){

    if(str[i] == \0){

    return 0;

    };

    return 1 + longitud_cadena_p(str, i+1);

    };

    int longitud_cadena(char* str){

    return longitud_cadena_p(str, 0);

    };

    Con esta funcion de longitud se pueden definir funciones interesantes como copiarcadena:

    copiar cadena ASCII ASCII(str)z strcpstrcp = crear cadena(longitud cadena(str) + 1), strcpi =stri i=0,1,2,..,longitud cadena(str), strcp(longitud cadena(str)) = /0char* copiar_cadena(char* str){

    int i;

    int lstr = longitud_cadena(str);

    char* strcp = crear_cadena(lstr+1);

    for(i=0; i < lstr; i++){

    strcp[i] = str[i];

    };

    strcp[lstr] = \0;

    return strcp;

    };

    12.1. Codigo Completo

    El codigo completo de cadenas quedara as:

    #include

    #include

    using namespace std;

  • 186 CAPITULO 12. CADENAS DE CARACTERES

    int longitud_cadena_r(char* str, int i){

    if(str[i] == \0){

    return 0;

    };

    return 1 + longitud_cadena_r(str, i+1);

    };

    int longitud_cadena(char* str){

    return longitud_cadena_r(str, 0);

    };

    char* crear_cadena(int n){

    return new char[n];

    };

    void liberar_cadena(char* str){

    delete[] str;

    };

    char* leer_cadena(istream& is, char* str, int n){

    is.getline(str, n);

    return str;

    };

    ostream& escribir_cadena(ostream& os, char* str){

    os

  • 12.1. CODIGO COMPLETO 187

    int main(){

    int n = 100;

    /* Crea una cadena de tamano 100 */

    char* str = crear_cadena(n);

    char* str_copia = crear_cadena(n);

    /* Lee la cadena de la consola */

    cout

  • 188 CAPITULO 12. CADENAS DE CARACTERES

    Ejercicios

    Elabore un programa que dada una letra cuente cuantas ocurrencias de esta letrahay.

    Elabore un programa que dada una cadena diga si todos los smbolos de la cadenason letras.

    Elabore un programa que dada una cadena cuente las consonantes en dicha cadena.

    Desarrollar un algoritmo que invierta una cadena de caracteres (la cadena invertidadebe quedar guardada en una variable aparte)

    Desarrollar un algoritmo que determine si una cadena de caracteres es palindrome.Una cadena se dice palindrome si al invertirla es igual a ella misma. Ejemplos:

    ala es palindrome

    anita lava la tina No es palindrome, pues al invertirla con espacios no esexactamente igual a la original.

    los estudiantes de programacion leyeron toda la gua no es palindrome.

    robas ese sabor es palindrome

    Desarrollar un algoritmo que realice el corrimiento circular a izquierda de una cadenade caracteres. El corrimiento circular a izquierda es pasar el primer caracter de unacadena como ultimo caracter de la misma. Ejemplo: Los estudiantes hicieron bienel taller quedara os estudiantes hicieron bien el tallerL.

    Desarrollar un algoritmo que reciba como entrada dos cadenas y determine si laprimera es subcadena de la segunda. (No se deben usar operaciones de subcadenaspropias del lenguaje de programacion). Ejemplos: La cadena prosa es subcadenade la cadena la prosa debe ser armoniosa La cadena pepito no es subcadena dela cadena el torpe pito de aire. La cadena pe pito si esta incluida en la cadenael torpe pito de aire.