Unidad v Cadenas de Caracteres

Embed Size (px)

Citation preview

  • 7/21/2019 Unidad v Cadenas de Caracteres

    1/14

    1

    Universidad de El SalvadorFacultad de Ingeniera y ArquitecturaEscuela de Ingeniera de Sistemas Informticos

    Programacin I

    Unidad VCADENAS DE CARACTERES

    Objetivo: Aprender a manejar datos alfanumricos y conocer las funciones propias delLenguaje de Programacin C para hacerlo.

    Contenido:

    Cadenas de Caracteres Concepto Declaracin de Datos Alfanumricos

    Inicializacin de Variables de Caracteres Lectura de Cadenas de Caracteres Salida de Datos Alfanumricos

    Manejo de cadenas de Caracteres Librera Librera Librera

    Ejemplos

    Introduccin: Los datos, con los que hemos trabajado, hasta el momento son numricos, y

    con ellos hemos realizado todo tipo de clculos y comparaciones; con los datos alfanumricossolo hemos hecho operaciones de lectura y escritura, ya que los datos alfanumricos no sepueden operar de la misma forma.

    Dos nombres no se pueden sumar o multiplicar, pero s podemos agregarle un datoalfanumrico a otro del mismo tipo, o podemos contar cuantas veces aparece una letradeterminada en una frase o texto determinado. Para ello estudiaremos las funciones propias deC que nos sirven para manejar datos alfanumricos.

    I. CADENAS DE CARACTERES:1. Concepto:Una CADENA, o string, es un dato alfanumrico, que est formado por un grupo de caracteres,que desde luego tienen en un momento un `valor` o contenido especial.

    Por caracter se debe entender una letra, un nmero, o un signo, incluso un espacio en blanco;podemos decir que, cada smbolo del cdigoASCIIes un caracter y sabemos que este cdigoest formado por 255 caracteres diferentes.

    Un solo caracter siempre lo escribimos dentro de comillas simples, y una cadena dentro decomillas dobles, por ejemplo:

  • 7/21/2019 Unidad v Cadenas de Caracteres

    2/14

    2

    Caracteres: n 3 % ; ? { +

  • 7/21/2019 Unidad v Cadenas de Caracteres

    3/14

    3

    3. Inicializacin de Variables de Caracteres.Se puede asignar valores iniciales a un vector tipo char cuando se declara, y sta la nica vezque se asignacon el operador de asignacin =

    Por ejemplo:

    char frase[12] = Buenos Das //No sobra espacio en la cadena frase.

    char texto[255] = Esta puede ser una cadena bien larga //Sobran 218 posiciones en texto

    char nom[ ] = Jose Francisco Morales Guevara //declara y llena un vector de 31 elementos

    4. Lectura Cadena de CaracteresLa lectura normalmente se realiza con la funcin scanf, siendo el formato de tipo de dato %s, yno necesita el smbolo &. Ejemplo:

    scanf(%s, nombre); // lee la cadena nombre

    Esta funcin da por finalizada la cadena (o dato a leer) cuando encuentra un espacio en blancoo el fin de lnea (al presionar enter) lo que ocurra primero. Para poder leer ms de una palabraen una cadena, se utiliza el formato [^\n] Ejemplo:

    scanf(%[^\n]s, nom); // Puede leer ms de una palabra

    Adems se pueden utilizar las funciones: gets,que lee todos los caracteres digitados hastaque encuentra el fin de lnea (al presionar enter); getchar, getch, getche, para leer un solo

    carcter.

    A continuacin se muestra los resultados de lecturas con diferentes funciones de entrada dedatos:

  • 7/21/2019 Unidad v Cadenas de Caracteres

    4/14

    4

    5. Salida de Datos alfanumricosLas cadenas las podemos imprimir con las funciones: printf, utilizando como formato de tipo dedatos %s; puts, que imprime una string; y putchar,para imprimir un solo carcter.

    II MANEJO DE DATOS ALFANUMRICOSPara poder trabajar (manejar, manipular o modificar) cadenas de caracteres, necesitamosutilizar funciones propias de C que se encuentran en las libreras del compilador, algunas destas son:

    Raul Antonio Fernandez. . .char nom[ ];

    printf(%s \n, nom (%s, nom);

    . . .char nom[ ];

    puts(nom);

    Raul Antonio Fernandez

    Instrucci n en C Si en memoria tenemos: Impresin:

    Raul Antonio Fernandez

    Raul Antonio Fernandez

    Raul Antonio Fernandez. . .char nom[ ];

    scanf (%s, nom);

    Raul

    . . .char nom[ ];

    scanf (%[^\n]s, nom);

    . . .char nom[ ];

    gets (nom);

    Raul Antonio Fernandez

    Raul Antonio Fernandez Raul Antonio Fernandez

    Instrucc in en C Si al ejecutar, digita: En memoria:

  • 7/21/2019 Unidad v Cadenas de Caracteres

    5/14

    5

    1. Librera str ing.hEs un archivo de cabecera que forma parte de la biblioteca estndar de C, contiene lasfunciones necesarias para manipular o trabajar con cadenas, utilizadas ms frecuentemente.

    2. Librera std lib.hEsta librera estndar de C, contiene entre otras, las funciones para convertir datos

    alfanumricos en datos numricos, siempre y cuando se pueda.

    3. Librera ctype.hEn esta librera, encontramos funciones para verificacin de tipos de datos y conversin deletras minculas a maysculas (y viceversa).

    4. Algunas Funciones de C ms util izadas:A continuacin se muestran algunas de las funciones de C que ms se utilizan, para podertrabajar fcilmente con datos alfanumricos. Para mejor comprensin de ellas se muestra lasintaxis y una explicacin de lo que hace cada funcin, y se han separado por librera:

    Librera

    strlen(cad) Devuelve la longitud de una string, cad, o nmero de caracteresque forman la cadena; el carcter nulo no forma parte de lalongitud.

    strcat(cad1,cad2) Concatena o aade la cad2 al final de la cad1, devuelve la nuevacad1.La longitud de cad1 debe ser suficientemente grande para quealbergue ambas cadenas.

    strncat(cad1,cad2,n) Concatena los n primeros caracteres de cad2 a cad1, devuelve lanueva cad1.Cad1 debe tener espacio para recibir los n caracteres de cad2

    strcpy(cad2,cad1) Copia cad2 en cad1, devuelve cad1. Sirve para asignarlevalores a una cadena.Cad1 debe tener espacio suficiente para almacenar cad2.

    strncpy(cad1,cad2,n) Copia los n primeros caracteres de cad2 en cad1

    strcmp(cad1,cad2) Compara las dos cadenas, devuelve un nmero entero, con unvalor:

    > 0 si cad1 > cad2= 0 si cad1 = cad2< 0 si cad1 < cas2

    strcmpi (cad1, cad2) Compara las dos cadenas sin diferenciar letras maysculas ominsculas. Los resultados son los mismos que strcmp( )

  • 7/21/2019 Unidad v Cadenas de Caracteres

    6/14

    6

    srtncmp(cad1,cad2, n) Compara un nmero n de caracteres de las 2 cadenas,devolviendo un entero igual que strcmp( ).

    strncpmi(cad1,cad2,n) Compara los n primeros caracteres de las 2 cadenas, ignorandolas diferencias entre maysculas y minsculas; los resultados sinlos mismos que strcmp( ).

    stricpm(cad1,cad2) Compara las 2 cadenas, sin tomar en cuenta el tamao de lasletras. Convierte primero todas las letras a minsculas y luegolos compara y devuelve un valor entero que indica el resultado dela comparacin:

    Si cad1 > cad2 El resultado es > 0Si cad1 = cad2 El resultado es = 0Si cad1 < cas2 El resultado es < 0

    strrev(cad) Invierte los caracteres de cad. El carcter de terminacin nulo,permanece en el mismo lugar.

    strlwr(cad) Convierte los caracteres de cad en letras minsculas.

    strupr(cad) Convierte los caracteres de cad en letras maysculas.

    LIBRERA atoi(cad) Convierte una cadena a un nmero entero. La cadena debe tener la

    representacin de un valor entero y el formato siguiente:

    [espacio en blanco] [signo] [ddd]

    donde: [espacio en blanco] Es una secuencia de escape detabulacin o un espacio enblanco y es opcional

    [signo] Puede ser +o -

    [ddd] Cadena de dgitos.

    atof(cad) Convierte una cadena a un nmero real de tipo double, la cadena debetener una representacin de caracteres de un nmero real, termina la

    conversin cuando encuentra no reconocido, su formato es:

    [espacio en blanco] [signo] [ddd] [.] [e/E] [signo] [ddd]

    atol(cad) Convierte una cadena a un entero largo. El formato de la cadena debede ser:

    [espacio en blanco] [signo] [ddd]

  • 7/21/2019 Unidad v Cadenas de Caracteres

    7/14

    7

    Librera isalnum(carac) Devuelve cero (0) si el carcter de argumento es un caracter no alfanumrico

    (ni letra ni nmero) o un valor distinto de cero (0) si es un carcteralfanmrico.

    isalpha(carac) Verifica si el carac es un carcter alfabtico. Devuelve cero (0) se carac no esalfabtico; un valor distinto de cero si carac es alfabtico.

    isascii(carac) Comprueba si carac es un carcter ASCII, en el rango de 0 127. Loscaracteres del 128 al 255 son tratados como no ASCII.Devuelve cero si carac es no ASCII, y un nmero diferente de cero si carac es

    ASCII.

    isdigit(carac) Verifica que carac sea un dgito decimal (0 . . . 9). Devuelve un valordistinto de cero si carac es un dgito, en caso contrario devuelve cero.

    islower(carac) Verifica si el carcter argumento: carac, es una letra minscula. Devuelve unvalor distinto de cero si es una letra minscula; en otro caso devuelve cero.

    isupper(carac) Verifica si carac es una letra mayscula. Devuelve cero si no es mayscula,de lo contrario devuelve un valor distinto de cero.

    tolower(carac) Convierte un carcter mayscula en minscula, siempre y cuando carac seauna letra mayscula.

    toupper(carac) Convierte una letra minscula en mayscula.

    Muchas veces, necesitamos en un programa, leer un valor numrico y a continuacin una

    cadena, la entrada del nmero se puede hacer con scanf y la de la cadena con gets:

    Al ejecutarse este fragmento de programa, no se puede introducir el nombre de la finca, elprograma le asigna una cadena vaca, ya que al digitar el valor de area y el retorno de carro oenter, inmediatamente se le asigna la cantidad a area y queda en el buffer interno el caracter deenter (o fin de lnea), que es el carcter en que termina la captura de una cadena por gets, porlo no se le asigna ningn carcter a cad. Para lograr leer area y cad se presentan la siguientesolucin: leer el valor numrico como una cadena de dgitos, y despus transformarla con atoi aentero:

    . . .

    int area;

    char cad[81];

    . . .

    printf(\n metros cuadrados.\t);

    scanf(%i,&area);

    printf(\n Nombre de la Finca:);

    gets(cad);

    . . .

  • 7/21/2019 Unidad v Cadenas de Caracteres

    8/14

    8

    III Ejemplos:

    1. Disee un programa que forme una cadena a partir de tres cadenas diferentes; las cadenasoriginales no se deben alterar, y se van a unir en el siguiente orden: cadena 1, cadena 2 , cadena 3, ydebe de agregarse 3 caracteres iniciales de la cadena 2; se debe incluir una coma y un espacio (, )entre cadena y cadena. Se debe de imprimir el nmero de caracteres que contiene la nueva cadena

    y la cadena en maysculas.

    I. Planteamiento del ProblemaEntrada de datos Salida de datos

    Cadenas de caracteresoriginales (3)

    Cadena final, formada por las tresiniciales.

    II. Anlis is del Problemaa) Variables de Salida:

    Nombre Tipo Descripcin

    Frase4[30] Alfanumerico Cadena formada por 3 cadenas diferentes, se le asignael carcter nulo (\0)

    b) Variables de entrada:

    Nombre Tipo Descripcin

    frase1 [20] Alfanumrico Representa la primera cadena, se inicializa con hola

    frase2[20] Alfanumrico Representa la segunda cadena, se inicializa con buenos diasfrase3[ ] Alfanumerico Representa la tercera cadena, se inicializa con adios

    c) Restricciones: No existen, las cadenas pueden estar formadas por cualquier tipo decaracteres, pero deben ser frase1 de 19, frase2 de 20, frase4 de 99 caracteres como mximo;frase3 tendr tantos caracteres como se le asignen al inicio.

    c) Proceso: Vamos a unir las tres cadenas, una despus de la otra (frase1+frase2+frase3),esto lo logramos con la funcin de contatenar: strcat y, para no afectar ninguna de las 3

    int area;

    printf(\n Metros cuadrados:\t);

    gets(cad);

    area = atoi(cad);

    printf(\n Nombre de la finca:\t);gets(cad);

    . . .

  • 7/21/2019 Unidad v Cadenas de Caracteres

    9/14

    9

    cadenas iniciales, se concatenaran una a una a la cuarta cadena, que inicialmente est vaca(\0):

    frase4 = frase4 + frase1 lo que se hace con strcat: strcat(frase4,frase1)

    frase4 = frase4 + una coma y un espacio

    frase4 = frase4 + frase2

    frase4 = frase4 + una coma y un espacio

    frase4 = frase4 + frase3

    frase4 = frase4 + una coma y un espacio

    frase4 = frase4 + los 3 caracteres iniciales de frase2 strncat(frase4, frase2, 3)

    Se va imprimiendo los cambios de frase4 para que se note la unin de las cadenas

    d) Variables de proceso: No existen

    III. Diseo de SolucinEl flujograma en este caso se omite, ya que las acciones a realizar son ms secuenciales.

    //Une tres frases en una sola, y les agrega puntuacin#include #include #include main(){char frase1[20]= "hola", frase2[20]="buenos dias" , frase3[ ]= "adios", frase4[100]="\0";strcat(frase4, frase1);puts(frase4);strcat(frase4, ", ");puts(frase4);strcat(frase4, frase2);puts(frase4);strcat(frase4, ", ");strcat(frase4, frase3);

    //Agrega 3 caracteres de frase2 a frase4strncat(frase4, frase2,3);puts(frase4);printf("\n\n\n La nueva cadena tiene \t%i caracteres\n", strlen(frase4));//convierte toda la frase4 a letras mayusculasstrupr(frase4),puts(frase4);

    getch();return 0; }

  • 7/21/2019 Unidad v Cadenas de Caracteres

    10/14

    10

    2. Disee un programa que cuenta el nmero de palabras que tiene una cadena decaracteres y, el nmero de veces que se repiten cada una de las vocales.

    I. Planteamiento del ProblemaEntrada de datos Salida de datos

    Cadena de caracteres Nmero de palabras que tiene lacadena.

    Nmero de veces que se aparecencada una de las vocales.

    II. Anlis is del Problemaa) Variables de Salida:

    Nombre Tipo Descripcin

    pal Entero Nmero de palabras que tiene la frase leda

    va Entero Nmero de vocales a que hay en la fraseve Entero Nmero de vocales e que hay en la frase

    Vi Entero Nmero de vocales i que hay en la frasevo Entero Nmero de vocales o que hay en la frase

    vu Entero Nmero de vocales u que hay en la frase

    Se imprime tambin la frase leda

    b) Variables de entrada:

    Nombre Tipo Descripcin

    frase1[100] Alfanumrico Representa la cadena o frase inicial,

    c) Restricciones: No existen, las cadenas pueden estar formadas por cualquier tipo de

    caracteres, pero deben ser frase1 de 19, frase2 de 20, frase4 de 99 caracteres como mximo;frase3 tendr tantos caracteres como se le asignen al inicio.

    d) Proceso:Para contar las palabras de una frase (por ejemplo la casa es bonita) debemos observar queentre dos palabras siempre hay un espacio en blanco; por lo tanto si contamos los espacios enblanco que tiene una cadena sabremos el nmero de palabras que sta tiene.

    Necesitamos un contador de palabras: pal (inicialmente con valor cero) y, un ciclo que comparedesde el primer carcter de la frase ( 0 ) hasta el ltimo (strlen(frase)) con un espacio en blanco.

    Recuerde que una cadena de caracteres, es un vector, por lo tanto se puede manejar carcter

    por carcter, con subndices:pal=0

    Por ejemplo: La casa es bonita tienei = 0, str len(frase), 1 frase[ i ] == ? 3 espacios en blanco

    Si: pal++

    Note que la ltima palabra de la frase (bonita del ejemplo) NOtiene espacio en blanco, por loque para imprimir pal le agregamos 1.

  • 7/21/2019 Unidad v Cadenas de Caracteres

    11/14

    11

    De la misma forma contaremos cada una de las vocales que existen en la frase en cuestin; esdecir recorriendo la cadena desde el primer carcter hasta el ltimo, buscando en cada unoletras vocales, maysculas o minsculas:

    va=0; ve=0; ve=0; vi=0; vo=0; vu=0;

    A a va++E e ve++

    I=0, s trlen(frase) frase[ i ] = I i vi++O o vo++U u vu++

    d) Variables de proceso:

    Nombre Tipo Descripcin

    i Entero Representa contador para desplazarse carcter por carcter enla cadena o frase inicial; V. inicial=0 V. cambio =1 y V. final =nmero de caracteres de la cadena (strlen(frase)),

    pal Entero Representa el nmero de palabras que tiene la frase leda

    e) Codificacin: Programa

    //Cuenta el numero de palabras que tiene una cadena y el numero de veces que se repiten lasletras a,e,i#include #include #include

    main()

    {char frase1[50];int pal=0, va=0, ve=0, vi=0, vo=0, vu=0int i;//Cuenta el numero de palabras que tiene una cadenaputs("digite una frase");gets(frase1);

    for (i=0; i

  • 7/21/2019 Unidad v Cadenas de Caracteres

    12/14

    12

    case 'i': case 'I':vi++;

    break;case 'o': case 'O':

    vo++;break;

    case 'u': case 'UI':vu++;

    break;}

    }printf("\n\n\n La frase:\t %s \t tiene \t%i palabras", frase1, pal+1);printf("\n\n Numero de letras a:\t%i", va);printf("\n\n Numero de letras e:\t%i", ve);printf("\n\n Numero de letras i:\t%i", vi);printf("\n\n Numero de letras e:\t%i", vo);printf("\n\n Numero de letras i:\t%i", vu);

    getch();return 0;

    }

    3. Disee un programa que pase las dos primeras palabras la final de una cadena.Trabaje con una cadena de varias palabras. Por ejemplo s i la frase es:

    Oscar Rene Pleitez Marroquin

    El resultado que se espera es: Pleitez Marroquin Oscar Rene

    No debe modificar la cadena inic ial.

    I. Planteamiento del ProblemaEntrada de datos Salida de datos

    Cadena de caracteres Cadena de caracteres modificada(con las dos primeras palabras al

    final).II. Anlis is del Problemaa) Variables de Salida:

    Nombre Tipo Descripcin

    aux[ ] Alfanumrica Representa la cadena de caracteres modificad, esdecir con las 2 primeras palabras al final de la misma.

    Se imprime tambin la frase leda

  • 7/21/2019 Unidad v Cadenas de Caracteres

    13/14

    13

    b) Variables de entrada:

    Nombre Tipo Descripcin

    cad[100] Alfanumrico Representa la cadena o frase inicial,

    c) Restricciones: No existen, las cadenas pueden estar formadas por cualquier tipo decaracteres, pero deben ser frase1 de 19, frase2 de 20, frase4 de 99 caracteres como mximo;

    frase3 tendr tantos caracteres como se le asignen al inicio.

    d) Proceso:Lo primero que tenemos que hacer es separar la cadena en dos:

    aux[ ]: que contendr las dos primeras palabrasaux1[ ]:que contendr de la tercera palabra en adelante.

    Para hacerlo vamos a copiar en aux solo lo n caracteres que forman las dos primeraspalabras, para lo que debemos saber el valor de nes decir, cuantos caracteres las forman:

    X= strlen(cad) //longitud de la cadenapal=0 //contador de palabras

    cad[ i ] == ?Si: pal++

    I=0,x,1 pal==2?Si: y = i // y almacena el nmero de caracteres que tienen

    // Las dos palabras primeras

    Ahora copiamos los yprimeroscaracteres de cad en aux: strncpy(aux, cad, y);

    Nos toca ahora, almacenar las restantes palabras en la cadena aux1 para lo cual:

    Primero invertimos la cadena leda con strrev (cad)

    Calculamos el nmero de caracteres de las ltimas palabras:

    z = x-y

    Copiamos los z caracteres de cad (invertida)enaux1: strncpy(aux1, cad, z)

    Invertimos aux1 para hacerla legible con: strrev(aux1)

    Invertimos cad para volver a la cadena inicial con: strrev(cad)

    Por ltimo unimos aux1 a aux y obtener la nueva cadena con: strcat(aux1, aux)

  • 7/21/2019 Unidad v Cadenas de Caracteres

    14/14

    14

    e) Programa:

    // Pasa las 2 primeras palabras de una cadena al final de la misma.#include#include#include

    main(){char cad[100], aux[50]="\0", aux1[50]="\0";int i,x,y, z, pal=0;puts("digite la cadena a trabajar");gets(cad);x=strlen(cad);for (i=0; i