viernes, 8 de abril de 2011

Capitulo 6. Cadenas

Fuente:
Programación en C++ / Principios y Aplicaciones (resumen)
Carlos Romero Shollande

1.        Introducción

El C++ carece de incorporador de cadenas (string), por lo que una cadena se define como un arreglo de caracteres.

Sintaxis   : char nombre–cadena [tamaño];
Propósito : Declarar un arreglo de caracteres que terminan con un nulo.
Ejemplo   : char m[12];

El ejemplo declara que m es una cadena de 12 caracteres. El nulo se especifica como ‘\0’ y en C++ es cero; por esta razón se debe declarar arreglos de caracteres con un carácter más que la cadena más larga que vaya a guardar.
Por ejemplo, si se desea declarar un arreglo w que guarde una cadena de quince caracteres, se escribirá:  char w[16]; Esta declaración hace un lugar para un nulo al final de la cadena.
Una constante de caracteres debe encerrarse entre apóstrofes. Ejemplo: ‘t’
Una constante de cadena es una lista de caracteres que se encierra entre comillas. Ejemplo: “TECLADO”
No se necesita añadir el nulo manualmente al final de la constante de cadena, el C++ lo hace automáticamente, así la cadena anterior se verá en la memoria de la siguiente manera:

T
E
C
L
A
D
O
‘\0’

2.        Lectura de un Carácter desde Teclado

Sintaxis    : variable = char getche (void);
Archivo    : <conio.h>
Propósito  : Leer un  carácter único desde el teclado.
Ejemplo    : h = getche ();

Esta función espera hasta que se pulse una tecla y entonces devuelve el resultado.

3.        Lectura de una Cadena desde Teclado

Sintaxis    : char *gets(char *s);
Archivo    : <stdio.h>
Propósito  : Introducir  una cadena s desde teclado.
Ejemplo    : gets(w);

Se puede llamar a gets() con el nombre de la cadena, sin ningún índice como argumento y continuar leyendo caracteres hasta que se introduzca un retorno de carro.

4.        Funciones para operar cadenas 

4.1.       Copia de Cadenas

Sintaxis    : char *strcpy (char *s1, const char *s2);
                   char *strncpy (char *s1,const char *s2,int n);
Archivo    : <string.h>
Propósito  : Copiar el contenido de la constante de cadena s2 a la cadena s1; se devuelve el valor de s1. En el caso de strncpy, se copia sólo una porción de n caracteres de la cadena s2 a s1.
Ejemplo    : strcpy (g, “Feliz”);

La sentencia anterior copiará “Feliz” en g. El arreglo que forma g debe ser lo suficiente grande para guardar “Feliz”. Si g no es lo suficiente grande, el arreglo se desbordará y es probable que se dañe el programa.

4.2.       Concatenado de Cadenas

