Anda di halaman 1dari 55

Fundamentos de Programacion:

Lenguaje C++ 11 y C++ 14

Yalmar Ponce Atencio

Monday 28th September, 2015


Contenido

1 Introduccion 3

2 Antes de empezar 5
2.1 De donde viene el lenguaje C++ . . . . . . . . . . . . . . . . . . . . . . . . . . 7

3 Una vision general 11


3.1 Tipos de datos fundamentales . . . . . . . . . . . . . . . . . . . . . . . . . . . 11
3.2 Un primer programa en C++ . . . . . . . . . . . . . . . . . . . . . . . . . . . . 14
3.3 Modificando el Primer programa en C++ . . . . . . . . . . . . . . . . . . . . . 17
3.3.1 Incluyendo uso de tipos de dato . . . . . . . . . . . . . . . . . . . . . . 17
3.4 Otro programa C++: ingreso/lectura de valores desde el teclado . . . . . . . 18
3.5 Editar, compilar y ejecutar el programa . . . . . . . . . . . . . . . . . . . . . . 19
3.6 Uso de variables . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 21
3.7 Uso de constantes . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 23
3.8 Operadores . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 23
3.8.1 Precedencia y asociatividad . . . . . . . . . . . . . . . . . . . . . . . . 24
3.9 El operador de atribucion . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 26
3.10 Memoria del computador . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 28
3.11 Identificadores . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 28
3.12 Conversion de tipos . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 29
3.13 Caracteres . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 30
3.14 Tipos enumerados . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 31

4 Condiciones 33
4.1 La sentencia if . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 34

i
Contenido Contenido

4.2 La sentencia if - else . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 36


4.3 La sentencia if - else multiple . . . . . . . . . . . . . . . . . . . . . . . . . . . 38
4.4 Composicion de expresiones booleanas . . . . . . . . . . . . . . . . . . . . . . 42
4.5 Condicionales anidadas . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 43
4.6 La sentencia switch . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 43

5 Iteraciones 47
5.1 La sentencia while . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 47

1
Contenido Contenido

2
Introduccion
1
Un curso de programacion de computadores puede iniciarse de diversas maneras, y es
as que los tantos autores que han escrito textos de fundamentos de programacion han
comenzado describiendo principalmente sus experiencias.
Entonces, podemos comenzar abordando el ciclo de vida de desarrollo de sistemas
o de software, o tambien describiendo en que consta un programa de computadora, o
talvez mostrando como motivacion ejemplos de software (aplicaciones CAD, Juegos inter-
activos, Sistemas Interactivos, etc.), o simplemente mostrando un programa de computa-
dora en algun lenguaje y explicando que es lo que hace linea a linea. Sea cual fuera la
manera de iniciar al lector en este fascinante arte de la programacion, el objetivo principal
es ensenar a escribir programas de computadora.
Sin embargo, escribir programas no solamente es un proceso mecanico como es-
cribir un texto, aun escribir cualquier documento requiere de cierto carisma, y ciertas
tecnicas para hacerlo mas elegante o mas agradable de leer. En ese sentido, escribir un
programa de computadora require de emplear diversas habilidades, como ser sumamente
creativo, ya que cada programador puede implementar un programa que solucione algun
problema muy distinto a cualquier otro programador, y en ese sentido podemos comparar
y ver que un programa es mejor que otro as como una pintura de algun pintor es mejor
que la de otro pintor. Tambien es importante preocuparse por aspectos de calidad, eficien-
cia, seguridad, rapidez, robustez, entre otros conceptos que se iran viendo a medida que
avancemos.
En este texto, emplearemos el lenguaje de programacion C++, en sus versiones 11

3
1. Introduccion

