EJEMPLO 9.1

#include #include using namespace std; int main(int argc, char *argv[]) { char S[]="Lucas";// cadena estática inicializada a 5 caracteres y nulo char S1[12] = " nombre:";

cout << S1 << endl << endl;

for (int i = 0; i < 6; i++) cout << " S[" << i << "] = " << S[i] << "\n"; system("PAUSE"); return EXIT_SUCCESS; }

En el resultado de ejecución aparece S[5] = carácter nulo que es no imprimible:

EJEMPLO 9.2

#include #include using namespace std;

int main(int argc, char *argv[]) { char Ejemplo[31]; // Definir array de caracteres

cout << " introduzca frase \n "; cin.getline(Ejemplo,30); // lectura de cadena completa cout << "\t\"" << Ejemplo << "\"\n"; cout << " introduzca otra frase \n "; cin >> Ejemplo; // lectura de palabra hasta encontrar blanco cout << "\t\"" << Ejemplo << "\"\n"; system("PAUSE"); return EXIT_SUCCESS; }

Resultado de ejecución:

1 EJEMPLO 9.3 #include #include using namespace std; struct registro { char Nombre_y_apellidos[51]; char Calle[33], Poblacion[28]; char Provincia[28], Pais[21], Codigo_Postal[8]; }r;

void Leer_registro(registro &r) { cout << " Lectura de datos \n"; cout<<" Nombre y apellidos: ";cin.getline(r.Nombre_y_apellidos, 50); cout << " Calle: "; cin.getline(r.Calle, 32); cout << " Poblacion: "; cin.getline(r.Poblacion,27); cout << " Provincia: "; cin.getline(r.Provincia, 27); cout << " Pais: "; cin.getline(r.Pais, 20); cout << " Codigo Postal: "; cin.getline(r.Codigo_Postal, 7); } void Escribir_registro(registro r) { cout << " \n Visualizacion de datos \n \n"; cout << " " << r.Nombre_y_apellidos << endl; cout << " " << r.Calle << endl;; cout << " " << r.Poblacion << endl; cout << " " << r.Provincia << endl; cout << " " << r.Pais << endl; cout << " " << r.Codigo_Postal << endl; } int main(int argc, char *argv[]) { Leer_registro(r); Escribir_registro(r); system("PAUSE"); return EXIT_SUCCESS; }

Resultados de ejecución:

.

2 EJEMPLO 9.4. #include #include using namespace std; bool esvocal(char ch) { ch= toupper(ch); return ( ch == 'A' || ch == 'E' ||ch == 'I' ||ch == 'O' ||ch == 'U'); } int main(int argc, char *argv[]) { char ch; int cuenta = 0;

while (cin.get(ch)) if (esvocal(ch)) cuenta++; cout << " numero de vocales leidas "<< cuenta << "\n"; system("PAUSE"); return EXIT_SUCCESS; }

Un resultado de ejecución es:

EJEMPLO 9.5

#include #include using namespace std; bool esvocal(char ch) { ch= toupper(ch); return ( ch == 'A' || ch == 'E' ||ch == 'I' ||ch == 'O' ||ch == 'U'); } int main(int argc, char *argv[]) { char ch;

