Ejemplos capítulos (Leccion) 8 y 9
Ejemplo 9.1
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;
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. Por ejemplo, ejecutar los programas desde una ventana de consola, o añadir líneas al código que detengan la ejecución del programa, como cin.get() o system("pause").
Otros IDEs, como Code::Blocks, no tienen ese inconveniente. |
Ejemplo 9.2
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
return 0;
} |
Ejecutar este código en codepad.
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.
Ejemplo 9.3
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.
También puedes consultar el apéndice sobre bibliotecas 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 bucle
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]);
alfabeto[i] = toupper(alfabeto[i]);
// Mostrar resultado:
cout << alfabeto << endl;
return 0;
} |
Ejecutar este código en codepad.
Ejemplo 9.4
Bien, ahora veamos un ejemplo tradicional en todos los cursos de 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 '&'"
<< endl;
while((c = getchar()) != '&')
{
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;
return 0;
} |
Comentarios