y 14, de forma que podremos aprovechar los conceptos mas modernos de programacion
as como tambien las potencialidades de este lenguaje en sus versiones actuales.
Antes de comenzar con el primer captulo del libro, debemos tener en cuenta que
el lenguaje C++ es unico, no existe varios lenguajes C++, lo que si es verdad es que hay
varios compiladores para el lenguaje C++, como el Microsoft vcc o el GNU GCC para
diversas plataformas (MinGW para Windows, Linux, OSX, etc.), Intel C++, Metrowerks
Codewarrior, Embarcadero C++Builder, entre otros (una lista mas detallada puede ser
encontrada en
https : {{en.wikipedia.org{wiki{List of compilers#C.2B.2B compilers)
Este texto comparte y aprueba los metodos y tecnicas empleadas en los textos de
programacion de los autores Deitel & Deitel [1], de modo que si desean profundizar en
algun asunto o tema en particular, se recomienda al lector consultar los textos de progra-
macion de los autores mencionados.

4
Antes de empezar
2
Como en muchos textos de Programacion y mas especficamente cuando hablamos de
programacion en/con el Lenguaje C++, debemos iniciar al lector (suponiendo en este caso
es nuevo en la programacion), mencionando y sugiriendo algunas herramientas que podra
usar para empezar YA a programar y experimentar con algunos ejemplos.
Como comentamos en la introduccion existen diversos compiladores para C++,
pero podemos recomendar algunos que consideramos sumamente simples de instalar y no
deben faltar en nuestra computadora.
Primero, si tenemos instalado alguna distribucion de Linux, debemos asegurarnos
que este instalado el compilador GNU GCC, sin embargo este es solo el compilador, no
posee alguna herramienta para poder editar o escribir codigo C++, entonces debemos in-
stalar algun editor o entorno de desarrollo (IDE). Para este proposito, podemos sugerir que
usen el editor Geany o tambien sublime, busquen en sus respectivas paginas para ver la
instalacion, aunque en Linux el modo usual de instalar es a traves de sus administradores
de aplicaciones como dnf en Fedora o Synaptic Ubuntu.
El compilador GNU GCC de hecho es el mas usado por ser multiplataforma, y
en ese sentido podemos instalarlo en Windows tambien, aunque este proceso no es tan
directo como en el caso de las distribuciones de Linux, podemos recomendar la version
que se incluye en el entorno de desarrollo CodeBlocks, vaya a la siguiente url

http : //www. c o d e b l o c k s . org / downloads / b i n a r i e s

5
2. Antes de empezar

y haga click en el link

codeblocks13.12mingwsetupTDMGCC481.exe

, esta version incluye el compilador GNU MinGW GCC).


Si por el contrario usted tiene una computadora con sistema OSX, tambien podra
instalar el compilador GNU GCC, aun si esta utilizado XCode puede seleccionar usar el
compilador GNU GCC.
Segundo, para usuarios que tienen sistema operativo Windows, es muy recomend-
able utilizar el entorno de desarrollo de aplicaciones Microsoft Visual Studio. Este trae
toda las herramientas necesarias para desarrollar aplicaciones. Sin embargo, este IDE, es
bastante pesado, las versiones mas actuales requieren de un espacio considerable (algo
alrededor de 10Gb) en disco, esto no es muy conveniente en algunos tipos de ordenadores
como las tablets con 16Gb o 32Gb.
la figura 2.2 muestra al IDE Visual Studio 2013 y la figura 2.1 muestra al IDE
CodeBlocks.

Figure 2.1: Un ejemplo de programa en lenguaje C++ en el IDE CodeBlocks.

6
2. Antes de empezar 2.1. De donde viene el lenguaje C++

Figure 2.2: Un ejemplo de programa en lenguaje C++ en el IDE Visual Studio 2013.

2.1 De donde viene el lenguaje C++


C++ evoluciono del lenguaje C, y este a su vez evoluciono de dos lenguajes de progra-
macion anteriores, BCPL y B. En 1967, Martin Richards desarrollo BCPL como un lenguaje
para escribir software de sistemas operativos y compiladores para sistemas operativos.
Ken Thompson modelo muchas caractersticas en su lenguaje B a partir del trabajo de sus

7
2. Antes de empezar 2.1. De donde viene el lenguaje C++

contrapartes en BCPL, y utilizo a B para crear las primeras versiones del sistema operativo
UNIX, en los laboratorios Bell en 1970.
El lenguaje C evoluciono a partir de B, gracias al trabajo de Dennis Ritchie (creador
del lenguaje C) en los laboratorios Bell. Inicialmente, se hizo muy popular como lenguaje
de desarrollo para el sistema operativo UNIX. En la actualidad, la mayor parte de los
sistemas operativos se escriben en C y/o C++. C esta disponible para la mayora de las
computadoras y es independiente del hardware. Con un diseno cuidadoso, es posible
escribir programas en C que sean portables para la mayora de las computadoras.
Por un largo tiempo (decadas de 90 y 2000), el uso del lenguaje C se diversifico
tanto que existan muchos compiladores desarrollados para diversos tipos de computa-
dores y sistemas operativos (a las que algunas veces se les denomina plataformas de hard-
ware y de software) produciendo variaciones en el lenguaje de programacion. Este fue un
grave problema para los desarrolladores de programas, quienes necesitaban escribir pro-
gramas portables que pudieran ejecutarse en varias plataformas. Entonces se vio la necesi-
dad de una version estandar de C. El Instituto nacional estadounidense de estandares
(ANSI) coopero con la Organizacion internacional para la estandarizacion (ISO) para es-
tandarizar C a nivel mundial; el documento estandar colectivo se publico en 1990, y se
conoce como ANSI/ISO 9899: 1990.
C99 es el estandar ANSI mas reciente para el lenguaje de programacion C. Se de-
sarrollo para evolucionar el lenguaje C, de manera que pudiera estar al corriente con el
poderoso hardware de la actualidad, y con los requerimientos cada vez mas exigentes de
los usuarios. El Estandar C99 es mas capaz (que los primeros Estandares de C) de compe-
tir con los lenguajes como Fortran para las aplicaciones matematicas. Las capacidades de
C99 incluyen el tipo long long para las maquinas de 64 bits, los numeros complejos para
las aplicaciones de ingeniera y un mayor soporte para la aritmetica de punto flotante.
C99 tambien hace a C mas consistente con C++, al permitir el polimorfismo a traves de
funciones matematicas de tipo generico, y por medio de la creacion de un tipo booleano
definido.
A principios de la decada de los ochenta, Bjarne Stroustrup desarrollo una ex-
tension del lenguaje C en los laboratorios Bell: C++. Este lenguaje proporciona un con-
junto de caractersticas que mejoran al lenguaje C (lenguaje netamente estructurado),
donde lo mas importante es proporcionar la capacidad de una programacion orientada a
objetos. Actualmente una revolucion se viene trabajando en la comunidad del software.
Escribir software rapido, correcto y seguro. Los objetos en esencia son componentes re-

8
2. Antes de empezar 2.1. De donde viene el lenguaje C++

utilizables de software, que modelan elementos del mundo real. Los desarrolladores de
software estan descubriendo que el uso de una metodologa de diseno e implementacion
modular y orientada a objetos puede hacerlos mas productivos que mediante las populares
tecnicas de programacion anteriores. Los programas orientados a objetos son mas faciles
de entender, corregir y modificar. Por esta razon, cambiamos a una pedagoga en la que se
presentan las clases y los objetos en los primeros captulos.
Sin embargo, es necesario conocer algunos aspectos de la programacion antes de
comenzar con la Programacion Orientada a Objetos, como son los tipos de dato fundamen-
tales del lenguaje C++, luego tambien es importante ver las estructuras de decision (if then
else), las estructuras de repeticion (for, while, do ... while) y la definicion y uso de funciones.
Posteriormente, podremos ver una introduccion a los conceptos basicos y la termi-
nologa de la tecnologa de objetos, iniciando con el desarrollo de clases personalizadas y
reutilizables, pero eso solo sera una vez que se tenga bastante practica con los conceptos
basicos de programacion.

9
2. Antes de empezar 2.1. De donde viene el lenguaje C++

10
Una vision general
3
Como para todo lenguaje de programacion lo primero que se tiene que conocer son los
tipos de datos, en C++ existen varios, y a continuacion los presentamos.

3.1 Tipos de datos fundamentales


void. El tipo de dato void admite un conjunto de valores considerados como vacos. Este es
un tipo incompleto que no puede ser completado (consecuentemente, objetos del tipo
void no son admitidos o en otras palabras no son posibles de crear). Por ejemplo, no
existen arreglos de tipo void, ni referencias a void. Sin embargo, hay funciones que
no retornan ningun valor por lo que hay obligacion de que se las declare como void,
luego, lo que si es posible es declarar apuntadores de tipo void, esto con la finalidad
de que estos tipos puedan ser convertidos a cualquier otro tipo de apuntador. El uso
de void lo dejaremos para mas adelante, a excepcion del uso en funciones que no
retornan ningun valor, esto tambien se vera en su momento, cuando toque explicar
declaracion y uso de funciones.

boolean. Este tipo de dato solo admite dos valores: true o false

char. Este tipo de datos ademas de ser declarado por omision como unsigned

signed. Este tipo con signo basicamente admite valores enteros negativos y positivos
en el rango de -127 al 127, entonces este tipo no se refiere concretamente a
representar caracteres sino a guardar valores que no superan ese rango.

11
3. Una vision general 3.1. Tipos de datos fundamentales

unsigned. Este tipo con signo es para representacion de caracteres propiamente,


es decir que podemos guardar los caracteres con valores desde el 0 hasta el
255, aunque muchos de estos caracteres son solo smbolos, podemos ver los
principales la tabla 3.2.

int. Este es uno de los tipos de dato mas usuales, ya que podemos usarlo para diversos
propositos. As como en char, tambien podemos escoger solo usar valores positivos
con el modificador unsigned aunque por omision toda declaracion del tipo int es
signed, es decir admitira valores negativos y positivos en el rango -2147483648 al
-2147483647, o en otras palabras 231 a 231 1. En el caso de unsigned los valores
admitidos son desde el 0 hasta el 232 1.

float. Este tipo de datos admite numeros con decimales, o podramos decir numeros reales,
aunque float solo admite numeros con hasta 7 dgitos despues del punto decimal.

double. Este tipo es similar a float solo que con mayor precision que float, hasta 15 dgitos
despues del punto decimal. Entonces a un tipo double se le conoce como un tipo
numerico de precision doble.

La siguiente tabla 3.1 muestra un resumen de los valores que admiten cada uno de
estos tipos de dato.

12
3. Una vision general 3.1. Tipos de datos fundamentales

Figure 3.1: Rangos de valores admitidos por los tipos de dato fundamentales en C++.

13
3. Una vision general 3.2. Un primer programa en C++

Figure 3.2: Tabla de codigos correspondientes a los caracteres ASCII.

3.2 Un primer programa en C++


El lenguaje C++ utiliza notaciones que pueden parecer extranas a los nuevos en esto de la
programacion. Ahora consideraremos un programa simple que imprime una lnea de texto
(figura 3.1). Este programa ilustra varias caractersticas importantes del lenguaje C++. A
continuacion explicaremos cada lnea en forma detallada.

La linea 1 inicia con //, esto significa que lo que sigue es un comentario hasta el final
de la linea. Existe otro modo de comentario, es el de comentarios mas extensos. Por
ejemplo, si quisieramos colocar alguna explicacion mas extensa, la cual puede ser de
varias lneas, entonces debemos delimitarla entre /* y */.

La linea 2 nos indica que estamos incluyendo recursos que son parte de la biblioteca

14
3. Una vision general 3.2. Un primer programa en C++

estandar del lenguaje C++ (la STL, es un conjunto de utilidades que podemos hacer
uso y no tener que reinventar la rueda). En este caso se trata de estructuras y fun-
ciones que nos permiten entradas/lectura de valores desde el teclado y salida de
valores en la pantalla (figura 3.3).

La linea 4 nos indica que vamos a utilizar estructuras y funciones que estan dentro
del ambito std. Lo usual es llamar a las funciones o tipos de dato definidos dentro del
ambito std como std::, sin embargo, si necesitaramos usar varias funciones o tipos,
tendramos que estar siempre escribiendo el prefijo std::. Por ejemplo en la lnea 7
tendramos que colocar std::cout. Observe el programa 3.2 para ver la diferencia.

En la linea 6 se declara la funcion main, esta inicia al escribir el caracter { y termina


cuando encuentra el caracter } . Tambien podemos notar que antes de main se tiene
la palabra reservada int, esto quiere decir que esta funcion espera que retornemos
algun valor del tipo entero, ya que int se refiere a un tipo de dato entero. Entonces
si observan en la linea 9 la palabra reservada return esta retornando el valor 0, con
lo que se esta cumpliendo con la definicion de la funcion. Por otro lado, la funcion
main es unica, y solamente aparece una sola vez en un programa. Esta funcion in-
dica el inicio del programa, y el programa solamente ejecuta lo que encuentre den-
tro de los caracteres y . En otras palabras, podemos pensar que el programa es la
funcion basicamente la funcion main. Por lo tanto no podemos emplear ningun otro
nombre para esta funcion que en s es el programa, caso utilicemos otro nombre,
simplemente sera otra funcion y no se creara el programa ejecutable y el compilador
indicara que falta definir la funcion main.

En las lneas 7 y 8 se estan utilizando la funcion cout que permite imprimir algun
valor en la pantalla. cout permite imprimir valores de variables y constantes, y en
este caso se esta imprimiendo un texto constante Hola zn C++. Finalmente, en la
linea 8, endl imprime un retorno de linea en la pantalla de salida (figura 3.3).

Ahora, por otro lado, observe el operador , a este se le conoce como el operador de
insercion de flujo. Cuando el programa se ejecuta, el valor a la derecha del operador
(el operando derecho) se inserta en el flujo de salida. Note que el operador apunta
en la direccion hacia la que van los datos. Por lo general, los caracteres del operando
derecho se imprimen exactamente como aparecen entre las comillas dobles. Sin em-
bargo, los caracteres zn no se imprimen en la pantalla (figura 3.3). A la barra diagonal
inversa (z) se le llama caracter de escape. Este caracter indica que se va a imprimir

15
3. Una vision general 3.2. Un primer programa en C++

en pantalla un caracter especial.

Cuando se encuentra una barra diagonal inversa en una cadena de caracteres, el sigu-
iente caracter se combina con la barra diagonal inversa para formar una secuencia
de escape. La secuencia de escape zn representa una nueva lnea y hace que el cursor
(es decir, el indicador de la posicion actual en la pantalla) se desplace al principio de
la siguiente lnea en la pantalla. En la linea 8 endl es una alternativa a zn.

Listing 3.1: Programa para imprimir una linea de texto


1 // Prog1 . cpp
2 # i n c l u d e <iostream >
3
4 using namespace std ;
5
6 i n t main ( ) {
7 cout << Hola \n ;
8 cout << C++<<endl ;
9 return 0;
10 }

Listing 3.2: Programa para imprimir una linea de texto (Version sin incluir el uso del
ambito std)
1 # i n c l u d e <iostream >
2
3 i n t main ( ) {
4 std : : cout << Hola C++<<std : : endl ;
5 return 0;
6 }

Figure 3.3: Salida del programa 3.1.

16
3. Una vision general 3.3. Modificando el Primer programa en C++

3.3 Modificando el Primer programa en C++

3.3.1 Incluyendo uso de tipos de dato

El primer programa visto solo imprima un texto que estaba explcitamente definido, es
decir un texto constante. Ahora modificaremos el programa para que podamos imprimir
algunas variables. Analicemos el programa 3.3. Observamos que se declara la variable
global n fuera de la funcion main. Variable global significa que podemos usarla en cualquier
funcion, no solamente en main.
Luego, se ha declarado tambien la variable c. Esta variable esta dentro de la funcion
main lo que significa que es una variable local, y no la podremos usar fuera de la funcion
main.
Tambien se ha declarado la variable res, y como podemos notar se le asigna el
resultado de la multiplicacion de n y c.
Finalmente se pide imprimir los valores de las tres variables empleando la funcion
cout. La salida se muestra en la figura 3.4.

Listing 3.3: Programa que imprime valores de variables


1 # i n c l u d e <iostream >
2 using namespace std ;
3 int n = 10;
4
5 i n t main ( ) {
6 int c = 5;
7 i n t res = n*c ;
8 cout << El v a l o r de n e s : ;
9 cout << n << endl ;
10 cout << El v a l o r de c e s : ;
11 cout << c << endl ;
12 cout << El r e s u l t a d o de m u l t i p l i c a r c x n e s : ;
13 cout << res << endl ;
14 return 0;
15 }

17
3. Una vision general 3.4. Otro programa C++: ingreso/lectura de valores desde el teclado

Figure 3.4: Salida del programa 3.3.

3.4 Otro programa C++: ingreso/lectura de valores


desde el teclado
En el programa anterior mostramos el flujo de salida por medio de la funcion cout y el
operador , ahora veremos la funcion cin y el operador , de modo que podemos leer
desde el teclado algun valor y atribuirlo en la variable parametro (operando a la derecha
del operador ). Veamos el siguiente ejemplo.

Listing 3.4: Programa que suma dos valores ingresados desde el teclado
1 # i n c l u d e <iostream >
2 using namespace std ;
3
4 i n t main ( ) {
5 int a, b;
6 cout<< I n g r e s e un numero : ;
7 cin>>a ;
8 cout<< I n g r e s e o t r o numero : ;
9 cin>>b ;
10 cout << La suma e s : ;
11 cout << a + b << endl ;
12 return 0;
13 }

Figure 3.5: Salida del programa 3.4.

18
3. Una vision general 3.5. Editar, compilar y ejecutar el programa

Primeramente hemos declarado dos variables locales, a y b, luego pedimos que en la


pantalla se muestre el mensaje Ingrese un numero:, donde el usuario debe escribir algun
numero, y este valor sera atribuido a la variable a (linea 7), luego, otra vez mostramos
un mensaje con la funcion cout (el texto Ingrese otro numero:), el usuario ira escribir
otro numero y este valor sera atribuido a la variable b, finalmente volvemos a mostrar otro
mensaje La suma es y en la linea 11, mostramos el valor que resulte de la suma de a y b.
Observe que no ha sido necesario emplear una variable adicional, ya que a ` b por tener
una operacion ` el compilador hace el calculo y lo guarda en una variable temporal, es
decir que a ` b retorna un valor y este es guardado en otra variable que el compilador crea
y lo usa internamente, de modo que no es necesario que atribuyamos ese calculo a una
variable explcitamente.
En el libro de Deitel & Deitel [1] hay explicaciones mucho mas extensas de lo que
ocurre en un programa, ademas de dar consejos y advertencias fundamentales; sera inutil
volverlas a reescribir aqu, por lo que se recomienda al lector tener el texto citado en mano
y poder consultar o incluso recomiendo leerlo de principio a fin. En este texto, por otro
lado, nos enfocaremos en ejemplos no muy comunes, de modo que el lector podra tener
un texto de consulta distinto al resto, y no simplemente un texto mas.

3.5 Editar, compilar y ejecutar el programa


Como habamos mencionado antes, se recomienda usar CodeBlocks para empezar, ya que
es un editor bastante completo y ya tiene al compilador MinGW GCC incluido. Para un
estudio inicial del lenguaje de programacion C++ no se requiere mas.
Entonces, asumiendo que el lector ya tiene CodeBlocks instalado (la version que se
indico antes en este libro), entonces creamos un nuevo archivo (File New Empty
file, o en todo caso Ctrl+Shift+N). Escriba el codigo del primer programa (vea la figura
3.6), luego presionamos F9. Abrira el dialogo para guardar archivo, ya que es un archivo
nuevo y no lo habamos guardado. Pongale alguno nombre como prog1.cpp. Observe
que le estamos colocando la extension .cpp, esto es sumamente importante, ya que si
ponemos solamente .c, el compilador entendera que se trata un programa en lenguaje C
y no C++. Como ya habamos presionado F9 (este es un hotkey para compilar y ejecutar
un archivo de programa), luego de guardar el archivo con el nombre escogido, CodeBlocks
compilara el archivo de programa seleccionado. Si el codigo estuviera correcto, se creara
un archivo ejecutable con el nombre prog1.exe, y CodeBlocks lo ejecutara (figura 3.3).

19
3. Una vision general 3.5. Editar, compilar y ejecutar el programa

Figure 3.6: Compilando y ejecutando un programa en CodeBlocks.

Tambien puede optar por crear un nuevo archivo de programa (Ctrl+Shift+N) y


guardarlo con algun nombre antes de comenzar a escribir cualquier codigo. Esto nos fa-
cilitara en la edicion de programas C++ ya que el editor de CodeBlocks reconoce palabras
reservadas del lenguaje y las resalta con letras de colores (figura 3.7).

20
3. Una vision general 3.6. Uso de variables

Figure 3.7: Un programa C++ en CodeBlocks.

3.6 Uso de variables


En C++, es obligatorio declarar las variables antes de usarlas. Lo mas importante de la
declaracion de una variable es hacer una asociacion entre el nombre de la variable y el
tipo de valor que la variable ira contener. El lugar donde se declara una variable, dentro
del programa, tambien es importante, pues permite determinar el ambito (alcance) de la
variable, es decir determinara donde podemos usar la variable o desde donde es accesible.
La sintaxis usual para declarar una variable es:
tipo nombre;
donde tipo indica el tipo de dato y nombre es el nombre de la variable que iremos
declarar. Hay ciertas restricciones para el nombre:

Debe ser solo una palabra, si se requiere un nombre compuesto de dos o mas pal-
abras, podemos usar el guion bajo ( ) para unirlas y hacer que sea solo una palabra.

21
3. Una vision general 3.6. Uso de variables

No puede empezar con smbolos, solo caracteres alfanumericos, excepcionalmente el


guion bajo.

Note que al final de la declaracion hay el punto y coma (;), este caracter indica la
ejecucion de una sentencia, en este caso indica que la variable es creada, con el nombre y
tipo indicados.
Es posible tambien hacer una declaracion de multiples variables para el mismo tipo
de dato.
tipo nombre 1, nombre 2, ..., nombre n;
Observe que hay una coma (,) que separa los nombres, y al final un punto y coma.
Nuevamente aqu, cuando el compilador lee el punto y coma, ejecutara la sentencia, en
este caso la creacion de todas las variables del tipo de dato indicado.
Existe una tercera manera de declarar variables y es inicializando valores.
tipo nombre = val;
tambien podemos combinar con la declaracion de multiples variables. Vea el codigo
3.5 para un ejemplo real.

Listing 3.5: Declaracion de variables


1 // Prog5 . cpp
2 i n t main ( ) {
3 double a ; // Ok, d e c l a r a una v a r i a b l e
4 f l o a t i , j , k ; // Ok, d e c l a r a v a r i a b l e s
5 i n t x = 10 , y , z = 5 , w = 3 ; // Ok, d e c l a r a v a r i a b l e s
6 i n t u = x + z ; // Ok, u tendra 15
7 i n t v = y + w ; // Ok, pero i n c u r r e en e r r o r pues no conocemos e l v a l o r de y
8 return 0;
9 }

El programa muestra las tres formas usuales de declaracion de variables. Observe


que las variables a, i, j, k y y han sido declaradas pero no inicializadas, es decir que no se
les ha dado ningun valor, eso puede llevar a cometer errores en calculos posteriores, ya
que no sabemos que valores se les ha dado, el compilador puede haber asignado cualquier
valor de manera aleatoria. Entonces siempre debemos darle valores antes de usarlos.
En el ejemplo hemos usado nombres de un solo caracter. Entretanto, como hemos
mencionado antes, podemos usar cualquier nombre que cumpla con las restricciones antes
mencionadas, por ejemplo podramos usar nombres como:

22
3. Una vision general 3.7. Uso de constantes

double pi;
float raiz cuadrada de x;
int resultado;
float sumaParcial;
Existe una convencion de usar, para la primera letra de nombres de variables, solo
minusculas, ya que palabras que empiezan con mayusculas se usan para nombres de fun-
ciones.

3.7 Uso de constantes


Al escribir programas a menudo podemos usar algun valor varias veces, por ejemplo PI.
Entonces este tipo de valores, frecuentemente usados no es conveniente asignarlos a vari-
ables, sino por el contrario lo correcto es que use como constantes, ya que ese valor no
cambiara. Existe basicamente dos maneras de declarar constantes: la primera, que se ha
heredado del lenguaje C, y que es muy comun usarlo en C++, es a traves de la directiva
#define, ejemplo.
#define PI 3.14159265358979323846
Note que al final de la linea no hay el punto y coma. Este es un caso especial, as
como la inclusion de archivos de cabecera.
La otra manera es agregar, a la declaracion de variable que vimos en la seccion
anterior, el modificador const de modo que la declaracion quedara algo como:
const float PI = 3.14159265358979323846;
Ahora, observe la convencion usada. La noto?, si, justamente eso, en constantes se
debe usar letras mayusculas, por ejemplo, MIN, MAX, PI, SQRT 2, etc.
Esta demas decir que PI no podra cambiar de valor durante la ejecucion del pro-
grama.

3.8 Operadores
Ahora que ya conocemos como declarar variables, podemos ya hacer algunos calculos. Para
ese proposito existen los operadores y la mayora se comporta como en las matematicas.
Veamos la siguiente tabla.

23
3. Una vision general 3.8. Operadores

Figure 3.8: Tabla de operadores en C++.

Esta tabla le sera muy util a la hora de usar los distintos operadores, tanto ar-
itmeticos como logicos o de comparacion.

3.8.1 Precedencia y asociatividad

Existen otros operadores importantes as como su aplicacion. La siguiente tabla muestra


una tabla mas completa y de como es su aplicacion.

24
3. Una vision general 3.8. Operadores

25

Figure 3.9: Tabla de operadores en C++.


3. Una vision general 3.9. El operador de atribucion

Entonces para poder encontrar la solucion a la clasica ecuacion cuadratica:

ax2 ` bx ` c 0, (3.1)

debemos calcular ?
b b2 ` 4ac
x , (3.2)
2a
la primera solucion sera calculando por ` mediante la formula
float x1 = (-b + sqrt(b*b - 4*a*c))/2*a;
la segunda sera
float x2 = (-b - sqrt(b*b - 4*a*c))/2*a;
Note que en el calculo de las raices estamos usando la funcion sqrt. Para que el
compilador reconozca esta funcion, debemos incluir el archivo donde esta se encuentra
definida, y es en el archivo cmath y la incluiremos en las primeras lneas del programa,
luego enseguida de iostream
#include iostream
#include cmath
Note que a las variables x1 y x2 se les ha asignado valores, y estos son el resultado
del calculo de una expresion. En C++, una expresion es una composicion de terminos
(variables) y operadores. En este caso debemos conocer a priori los terminos o variables a,
b y c.

3.9 El operador de atribucion


Ya hemos visto como atribuirle valores a las variables, y es por medio del operador igual
(=). Este operador es el unico de atribucion, y no debemos confundir para hacer compara-
ciones. En el caso que se quiera comparar dos variables (o los valores de dos variables) se
debe usar el operador de comparacion double igual (==).
Sin embargo, hay otras posibilidades en el uso del operador igual, como la combi-
nacion en una expresion. Ejemplo.
float z = (x = 6) + (y = 7);
Aunque este uso no es usual, siempre es posible que se requiera en algun momento.
Otro uso muy comun es el siguiente:
z = x = y = 0;

26
3. Una vision general 3.9. El operador de atribucion

Se trata de inicializar las variables x, y y z. Solo note que el operador de atribucion


opera de derecha a izquierda y no en simultaneo. En otros terminos, esto es
z = (x = (y = 0));
Debemos tener cierto cuidado con algunas declaraciones o sentencias. Hemos in-
dicado que toda vez que aparece ; se ejecuta la sentencia previa, ya sea una declaracion
de variable alguna instruccion de atribucion de valores, o llamada a funciones. Entonces
veamos el siguiente ejemplo.

Listing 3.6: Mas de declaracion de variables


1 // Prog6 . cpp
2 i n t main ( ) {
3 int x = 10; // d e c l a r a c i o n Ok y x e s i g u a l a 10
4 int y; // d e c l a r a c i o n Ok, pero y no e s t a d e f i n i d o
5 int z = a; // E r r o r ! , no s e conoce a l a v a r i a b l e a
6 return 0;
7 }

Podemos notar que variables tienen valore y cuales no, as como posible errores que se
cometen. Ahora veamos este otro ejemplo 3.7. Aqu basicamente queremos hacer notar
que el programa no se ejecuta en bloque, lo que ocurre es que se ejecuta linea a linea
de arriba a abajo. Entonces, haremos una explicacion cronologica de como se ejecuta el
programa en la figura 3.10.

Listing 3.7: Secuencia de declaraciones y atribuciones de valores y variables


1 // Prog7 . cpp
2 i n t main ( ) {
3 i n t a , b ; // d e c l a r a c i o n Ok, pero a y b no e s t a n d e f i n i d a s
4 a = 2; // a r e c i b e e l v a l o r 2
5 b = 5; // b r e c i b e e l v a l o r 5
6 a = b; // a r e c i b e e l v a l o r que t i e n e b , en e s t e c a s o 5
7 b = 4; // b r e c i b e e l v a l o r 4 , o a b s e l e a t r i b u y e 4
8 return 0;
9 }

27
3. Una vision general 3.10. Memoria del computador

Figure 3.10: Como cambian los valores.

3.10 Memoria del computador


No hemos hablado nada acerca de la memoria hasta este punto, sin embargo podemos
decir que es donde se guardan los valores de las variables que estamos declarando en
todos los programas vistos hasta ahora. Veremos mas acerca de la memoria en los captulos
de referencias y apuntadores, pero podemos ya pensar que toda ves que declaramos una
variable, el valor que tiene cada variable esta almacenado en la memoria, as como se
muestra en la figura 3.10.

3.11 Identificadores
De manera similar a las matematicas, donde nombramos a las diferentes entidades (con-
juntos, vectores, matrices, etc.) con letras del alfabeto a, x, s, etc. o inclusive en otras situa-
ciones podemos usar palabras como altitud, ancho, suma, etc. A ellos se les denomina

28
3. Una vision general 3.12. Conversion de tipos

identificadores, y pueden ser de variables o de constantes, y en los lenguajes de progra-


macion debemos usar este tipo de convenciones para poder nombrar de manera adecuada
a las variables, tal como se vio en la seccion 3.6. Sin embargo, es necesario mencionar
que el lenguaje C++ ya esta empleando varios identificadores y ya no podemos volverlos a
declarar. La tabla 3.11 muestra los principales identificadores (tambien llamadas palabras
reservadas) del lenguaje C++ (El lector debera averiguar y saber que significa cada uno de
ellos).

Figure 3.11: Palabras reservadas del lenguaje C++.

3.12 Conversion de tipos


Muchas veces tendremos la necesidad de hacer conversiones de valores, sin embargo debe-
mos considerar el tipo de cada variable y que tipo de valor queremos obtener. Entonces
podemos especificar una conversion explcita usando lo que se llama de typecast, el cual
permite una conversion de un tipo a otro. Ejemplo.
double frac = (double)1/3;
el valor de frac sera 0.333333333333333.
Entretanto, si fueramos hacer la conversion
float frac = (double)1/3;

29
3. Una vision general 3.13. Caracteres

aun cuando hagamos la conversion a double de la fraccion, este valor sera atribuido
a una variable de tipo float, y como vimos en la tabla 3.1 float tiene 7 dgitos de precision
despues del punto decimal, por lo que en este caso frac tendra el valor de 0.33333334,
perdiendo precision.
Entonces por lo que pudimos ver, hay que tener cuidado en el valor a convertir y la
variable a la que vamos a atribuir.

3.13 Caracteres

Hay un tratamiento especial para caracteres, ya que estos guardan un valor entero, el
codigo del caracter (ver tabla 3.2), y ademas el caracter. Veamos el siguiente Ejemplo.

Listing 3.8: Trabajando con el tipo de dato char


1 // Prog8 . cpp
2 # i n c l u d e <iostream >
3 using namespace std ;
4 i n t main ( ) {
5 char c = a ;
6 int i = c;
7 float f = 10.8;
8 cout<<c<<endl ;
9 cout<<c+5<<endl ;
10 cout<<i<<endl ;
11 cout<<i+c<<endl ;
12 cout<<c+f<<endl ;
13 return 0;
14 }

La salida se muestra en la figura 3.12, donde podemos notar que solo la impresion/salda
de la linea 7 muestra el caracter correspondiente (en este caso a), sin embargo la siguiente
salida (linea 8) imprime un numero, por que?. Al realizar una operacion aritmetica, entre
un tipo de dato caracter (char) y cualquier otro tipo, el resultado siempre sera un tipo
numerico, es decir, que el compilador tomara el valor numerico de char (el codigo del
caracter) y hara la operacion aritmetica, manteniendo el resultado como un nuevo valor
numerico.

30
3. Una vision general 3.14. Tipos enumerados

Figure 3.12: Salida del programa 3.8.

3.14 Tipos enumerados


C++ permite al programador crear un nuevo tipo de dato simple, orientado a considerar
una lista de posibles valores. La palabra clave enum nos permitira definir este tipo de dato
nuevo.

1 enum Color { Red , Orange , Yellow , Green , Blue , Violet } ;

Para una mayor comprension del uso de enum veamos el siguiente ejemplo.

Listing 3.9: Trabajando tipos enumerados


1 // Prog9 . cpp
2 # i n c l u d e <iostream >
3 #include <typeinfo >
4 #define l i t b o o l ( x ) ( ( x ) ? true : f a l s e )
5 using namespace std ;
6 enum Alarm { Off , On } ;
7 enum Medida { Gramo = 1 , Libra = 454 , Kilo = 1000 , Arroba=11340 , Quintal = 50000 ,
Tonelada = 1000 000};
8 enum Dia { Lunes = 1 , Martes , Miercoles , Jueves , Viernes , Sabado , Domingo } ;
9 i n t main ( ) {
10 Dia dia = Lunes ;
11 // supongamos que pasaron 3 d i a s
12 dia = Lunes + 3 ;
13 // ahora que d i a e s ?
14 cout<< e s m i e r c o l e s ? <<litbool ( dia == Miercoles ) <<endl ;
15 cout<< e s j u e v e s ? <<litbool ( dia == Jueves ) <<endl ;
16 cout<<2 l i b r a s e s : << 2 . 0 * Libra/Kilo<< K i l o s <<endl ;
17 cout<<1 a r r o b a son : << f l o a t ( Arroba ) /Kilo<< K i l o s <<endl ;
18 return 0;
19 }

31
3. Una vision general 3.14. Tipos enumerados

Hemos definido nuevos tipos de datos en las lneas 6, 7 y 8 (Alarm, Medida y Dia), ob-
viamente sabemos que cada uno de estas variables solo pueden tomar algunos valores,
por ejemplo una Alarma podra estar o bien apagada o encendida, lo mismo con Da, solo
podra ser de Lunes a Domingo, etc. Pero ademas de eso, tambien debemos considerar que
estos valores deben tener un valor numerico, como el de alarma apagada debe ser 0 (cero),
y encendida 1 (uno). Algo similar ocurre con Dia, Lunes debe empezar con 1, puesto que
0 no sera lo mas apropiado, y ademas sabemos que lunes es el primer da de la semana.
Otro ejemplo es Medida, suponiendo que consideramos la unidad mnima al gramo, y de
ah sabremos que el resto de unidades son compatibles con una cierta cantidad de gramos,
y eso facilitara conversiones entre un tipo a otro, por ejemplo cuanto es 2 libras en kilos?
(Linea 16 del programa). La salida del programa se muestra en la figura 3.13.

Figure 3.13: Salida del programa 3.9.

Concluimos esta seccion indicando que en un tipo enumerado, si no atribuimos


nada al primer valor este por omision sera 0 y el resto ira incrementando en 1, a no ser
que se comience a dar valores diferentes empezando desde el primer elemento de la lista.
Observe que siempre que se dar valores diferentes a los por omision, debemos empezar
definiendo de izquierda a derecha, y sin saltarse. No es necesario dar valores a todos los
elementos, si solo damos valores a algunos, el resto tomara valores incrementando desde
el ultimo elemento que se le atribuyo algun valor. Ejemplo.

1 enum Color { Red = 1 , Orange , Yellow , Green , Blue , Violet } ; // OK, Orange tomara 2 ,
Yellow 3 , . . . y a s i sucesivamente
2 enum Level { First = 1 , Second = 2 , Fourth , Third = 3 } ; // E r r o r !
3 enum Layer { One = 1 , Two = 2 , Three = 3 , Four , Five } ; // OK, Four e s 4 y F i v e s e r a 5

Antes de continuar con mas ejemplos, es responsabilidad del lector verificar,


repasar, modificar, extender cada programa hasta comprenderlo, de otra forma de nada
servira avanzar mas en el libro, puesto que siempre quedaran dudas!.

32
Condiciones
4
Anteriormente hemos visto algunos ejemplos de programas, pero todos los programas han
hecho exactamente lo que se ha indicado en el codigo, es decir, sin depender de algun valor
en particular. sentencia 1; sentencia 2; ... sentencia n;
Mas o menos en ese sentido, pero no siempre los programas son secuencias de
sentencias explcitas, me refiero a que algunas veces se deben ejecutar otras sentencias
y otras veces otras sentencias, dependiendo de la evaluacion de condiciones. Veamos el
siguiente ejemplo.

Listing 4.1: El tipo de dato bool


1 // Prog10 . cpp
2 # i n c l u d e <iostream >
3 using namespace std ;
4 i n t main ( ) {
5 bool cerradura = 1 ;
6 cout<<cerradura<< s i g n i f i c a que l a compuerta e s t a a b i e r t a <<endl ;
7 cout< <!cerradura<< s i g n i f i c a que l a compuerta e s t a c e r r a d a <<endl ;
8 return 0;
9 }

Figure 4.1: Salida del programa 4.1.

33
4. Condiciones 4.1. La sentencia if

Observe que el programa emplea el tipo de dato bool, este tipo de dato solo puede asumir
dos valores 0 o 1, o en todo caso false o true. Y para que usamos este tipo de dato?.
El ejemplo es mas o menos claro en ese sentido, ya que una compuerta solo puede es-
tar cerrada o abierta, no hay otros estados que verificar. Ademas de eso, con los tipos
booleanos podemos usar el algebra boolena, como en la linea 7, donde para cambiar el
estado de la compuerta a cerrada, simplemente negamos que la compuerta esta abierta,
o en cualquier caso podemos decir que 1 !0 y visceversa 0 !1. Esto mismo, con val-
ores boolenos, true !f alse o f alse !true. Y finalmente que hacemos con los valores
booleanos, cuando los usamos?. Imagine que queremos saber si la compuerta esta abierta o
cerrada, pero esa es una informacion que no conocemos, es decir que no sabemos hasta que
vamos y verificamos. Vea el siguiente ejemplo para entender de lo que estamos hablando.

Listing 4.2: Ejemplo con el tipo de dato bool


1 // Prog11 . cpp
2 # i n c l u d e <iostream >
3 using namespace std ;
4 i n t main ( ) {
5 bool cerradura ;
6 cout<< indique e s t a d o de l a compuerta : ;
7 cin>>cerradura ;
8 return 0;
9 }

Figure 4.2: Salida del programa 4.2.

Bien, el usuario indicara el estado de la compuerta, ciertamente podra colocar 1 o bien


0, son los dos unicos valores que el programa admite, el sistema no entiende abierto o
cerrado. Pero nosotros debemos indicarle al programa que 1 es abierto y 0 es cerrado.
Como hacemos esto?.

4.1 La sentencia if
Continuando con el ejemplo anterior, un programa no entendera la palabra abierto o
cerrado, son textos que carecen de significado. Ciertamente podramos implementar
un programa que entienda palabras, es decir comprenda el lenguaje natural, pero eso no

34
4. Condiciones 4.1. La sentencia if

es tan simple como mostrar un mensaje. Entonces, lo que el programa con el tipo de
dato bool entiende es 1 o 0, y ahora debemos indicar que 1 es abierto y 0 cerrado. La
sentencia if justamente permitira evaluar el resultado de una expresion y caso sea true
ejecutar una o varias sentencias, caso sea false, el programa simplemente continuara a
ejecutar las sentencias subsecuentes. Note que las sentencias dentro de if solo se ejecutan si el
resultado de la expresion es true Vemos la sintaxis de uso de if.

i f ( expresion ) {
// s e n t e n c i a s
}

Ahora, veamos entonces como usar if en el programa para indicar el estado de la com-
puerta.

Listing 4.3: Ejemplo simple de la sentencia if


1 // Prog12 . cpp
2 # i n c l u d e <iostream >
3 using namespace std ;
4 i n t main ( ) {
5 bool cerradura ;
6 cout<< indique e s t a d o de l a compuerta : ;
7 cin>>cerradura ;
8 i f ( cerradura ) {
9 cout<< compuerta a b i e r t a <<endl ;
10 }
11 return 0;
12 }

Figure 4.3: Salida del programa 4.3. cuando la expresion es verdad (true o 1)

Figure 4.4: Salida del programa 4.3. cuando la expresion es falsa (false o 0)

En este ultimo programa 4.3, debe haber notado la palabra cin y el operador .
As como cout (que viene de c-output o salida) es usado para mostrar (en pantalla o con-

35
4. Condiciones 4.2. La sentencia if - else

sola) valores de cualquier variable o constante, cin (que viene de c-input o entrada) es
usado para recepcionar valores que el usuario da cuando se le solicita.

4.2 La sentencia if - else


Otro ejemplo bien conocido es el de division por cero. El programa 4.4 presenta una
division por cero y su respectivo resultado cuando ejecutamos el programa.

Listing 4.4: Ejemplo de division por cero


1 # i n c l u d e <iostream >
2 using namespace std ;
3 i n t main ( ) {
4 int x = 5;
5 int y = 0;
6 cout<<x/y<<endl ;
7 return 0;
8 }

Figure 4.5: Salida del programa 4.4.

Si ejecutamos este programa el resultado sera inesperado (ver figura 4.5), por que?.
Ciertamente en un primer momento podramos pensar que para que dividiramos un nu-
mero por cero, claro en este ejemplo parece as tan simple, pero pensemos mas alla de lo
evidente. Que pasara si quisieramos hacer un calculo de porcentaje y el usuario por error
ingresa al total como cero?, o si el valor que divide es el resultado de un calculo previo que
resulta cero. Entonces, siempre habra la posibilidad de que nuestro programa este frente
a una division por cero, y cuando eso ocurra no podemos simplemente dejar que el pro-

36
4. Condiciones 4.2. La sentencia if - else

grama se cierre inesperadamente, sino por el contrario evitar la division por cero y alertar
que ocurrio ese problema.
Considerando que no podemos ignorar la posibilidad de una division por cero,
entonces debemos tratar esa posibilidad, vea atentamente el siguiente programa.

Listing 4.5: Evitando una division por cero


1 # i n c l u d e <iostream >
2 using namespace std ;
3 i n t main ( ) {
4 float a, b;
5 cout<< i n g r e s e dos numeros a d i v i d i r : <<endl ;
6 cin>>a>>b ;
7 i f ( b != 0 ) {
8 cout<< e l r e s u l t a d o de l a d i v i s i o n de <<a<< e n t r e <<b<< e s <<a/b<<endl ;
9 } else {
10 cout<<No s e puede d i v i d i r <<a<< e n t r e <<b<<endl ;
11 }
12 return 0;
13 }

Figure 4.6: Salida del programa 4.5.

Figure 4.7: Salida del programa 4.5.

Las figuras 4.6 y 4.7 muestran las dos posibilidades. Seguramente habra observado
que en el programa aparece la palabra else, esta variante de la sentencia if es justamente
para decidir que hacer cuando la expresion evaluada por if es falsa o 0 (cero).

i f ( expresion ) {
// s e n t e n c i a s
} else {
// s e n t e n c i a s

37
4. Condiciones 4.3. La sentencia if - else multiple

4.3 La sentencia if - else multiple


Una seleccion if - else simple permite seleccionar entre dos posibilidades, sin embargo no
siempre tenemos que escoger de dos posibilidades. Por ejemplo, si quisieramos hacer una
seleccion a estudiantes por rangos de notas, es decir, de 0-10 es deficiente, de 11-13 es
regular, de 14-16 es bueno, de 17-18 es muy bueno y de 19-20 es excelente. Ciertamente
tendramos que hacer uso de varios if else if. Veamos el ejemplo.

Listing 4.6: if-else Multiple


1 # i n c l u d e <iostream >
2 using namespace std ;
3 i n t main ( ) {
4 i n t nota ;
5 cout<< i n g r e s e nota : <<endl ;
6 cin>>nota ;
7 i f ( nota <=10) {
8 cout<< D e f i c i e n t e <<endl ;
9 } else {
10 i f ( nota <=13) {
11 cout<< Regular <<endl ;
12 } else {
13 i f ( nota <=16) {
14 cout<<Bueno<<endl ;
15 } else {
16 i f ( nota <=18) {
17 cout<<Muy Bueno<<endl ;
18 } else {
19 i f ( nota <=20) {
20 cout<< E x c e l e n t e <<endl ;
21 }
22 }
23 }
24 }
25 }
26 return 0;
27 }

La salida de este programa se muestra en la figura 4.8.


Observe que el programa se hace un tanto complejo de seguir y se va haciendo
grande a medida que necesitamos ver mas opciones. En realidad ese no es el if else multi-

38
4. Condiciones 4.3. La sentencia if - else multiple

Figure 4.8: Salida del programa 4.6.

ple mas adecuado, aunque sintacticamente es lo correcto, pero hay una sutil consideracion
que debemos tener. Observe que una sentencia if-else es de una sola ejecucion, es como
si estuvieramos ejecutando una sola linea. Vea cuidadosamente el ejemplo 4.7 y note las
diferencias con respecto al ejemplo 4.6.

Listing 4.7: Ejemplo if-else Multiple equivalente al ejemplo 4.6


1 # i n c l u d e <iostream >
2 using namespace std ;
3 i n t main ( ) {
4 i n t nota ;
5 cout<< i n g r e s e nota : <<endl ;
6 cin>>nota ;
7 i f ( nota <=10) {
8 cout<< D e f i c i e n t e <<endl ;
9 } else
10 i f ( nota <=13) {
11 cout<< Regular <<endl ;
12 } else
13 i f ( nota <=16) {
14 cout<<Bueno<<endl ;
15 } else
16 i f ( nota <=18) {
17 cout<<Muy Bueno<<endl ;
18 } else
19 i f ( nota <=20) {
20 cout<< E x c e l e n t e <<endl ;
21 }
22 return 0;
23 }

Podemos ver que cuando toca evaluar else ya no incluye el caracter abre llave y por consigu-
iente ya no aparece cierra llave. Pero por que no son necesarias las llaves?. La respuesta es
por que sabemos de antemano que la parte else evaluara otra unica posibilidad, es decir
que sabemos que se hara solamente otra evaluacion. Ademas, podramos decir tambien
que si hay una sola linea a ejecutar dentro de if tampoco seria necesario usar llaves, el
uso de llaves es realmente necesario cuando se van a ejecutar mas de una sentencia (vea y

39
4. Condiciones 4.3. La sentencia if - else multiple

compare los ejemplos 4.8 y 4.9.).

Listing 4.8: Otro ejemplo simple con if-else.


1 # i n c l u d e <iostream >
2 using namespace std ;
3 i n t main ( ) {
4 i n t nota ;
5 cout<< i n g r e s e nota : <<endl ;
6 cin>>nota ;
7 i f ( nota <=10)
8 cout<< Reprovado <<endl ;
9 else
10 cout<< Aprovado <<endl ;
11 return 0;
12 }

Listing 4.9: Variante del ejemplo 4.8.


1 # i n c l u d e <iostream >
2 using namespace std ;
3 i n t main ( ) {
4 i n t nota ;
5 cout<< i n g r e s e nota : <<endl ;
6 cin>>nota ;
7 i f ( nota <=10) {
8 cout<< Reprovado <<endl ;
9 cout<< Debera r e n d i r un nuevo examen<<endl ;
10 } else {
11 cout<< Aprovado <<endl ;
12 cout<< F e l i c i t a c i o n e s ! ! ! <<endl ;
13 }
14 return 0;
15 }

Bien, ahora que sabemos que, en este caso de seleccion multiple, la parte else de cada if
debera simplemente ejecutar otra verificacion, podemos reorganizar el codigo para una
version mucho mas compacta y legible mostrada en el ejemplo 4.10.

Listing 4.10: Ejemplo if-else Multiple version compacta.


1 # i n c l u d e <iostream >
2 using namespace std ;

40
4. Condiciones 4.3. La sentencia if - else multiple

3 i n t main ( ) {
4 i n t nota ;
5 cout<< i n g r e s e nota : <<endl ;
6 cin>>nota ;
7 i f ( nota <=10) {
8 cout<< D e f i c i e n t e <<endl ;
9 } e l s e i f ( nota <=13) {
10 cout<< Regular <<endl ;
11 } e l s e i f ( nota <=16) {
12 cout<<Bueno<<endl ;
13 } e l s e i f ( nota <=18) {
14 cout<<Muy Bueno<<endl ;
15 } e l s e i f ( nota <=20) {
16 cout<< E x c e l e n t e <<endl ;
17 }
18 return 0;
19 }

Finalmente, hay algo que agregar a este programa de clasificacion de notas. Que
pasara si el usuario ingresa un valor menor a cero, o mayor a 20?. Ciertamente el programa
debe de mostrar un mensaje indicando que la nota esta fuera del rango permitido. El
programa final es mostrado en el ejemplo 4.4.

Listing 4.11: Ejemplo if-else Multiple version final.


# i n c l u d e <iostream >
using namespace std ;
i n t main ( ) {
i n t nota ;
cout<< i n g r e s e nota : <<endl ;
cin>>nota ;
i f ( ( nota < 0 ) | | ( nota > 20) )
cout<< Valor f u e r a d e l rango <<endl ;
e l s e i f ( nota <=10)
cout<< D e f i c i e n t e <<endl ;
e l s e i f ( nota <=13)
cout<< Regular <<endl ;
e l s e i f ( nota <=16)
cout<<Bueno<<endl ;
e l s e i f ( nota <=18)
cout<<Muy Bueno<<endl ;
e l s e i f ( nota <=20)
cout<< E x c e l e n t e <<endl ;
return 0;
}

41
4. Condiciones 4.4. Composicion de expresiones booleanas

4.4 Composicion de expresiones booleanas


Se ha visto evaluar expresiones simples como i==0 o n=5, donde el resultado/respuesta es
bastante clara, sin embargo podemos requerir evaluar expresiones mas complejas, como si
el valor de una variable se encuentra en un determinado rango. Por ejemplo, si quisieramos
evaluar si x esta entre los valores de a e b, y mas aun si queremos saber si se admiten en
el conjunto solucion los extremos/fronteras (intervalo cerrado), cual sera la expresion a
evaluar?. Probablemente diramos que if (a=x=b). Sin embargo, en el lenguaje C++
no es posible evaluar una expresion bilateral, entonces?. De manera semejante a las condi-
ciones matematicas podemos considerar dos casos en esta evaluacion y hacer que las dos
cosas se cumplan, entonces diremos que x=a y ademas que x=b. Existen dos maneras
de hacer esta evaluacion.

i f ( x>=a ) {
i f ( x<=b ) {
// s e n t e n c i a s
}
}

La otra manera es mucho mas simple, pero debemos comprender el uso de otros oper-
adores como && que es el ^ logico.

i f ( ( x>=a ) && ( x<=b ) ) {


// s e n t e n c i a s
}

Vea la siguiente tabla para poder ver el uso de los operadores logicos mas impor-
tantes.

Figure 4.9: Tabla de verdad para dos variables e1 y e2.

42
4. Condiciones 4.5. Condicionales anidadas

De esa manera podemos ir evaluando expresiones mucho mas complejas y con


varias variables.

4.5 Condicionales anidadas


En la seccion anterior pudimos ver que necesitamos evaluar mas de una condicion para
poder ejecutar ciertas acciones (ver codigo 4.4). A esta forma de uso de las sentencias
if, se le denomina condicionales anidadas, por que hay necesidad de usar mas sentencias
if para poder evaluar todas las restricciones. Ciertamente, si hay una expresion del tipo
pp ^ q ^ rq implicara usar tres sentencias if anidadas, mas aun si algunas de ellas son
valores obtenidos dentro de cada if correspondiente (4.12).

Listing 4.12: Sentencias if anidadas


i f (p) {
// s e n t e n c i a s
q=expresion ;
i f (q) {
// s e n t e n c i a s
r=expresion ;
i f (r) {
// s e n t e n c i a s
}
// s e n t e n c i a s
}
// s e n t e n c i a s
}

4.6 La sentencia switch


Existe esta sentencia/estructura como una alternativa al uso de la sentencia if - else mul-
tiple 4.3. Sin embargo solo puede evaluar casos puntuales. Veamos la sintaxis antes para
poder comprender como usar esta estructura.

Listing 4.13: Estructura switch


s w i t c h ( var ) {
c a s e a1 : {
// s e n t e n c i a s

43
4. Condiciones 4.6. La sentencia switch

break ;
}
c a s e a2 : {
cout << one ;
break ;
}
c a s e a3 : {
// s e n t e n c i a s
break ;
}
...
c a s e an : {
// s e n t e n c i a s
break ;
}
default : {
// s e n t e n c i a s
}
}

Donde a1, a2, a3, ... an son valores enteros o en todo caso constantes que puedan tener
un valor entero asociado (como es el caso de los caracteres). En ningun caso podemos
intentar evaluar un valor no entero. Ademas de la condicion previa, note que cada caso se
comportara como una sentencia if (ver version equivalente con sentencias if 4.14), donde,
si se cumple ese caso, podemos ejecutar una o multiples sentencias, y lo mas importante
es: No olvidar la sentencia break;, ya que si no le ponemos aun sera posible que evalue
los otros casos y tambien la ultima posibilidad default:. default: es usado opcionalmente
para poder hacer alguna cosa, si es que el valor de var no es contemplado en ningun caso.
Pero en este ultimo caso, podemos obviar usar la sentencia break; ya que de todas maneras
terminara la ejecucion de la structura switch.

Listing 4.14: if-else multiple equivalente a la estructura switch del codigo 4.13
i f ( var==a1 ) {
// s e n t e n c i a s
} e l s e i f ( var==a2 ) {
// s e n t e n c i a s
} e l s e i f ( var==a3 ) {
// s e n t e n c i a s
}
...
} e l s e i f ( var==an ) {
// s e n t e n c i a s
} else {

44
4. Condiciones 4.6. La sentencia switch

// c a s o por omision ( d e f a u l t )
// s e n t e n c i a s
}

Ahora que ya conocemos como es el uso de switch y su correspondiente version equiva-


lente if-else multiple, veamos un ejemplo real de uso de la estructura switch. El codigo
4.15 es un programa que permite recibir del usuario un numero entero de 1-10, ingresado
por el teclado, para convertirlo en su correspondiente numero romano.

Listing 4.15: Ejemplo de uso de la estructura switch.


1 # i n c l u d e <iostream >
2 using namespace std ;
3 i n t main ( ) {
4 i n t numero ;
5 cout<< i n g r e s e un numero e n t e r o
6 <<menor i g u a l a 10 y mayor que c e r o : ;
7 cin>>numero ;
8 s w i t c h ( numero ) {
9 c a s e 1 : cout<< I ; break ;
10 c a s e 2 : cout<< I I ; break ;
11 c a s e 3 : cout<< I I I ; break ;
12 c a s e 4 : cout<<IV ; break ;
13 c a s e 5 : cout<<V ; break ;
14 c a s e 6 : cout<<VI ; break ;
15 c a s e 7 : cout<< VII ; break ;
16 c a s e 8 : cout<< V I I I ; break ;
17 c a s e 9 : cout<< IX ; break ;
18 c a s e 1 0 : cout<<X ; break ;
19 d e f a u l t : cout<<Numero no v a l i d o ;
20 }
21
22 return 0;
23 }

Note que en el ejemplo 4.15 no se estan usando las llaves en cada caso, esto es por que solo
ejecutamos una sola sentencia con la funcion cout. Solo son necesarias las laves siempre
que sea vayan a ejecutar mas de una sentencia. break;,en este caso, no es considerado como
una sentencia (nos referimos solo a la estructura switch). Un resultado para el programa
4.15 se muestra en la figura 4.10

45
4. Condiciones 4.6. La sentencia switch

Figure 4.10: Salida del programa 4.15.

46
Iteraciones
5
Iteraciones se refiere a repetir la ejecucion de una sentencia o secuencia de sentencias un
numero determinado o indeterminado de veces, regido bajo el cumplimiento de algun
criterio en particular. Normalmente va asociado con una sentencia if interna. Entonces,
se entiende que debe ejecutar una(s) sentencia(s) si es que se cumple una dada condicion.
Existen dos estructuras bien conocidas para este proposito, la sentencia for y la sentencia
while.

5.1 La sentencia while


En la mayoria de lenguajes de programacion un bucle while es una sentencia para con-
trol de flujo que permite ejecutar algun codigo repetidamente, basado en una condicion
booleana. La construccion del bucle while consiste de una expresion de condicion y que
si es verdadero el resultado se ejecuta un bloque de codigo.

Listing 5.1: Sentencia o bucle de repeticion while


while ( condicion ) {
// bloque de codigo
// conformado por una o v a r i a s s e n t e n c i a s
}

El bloque de codigo se ejecutara repetidamente mientras se cumpla la condicion. Note


que si queremos que la secuencia de repeticion tenga un fn la condicion debe ser la que

47
5. Iteraciones 5.1. La sentencia while

determine cuantas repeticiones se ejecutaran, por lo tanto la condicion no puede ser con-
stante, aunque nada impide que lo sea. Sin embargo, debemos tener en claro cuantas
repeticiones queremos ejecutar. Como ejemplo supongamos que queremos mostrar la lista
de los primeros n numeros enteros comenzando del 1 (ver programa 5.2).

Listing 5.2: Ejemplo de uso de la estructura de repeticion while.


1 # i n c l u d e <iostream >
2 using namespace std ;
3 i n t main ( ) {
4 i n t numero ;
5 cout<< i n g r e s e un numero : ;
6 cin>>numero ;
7 int i = 1;
8 while ( i<=numero ) {
9 cout<<i<<endl ;
10 i++;
11 }
12 return 0;
13 }

Como podemos observar, el numero que ingresa el usuario es la cantidad de veces que ira
repetir el bucle while. Entretanto, note que estamos empleando una variable auxiliar int i
= 1; que aumenta a cada repeticion, de tal forma que podemos controlar la condicion, y al
mismo tiempo imprimir el i-esimo numero entero. Una salida del programa es mostrado
en la fig 5.1

Figure 5.1: Salida del programa 5.2.

Obviamente no es la unica manera de usar la sentencia while. Veamos otra version


del programa 5.2 en el programa 5.3.

48
5. Iteraciones 5.1. La sentencia while

Listing 5.3: Variante de la estructura de repeticion while del ejemplo 5.2.


1 # i n c l u d e <iostream >
2 using namespace std ;
3 i n t main ( ) {
4 i n t numero ;
5 cout<< i n g r e s e un numero : ;
6 cin>>numero ;
7 int i = 1;
8 while ( t r u e ) {
9 i f ( i<=numero )
10 cout<<i<<endl ;
11 else
12 break ;
13
14 i++;
15 }
16 return 0;
17 }

Aunque este programa no es el mejor en terminos de eficiencia, pero en ciertas circunstan-


cias podemos necesistar escribir bajo ese criterio, y a su vez estamos mostrando el uso de
la sentencia break; dentro de una estructura de repeticion while. break; lo que hace es
forzar la finalizacion de la estructura de repeticion.
Si se ejecuta el programa 5.3 obtendra el mismo resultado del programa 5.2.
Bien, ahora veamos el siguiente problema. suponga que se quiere implementar
un programa para mostrar la figura 5.2. Observemos que es lo que se repite. Vemos que
los numeros son potencias del numero 10, es decir que a cada repeticion se imprime un
numero numero potencia de 10 incrementalmente. El siguiente codigo 5.4 es una solucion
para obtener el resultado de la figura 5.2.

Listing 5.4: Implementacion para el problema 5.2.


1 # i n c l u d e <iostream >
2 using namespace std ;
3 i n t main ( ) {
4 int n;
5 cout<< i n g r e s e r e p e t i c i o n e s : ;
6 cin>>n ;
7 i n t nro = 1 ;
8 int i = 1;
9 while ( t r u e ) {
10 i f ( i>n ) break ;

49
5. Iteraciones 5.1. La sentencia while

Figure 5.2: Triangulo de numeros.

11 cout<<nro<<endl ;
12 i++;
13 nro = nro * 1 0 ;
14 }
15 return 0;
16 }

Otro problema semejante es el de la figura 5.3. Sin embargo este tiene el texto
alineado a la derecha. En c++, con la biblioteca iomanip es posible darle justificacion
a las salidas dependientes de cout. Revise atentamente el codigo 5.5.

Listing 5.5: Implementacion para el problema 5.3.


1 # i n c l u d e <iostream >
2 # i n c l u d e <iomanip >
3 #include <string >
4 using namespace std ;
5 i n t main ( ) {
6 int n;
7 cout<< i n g r e s e r e p e t i c i o n e s : ;
8 cin>>n ;
9 string s = 1 ;
10 int i = 1;
11 while ( t r u e ) {

50
5. Iteraciones 5.1. La sentencia while

Figure 5.3: Triangulo de numeros alineados a la derecha.

12 i f ( i>n ) break ;
13 cout<<std : : right<<setw ( n ) <<s<<endl ;
14 i++;
15 s += 0 ;
16 }
17 return 0;
18 }

51
5. Iteraciones 5.1. La sentencia while

52
Bibliography
[1] Paul J. Deitel. C++ How to Program. P.J. Deitel, H.M. Deitel. Pearson Education, 7th
edition, 2010.

53

Anda mungkin juga menyukai