En la sección anterior, vimos un ejemplo de programa que llamamos HolaMundo.cpp
. Reproducimos este programa a continuación:
#include <iostream> using namespace std; int main() { cout << "Hola mundo!" << endl; return 0; }
En esta sección, experimentaremos un poco con posibles cambios al mismo, para ver el comportamiento que resulta de los cambios.
Un cambio muy sencillo que podemos hacer a cualquier programa es el de agregar comentarios.
Un comentario es una aclaración en forma de texto, para ser leída por un humano, y que el compilador ignora por completo. De esta forma, el comportamiento de nuestros programas no cambia en lo más mínimo por agregar y sacar comentarios. Los comentarios son simplemente una forma de ordenarse a la hora de programar, o bien de clarificar cosas que podrían no entenderse cuando otra persona lea el código. Es decir, se utilizan para aumentar la claridad del programa y hacerlo más fácil de leer.
La forma más común de comentarios son los comentarios de una línea, y se obtienen utilizando
en alguna línea, todo lo que sigue en esa misma línea es completamente ignorado por el compilador, que lo considerará un comentario.
. Cuando se coloca
Otra forma de realizar comentarios menos común es a través de los comentarios multilínea, que comienzan con /*
y finalizan con */
.
Veamos un ejemplo del HolaMundo.cpp
con comentarios agregados:
#include <iostream> using namespace std; // Esto es solo por comodidad, nos sirve para no poner std:: todo el tiempo. int main() { /* Esto es un comentario de multiples lineas. * Notar que por belleza estetica, estamos comenzando todas las lineas con * un "*", para que parezca un 'margen' o 'borde' desde el cual escribir. * Como todo esto esta encerrado entre los extremos de un comentario multilinea, * da igual cualquier cosa que escribamos, y el compilador lo ignorara por completo. int main () { return 5; } Notar que lo anterior, aunque parezca codigo fuente c++, no se ejecuta nunca: Seguimos estando adentro del comentario. */ cout << "Hola mundo!" << endl; // Esta linea si la tendra en cuenta el compilador, salvo por este comentario return 0; }
Si compilamos (F9) y ejecutamos (F5) este programa modificado, veremos que hace lo mismo que el anterior: Los comentarios no afectan en nada.
En HolaMundo.cpp
, damos a la computadora la instrucción de imprimir una línea con el texto Hola mundo!
. Pero podríamos perfectamente escribir una secuencia de órdenes, escribiendo muchas cosas:
#include <iostream> using namespace std; int main() { cout << "Hola mundo!" << endl; cout << "Estamos comenzando a realizar programas propios. WOW!" << endl; cout << endl; // Dejamos una linea en blanco: Pasamos a la siguiente directamente cout << "Esto va a salir en "; cout << "una"; cout << " sola linea " << "sin" << " importar el"; cout << " hecho de que le vamos tirando el texto en partes." << endl; cout << "Solamente cuando usamos endl para cambiar de linea," << endl; cout << "cout pasa a la linea siguiente" << endl; return 0; }
Notar que en este caso, terminamos todas las instrucciones con el correspondiente ;
. Como las instrucciones son ejecutadas desde arriba hacia abajo, y de izquierda a derecha, (en el mismo orden en que se leen los textos en español), cuando compilemos y ejecutemos el programa anterior obtendremos lo siguiente como resultado:
Hola mundo! Estamos comenzando a realizar programas propios. WOW! Esto va a salir en una sola linea sin importar el hecho de que le vamos tirando el texto en partes. Solamente cuando usamos endl para cambiar de linea, cout pasa a la linea siguiente
Es posible que al ejecutar esto con Geany, en la ventana parezca que la línea larga (que comienza con “Esto va a salir”) se vea partida en dos líneas. Pero esto es por una cuestión de que la ventana que utiliza Geany para la visualización no es muy ancha: el texto que escribe el programa tiene todo eso en una sola línea. Esto lo podemos verificar si seleccionamos el texto que ha producido el programa, hacemos clic derecho -> copiar, y luego lo pegamos en un editor de texto separado (como el mismo Geany): Veremos que allí el programa ha producido un texto que efectivamente, solamente cambia de línea al utilizar los endl.
Hasta ahora, nunca hemos hecho un programa interactivo: Nuestros programas solamente escriben un texto fijo a la pantalla sin importar lo que hagamos. Veamos ahora un programa que saluda:
#include <iostream> #include <string> using namespace std; int main() { cout << "Cual es tu nombre?" << endl; string nombre; cin >> nombre; cout << "Buenos dias " << nombre << "!" << endl; return 0; }
Este es un ejemplo muy sencillo, pero aquí hemos incorporado varios elementos nuevos que explicaremos brevemente (serán explicados mejor en la sección siguiente).
En primer lugar, hemos añadido la línea #include <string>
. Esto es necesario porque queremos utilizar string
, que es parte de la biblioteca de igual nombre. string
se utiliza para que los programas puedan manipular textos.
La línea string nombre;
le avisa a la computadora que usaremos una variable, a la cual hemos llamado nombre (puesto que la usaremos para el nombre del usuario que vamos a saludar). Las variables son un concepto fundamental de la programación imperativa: Lo veremos mucho mejor en la sección siguiente, pero por ahora, basta con saber que la intención de esta línea es reservar espacio para un texto que vamos a recibir del usuario (en concreto: su nombre).
La línea cin >> nombre;
es novedosa: Utiliza el elemento nuevo cin
, que es parte junto con cout
y endl
de la biblioteca iostream
. Así como cout
es un elemento al cual podemos enviar datos que queremos que se escriban en la pantalla, cin
trabaja como entrada, y de él podemos recibir datos que se ingresan al programa (normalmente, a través del teclado, pero es posible cambiarlo y que por ejemplo cin
obtenga los datos desde un archivo). La forma de escribir esto es igual que para cout
, pero con “las flechas” invertidas, pues ahora recibimos los datos desde cin
. Además, en lugar de indicar cuál es el dato que enviamos, indicamos dónde guardarlo: Eso es lo que hacemos al indicar la variable nombre
usada anteriormente.
Finalmente, la línea cout << “Buenos dias ” << nombre << “!” << endl;
imprime por pantalla el saludo final. Notar que como estamos enviando nombre
a cout
, que es algo que recibimos previamente a través de cin
, la cadena que se imprime no está fija, sino que depende de lo que haya ingresado el usuario. En otras palabras, este programa presenta un saludo interactivo según el nombre del usuario, como podemos verificar si lo ejecutamos.
Se sugiere fuertemente experimentar haciendo cambios a este programa. Veremos más cuidadosamente los principios en funcionamiento detrás de instrucciones como esta, en la sección siguiente.
Es sabido que la computadora tiene una gran capacidad de cálculo. Podemos ponerla a hacer cuentas, y las resolverá de manera prácticamente instantánea. Veamos un ejemplo que suma dos números recibidos por pantalla:
#include <iostream> using namespace std; int main() { cout << "Ingrese los numeros " << endl; int a,b; cin >> a >> b; cout << "La suma de los dos numeros es " << a + b << endl; return 0; }
Este ejemplo es similar al anterior pero se usa int
en lugar de string
: int
se utiliza para indicar que trabajaremos con números enteros. Veremos más en detalle qué significa esto en la sección siguiente.
Al ejecutar este programa, si ingresamos por ejemplo 23 y 48, podemos obtener una salida como la siguiente:
Ingrese los numeros 23 48 La suma de los dos numeros es 71
Observamos que este programa es capaz de sumar los números que le indicamos, sin importar cuáles sean. Es decir, le hemos enseñado a la computadora, a través de nuestro programa, cómo interactuar para escribir la suma de dos números dados. ¿Qué ocurrirá si usamos a * b
en lugar de 'a + b'? ¿Y si usamos a - b? ¿Y si usamos a / b? ¡Experimente!
¿Se anima a hacer un programa que lea dos números, como el anterior, pero luego los escriba en el orden inverso al que fueron ingresados? Lo dejamos como desafío. Por ejemplo si al programa se ingresa 12 34
, se espera que escriba a continuación 34 12
.
Así como podemos utilizar +
, -
, *
y /
para realizar operaciones aritméticas fundamentales, es posible utilizar los paréntesis (
y )
para poder escribir cosas como (1+2) * 3 (que tiene por resultado 9) en lugar de 1 + 2 * 3 (que tiene como resultado 7, por las reglas de separar en términos). Con eso podríamos escribir cualquier operación aritmética y usar a la computadora como calculadora en programas sencillos.
Por ejemplo, el siguiente programa:
#include <iostream> using namespace std; int main() { cout << 23+12 << endl; cout << ((23*11-32)*5 + 70) / 6 << endl; cout << (((5*5 - 4*4 - 3*3))) << endl; cout << 5*5 - 4*4 - 3*3 << endl; cout << (5*5 - 4*4 - 3*3) * (5*5 - 4*4 - 3*3) << endl; return 0; }
Imprimiría por pantalla lo siguiente:
35 195 0 0 0
Notar que en C++ es válido utilizar “paréntesis redundantes”, como los de la tercera cuenta. Lo que no está permitido es tener paréntesis inválidos, o que no se correspondan entre sí. Por ejemplo, una expresión como (2 + 4(
generará un error de compilación, pues el segundo paréntesis que abre debería estar cerrando. Similarmente, algo como (2 + 4
sería una expresión incompleta, pues falta cerrar el paréntesis, y esto también producirá un error de compilación.