Volvamos al ejemplo del capítulo 1, aquél que sumaba dos más dos. Ahora podemos comprobar si el ordenador sabe realmente sumar, le pediremos que nos muestre el resultado:
// Este programa suma 2 + 2 y muestra el resultado // No me atrevo a firmarlo #include <iostream> using namespace std; int main() { int a; a = 2 + 2; cout << "2 + 2 = " << a << endl; cin.get(); return 0; }
Espero que tu ordenador fuera capaz de realizar este complicado cálculo, el resultado debe ser:
2 + 2 = 4
Nota: si estás compilando programas para consola en un
compilador que trabaje en entorno Windows, probablemente no verás los
resultados, esto es porque cuando el programa termina se cierra la ventana de
consola automáticamente, como comentamos en el capítulo 7.
Hay varias
opciones para evitar este inconveniente. Ejecuta los programas desde una ventana
DOS, o usar la solución propuesta en el capítulo 7.
Veamos un ejemplo algo más serio, hagamos un programa que muestre el alfabeto. Para complicarlo un poco más, debe imprimir dos líneas, la primera en mayúsculas y la segunda en minúsculas. Una pista, por si no sabes cómo se codifican los caracteres en el ordenador. A cada carácter le corresponde un número, conocido como código ASCII. Ya hemos hablado del ASCII de 256 y 128 caracteres, pero lo que interesa para este ejercicio es que las letras tienen códigos ASCII correlativos según el orden alfabético. Es decir, si al carácter 'A' le corresponde el código ASCII n, al carácter 'B' le corresponderá el n+1.
// Muestra el alfabeto de mayúsculas y minúsculas #include <iostream> using namespace std; int main() { char a; // Variable auxiliar para los bucles // El bucle de las mayúsculas lo haremos con un while a = 'A'; while(a <= 'Z') cout << a++; cout << endl; // Cambio de línea // El bucle de las minúsculas lo haremos con un for for(a = 'a'; a <= 'z'; a++) cout << a; cout << endl; // Cambio de línea cin.get(); return 0; }
Tal vez eches de menos algún carácter, efectivamente la 'ñ' no sigue la norma del orden alfabético en ASCII, esto es porque el ASCII lo inventaron los anglosajones, y no se acordaron del español. De momento nos las apañaremos sin ella.
Para este ejemplo queremos que se muestren cuatro líneas, la primera con el alfabeto, pero mostrando alternativamente las letras en mayúscula y minúscula, AbCdE... La segunda igual, pero cambiando mayúsculas por minúsculas, la tercera en grupos de dos, ABcdEFgh... y la cuarta igual pero cambiando mayúsculas por minúsculas.
Para este problema tendremos que echar mano de algunas funciones estándar, concretamente de toupper y tolower, declaradas en ctype.h.
También puedes consultar el apéndice sobre librerías estándar en el apéndice C.
Piensa un poco sobre el modo de resolver el problema. Ahora te daré la solución.
Por supuesto, para cada problema existen cientos de soluciones posibles, en general, cuanto más complejo sea el problema más soluciones existirán, aunque hay problemas muy complejos que no tienen ninguna solución, en apariencia.
Bien, después de este paréntesis, vayamos con el problema. Almacenaremos el alfabeto en una cadena, no importa si almacenamos mayúsculas o minúsculas. Necesitaremos una cadena de 27 caracteres, 26 letras y el terminador de cadena.
Una vez tengamos la cadena le aplicaremos diferentes procedimientos para obtener las combinaciones del enunciado.
// Muestra el alfabeto de mayúsculas y minúsculas: // AbCdEfGhIjKlMnOpQrStUvWxYz // aBcDeFgHiJkLmNoPqRsTuVwXyZ // ABcdEFghIJklMNopQRstUVwxYZ // abCDefGHijKLmnOPqrSTuvWXyz #include <iostream> #include <cctype> using namespace std; int main() { char alfabeto[27]; // Cadena que contendrá el alfabeto int i; // variable auxiliar para los bucles // Aunque podríamos haber iniciado alfabeto directamente, // lo haremos con un blucle for(i = 0; i < 26; i++) alfabeto[i] = 'a' + i; alfabeto[26] = 0; // No olvidemos poner el fin de cadena // Aplicamos el primer procedimiento si la posición es // par convertimos el carácter a minúscula, si es impar // a mayúscula for(i = 0; alfabeto[i]; i++) if(i % 2) alfabeto[i] = tolower(alfabeto[i]); else alfabeto[i] = toupper(alfabeto[i]); cout << alfabeto << endl; // Mostrar resultado // Aplicamos el segundo procedimiento si el carácter era // una mayúscula lo cambiamos a minúscula, y viceversa for(i = 0; alfabeto[i]; i++) if(isupper(alfabeto[i])) alfabeto[i] = tolower(alfabeto[i]); else alfabeto[i] = toupper(alfabeto[i]); cout << alfabeto << endl; // Mostrar resultado // Aplicamos el tercer procedimiento, pondremos los dos // primeros caracteres directamente a mayúsculas, y // recorreremos el resto de la cadena, si el carácter // dos posiciones a la izquierda es mayúscula cambiamos // el carácter actual a minúscula, y viceversa alfabeto[0] = 'A'; alfabeto[1] = 'B'; for(i = 2; alfabeto[i]; i++) if(isupper(alfabeto[i-2])) alfabeto[i] = tolower(alfabeto[i]); else alfabeto[i] = toupper(alfabeto[i]); // Mostrar resultado: cout << alfabeto << endl; // El último procedimiento, es tan simple como aplicar // el segundo de nuevo for(i = 0; alfabeto[i]; i++) if(isupper(alfabeto[i])) alfabeto[i] = tolower(alfabeto[i]); else alfabeto[i] = toupper(alfabeto[i]); // Mostrar resultado: cout << alfabeto << endl; cin.get(); return 0; }
Bien, ahora veamos un ejemplo tradicional en todos los cursos de C y C++.
Se trata de leer caracteres desde el teclado y contar cuántos hay de cada tipo. Los tipos que deberemos contar serán: consonantes, vocales, dígitos, signos de puntuación, mayúsculas, minúsculas y espacios. Cada carácter puede pertenecer a uno o varios grupos. Los espacios son utilizados frecuentemente para contar palabras.
De nuevo tendremos que recurrir a funciones de estándar. En concreto la familia de macros is<conjunto>.
Para leer caracteres podemos usar la función getchar, perteneciente a stdio.
// Cuenta letras #include <iostream> #include <cstdio> #include <cctype> using namespace std; int main() { int consonantes = 0; int vocales = 0; int digitos = 0; int mayusculas = 0; int minusculas = 0; int espacios = 0; int puntuacion = 0; char c; // caracteres leídos desde el teclado cout << "Contaremos caracteres hasta que se pulse ^Z" << endl; while((c = getchar()) != EOF) { if(isdigit(c)) digitos++; else if(isspace(c)) espacios++; else if(ispunct(c)) puntuacion++; else if(isalpha(c)) { if(isupper(c)) mayusculas++; else minusculas++; switch(tolower(c)) { case 'a': case 'e': case 'i': case 'o': case 'u': vocales++; break; default: consonantes++; } } } cout << "Resultados:" << endl; cout << "Dígitos: " << digitos << endl; cout << "Espacios: " << espacios << endl; cout << "Puntuación: " << puntuacion << endl; cout << "Alfabéticos: " << mayusculas+minusculas << endl; cout << "Mayúsculas: " << mayusculas << endl; cout << "Minúsculas: " << minusculas << endl; cout << "Vocales: " << vocales << endl; cout << "Consonantes: " << consonantes << endl; cout << "Total: " << digitos + espacios + vocales + consonantes + puntuacion << endl; cin.get(); return 0; }
© Septiembre de 2000 Salvador Pozo, salvador@conclase.net