while (cin.get(ch)) { if (esvocal(ch)) // es una vocal cout.put(tolower(ch)); // escribe en minúscula else if(isalpha(ch)) // es letra cout.put(toupper(ch)); // escribe minúscula else cout.put(ch); // escribe como se lee } system("PAUSE"); return EXIT_SUCCESS; } Ejemplo de ejecución:

3 .

EJEMPLO 9.6 #include #include using namespace std; float siguienteReal() { // busca el primer caracter dígito y lee el número real char ch; float r;

while (cin.get(ch)) if (ch >= '0' && ch <= '9') { cin.putback(ch); // restaura cin >> r; // lee dato real break; } return r; } int main(int argc, char *argv[]) { float r1, r2; char ch;

cout <<"intoduzca linea con dos numeros a sumar control+z fin \n"; while(cin.get(ch)) { cin.putback(ch); // restaura para leer reales r1 = siguienteReal(), r2 = siguienteReal(); cin.ignore(80,'\n'); // salta hasta fin línea cout << r1 << " + " << r2 << " = " << r1 + r2 << endl; } system("PAUSE"); return EXIT_SUCCESS; }

EJEMPLO 9.7 void getline2 (char* cadena, int n) { char c, *p = cadena; int i = 0;

while (( cin.get(c)) && (c != '\n') && (i < n)) { *p++ = c; i++;

4 } *p = '\0'; } void getline2 (char* cadena, int n, char ch) { char c, *p = cadena; int i = 0;

while (( cin.get(c)) && (c != ch) && (i < n)) { *p++ = c; i++; } *p = '\0'; }

EJEMPLO 9.8 char * strcpya( char * destino, const char* origen) { int lon = strlen(origen); // se calcula longitud

destino = new char [lon + 1]; // se reserva memoria for (int i = 0; i < lon; i++) //se copia carácter a carácter destino[i]= origen[i]; destino[lon] = '\0'; // se añade fin decadena return destino; // retorno de la copia }

EJEMPLO 9.9

#include #include using namespace std; #define max 60 int main(int argc, char *argv[]) { char texto[max][81]; int i = 0, j, lon, int longmax = 0, posmax, longmin = 81, posmin; char linea [80];

while (i < max) { cin.getline(linea, 80); lon = strlen(linea); if ( lon == 0) break; if (lon < longmin) { posmin = i; longmin = strlen(linea); } if (lon > longmax) { posmax = i; longmax = strlen (linea); } strcpy (texto [i], linea);

5 i++; }

strcpy (linea, texto[posmin]); strcpy (texto[posmin], texto[posmax]); strcpy (texto[posmax], linea); cout << " texto intercambiado \n"; for (j = 0; j < i ; j++) cout << texto[j] << endl;

system("PAUSE"); return EXIT_SUCCESS; }

EJEMPLO 9.10

#include #include using namespace std; int main(int argc, char *argv[]) { char buffer [80], *ptr; int kilos, suma = 0, sumalinea;

cout << " Introduzca el texto linea a linea. \n"; for (; ; ) { sumalinea = 0; cin.getline(buffer, 80); if (strlen(buffer) == 0) break; // salida del bucle ptr = strtok(buffer, " "); while (ptr) { if ((kilos = atoi (ptr)) != 0) sumalinea += kilos; ptr = strtok(NULL, " "); } cout << " La suma de kg en linea es: " << sumalinea << endl; suma += sumalinea; } cout << " La suma de kg de todas las lineas es: " << suma << endl; system("PAUSE"); }

Un resultado de ejecución es el siguiente:

EJEMPLO 9.11 #include #include using namespace std;

6 int main(int argc, char *argv[]) { char *cadena= " 32 111"; char **pcadena = new(char*) ; long numero1; unsigned long numero2;

numero1 = strtol (cadena,pcadena,4); // extrae numero en base 4 cout << " numero = "<< numero1 << endl; cout << " cadena actual "<< *pcadena << endl; cadena = *pcadena; numero2 = strtoul (cadena, pcadena,2); // extrae numero en base 2 cout << " n2 = "<< numero2 << endl; system("PAUSE"); return EXIT_SUCCESS; }

Resultado de ejecución:

EJERCICIO 9.1

Todas las declaraciones realizan inicializaciones de array de caracteres a cadenas, excepto la declaración correspondiente a var_cad1, que inicializa un array de caracteres, simplemente, ya que no termina en el carácter nulo '\0'. Son equivalentes las inicializaciones de las variables var_cad0 y var_cad2 entre sí, ya que la primera se inicializa a una constante cadena, y la segunda se inicializa cada posición del array a los mismos caracteres terminando en el carácter nulo. También son equivalentes las inicializaciones de var_cad3 y var_cad4, a pesar de que la segunda inicialización es de un array indeterminado.

EJERCICIO 9.2 #include #include using namespace std; int main(int argc, char *argv[]) { char var_cad[]= "Hola";

strcat(var_cad, " y adios"); cout << var_cad<< endl; system("PAUSE"); return EXIT_SUCCESS; }

EJERCICIO 9.3

#include #include using namespace std; typedef char cadena80[80];

7 int Longitud(cadena80 &cad) { int contador = 0;

while (cad[contador] != '\0') contador ++; return contador; } int main(int argc, char *argv[]) { cadena80 cad = "C++ es mejor que C";

cout << "longtud de " << cad<< " = " << Longitud(cad) << endl;

system("PAUSE"); return EXIT_SUCCESS; }

EJERCICIO 9.4

La variable c1 es una variable puntero que apunta a un puntero de caracteres. La variable c2 es un array de 10 punteros a caracteres. La variable c3 es una matriz con espacio para 210 punteros a caracteres accesibles según un arreglo de 10 filas de 21 elementos cada una de ellas.

EJERCICIO 9.5 int main(int argc, char *argv[]) { char s1[81], s2[81];

cout << " introduzca cadena :"; cin.getline(s1,80); cout << " introduzca cadena :"; cin.getline(s2,80); cout << " Antes de strcat(s1, s2): \n"; cout<< " s1 = \"" << s1 << "\", longitud = "<

Resultado de ejecución:

EJERCICIO 9.6 include #include using namespace std;

8 char asignatura [N][21], codigo [N][7]; void leer(char asignatura[][21], char codigo[][7], int n) { for (int i = 0; i<= n; i++) { cout << " Escriba el nombre de la asignatura: " << i + 1 << " "; cin.getline (asignatura [i],20); cout << " Escriba el código de la asignatura: " << i + 1 << " "; cin.getline(codigo [i], 6); } }

#define N 50 int main(int argc, char *argv[]) { ..... system("PAUSE"); return EXIT_SUCCESS; }

EJERCICIO 9.7 void escribir(char asignatura[][21], char codigo[][7], int n) { for (int i = 0; i<= n; i++) { cout<< " nombre de la asignatura: " <

#include #include using namespace std; int main(int argc, char *argv[]) { char cadena[41] ;

cout << "deme cadena "; cin.getline(cadena,40); strrev(cadena); cout << "Cadena invertida \n" << cadena << endl; system("PAUSE"); return EXIT_SUCCESS; }

PROBLEMA 9.1 include

9 #include using namespace std; long int Hexadecimal_a_enterolargo(char Hexa[]) { //cambia el número escrito en 16 como cadena de caracteres a base //10 como entero largo int Valordigito, c = 0, base = 16; long int numero = 0;

for (; Hexa[c]; c++)//mientras quede dígito en número en hexadecimal { if ((Hexa[c] >= '0') && (Hexa[c] <= '9')) //es dígito Valordigito = Hexa[c]-'0'; else + 10; if ((0 <= Valordigito) && //es carácter Valordigito = Hexa[c] -'A' (Valordigito < base)) //comprobación de dato numero = numero * base + Valordigito; else cout <<" error \n"; //no está bien escrito en la base 16 } return numero; } int main(int argc, char *argv[]) { char Hexa[]= "12A"; cout << Hexadecimal_a_enterolargo( Hexa) << endl; system("PAUSE"); return EXIT_SUCCESS; }

Resultado de ejecución:

PROBLEMA 9.2

#include #include using namespace std; typedef char linea[81] ; linea *text; void Leer_Texto (linea tex[], int n) { for (int i = 0; i < n; i++) cin.getline(tex[i],80); } void Escribir_Texto (linea tex[], int n) { for (int i = 0; i < n; i++) cout << tex[i] << endl; } int main(int argc, char *argv[]) {

10 cout << " introduzca texto\n"; text = new linea[4]; Leer_Texto( text, 4); cout << " Texto leido texto\n"; Escribir_Texto(text,4); system("PAUSE"); return EXIT_SUCCESS; }

PROBLEMA 9.3

#include #include #define max 100 using namespace std; int main(int argc, char *argv[])

{ char *TextoEntrada[max]; char linea [81], *ptr; int kilos, suma = 0;

cout << " Introduzca el TextoEntrada linea a linea. \n"; for (int i = 0; i < max ; i++) { cin.getline(linea, 80); TextoEntrada[i] = new char[strlen(linea)+1];//espacio para linea strcpy(TextoEntrada[1], linea); // copia linea en texto ptr = strtok(linea, " "); // busca prime blanco while (ptr) { kilos = atoi (p ptr = strtok(NULL tr); // convienrte a entero suma += kilos;, " "); // búsqueda de siguiente } } cout << " texto leido \n"; for (int i = 0; i < max ; i++) // visualización del texto. cout << TextoEntrada[i]<< endl; cout << " La suma de kg de todas las lineas es: " << suma << endl; system("PAUSE"); }

PROBLEMA 9.4 void cuentaLetras ( char* cadena, int &voc, int &con, int &dig) { char * p = cadena;

voc = con = dig = 0; while (*p != '\0') { char ch = tolower(*p); // convierte en letra mayúscula if (isupper(ch)) // si es letra mayúscula switch (ch) { case 'A': case 'E': case 'I': case 'O': case 'U': voc ++;

11 break; default : con ++; } else if (isdigit(ch)) // es un dígito dig++; p++; } }

PROBLEMA 9.5

#include #include using namespace std; char * tolowercad(char cad[81]) { // pasa todas las letras a minúsculas for(int i = 0; i < strlen(cad); i++) cad[i] = tolower(cad[i]); return cad; } int main(int argc, char *argv[]) { char *cad1, *cad2, buffer[81]; int letras1[28], letras2[28], i; bool sw = true;

cout << " introduzca cadena: "; cin.getline(buffer,80); cad1 = tolowercad(buffer); cout << " introduzca cadena: "; cin.getline(buffer,80); cad2 = tolowercad(buffer); for (i = 0; i < 28 ; i++) letras1[i] = letras2[i] = 0; for (i = 0; i < strlen(cad1); i++) if (islower (cad1[i])) letras1[cad1[i] - 'a']++; for (i = 0; i < strlen(cad1); i++) if (islower (cad1[i])) letras2[cad1[i] - 'a']++; for (i = 0; (i < 28) && sw; i++) if (letras1[i] != letras2[i]) sw = false; if(sw) cout << "Las cadenas introducidas son anagramas. \n"; else cout << "Las cadenas introducidas no son anagramas. \n"; system("PAUSE"); return EXIT_SUCCESS; }

PROBLEMA 9.6

#include #include using namespace std; void saltablanco( char *cad, int &i)

12 { while (cad[i] == ' ' && i <= strlen(cad))//busca carácter<>de blanco i++; } void saltapalabra(char *cad, int &i) { while (cad[i] != ' ' && i <= strlen(cad)) //busca carácter blanco i++; } int main(int argc, char *argv[]) { char cad[81]; int i, n, total = 0;

cout << " Introduzca lineas, separando las palabras con blancos.\n"; cin.getline (cad,80); while ((*cad) != NULL) // hay línea { i = n = 0; // comienza el tratamiento de una nueva línea saltablanco(cad,i); for (; i <= strlen(cad); i++) { saltapalabra(cad,i); saltablanco(cad,i); n++; // una palabra más } cout << " \t\t\"" <

Un resultado de ejecución es el siguiente:

PROBLEMA 9.7

#include #include using namespace std; #define max 30 int main(int argc, char *argv[]) { char * arraydelineas[30], linea [81], clave[16] ,*punteroL; int i, numero_de_veces = 0;

cout << " Introduzca la palabra clave a buscar: " << endl; cint.getline(clave,15);

13 for (i = 0; i < max ; i++) { cin.getline(linea, 80); if (strlen(linea) == 0)break; // fin de datos arraydelineas [i] = new char [strlen (linea ) +1]; strcpy (arraydelineas [i], linea); punteroL = arraydelineas[i]; while ((punteroL = strstr (punteroL, clave)) != NULL) { punteroL++; // avanza una posición el puntero numero_de_veces++; } }

cout<< "La palabra clave" << clave << " aparece "; cout << numero_de_veces << " en el text.\n"; system("PAUSE"); return EXIT_SUCCESS; }

PROBLEMA 9.8

#include #include #define max 40 using namespace std; void leer_texto(char* arraydelineas[],int ll[][2],int &i) { i = 0; char linea[81]; cout << " Introduzca el texto linea a linea. \n"; while (i < max ) { cin.getline(linea, 80); if (strlen(linea)==0) break; arraydelineas [i] = new char [strlen (linea ) +1]; strcpy (arraydelineas[i], linea); ll [i][0] = strlen (linea ); ll [i][1] = i; i++; } }

void escribir_texto(char* arraydelineas[], int ll[][2], int n) { for ( int i = 0; i < n ; i++) cout << arraydelineas[ ll[i][1]] << endl;//indexación salida }

void ordenar (int ll[][2], int n) { //método de ordenación por burbuja int aux;

for (int i = 0; i < n - 1; i++) for (int j = 0; j < n - i - 1; j++) if (ll[j][0] > ll[j + 1][0]) {

14 aux = ll[j][0]; ll[j][0]=ll[j + 1][0]; ll[j + 1][0]= aux; aux = ll[j][1]; ll[j][1]=ll[j + 1][1]; ll[j + 1][1]= aux; } }

int main(int argc, char *argv[]) { char* arraydelineas[max]; int longitudlineas[max][2], i;

leer_texto(arraydelineas,longitudlineas, i); ordenar (longitudlineas, i); cout << " texto leido ordenado por longitud de lineas \n"; escribir_texto(arraydelineas, longitudlineas, i); system("PAUSE"); return EXIT_SUCCESS; }

Resultado de una posible ejecución

PROBLEMA 9.9

#include #include #define max 100 using namespace std; int main(int argc, char *argv[]) { char* texto[50], buffer [81], clave[16], *ptr; int i = 0, j = 0;

cout << " Introduzca la palabra clave a buscar: "; cin.getline(clave,15);

while (i < 50 ) { cin.getline(buffer,80); ptr = buffer; if (strstr (ptr, clave) == NULL) //no está en línea almacenarla { texto [j] = new char[strlen (buffer ) +1];

15 strcpy (texto [j], buffer); j++; } i++; } cout << " texto con lineas elminadas "<< endl; for (i = 0; I < j; i++) cout << texto [i] << endl; system("PAUSE"); return EXIT_SUCCESS; }

PROBLEMA 9.10

#include #include using namespace std; char * reverse (char * cadena) { char* rcadena; int i, lon;

lon = strlen(cadena); rcadena = new char[lon+1]; for(int i = 0; i < lon; i++) rcadena[lon - i - 1] = cadena[i]; rcadena[lon] = '\0'; return rcadena; } int main(int argc, char *argv[]) { cout << "ABCD"<< " invertida "<< reverse( "ABCD")<< endl; system("PAUSE"); return EXIT_SUCCESS; }

PROBLEMA 9.11 char *ampliacaracter( char *cadena, int lon, char ch) { char * acadena = new char[lon +1];

strcpy(acadena,cadena); for (int i = strlen(cadena); i< lon; i++) acadena[i]= ch; acadena[lon] = '\0'; return acadena; } int main(int argc, char *argv[]) { cout << "ABCD" << " "<< ampliacaracter("ABCD", 7, 'X')<< endl; cout << "ABCD" << " "<< ampliacaracter("ABCD", 2, 'X')<< endl; system("PAUSE"); return EXIT_SUCCESS; }

16 Resultado de ejecución del programa:

PROBLEMA 9.12

#include #include using namespace std; char * reverse (char * cadena) { char* rcadena; int i, lon;

lon = strlen(cadena); rcadena = new char[lon+1];

for(int i = 0; i < lon; i++) rcadena[lon - i - 1] = cadena[i]; rcadena[lon] = '\0'; return rcadena; } char *ampliacaracter( char *cadena, int lon, char ch) { char * acadena = new char[lon +1];

strcpy(acadena,cadena); for (int i = strlen(cadena); i< lon; i++) acadena[i]= ch; acadena[lon] = '\0'; return acadena; } char* SumarGrandes (char* numero1, char* numero2) { char* rnumero1, * rnumero2, *resultado; int i, mayor, acarreo = 0;

rnumero1 = reverse (numero1); rnumero2 = reverse (numero2); if (strlen (numero1) > strlen (numero2)) mayor = strlen (numero1); else mayor = strlen (numero2); resultado = new char[mayor +2]; // reserva de memoria para la suma *resultado = '\0'; // cadena vacía rnumero1 = ampliacaracter(rnumero1, mayor,'0'); // rellena con ceros rnumero2 = ampliacaracter(rnumero2, mayor,'0'); // rellena con ceros resultado =ampliacaracter(resultado,mayor+1,'0');//rellena con ceros // realización de la suma.

for (i = 0; i < mayor; i++) { // realización de la suma por el algoritmo estandar resultado[i]=(rnumero1[i]-'0'+rnumero2[i]-'0'+acarreo) % 10 +'0'; acarreo = (rnumero1[i] - '0'+ rnumero2[i]-'0'+ acarreo) / 10 ; }

17 if(acarreo > 0) resultado[mayor] = '0' + acarreo; else resultado[mayor] = '\0'; // el resultado tiene un carácter menos return reverse(resultado); } int main(int argc, char *argv[]) { cout << "55524" << " + " << "56789" << " = "; cout << SumarGrandes( "55524", "56789") << endl; cout <<"24" << " + " << "2463" << " = "; cout << leerGrandes( "24", "2463")<< endl; system("PAUSE"); return EXIT_SUCCESS; }

Resultado de ejecución:

PROBLEMA 9.13 char * multiplica_digito (char* numero, char dig) { char* rnumero, *resultado;

int i, lon, acarreo = 0, d, valor; rnumero = reverse (numero); lon = strlen (numero); resultado = new char[lon +2]; // reserva de memoria para la suma *resultado = '\0'; // cadena vacía resultado=ampliacaracter(resultado, lon+1,'0');//rellena con ceros // realización del producto d = dig - '0'; for (i = 0; i < lon; i++) { // realización del producto por el algoritmo estandar valor = (rnumero[i]-'0')*d + acarreo; resultado[i] = '0'+ valor % 10; acarreo = valor / 10 ; } if(acarreo > 0) resultado[lon] = '0' + acarreo; else resultado[lon] = '\0'; // el resultado tiene un carácter menos return reverse(resultado); }

PROBLEMA 9.14 char * multiplica_grandes (char* numero1, char *numero2) { char *resultado, *sumando; int i, lon2 = strlen(numero2);

resultado = new char; *resultado = '\0';

for (i = lon2-1; i >= 0; i--)

18 { sumando = multiplica_digito(numero1,numero2[i]); sumando = ampliacaracter(sumando,strlen(sumando)+ lon2 - i - 1,'0'); resultado = SumarGrandes(resultado, sumando); } return resultado; } int main(int argc, char *argv[]) { cout << "resultado: " "2457" << " X " << " 659 =+"; cout << multiplica_grandes("2457", "659")<< endl; system("PAUSE"); return EXIT_SUCCESS; }

Un resultado de ejecución es el siguiente:

PROBLEMA 9.15

#include #include using namespace std; char *ampliacaracter( char *cadena, int lon, char ch) { // codificada en el ejercicio 9.11 } int main(int argc, char *argv[]) { char* texto[100], buffer [81], *ptr; int i, j, mayor =-1;

cout << " Introduzca el texto linea a linea.\n";

for (i = 0; i < 100 ; i++) { cin.getline(buffer, 80); texto [i] = new char[80]; strcpy (texto[i], buffer); if (mayor < strlen (buffer)) mayor = strlen (buffer); } // rellenado con blancos for (i = 0; i < 100 ; i++) ampliacaracter(texto[i], mayor,' '); // visualización del texto. for (i = 0; i < 100 ; i++) cout << texto[i] << endl; system("PAUSE"); return EXIT_SUCCESS; }

19