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:
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