Sintaxis     : char *strcat (char *s1, const char  *s2);
                    char *strncat (char *'s1, const char *s2, int n);
Archivo     : <string.h>
Propósito   : Añadir o concatenar una copia de la constante de cadena s2 al final de la cadena s1, el primer carácter de s2 sobreescribe el carácter nulo con que termina s1; se devuelve el valor de la cadena s1. La operación no afecta a la cadena s2. En el caso de strncat, se añade solo una porción de n caracteres de la cadena s2 a s1.
Ejemplo     : strcat(g, “Navidad”);

4.3.       Comparación de Cadenas

Sintaxis     : int strcmp (const char *s1, const char *s2);
                    int strncmp (const char *s1, const char *s2, int n);
Archivo     : <string.h>
Propósito   : Comparar la cadena s1 con la cadena s2, ambas terminadas en nulo y devuelve un entero basado en la salida, de acuerdo a la tabla adjunta. En el caso de strncmp, sólo se compara una porción de n caracteres de ambas cadenas.
Ejemplo     : strcmp (c, “Grados”);

El ejemplo compara la constante de cadena “Grados” con el contenido de la cadena c.

Tabla 1. Valores alternativos de strcmp.



Valor

Significado Lexicográfico

< 0
0
> 0

s1 es menor que s2
s1 es igual a s2
s1 es mayor que s2

4.4.       Longitud de Cadenas

Sintaxis           :     unsigned int strlen (const char *s);
Archivo          :     <string.h>
Propósito       :     Devolver la longitud de la cadena terminada en nulo que define s.
                            La función no cuenta el nulo.
Ejemplo         :     cout<<strlen ("Feliz Cumpleaños");

La sentencia anterior imprime el número 16 en la pantalla.

4.5.       Conversión de Cadenas a Números

Sintaxis    : long int strtol (const char *s, char **endptr, int radix);
                   double strtod (const char *s, char **endptr);
Archivo    : <:stdlib.h>
Propósito  : Convertir la cadena de caracteres s a entero largo (strtol) o a doble punto flotante (strtod).
Ejemplo    : y = strtol (x, &endptr, 10);
                    z = strtod(x, &endptr);

El argumento radix es utilizado por strtol para asignar la base del número al cual está siendo convertida la cadena s, esta base debe estar entre 2 y 36.
Para detectar posibles errores se utiliza el argumento &endptr, el mismo que debe definirse previamente como: char *endptr;

4.6.       Conversión de Números a Cadenas

Sintaxis     : char *itoa (int v, char *s, int. radix);
                    char *ltoa (long int v, char *s, int radix);
Archivo     : <stdlib.h>
Propósito   : Convertir un entero (itoa) o entero largo (ltoa) v a cadena de caracteres s.
Ejemplo     : itoa(a, g, 10);

El argumento radix es empleado para especificar la base del número v, a la cual está siendo convertida la cadena s, esta base debe estar entre 2 y 36.

4.7.       Inversión de los Caracteres de una Cadena

Sintaxis     : char *strrev (char *s);
Archivo     : <string.h>
Propósito   : Invertir todos los caracteres de una cadena en orden inverso, excepto el carácter de terminación NULO.
Ejemplo     : strrev (k);

4.8.       Inserción de un Carácter a una Cadena

Sintaxis     : char *strset (char *s, int c);
                    char *strnset (char *s, int c, int n);
Archivo     : <string,h>
Propósito   : Copiar el carácter c en toda la cadena s. En el caso de strnset copia el carácter c en los primeros n caracteres de s.
Ejemplo     : strnset (k, ‘*’, 4);

4.9.       Código ASCII de un Carácter

Sintaxis     : int toascii (int c);
Archivo     : <ctype.h>
Propósito   : Obtener el código ASCII que le corresponde al carácter c.
Ejemplo     : toascii (v);

Para hacer esta operación también se utiliza el formato: codigo = int(c).
Para obtener el carácter c que corresponde a un código ASCII se usa el formato: c = char(codigo);

5.        Borrado de una Porción de Línea

Sintaxis     : void clreol (void);
Archivo     : <conio.h>
Propósito   : Borrar una línea, de izquierda a derecha, desde la posición actual del cursor hasta el final de la línea. Esta es una función de control de consola.
Ejemplo     : clreol();

6.             Funciones para cambiar caracteres a mayúsculas o minúsculas

6.1.       Cambio de un Carácter a Minúscula

Sintaxis     : int tolower (int c);
Archivo     : <ctype,h>
Propósito   : Devolver el equivalente de c en minúsculas, si c es una letra. En caso de que c no sea una letra, no se realizarán cambios.
Ejemplo     : cout<<tolower (‘W’);

El ejemplo anterior imprime en pantalla el carácter w.

6.2.       Cambio de un Carácter a Mayúsculas

Sintaxis     : int toupper (int c);
Archivo     : <ctype.h>
Propósito   : Devolver el equivalente de c en mayúsculas, si c es una letra. En caso de que c no sea letra, no se realizarán cambios.
Ejemplo     : cout<<toupper (‘t’);

Este ejemplo imprime en pantalla el carácter T.

7.             Funciones para cambiar cadenas a mayúsculas o minúsculas

7.1.       Cambio de una Cadena a Minúsculas

Sintaxis     : int *strlwr (char *s);
Archivo     : <string.h>
Propósito   : Devolver el equivalente de todos los caracteres de s en minúsculas. En caso de que algún carácter no sea letra, no se realizan cambios.
Ejemplo     : cout<<strlwr (“PERSONAL 2002”);

El ejemplo anterior imprime en pantalla la cadena: personal 2002.

7.2.       Cambio de una Cadena a Mayúsculas

Sintaxis     : int *strupr (char *s);
Archivo     : <string.h>
Propósito   : Devolver el equivalente de todos los caracteres de s en mayúsculas. En caso de que alguno de los caracteres no sea una letra, no se realizarán cambios.
Ejemplo     : cout<<strupr (‘Programa # 53’);

El ejemplo anterior imprime en pantalla la cadena: PROGRAMA # 53. 

8.        Arreglos de Cadenas

Sintaxis      : char nombre_arreglo [tam_arr] [lon_cad];
Propósito    : Declarar un arreglo de cadenas, que es un arreglo de caracteres de dos dimensiones, en la que el índice izquierdo indica el número de cadenas y el índice de la derecha especifica la longitud máxima de cada cadena.
Ejemplo      : char y[20][50];

El ejemplo indica que y cuenta con un máximo de 20 cadenas y cada cadena tiene un máximo de 50 caracteres. El acceso a una cadena individual se especifica solamente con el índice izquierdo.
Ejemplo: gets (Y[i]);

9.        Inicialización de Cadenas

Sintaxis     : char nomb_cadena [tam] = {lista_caract};
Propósito   : Inicializar cadenas en forma global.
Ejemplo     : char w[5] ={‘l’, ‘u’, ‘n’, ‘a’, ‘\0’);

Los arreglos de caracteres que guardan cadenas permiten una inicialización abreviada que tiene la forma: char nombre_cadena [tamaño] = “cadena”;
Ejemplo:  char w[5] = “luna”;
Este fragmento de código inicializa w a “luna”:
El C++ también puede dimensionar automáticamente las cadenas, usando arreglos sin tamaño. Ejemplo: char g[ ] = “Autorización denegada”;

Ejemplo:

Elabore un programa que permita auto generar el código de identificación de un asegurado de EsSalud, el mismo que consiste en lo siguiente:

-      Los dos primeros dígitos de la izquierda pertenecen al año, los dos segundos al mes y los dos siguientes al día de nacimiento.
-       El sétimo dígito pertenece al sexo. Si es varón le corresponde el 1, en caso contrario el 0.
-   Aparecen a continuación cuatro caracteres que corresponden a la primera y cuarta letra de los apellidos paterno y materno respectivamente y una quinta letra que corresponde a la primera letra del primer nombre.
-      Los tres últimos dígitos corresponden a un número aleatorio entero entre 001 y 333.

Codificación:
#include <iostream.h> // CODIGO DE ESSALUD
#include <conio.h>
#include <stdio.h>
#include <ctype.h>
#ínclude <stdIib.h>
#include <string.h>
main()    {
int r;                         // Número aleatorio entre 1 y 333
int i;                         // Subíndice de la cadena del código de afiliación a EsSalud
int t;                         // Variable auxiliar para almacenar número aleatorio temporalmente
int z;                        // Número de caracteres de los apellidos paterno y materno
long int  y;              // Año o mes o día de nacimiento en números
char ap[20];            // Apellido paterno
char am[20];           // Apellido materno
char nom[20];              // Nombres
char an[5];              // Año de nacimiento en caracteres
char mn[3];             // Mes de nacimiento en caracteres
char dn[3];              // Día de nacimiento en caracteres
char s1[7];              // Primera subcadena del código de afiliación a EsSalud
char s2[8];              // Segunda subcadena del código de afiliación a EsSalud
char g[4];               // Número aleatorio en caracteres
char h;                    // Carácter que define al sexo
char *endptr;
clrscr();
gotoxy(5,2); cout<<”Fecha de nacimiento”;
ban1:
gotoxy(5,4); cout<<”Año (entre 1800 y 2000) : “;
gotoxy(32,4); gets(an);
y = strto1(an, &endptr, 10);
if (y<1800 || y>2000)    {
gotoxy(5,4); clreoI();
goto ban1;       }
s1[0] = an[2];   s1[1] = an[3];
ban2:
gotoxy(5,5); cout<<”Mes (2 dígitos) : “;
gotoxy(32,5); gets(mn);
y = strtol(mn, &endptr, 10);
if (y<1 || y> 12)    {
gotoxy(5,5); clreoI();
goto ban2;       }
s1[2] = mn[0];   s1[3] = mn[1];
ban3:
gotoxy(5,6); cout<<”Día {2 dígitos) : “;
gotoxy(32,6); gets(dn);
y = strtol(dn, &endptr, 10);
if (y<1 || y>31)    {
gotoxy(5,6); clreoI();
goto ban3;       }
s1[4] = dn[0];   s1[5] = dn[1];
ban4:
gotoxy(5,8); cout<<”Sexo (M/F)    : “;
gotoxy(32,8 ); h = toupper(getche());
íf (h != ‘M’ && h != ‘F’)    {
gotoxy(5,8); clreol();
goto ban4;       }
íf (h == ‘M’) h = ‘1’;
else h = ‘0’;
s1[6] = h;
clrscr();
cout<<”Apellido paterno: “;   gets(ap);
strcpy (ap, strupr (ap) );
s2[0] = ap[0];
z = strlen(ap);
if(z>=4) s2[1] = ap[3];
else s2[1] = ‘0’;cout<<”Apellido materno: “;   gets{am);
strcpy(am, strupr(am));
s2{2] = am[0];
z = strlen(am);
if(z>=4) s2[3] = am[3];
else s2[3] = ‘0’;
cout<<”Nombres :   “;   gets(nom);
strcpy(norn, strupr(nom));
s2[4] = nom[0];
randomize();   r = rand()%>333+1;   itoa(r, g, 10);     t = r;
if(t<10)    {
s2[5] = ‘0’;   s2[6] = ‘0’;   s2[7] = g[0];         }
else               {
if (t<100)    {
s2[5] = ‘0’;   s2[6] = g[0];
if (t%10==0) s2[7] = ‘0’;
else s2[7] = g[1]; }
else    {
s2[5] = g[0];
if (t%10==0) s2[7] = ‘0’;
else s2[7] = g[2];
t=t/10;
if (t%10==0) s2[6] = ‘0’;
else s2[6] = g[1];       }
}
strcat (s1, s2);
clrscr();
gotoxy (10,6); cout<<”Código EsSalud : “;
for(i=0; i<l5; i++) cout<<s1[i];
getch();
}

No hay comentarios:

Publicar un comentario