Vous êtes sur la page 1sur 74

MIGUEL .

TOLEDO MARTNEZ

CONTENIDO DE LA LECCIN 10
REPETICIN DE UNO O MS ENUNCIADOS
1. Introduccin 2. Ciclo con while
2.1. 2.2. 2.3. 2.4. 2.5. 3.1. 3.2. 4.1. 4.2. 4.3. 4.4. Formato para el enunciado while Ejemplos 9.1, 9.2, 9.3, 9.4, 9.5 Entrada de datos usando while Ejemplos 9.6, 9.7, 9.8, 9.9, 9.10, 9.11 Examen breve 23 Formato para el enunciado do/while Ejemplos 9.12, 9.113, 9.14 Problema Definicin del problema Planeacin de la solucin Codif icacin del programa

3 3
4 4 9 9 390

3. El ciclo do/while

16
17 17 20 20 21 24

4. Solucin de problemas en accin: Programas manejadores de mens controlados por ciclos 20

5. Ejemplo 9.15 6. Examen breve 24 7. El ciclo for


7.1. 7.2. 7.3. 7.4. 7.5. 7.6. 7.7. 7.8. 7.9. 7.10. 7.11. 7.12. 7.13. 7.14. 7.15. 7.16. 7.17. 7.18. 8.1. 8.2. 8.3. 8.4. 9.1. Formato para el enunciado for Ejemplo 9.16, 9.17. 9.18, 9.19 Enunciados compuestos con el ciclo for Ejemplos 9.20, 9.21,9.22 Cambiar el incremento en un ciclo for Ejemplos 9.23, 9.24 Las partes del enunciado for son opcionales Ejemplo 9.25 El ciclo for no es exclusivamente para variables de clase entero Ejemplo 9.26 Ciclo nulo con for Ciclos infinitos con for Ejemplos 9.27, 9.28 El operador coma dentro de un ciclo for Ejemplo 9.29 Ciclos for anidados Ejemplos 9.30, 9.31 Examen breve 25 El enunciado break Ejemplo 9.32 El enunciado continue Ejemplos 9.33, 9.34, 9.35 Ejemplo 9.36

26 71 27
28 29 33 33 35 36 36 37 38 38 38 39 39 40 40 40 41 72

8. Los enunciados break y continue

42
42 43 43 44

9. Ramificacin con goto 10. Examen breve 26

46
46

72

FUNDAMENTOS LECCIN 9

9-1

MIGUEL . TOLEDO MARTNEZ

11. Solucin de problemas en accin: Anlisis de un circuito con resistencias en paralelo


11.1. 11.2. 11.3. 11.4. 12.1. 12.2. 12.3. 12.4. Problema Definicin del problema Planeacin de la solucin Codificacin del problema Planteamiento del problema Tarea de laboratorio del elevador 1 Notas Preguntas

47
47 48 48 49

12. Pensando en objetos: Identificacin de los objetos de un problema

52
52 53 53 54

13. Lo que necesita saber 14. Preguntas y problemas


14.1. 14.2. Preguntas Problemas

55 57
57 62

FUNDAMENTOS LECCIN 9

9-2

MIGUEL . TOLEDO MARTNEZ

LECCIN 10
REPETICIN DE UNO O MS ENUNCIADOS
INTRODUCCIN En la leccin 8 se revis la estructura de control de seleccin. Ahora es tiempo de explorar la tercera y ltima estructura de control utilizada por C++ : la iteracin. La iteracin simplemente significa hacer algo en forma repetida. En programacin a esto se le llama ciclo porque la estructura de control iteracin ocasiona que el programa fluya entrando en un ciclo. Desde luego, debe haber alguna manera de salir de este ciclo o la computadora estar en un ciclo por siempre y para siempre! A esta clase de situacin se le conoce con el nombre de ciclo infinito, por razones obvias. Para evitar un ciclo infinito, todas las estructuras de control de iteracin verifican una condicin para determinar cundo salir del ciclo. Los ciclos de preverificacin verifican una condicin antes de ejecutar cada ciclo. Los ciclos de posverificacin revisan una condicin despus de que se ejecuta cada ciclo. Por ltimo, los ciclos de repeticin fija hacen que el ciclo se ejecute un nmero determinado de veces. Las tres estructuras de control de iteracin que utiliza C++ son while, do/while y for. Como se ver en esta leccin, cada una ofrece un medio de realizar operaciones repetitivas. La diferencia entre stas es la manera en la que controlan la salida del ciclo. while es un ciclo de preverificacin, do/while es un ciclo de posverificacin y for es un ciclo de repeticin fija.
Objetivos de esta leccin: Utilizar el enunciado for de C++ para repetir enunciados un nmero especfico de veces. Utilizar el enunciado while de C++ para repetir enunciados hasta que se satisfaga una condicin. Utilizar el enunciado do while para ejecutar enunciados al menos una vez y posiblemente repetirlos posteriormente.

CICLO CON while Como se ve en la figura 9.1, el ciclo while es un ciclo de preverificacin porque se hace una prueba antes de que los enunciados del ciclo se puedan ejecutar. Si la expresin de verificacin es verdadera (diferente de cero ) se ejecutarn los enunciados del ciclo. Si la expresin de verificacin es falsa (cero ) se ignorarn los enunciados del ciclo y se ejecutar el siguiente enunciado que sigue al ciclo. Siempre que la expresin de verificacin sea verdadera, el programa continuar dentro del ciclo. En otras palabras, el ciclo se repetir mientras la expresin de verificacin sea verdadera. Para salir del ciclo, algo deber cambiar dentro del ciclo que haga que la expresin de verificacin sea falsa. Si no se hace este cambio, se tendr un ciclo infinito. Adems el diagrama muestra que si la expresin de verificacin es falsa la primera vez que se encuentra, nunca se ejecutarn los enunciados del ciclo. Esta es una caracterstica importante de la estructura de control while.

FUNDAMENTOS LECCIN 9

9-3

MIGUEL . TOLEDO MARTNEZ

while

expresin de verificacin

falso

verdadero

enunciados del ciclo

Figura 9.1 . Funcionamiento del ciclo while.

El formato C++ para el enunciado while es como sigue:


FORMATO PARA EL ENUNCIADO while
while (expresin de verificacin) { enunciado 1; enunciado 2; .................... // Enunciados del ciclo enunciado n; } // Fin de while

La primera lnea del enunciado contiene la palabra reservada while seguida de la expresin de verificacin dentro de parntesis. Para verificar una sola condicin, con frecuencia se utilizan los operadores relacionales: ==, !=, <, <=, >, >= y !. Para verificar condiciones mltiples, deber utilizar los operadores lgicos : OR ( ||) y AND (&&) Sin embargo, recuerde que cualquier expresin que reduzca a cero se considerar falsa y cualquiera que se reduzca a un valor diferente de cero se considerar verdadera. Ntese que los enunciados del ciclo se encuentran entre llaves. Esto forma un enunciado compuesto, que contiene enunciados simples dentro del ciclo. Tambin se utiliza un esquema de sangra para identificar con facilidad la parte del enunciado del ciclo. Por ltimo, recuerde que el ciclo no tiene que estar entre llaves si slo contiene un enunciado.
Ejemplo 9.1 Qu se mostrar con los siguientes segmentos de programa? Suponga que las variables que se utilizan en cada segmento se han definido de manera adecuada.
a. numero = 5; suma = 0; while(numero > 0) { suma +=numero; --numero; } // Fin de while 9-4

FUNDAMENTOS LECCIN 9

MIGUEL . TOLEDO MARTNEZ

cout << La suma es << suma << endl;

Se ver en la salida: La suma es 15 Este mismo ciclo se puede codificar como sigue:
b. numero = 5; suma = 0; while(numero) { suma +=numero; --numero; } // Fin de while cout << La suma es << suma << endl;

En este ejemplo se puede ver que se ha eliminado la verificacin mayor que cero ( > 0) Recuerde que C++ interpreta los valores diferentes de cero como verdaderos y un valor cero como falso. De esta manera, siempre que numero sea mayor que cero, se ejecutarn los enunciados del ciclo .
c. suma = 0; while(numero > 0) { suma +=numero; --numero; } // Fin de while cout << La suma es << suma << endl;

Qu ha sucedido en este segmento del programa en comparacin con el segmento anterior? Observe que la variable de control del ciclo , numero , no se ha inicializado antes de la verificacin del ciclo , como consecuencia, numero tomar inicialmente el valor que se encuentre en ese momento en la memoria. Este estado originar un nmero indeterminado de iteraciones cclicas, produciendo a menudo un ciclo infinito .
d. numero = 5; suma = 0; while(numero > 0) { if (numero % 2 ) suma +=numero; --numero; } // Fin de while cout << La suma es << suma << endl;

Este segmento del programa calcula la suma de los enteros impares de 1 a 5 , mostrando: La suma es 9.
e. numero = 5; suma = 0; while(numero > 0) { if(!(numero % 2)) suma +=numero; --numero; } // Fin de while cout << La suma es << suma << endl;

Esta vez el programa calcula la suma de los enteros pares entre 1 y 5 , mostrando: La suma es 6.
f. numeroMax = 5; 9-5

FUNDAMENTOS LECCIN 9

MIGUEL . TOLEDO MARTNEZ

numero = 0; suma = 0; while(numero != numeroMax) suma +=numero; cout << El promedio de los primeros << numeroMax << enteros positivos es: << suma / numeroMax << endl;

Este es un ciclo infinito . Ntese que el ciclo se ejecuta siempre que numero y numeroMax no sean iguales. El valor inicial de numero es 0 y el valor inicial de numeroMax es 5 . Sin embargo, estos valores nunca van a cambiar dentro del ciclo . De esta manera, numero siempre ser diferente a numeroMax, dando origen a un ciclo infinito. Para corregir este problema ser necesario cambiar la variable de control del ciclo en algn lugar dentro del ciclo , de manera que, a la larga, la verificacin del ciclo se convierta en falso. En este segmento de programa es necesario incrementar numero dentro del cuerpo del ciclo , como sigue:
g. numeroMax = 5; numero = 0; suma = 0; while(numero != numeroMax) { ++numero; suma +=numero; } // Fin de while cout << El promedio de los primeros << numeroMax << enteros positivos es: << suma / numeroMax << endl;

El ciclo ahora producir el resultado: El promedio de los primeros 5 enteros positivos es: 3.
h. enum boolean{Falso, Verdadero }; bandera boolean; int numero; int suma; bandera suma = Verdadero; = 0; // Inicializa la variable boolean a verdadero // Inicializa suma a 0 // Definicin de la clase de datos boolean // Define la variable boolean bandera

while(bandera == Verdadero) { cout << Escriba un nmero entero positivo: << endl; cin >> numero; if(numero < 0) { bandera = Falso; cout << Ciclo concluido << endl; } // Fin del if else { suma = suma + numero; cout << Ahora la suma es: << suma << endl << endl; } // Fin del else } // Fin del while

Este es un ejemplo de un ciclo controlado por bandera. Una bandera es una variable booleana que se usa para controlar el flujo de un programa. La bandera se inicializa a Verdadero , despus

FUNDAMENTOS LECCIN 9

9-6

MIGUEL . TOLEDO MARTNEZ

se cambia a Falso cuando ha ocurrido un acontecimiento dentro del programa. La verificacin del ciclo anterior tambin puede codif icarse como while (bandera) Por qu? A continuacin se muestra una salida producida por el ciclo:
Escriba un nmero entero: 1 Ahora la suma es 1 Escriba un nmero entero: 2 Ahora la suma es 3 Escriba un nmero entero: 3 Ahora la suma es 6 Escriba un nmero entero: -1 Ciclo concluido

Ejemplo 9.2 El siguiente programa: MSTWHILE.CPP, muestra las cuatro partes de un ciclo while .
/* El siguiente programa: MSTWHILE.CPP, ilustra las cuatro partes de un ciclo while. Muestra en la pantalla los nmeros del 1 al 100 separados por un espacio en blanco. */ #include <iostream.h> void main(void) { int contador = 1; while (contador <= 100) { cout << contador << ' '; contador++; } // Fin de while } // Fin de main() // Inicializa la variable de control // Prueba la condicin // Ejecuta los enunciados // Modifica la variable de control // Para cout

Ejemplo 9.3 El siguiente programa: OBTSN1.CPP, le pide que teclee S (para S) o N (para No ) A continuacin el programa ejecuta un ciclo while , para leer caracteres desde el teclado hasta que teclee S o N.
/* El siguiente programa: OBTSN1.CPP, le pide que teclee S (para s) o N (para No)

A continuacin el programa ejecuta un ciclo while, para leer caracteres desde el teclado hasta que teclee S o N. */

FUNDAMENTOS LECCIN 9

9-7

MIGUEL . TOLEDO MARTNEZ

#include <iostream.h> void main(void) { int hecho = 0; char letra; while(!hecho) {

// Para cin y cout

// Se pone en verdadero cuando se encuentra S o N

cout << "\nDigite S o N y oprima Intro para continuar: "; cin >> letra; if((letra == 'S') || (letra == 's')) hecho = 1; else if((letra == ' N') || (letra == 'n')) hecho = 1; else cout << '\a'; // Suena la campana para carcter invlido } // Fin de while cout << "La letra que tecle fu: " << letra << endl; } // Fin de main()

Ejemplo 9.4 Una variante del programa anterior es el siguiente programa: OBTSN2.CPP.
/* El siguiente programa: OBTSN2.CPP , es una variante del programa OBTSN1.CPP. Utiliza la funcin toupper() para convertir un carcter a mayscula y de esta manera simplificar la condicin del while(). */ #include <iostream.h> #include <ctype.h> void main(void) { char letra; cout << "Desea continuar (S/N): "; cin >> letra; letra = toupper(letra); while ((letra != 'S') && (letra != ' N')) { cout << '\a'; cin >> letra; letra = toupper(letra); } // Fin del while // Obtiene la letra tecleada // Convierte a mayscula // Letra tecleada por el usuario // Para cin y cout // Para la funcin toupper()

// Emite un sonido // Obtiene una letra // Convert letra to uppercase

cout << "Tu respuesta fu: " << letra << endl; } // Fin del main()

FUNDAMENTOS LECCIN 9

9-8

MIGUEL . TOLEDO MARTNEZ

Ejemplo 9.5 El siguiente programa: WHILE.CPP, calcula la suma y el promedio de un rango de enteros usando un ciclo while .
/* El siguiente programa: WHILE.CPP, calcula la suma y el promedio de un rango de enteros usando un bucle while. */ #include <iostream.h> void main(void) { int contador = 0; // Variable para determinar el nmero de enteros sumados double suma = 0.0; // Acumulador con la suma de todos los enteros del rango int primero, ultimo, temporal; // Variable inicial y final del rango. // temporal es una variable auxiliar, para // intercambiar si es necesario los valores // entre primero y ultimo. cout << "Introduzca el primer entero: "; cin >> primero; cout << "Introduzca el segundo entero: "; cin >> ultimo; if (primero > ultimo) { temporal = primero; primero = ultimo; ultimo = temporal; } // Fin del if cout << "La suma de los enteros desde " << primero << " hasta " << ultimo << ": "; while (primero <= ultimo) { contador++; suma += (double) primero++; } // Fin del while cout << suma << endl; cout << "El promedio es de: " << suma / contador << endl; } // Fin del main() // Para cout y cin

ENTRADA DE DATOS USANDO while

Hay muchas situaciones en las cuales querr usar la operacin de ciclo para leer datos. Un ejemplo comn es leer las cadenas de datos. La idea es leer un solo elemento de dato, como un carcter, cada vez que se ejecute un ciclo. Despus romper el ciclo cuando la cadena de datos se termine.
Ejemplo 9.6 El siguiente programa: CTACAR1.CPP, cuenta los caracteres que hay en una cadena.

FUNDAMENTOS LECCIN 9

9-9

MIGUEL . TOLEDO MARTNEZ

/* El siguiente programa: CTACAR1.CPP, cuenta los caracteres que hay en una cadena, introducida por el usuario. Para indicar fin de introduccin de la cadena se utiliza un punto (.). Observe que, ya que se utiliza el objeto cin, los blancos no se consideran caracteres. */ #include <iostream.h> // Para cin y cout

// Definicin de la constante PUNTO. const char PUNTO = '.'; void main(void) { char caracter int contador = ' '; = 0; // Entrada del usuario // Contador del ciclo

cout << "Escriba una cadena de caracteres y termine la entrada\n" "con un punto. Presione ENTER cuando termine." << endl; cin >> caracter; while(caracter != PUNTO) { ++ contador; cin >> caracter; } // Fin del while cout << "El nmero de caracteres ingresados fu: " << contador << endl; } // Fin de main()

La idea general de este programa es le er una cadena de caracteres hasta encontrar un punto (.). El punto se llama valor centinela , porque finaliza la entrada de la cadena pero no forma parte de esta cadena. La variable de entrada es carcter. El ciclo while se ejecuta siempre y cuando carcter no sea igual a un punto. En cada iteracin se incrementar un contador (contador ) para contar el nmero de caracteres que se introdujeron antes del punto. Esto es lo que ver cuando se ejecute el programa:
Escriba una cadena de caracteres y termine la entrada con un punto. Presione ENTER cuando termine. abcd. El nmero de caracteres ingresados fue: 4

Aqu el usuario introdujo seis caracteres, incluyendo el valor centinela y el carcter CRLF generado por la tecla ENTER. El programa cuenta el nmero de caracteres introduc idos, excluyendo el valor centinela y el carcter CRLF. Veamos con ms detenimiento el programa. Primero, note que se lee un carcter justo antes del enunciado while porque el enunciado while verifica a la variable carcter para ver que sta no sea un punto. Sin la primera operacin de lectura, carcter no tendra un valor y, por lo tanto, no se podra verificar. Recuerde que la variable que se verifica en el enunciado while siempre tendr un valor antes de la primera verificacin. Esta es una fuente de error comn cuando se escriben ciclos while . Por qu el programa no cont el punto o el carcter CRLF? Bueno, el ciclo se rompe con el carcter punto y por lo tanto el contador no se ha incrementado; adems el operador >> ignora el carcter espacio en bla nco CRLF.

FUNDAMENTOS LECCIN 9

9-10

MIGUEL . TOLEDO MARTNEZ

Ejemplo 9.7 Veamos otro programa que emplea un ciclo while para leer datos. Esta vez, usaremos el carcter CRLF como nuestro valor centinela , como se muestra, en el programa, CTACAR2.CPP.
/* El siguiente programa: CTACAR2.CPP, cuenta los caracteres que hay en una cadena. El valor centinela es el CRLF. Utilizaremos cin.get para tomar en cuenta los caracteres en blanco. */ #include <iostream.h> // Declara constante a CRLF const char CRLF = '\n'; void main(void) { char caracter int contador = ' '; = 0; // Entrada del usuario // Contador del ciclo // Para cin y cout

cout << "Escriba una cadena de caracteres presione " "ENTER cuando termine." << endl << endl; cin.get(caracter); while(caracter != CRLF) { ++ contador; cin.get(caracter); } // Fin del while cout << "El nmero de caracteres ingresados fu: " << contador << endl; } // Fin de main()

La lgica de ese programa es la misma que la del programa anterior. Sin embargo, esta vez usamos la funcin get() en lugar del operador >> para leer los datos carcter. Dado que estamos verificando el carcter espacio en blanco (CRLF ), necesitamos una funcin que lo lea. En nuestro programa el carcter que lee get() se asigna a la variable carcter. La variable caracter se verifica por el enunciado while para ver si es el carcter CRLF. Cuando este presente el carcter CRLF, el ciclo se rompe y el valor de contador no se incrementa otra vez. Esto es lo que el usuario podr ver cuando ejecute el programa:
Escriba una cadena de caracteres y presione ENTER cuando termine. abcd. El nmero de caracteres ingresados fue: 5

Note que se cont el punto pero no el carcter CRLF. Ejemplo 9.8 El siguiente programa: CONCTA.CPP, calcula el promedio de las calificaciones de 10 alumnos , controlada por contador.

FUNDAMENTOS LECCIN 9

9-11

MIGUEL . TOLEDO MARTNEZ

/* El siguiente programa: CONCTA.CPP , calcula el promedio de un grupo de 10 alumnos, utilizando repeticin y controlada por contador. */ #include <iostream.h> void main(void) { int total, numeroAlumnos, calificacion, promedio; //Fase de inicializacin total = 0; numeroAlumnos //Suma de las calificaciones // Nmero de calificaciones introducidas //Una calificacin //Promedio de callificaciones //Para cout y cin

//Establece total a cero = 1; //Prepara el ciclo

//Fase de procesamiento while(numeroAlumnos <= 10) //Realiza el ciclo 10 veces { cout << Introduzca la calificacin: ; //Solicita entrada cin >> calificacion; //Introduce calificacin total = total + calificacion; //Suma la calificacion al total numeroAlumnos = numeroAlumnos + 1; //Incrementa contador } //Fin de while //Fase de terminacin promedio = total / 10; //Divisin entera cout << El promedio del grupo es: << promedio << endl; } //Fin de main

Nota: La repeticin controlada por contador con frecuencia se conoce como repeticin definida, ya que antes de iniciar la ejecucin del ciclo se conoce la cantidad de repeticiones.

Ejemplo 9.9
/* El siguiente programa: CONCEN.CPP, calcula el promedio de grupo con repeticin controlada por centinela. */ #include <iostream.h> #include <iomanip.h> void main(void) { int total, contadorCalificaciones, calificacion; float promedio; //Fase de inicializacin total contadorCalificaciones //Suma de calificaciones //Cantidad de calificaciones introducidas //Una calificacin //Nmero con punto decimal para el promedio //Para cout y cin //Para setprecision()

= 0; = 0;

FUNDAMENTOS LECCIN 9

9-12

MIGUEL . TOLEDO MARTNEZ

//Fase de procesamiento cout << Introduzca la calificacin, -1 para terminar: ; cin >> calificacion; while(calificacion != -1 ) { total = total + calificacion; contadorCalificaciones = contadorCalificaciones + 1; cout << Introduzca la calificacion, -1 para terminar: ; cin >> calificacion; } //Fin de while //Fase de terminacin if(contadorCalificaciones != 0) { promedio = static_cast <float> (total) / contadorCalificaciones; cout << El promedio del grupo es: << setprecision(2) << setiosflags(ios::fixed | ios::showpoint) << promedio << endl; } //Fin de if else cout << No se teclearon calificaciones << endl; } //Fin de main()

En el primer ejemplo de clculo de promedio de grupo, la cantidad de calificaciones era conocida desde un principio. En este ejemplo, no se indica la cantidad de calificaciones que se debe introducir. El programa debe procesar una cantidad arbitraria de calificaciones. Cmo puede terminar el pr ograma cundo hay que dejar de aceptar calificaciones? Cmo sabr el momento de calcular e imprimir el promedio? Una solucin a este problema es emplear un valor especial llamado valor centinela , valor de indicador , valor de seal o valor simulado que indica el fin de entrada de datos . El usuario teclea las calificaciones hasta que ha terminado de indicar los valores legtimos. Luego teclea el valor centinela para indicar que se ha introducido la ltima calificacin. La repeticin controlada por centinela se llama con frecuencia repeticin indefinida., pues la cantidad de repeticiones no se conoce antes de iniciar la ejecucin del ciclo. Queda claro que el valor centinela debe seleccionarse de modo que no pueda confundirse con un valor de entrada vlido. Debido a que las calificaciones de un examen suelen ser nmeros enteros no negativos, -1 es un valor centinela vlido para este problema. Aunque slo se han introducido calificaciones enteras, el proceso de clculo probablemente produc ir un nmero con un punto decimal, es decir un nmero real. En el clculo del promedio se utiliza un operador especial llamado operador de conversin mediante cast, que se encarga del proceso de sacar el promedio. El resultado del clculo total / contadorCalificaciones es un entero, debido a que total y contadorCalificaciones son variables enteras. La divisin de dos enteros da como resultado una divisin entera en la que se pierde (es decir, se trunca ) cualquier parte fraccional del clculo. En virtud de que primero se realiza el clculo, se pierde la parte fraccional antes de que se le asigne el resultado a promedio. Para producir un clculo de punto flotante con valores enteros, debemos crear valores temporales que sean nmeros de punto flotante. C++ ofrece el operador unario de conversin mediante cast, que realiza esta tarea. La instruccin:
promedio = static_cast<float> (total) / contadorCalificaciones;
FUNDAMENTOS LECCIN 9

9-13

MIGUEL . TOLEDO MARTNEZ

Incluye el operador de conversin mediante cast static_cast<float> (), que crea una copia de punto flotante del operando indicado entre parntesis: total. El empleo de los o peradores de conversin mediante cast en esta forma se llama conversin explcita . El valor almacenado en total sigue siendo entero. El clculo ahora consiste de un valor de punto flotante (la versin temporal de total en float) dividido entre el entero contadorCalificaciones. Ejemplo 9.10 Una universidad ofrece un curso que prepara a los estudiantes para el examen de obtencin de la licencia estatal para corredores de bienes races. El ao pasado, varios de los estudiantes que completaron este curso hicieron el examen para obtener la licencia. Naturalmente, la universidad quiere saber qu resultados obtuvieron sus estudiantes en el examen. Se le ha pedido a usted que escriba un programa que resuma los resultados (Llmele a este programa: EXAMENES.CPP) Por principio, se le ha dado una lista de estos 10 estudiantes. Junto a cada nombre hay un 1 si el estudiante pas y un 2 si reprob.
/* El siguiente programa: EXAMENES.CPP , analiza los resultados de examen. */ #include <iostream.h> void main(void) { //Inicializa las variables durante las declaraciones int aprobados = 0, //Cantidad de aprobados reprobados = 0, //Cantidad de reprobados contadorEstudiantes = 1, //Contador de estudiantes resultado; //Resultado de un examen //Procesa 10 estudiantes; ciclo controlado por contador while(contadorEstudiantes <= 10) { cout << Introduzca el resultado (1=aprobado, 2=reprobado):<; cin >> resultado; if(resultado == 1) //if/else anidado en while aprobados = aprobados + 1; else reprobados = reprobados + 1; contadorEstudiantes = contadorEstudiantes + 1; } //Fase de terminacin cout << Aprobados : << aprobados << endl; cout << Reprobados: << reprobados << endl; if(aprobados > 8) cout << Aumente la colegiatura << endl; } //Fin de main() //Para cout y cin

Ejemplo 9.11 El siguiente programa CONTACALIF.CPP, utiliza switch para contar el nmero de calificaciones diferentes (indicadas con letras) que los estudiantes obtuvieron en un examen.

FUNDAMENTOS LECCIN 9

9-14

MIGUEL . TOLEDO MARTNEZ

/* El siguiente programa CONTACALIF.CPP, cuenta las calificaciones indicadas mediante letras. */ #include <iostream.h> void main(void) { int calificacion, aContador = 0, bContador = 0, cContador = 0, dContador = 0, rContador = 0; cout //Una calificacin //Cantidad con calificacin A //Cantidad con calificacin B //Cantidad con calificacin C //Cantidad con calificacin D //Cantidad con calificacin R //Para cout y cin

<< Introduzca las calificaciones indicadas con letras. << endl << Teclee el carcter EOF para terminar la entrada de datos. << endl;

while((calificacion = cin.get()) != EOF) { switch(calificacion) { case A: case a: ++aContador; break; case B: case b: ++bContador; break; case C: case c: ++cContador; break; case D: case d: ++dContador; break; case 'R': case 'r': ++rContador; break; case '\n': //Ignora saltos de lnea case '\t': //tabulaciones case ' ' : //y espacios en la entrada break; default: cout

<< "Calificaciones literal incorrecta." << "Introduzca una nueva calificacin."

<< endl; break; //Opcional } //Fin de switch } //Fin de while

FUNDAMENTOS LECCIN 9

9-15

MIGUEL . TOLEDO MARTNEZ

cout

<< "\n\nLos totales para cada calificacin literal son: " << "\nA: " << aContador << "\nB: " << bContador << "\nC: " << cContador << "\nD: " << dContador << "\nR: " << rContador << endl;

} //Fin de main()

EXAMEN BREVE 23 EL CICLO do/while El flujo del ciclo do/while se puede observar en la figura 9.2.
enunciados del ciclo

do

while

expresin de verificacin

verdadero

falso

Figura 9.2 . Funcionamiento del ciclo do/while.

Si se compara la figura 9.2 con el flujo while en la figura 9.1, encontrar que la verificacin se hace al final del ciclo, en lugar de al principio del ciclo. Esta es la diferencia principal entre while y do/while. Ya que do/while es un ciclo posverificador, los enunciados del ciclo siempre se ejecutarn por lo menos una vez. Para romper el ciclo, la expresin de verificacin debe convertirse en falso (cero ) De este modo, si el valor de la verificacin es inicialmente verdadero, algo debe suceder dentro del ciclo para cambiar el valor a falso; de lo contrario, tendr un ciclo infinito. Enseguida se presenta la sintaxis requerida para C++.

FUNDAMENTOS LECCIN 9

9-16

MIGUEL . TOLEDO MARTNEZ

FORMATO PARA EL ENUNCIADO do/while


do { enunciado 1; enunciado 2; .................. // Enunciados del ciclo enunciado n; } // Fin de do/while while(expresin de verificacin);

Este formato muestra que la operacin comienza con la palabra reservada do, seguida por los enunciados del ciclo, los cuales estn seguidos por la palabra reservada while y la expresin de verificacin entre parntesis. Siempre deber encerrar entre llaves los enunciados mltiples; sin embargo, no se requiere cuando slo hay un enunciado en el ciclo. Adems, note que no hay un punto y coma despus de la palabra clave do en la primera lnea, pero se requiere un punto y coma despus de la expresin de verificacin en la ltima lnea. Observe los segmentos de programa en el ejemplo 9.12 y vea si puede predecir los resultados.
Ejemplo 9.12 Qu mostrarn los siguientes segmentos de cdigo? Suponiendo que las variables empleadas en cada segmento se han definido adecuadamente.
a. numero suma do { = 5; = 0;

suma += numero; --numero; } while(numero > 0); cout << La suma es << suma << endl; El resultado que se muestra es: La suma es 15

Observe que este ciclo do/while calcula la suma de los enteros del 1 al 5 , como lo hizo el ciclo while en el ejemplo 9.1a .
b. numero = 0; suma = 0; do { suma += numero; ++numero; } while(numero != 5); cout << La suma es << suma << endl;

El resultado que se muestra es: La suma es 10


Observe que este ciclo do/while calcula la suma de los enteros del 1 al 4 . c. numeroMax numero suma do {
FUNDAMENTOS LECCIN 9

= 5; = 0; = 0;

9-17

MIGUEL . TOLEDO MARTNEZ

--numero; suma += numero; } while(numero != numeroMax); cout << El promedio de los primeros << numeroMax << enteros positivos es: << suma / numeroMax << endl;

En este segmento, numeroMax empieza con el valor 5 , numero y suma se inicializan con 0 . El ciclo se rompe cuando el valor de numero es igual al valor de numeroMax Cuntas veces se ejecutar el ciclo ? Si dice cinco est equivocado! Note que numero se decrementa cada vez que se ejecuta el ciclo. Tericamente, el c iclo se ejecutar un nmero infinito de veces. Sin embargo, dado que el rango de los enteros en C++ es normalmente de 32768 a 32767, el ciclo se ejecutar 65531 veces. Cmo se obtuvo este dato? Bueno, 32768 ciclos se ejecutarn cuando numero llegue a 32768. La siguiente operacin del ciclo decrementar numero a 32767 . Entonces tomar 32762 ciclos para decrementar numero a 5. Note que 32768 + 1 + 32762 = 65531. Por supuesto, es infinito para todos los propsitos prcticos.
d. numeroMax numero suma do { = 5; =0 = 0;

++numero; suma += numero; } while(numero != numeroMax); cout << El promedio de los primeros << numeroMax << enteros positivos es: << suma / numeroMax << endl;

En este caso, el ciclo del ejemplo 9.12c se ha corregido para que el valor de numero se incremente en 1 en cada iteracin. Cuando numero llegue a 5 , igualar el valor de numeroMax , y se romper el ciclo. El resultado se muestra as:
El promedio de los primeros 5 enteros positivos es: 3 e. const char PUNTO = .; char caracter int contador = ; = 0; // Declara la constante punto // Define la variable de entrada del usuario // Define a la variable contador del ciclo

cout << Escriba una cadena de caracteres y termine la entrada\n con un punto. Presione ENTER cuando termine. << endl; do { ++contador; cin >> caracter; } while(caracter != PUNTO); cout << El nmero de caracteres escrito fue: << contador 1 << endl;

Suponiendo que el usuario introdujo la cadena abcd ., el desplegado ser:


Escriba una cadena de caracteres y termine la entrada con un punto. Presione ENTER cuando termine. abcd. El nmero de caracteres escrito fue: 4

FUNDAMENTOS LECCIN 9

9-18

MIGUEL . TOLEDO MARTNEZ

f.

const char CRLF char caracter int contador

= .; = ; = 0;

// Declara la constante CRLF // Define la variable de entrada del usuario // Define a la variable contador del ciclo

cout << Escriba una cadena de caracteres y presione ENTER cuando termine. << endl; do { ++contador; cin.get(caracter); } while(caracter != CRLF); cout << El nmero de caracteres escrito fue: << contador 1 << endl;

Suponiendo que el usuario introdujo la cadena xyz , el desplegado ser:


Escriba una cadena de caracteres y presione ENTER cuando termine. xyz. El nmero de caracteres escrito fue: 3

Ejemplo 9.13 El siguiente programa: DOWHILE1.CPP, utiliza una estructura de repeticin do/while que imprime los nmeros del 1 al 10. Observe que la variable de control contador se preincrementa en la prueba de continuacin del ciclo. Tambin observe que se emplean llaves para encerrar la instruccin nica que forma el cuerpo de la estructura do/while (aunque no sea necesaria)
/* El siguiente programa: DOWHILE1.CPP , emplea la estructura de repeticin do/while. */ #include <iostream.h> void main(void) { int contador = 1; do { cout << contador << ; }while(++contador <= 10); cout << endl; } //Fin de main() //Para cout y cin

Ejemplo 9.14 El siguiente programa, DOWHILE2.CPP, ilustra el uso del do/while . El do/while interno asegura que el nmero sea distinto de cero . El do/while externo le permite realizar los clculos tantas veces como desee.

FUNDAMENTOS LECCIN 9

9-19

MIGUEL . TOLEDO MARTNEZ

/* El siguiente programa: DOWHILE2.CPP, ilustra el uso de do/while. El programa solicita un nmero distinto de cero , si el usuario digita cero, le enva un mensaje para que introduzca nuevamente un nmero. Posteriormente calcula el recproco del nmero lo muestra y le pregunta si desea continuar haciendo clculos. */ #include <iostream.h> #include <ctype.h> void main(void) { char ch; double x, y; do { do // bucle do-while para recolectar un nmeo { cout << endl << "Introduzca un nmero: "; cin >> x; if (x == 0) cout << "Error: no se acepta el 0" << endl; } while ( x == 0); // bucle do-while para realizar clculos // Para cout y cin // Para toupper()

y = 1/x; cout << "1/" << x << " = " << y << endl; cout << "Desea hacer ms clculos? (S/N) "; cin >> ch; } while (toupper(ch) == 'S'); } // Fin de main()

Solucin de problemas en accin: Programas manejadores de mens controlados por ciclos


PROBLEMA En la leccin 8, se vio como se usa el enunciado switch para crear programas manejadores de mens . Con frecuencia conviene permitirle al usuario seleccionar una opcin de un men, realizar la tarea asociada con esa opcin, despus regresar al men para seleccionar otra opcin, sin terminar el programa hasta que se elija la opcin de salida. Tal programa requerir que el men se muestre repetidas veces hasta que se elija la opcin para salir. Esta es una aplicacin ideal para los ciclos. Encerraremos nuestro men dentro de un ciclo, as que el men y las tareas asociadas se mantendrn repitindose hasta que el usuario seleccione terminar el programa. Aplicaremos esta tcnica al programa manejador de men para la solucin de la ley de Ohm desarrollada en la leccin 8 . Vamos a revisar el problema a travs de su definicin. DEFINICIN DEL PROBLEMA
Salida: Un men que pida al usuario seleccionar una opcin para calcular el voltaje, corriente o resistencia. M ensaje para entradas no vlidas. Un valor de voltaje, corriente o resistencia, dependiendo de la opcin que el usuario seleccione.

FUNDAMENTOS LECCIN 9

9-20

MIGUEL . TOLEDO MARTNEZ

Entrada:

Una respuesta del usuario al men ( V, C , R o S). Si selecciona V: el usuario escribe los valores para corriente y resistencia. Si selecciona C: el usuario escribe los valores para voltaje y resistencia. Si selecciona R: el usuario escribe los valores para voltaje y corriente. Si selecciona S: el programa termina . Calcula la opcin seleccionada. Caso V: Voltaje = Corriente x Resistencia. Caso C: Corriente = Voltaje / Resistencia. Caso R: Resistencia = Voltaje / Corriente. Caso S: Termina el programa. El men se repite hasta que el usuario decide terminar el programa.

Procesamiento:

PLANEACIN DE LA SOLUCIN Con el uso del diseo de programacin estructurada, dividiremos el problema en subproblemas individuales para solucionar el problema general. Hay dos tareas importantes que surgen directamente a partir de la definicin del problema:
Mostrar el men y leer la opcin del usuario. Realizar los clculos requeridos y mostrar los resultados.

Primero, el programa deber mostrar un men de opciones al usuario. El usuario escribir su opcin y dependiendo de su opcin, se har uno de los tres clculos para determinar la cantidad solicitada. El diagrama de estructura en la figura 9.3 muestra el diseo descendente que resuelve el problema planteado.
programaPrincipal () Llama a muestraMenu() Llama a leyDeOhm()

opcin opcin

muestraMenu() Muestra el men y obtiene la opcin del usuario

leyDeOhm()
Realiza el clculo seleccionado y muestra los resultados

V
calculaVoltaje() si opcin V: calcula y muestra el voltaje.

C
calculaCorriente() si opcin C: calcula y muestra la corriente

R
calculaResistencia() si opcin R: calcula y muestra la resistencia

Figura 9.3 . Diagrama de estructura para el problema de la ley de Ohm.

Observe que hay tres niveles de solucin del problema. En el primer nivel programaPrincipal(), llama a una funcin para mostrar el men y obtener la opcin del usuario. La funcin muestraMenu() realiza esta tarea y devuelve la opcin del men a programaPrincipal() como se indica en el diagrama. La funcin
FUNDAMENTOS LECCIN 9

9-21

MIGUEL . TOLEDO MARTNEZ

programaPrincipal() enviar la opcin a la funcin llamada leyDeOhm (), que llamar a una de las tres funciones, d ependiendo de la opcin, para realizar los clculos requeridos. Ahora, la descripcin del proceso requiere que agreguemos al programa una caracterstica de control del ciclo. Aqu se muestra el conjunto de algoritmos revisados a travs del primer nivel de refinamiento
ALGORITMO INICIAL

programaPrincipal() INICIO do Llamar a la funcin muestraMenu(). Llamar a la funcin leyDeOhm(). While opcin != s AND opcin != S FIN.

El primer nivel de refinamiento muestra el contenido de las funciones muestraMenu() y leyDeOhm(), como sigue:
PRIMER NIVEL DE REFINAMIENTO

muestraMenu() Inicio Muestra el men del programa que pide al usuario seleccionar la opcin de voltaje (V), corriente (C), resistencia (R) o salir (S) Leer( opcin) Fin. leyDeOhm() Inicio Segn sea opcin hacer V: Llama a la funcin calculaVoltaje(). C: Llama a la funcin calculaCorriente(). R: Llama a la funcin calculaResistencia () S: Termina el programa. sino : Escribir (Entrada no vlida, seleccionar nuevamente.) Fin.

Observe que la caracterstica de control del ciclo se adiciona al nivel del algoritmo inicial programaPrincipal() Los algoritmos muestraMenu() y leyDeOhm () del primer nivel de refinamiento no han cambiado respecto de nuestra solucin anterior. As es que, enfoqumonos en el control del ciclo en programaPrincipal() Recordemos que la funcin muestraMenu() obtiene la opcin del men del usuario. Si el usuario introduce una s o S para salir del programa, se romper el ciclo y el programa termina. Pero, hay algn error aqu? La seudocodificacin dice si el usuario introduce una s o S el programa se termina , sin embargo, la verific acin del ciclo emplea la operacin AND. Entonces, por qu se utiliza la operacin AND en l ugar de la operacin OR para realizar esta verificacin? Este es un candidato clsico para explicar en el escritorio la lgica del algoritmo antes de codificar el pr ograma. Pregntese cundo se romper el ciclo? Un ciclo do/while se rompe cuando el valor verificado es falso, correcto? Recuerde que el resultado de una operacin AND es falso cuando alguno de sus valores es falso. Como resultado, el ciclo se romper cuando opcion sea una s o una S. El ciclo continuar cuando sean verdaderos ambos lados de la operacin AND. Por tanto, el ciclo continuar siempre y cuando opcion no sea una s y opcion no sea S. No es esto lo que queremos hacer? Qu pasara si errneamente usara la operacin OR en la prueba del ciclo anterior? Una operacin OR produce un resultado verdadero cuando alguna de sus condiciones es verdadera. Una de estas condiciones podra ser siempre verdadera, dado que opcin no puede ser s y S. El resultado de este descuido ser un ciclo infinito.
FUNDAMENTOS LECCIN 9

9-22

MIGUEL . TOLEDO MARTNEZ

Necesitamos hacer otra aclaracin aqu. Esta aplicacin es un candidato clsico para el ciclo do/while en vez de un ciclo while , porque siempre querr que el men se muestre por lo menos una vez para permitirle al usuario la seleccin de una opcin. Ahora, necesitamos un segundo nivel de refinamiento para mostrar el contenido de la s funciones de clculo:
SEGUNDO NIVEL DE REFINAMIENTO

calculaVoltaje() Inicio Escribir ( Favor de introducir un valor para la corriente: ) Leer( corriente) Escribir ( Favor de introducir un valor para la resistencia: ) Leer( resistencia) si resistencia < 0 Escribir (Entrada no vlida, ejecutar el programa nuevamente) sino Inicio Calcula voltaje = corriente x resistencia. Escribir( voltaje) Fin. Fin. calculaCorriente() Inicio Escribir (Favor de introducir un valor para el voltaje: ) Leer( voltaje) Escribir (Favor de introducir un valor para la resistencia: ) Leer( resistencia) si resistencia <= 0 Escribir (Entrada no vlida, ejecutar el programa nuevamente) sino Inicio Calcula corriente = voltaje / resistencia. Escribir( corriente) Fin. Fin. calculaResistencia () Inicio Escribir (Favor de introducir un valor para el voltaje: ) Leer( voltaje) Escribir (Favor de introducir un valor para la corriente: ) Leer( corriente) si corriente == 0 Escribir (Entrada no vlida, ejecutar el programa nuevamente) sino Inicio Calcula resistencia = voltaje / corriente. Escribir( resistencia ) Fin. Fin.

Cada funcin de clculo obtiene los datos necesarios para los clculos respectivos a partir de la ley de Ohm. La funcin hace los clculos y muestra el resultado. Observando ms de cerca estos algoritmos, encontrar algunas caractersticas de proteccin. Los enunciados si/sino dentro de cada funcin protegen contra entradas de datos no vlidos. Un valor de resistencia negativa no es
FUNDAMENTOS LECCIN 9

9-23

MIGUEL . TOLEDO MARTNEZ

vlido porque no hay tal cosa. Adems, no podr dividir entre 0 . Como resultado, las funciones calculaCorriente () y calculaResistencia () cada una verifica las entradas cero para los valores que se usan como divisor en clculo de la ley de Ohm. CODIFICACIN DEL PROGRAMA Codificaremos la solucin usando una implementacin lineal.
/* El siguiente programa: MENU2.CPP, muestra el concepto de mens. Salida: Un men del programa le pide al usuario seleccionar una opcin para calcular el Voltaje, Corriente o Resistencia. Se debe enviar un mensaje en el caso de hacer una seleccin invlida. Mostrar un valor del Voltaje, Corriente o resistencia dependiendo de la opcin que el usuario seleccione. Entrada: Una respuesta del usuario al men ( V, C, R o S) Si se selecciona V: escribe un valor para la corriente y la resistencia . Si selecciona C: escribe un valor para voltaje y resistencia. si selecciona R: escribe un valor para voltaje y corriente. Si selecciona S: el programa termina . Procesamiento: Clculo de la opcin seleccionada Caso V: Voltaje = Corriente x Resistencia. Caso C: Corriente = Voltaje / Resistencia. Caso R: Resistencia = Voltaje / Corriente. Caso S: Termina el programa. */ #include <iostream.h> void main(void) { // Definicin de variables. char opcion = 'S'; float voltaje = 0.0; float corriente = 0.0; float resistencia = 0.0; // Para cin y cout.

// Entrada del usuario desde el men. // Voltaje en voltios. // Corriente en miliamperes. // Resistencia en KiloOhms.

// Muestra el mensaje de la descripcin del programa. cout << "Este programa calcular el voltaje de cd, corriente, o\n" "resistencia proporcionando los otros dos valores." << endl << endl; // Empieza el ciclo que controla al men do { // Funcin mustraMenu() cout << "\n\n\t\t\tEscriba V para encontrar el voltaje." << endl << endl << "\t\t\tEscriba C para encontrar la corriente." << endl << endl << "\t\t\tEscriba R para encontrar la resistencia." << endl << endl << "\t\t\tEscriba S para salir." << endl << endl << "\tPor favor escriba su opcin: "; cin >> opcion; // Establecer la precisin de la salida. cout.setf(ios::fixed); cout.precision(2);

FUNDAMENTOS LECCIN 9

9-24

MIGUEL . TOLEDO MARTNEZ

// Funcin leyDeOhm() switch(opcion) { case 'v': // Funcin calculaVoltaje() case 'V': cout << "\nEscriba el valor de la corriente en miliamperes\tI = "; cin >> corriente; cout << "\nEscriba el valor de la resistencia en KiloOhms\tR = "; cin >> resistencia; if(resistencia < 0 ) cout << "\n\nEsta es una entrada no vlida. Por favor" "ejecute el programa de nuevo." << endl; else { voltaje = corriente * resistencia; cout << "\n\nEl valor del voltaje es " << voltaje << " voltios." << endl; } // Fin del else break; case 'c': // Funcin calculaCorriente(). case 'C': cout << "\nEscriba el valor del voltaje en volts\tV = "; cin >> voltaje; cout << "\nEscriba el valor de la resistencia en Kilo Ohms\tR = "; cin >> resistencia; if(resistencia <= 0) cout << "\n\nEsta es una entrada no vlida. Por favor" " ejecute el programa de nuevo." << endl; else { corriente = voltaje / resistencia; cout << "\n\nEl valor de la corriente es " << corriente << " miliamperes." << endl; } // Fin del else break; case 'r': // Funcin calculaResistencia(). case 'R': cout << "\nEscriba el valor de voltaje en volts\tV = "; cin >> voltaje; cout << "\nEscriba el valor de la corriente en miliamperes\tI = "; cin >> corriente; if(corriente == 0) cout << "\n\nEsta es una entrada no vlida. Por favor" " ejecute el programa de nuevo." << endl; else { resistencia = voltaje / corriente; cout << "\n\nEl valor de la resistencia es " << resistencia << " KiloOhms." << endl; } // Fin del else break; case 's': // Termina el programa case 'S': cout << "Programa terminado" << endl; break;

FUNDAMENTOS LECCIN 9

9-25

MIGUEL . TOLEDO MARTNEZ

// Muestra el mensaje de entrada no vlida. default: cout << "\n\nEsta es una entrada no vlida. Por favor" " ejecute el programa de nuevo." << endl; } // Fin del switch } // Final de do/while while ((opcion != 's') && (opcion != 'S')); } // Fin de main()

El cambio ms importante aqu es la caracterstica de control del ciclo do/while que aadimos en nuestro planteamiento de la solucin. Note ahora que la condicin de la prueba del ciclo se codifica al final del programa. La verificacin completa debe estar dentro de parntesis. La variable opcion se verifica dos veces, ambas verific aciones se deben encerrar entre parntesis. El resultado de ambas verificaciones se combina por medio de la operacin booleana AND (&& ) Mostremos nuevamente el uso comn del ciclo do/while para visualizar mens , ya que los mismos se requieren ver al menos una vez.

Ejemplo 9.15
El programa siguiente, MENU3.CPP, ilustra el uso del enunciado do/while , para el manejo de mens .
/* El siguiente programa: MENU3.CPP, ilustra el uso de do while. */ #include <iostream.h> #include <conio.h> #include <ctype.h> #include <stdlib.h> void main(void) { char letra; do { cout cout cout cout cout << "[A] Ejecuta el comando DIR" << endl; << "[B] Ejecuta el comando CHKDSK" << endl; << "[C] Ejecuta el comando DATE" << endl; << "[S] Salir" << endl; << "Su eleccin: "; // Para cout y cin // Para toupper()

cin >> letra; letra = toupper(letra); if (letra == 'A') system("DIR"); else if (letra == 'B') system("CHKDSK "); else if (letra == 'C') system("DATE"); } while (letra != 'S'); } // Fin de main()

EXAMEN BREVE 24
FUNDAMENTOS LECCIN 9

9-26

MIGUEL . TOLEDO MARTNEZ

EL CICLO for El flujo de esta estructura de control de iteracin se ilustra en la figura 9.4. Al ciclo for se le llama ciclo de repeticin fija porque el ciclo se repite un nmero determinado de veces. Como ver, lo primero que se lleva a cabo antes de ejecutar los enunciados del ciclo es la inicializacin de una variable controladora del ciclo. Iniciacin significa establecer una variable a algn valor inicial. Despus se ejecuta la expresin de verificacin para verificar el valor de la variable. Si el resultado de esta prueba es verdadero (diferente de cero ), se ejecutan los enunciados del ciclo. Cada vez que se ejecuten los enunciados del ciclo, el valor de la variable se debe incrementar o decremenentar. La expresin de verificacin se evala nuevamente antes de que se ejecuten otra vez los enunciados del ciclo. El ciclo se repite siempre y cuando el resultado de la expresin de verificacin sea verdadero. En otras palabras, la variable se incrementa o decrementa, se verifica y el ciclo se repite hasta que la expresin de la verificacin sea falsa. Cuando esto ocurre, ya no se ejecutan los enunciados del ciclo y ste se rompe. Entonces el control del programa pasa al siguiente enunciado del ciclo. Cuando sus programas utilizan un enunciado for (a menudo llamado ciclo for), se especifica una variable que controlar el nmero de veces que el ciclo se ejecutar. El siguiente ciclo for, por ejemplo, utiliza la variable contador para controlar el nmero de veces que el ciclo se ejecutar. En este caso el ciclo se ejecutar 10 veces:
for (contador = 1; contador <= 10; contador++) enunciado;

El ciclo for consiste de cuatro partes. Las primeras tres controlan el nmero de v eces que el ciclo se ejecutar, la cuarta parte se refiere a los enunciados a ejecutar dentro del ciclo. Para empezar, la asignacin contador = 1 inicializa la variable con un valor. El ciclo for inicializa a la variable solo una vez, esto ocurre al principio de su ejecucin. Posterio rmente, el ciclo prueba la condicin contador <= 10. Si la condicin es verdadera, el ciclo for ejecuta el enunciado que le sigue. Si la condicin es falsa, el ciclo termina y el programa contina ejecutndose en la lnea siguiente al ciclo for. Si la condicin es verdadera y el ciclo for ejecuta el enunciado, el ciclo entonces incrementa la variable contador utilizando el enunciado contador++. A continuacin el programa prueba la condicin contador <= 10. Si la condicin contina siendo verdadera, el enunciado y el incrementar se ejecutan nuevamente y as sucesivamente hasta que la condicin sea falsa.
for (contador = 1; contador <= 10; contador++)

Iniciacin

Condicin

Incremento

FUNDAMENTOS LECCIN 9

9-27

MIGUEL . TOLEDO MARTNEZ

for

inicializa el valor contador

expresin de verificacin en el contador

falso

verdadero

enunciados del ciclo

contador incremento/decremento

Figura 9.4 . Funcionamiento del ciclo for.

FORMATO PARA EL ENUNCIADO for


for(<clases de datos> contador = valor inicial; expresin de verificacin contador; incrementa o decrementa contador) { enunciado 1; enunciado 2; ................... // Enunciados del ciclo enunciado n; } // Fin del for

El enunciado comienza con la palabra reservada for. Esta es seguida por tres enunciados separados: un enunciado de iniciacin, una expresin de verificacin y un enunciado de incremento o decremento, todos encerrados dentro de parntesis. El ciclo se inicia asignando un valor inicial a la variable contador. La variable contador puede ser cualquier clase de datos. La variable contador se puede definir antes del enunciado for o dentro del enunciado for como parte del paso de inicializacin, como sigue:
for(int contador =1; ...)

Si se define dentro del enunciado for, slo es vlido dentro del for. As, en lo que a C++ respecta, la variable contador no existe fuera del ciclo for en la que se defini.

FUNDAMENTOS LECCIN 9

9-28

MIGUEL . TOLEDO MARTNEZ

La expresin de verificacin se usa para verificar el valor de contador del ciclo en contra de algn valor predeterminado. Los enunciados del ciclo se ejecutarn hasta que el resultado de la expresin de verificacin se convierta en falso (0) El enunciado incremento o decremento se usa para cambiar el valor del contador del ciclo, as que la expresin de verificacin se convierte a falso despus de un nmero determinado de iteraciones. Si el valor del contador del ciclo nunca cambia, habr un ciclo infinito. Es importante que note que el enunciado incremento o decremento no se ejecuta hasta despus de que se ejecuten los enunciados del ciclo en una iteracin dada. As, si la expresin de verificacin inicial es verdadera, los enunciados del ciclo se ejecutarn por lo menos una vez. Sin embargo, si la expresin de verificacin inicial es falsa, los enunciados del ciclo nunca se ejecutarn. Esto significa que el ciclo for acta muy parecido al ciclo while. De hecho, el ciclo for y el ciclo while son realmente lo mismo y tienen la misma estructura de ciclo, slo tienen diferente codificacin. La expresin de incremento de la estructura for acta como una instruccin individual al final del cuerpo del for. Por lo tanto, las expresiones:
contador = contador + 1 contador += 1 ++contador contador++

son equivalentes. Muchos programadores prefieren la forma contador++, pues el incremento sucede tras la ejecucin del cuerpo del ciclo. Por lo tanto, la forma de posincremento parece ms natural. Dada que la variable que se est incrementando aqu no aparece en una expresin, tanto el preincremento como el posincremento tienen el mismo efecto. Un ltimo punto para la variable contador del ciclo: nunca modifique la variable contador dentro del cuerpo del ciclo. La variable contador se puede usar dentro del cuerpo del ciclo, pero este valor no se debe modificar. En otras palabras, nunca utilice la variable contador en el lado izquierdo del smbolo de asignacin (=) dentro del ciclo. Por ltimo, observe en el formato anterior que los enunciados del ciclo estn enma rcados dentro de llaves. Esto siempre se requiere cuando hay ms de un enunciado dentro del ciclo. El enmarcado se podr eliminar cuando slo haya un enunciado de ciclo. Aqu se muestran unos cuantos ejemplos, vea si puede predecir los resultados.
Ejemplo 9.16 Qu se mostrar en los siguientes segmentos de programa?
a. for(int contador = 1; contador != 11; ++contador) cout << contador << endl;

Con cada iteracin de ciclo, el enunciado cout muestra el valor de contador , como sigue:
1 2 3 4 5
FUNDAMENTOS LECCIN 9

9-29

MIGUEL . TOLEDO MARTNEZ

6 7 8 9 10 b. for(int contador = 10; contador; --contador) cout << contador << endl;

Observe como no se necesita una operacin de verificacin relacional booleana , porque cuando contador llega a 0 , C++ interpreta la expresin como falsa . La salida generada por este ciclo es:
10 9 8 7 6 5 4 3 2 1 c. int suma = 0; for(int contador = 0 ; contador != 5; ++contador) { suma = suma + contador; cout << La suma en la primera iteracin es << suma << endl; ++contador; } // Fin del for

Este es un ciclo infinito! Note que el contador del ciclo se incrementa dentro del cuerpo del ciclo. Lo que en realidad sucede es que el contador del ciclo se incrementa dos veces, una dentro del cuerpo del ciclo por el enunciado de incremento y despus automticamente por el enunciado for . Como resultado, el valor de contador pasa por alto el valor 5 , creando un ciclo infinito.
d. for(int contador = -5; contador < 6; ++contador) cout << contador << endl;

Como resultado, el ciclo se ejecutar 11 veces para producir una salida como sta:
-5 -4 -3 -2 -1 0 1 2 3 4 5 e. cout << \n\tNmero\tCuadrado\tCubo << endl; cout << \t------\t--------\t---- << endl; 9-30

FUNDAMENTOS LECCIN 9

MIGUEL . TOLEDO MARTNEZ

for(int contador = 1; contador < 11; ++contador) cout << \t << contador << \t << contador * contador << \t << contador * contador * contador << endl;

El resultado se muestra a continuacin:


Nmero 1 2 3 4 5 6 7 8 9 10 f. Cuadrado 1 4 9 16 25 36 49 64 81 100 Cubo 1 8 27 64 125 216 343 512 729 1000

for(char caracter = A; caracter < Z + 1; ++caracter) cout << caracter; La salida que se produce es: ABCDEFGHIJKLMNOPQRSTUVWXYZ

g.

const int CONTADORMAX = 100; float suma = 0.0; float promedio = 0.0; cout.setf(ios::fixed); cout.precision(2); for(int contador = 1; contador < CONTADORMAX + 1; ++contador) suma += contador; promedio = suma / CONTADORMAX; cout << El promedio de los primeros << CONTADORMAX << enteros positivos es: << promedio << endl;

Esto es lo que ver:


El promedio de los primeros 100 enteros positivos es 50.5 h. const int CONTADORMAX = 100; for(int i = 1; i < CONTADORMAX + 1; ++i) { if(!(i%17)) cout << El valor << i << es divisible entre 17. << endl; }

En este caso se usa el enunciado if para determinar cundo el valor contador , i, es divisible entre 17 . As, el ciclo muestra todos los valores entre 1 y CONTADORMAX (100 ) que son divisibles entre 17 .
Esto es lo que ver cuando se ejecute: El valor 17 es divisible entre 17. El valor 34 es divisible entre 17. El valor 51 es divisible entre 17. El valor 68 es divisible entre 17. El valor 85 es divisible entre 17.

FUNDAMENTOS LECCIN 9

9-31

MIGUEL . TOLEDO MARTNEZ

Ejemplo 9.17 Los siguientes ejemplos muestran mtodos para modificar la variable de control de las estructuras for . En cada caso, escribimos el encabezado for adecuado. Observe el cambio en el operador relacional de los ciclos que decrementan la variable de control.
a. Modifica la variable de control de 1 a 100 en incremento de 1. for(int i = 1; i <= 100; i++) b. Modifica la variable de control de 100 a 1 en incrementos de 1 (decrementos de 1 ) for(int i = 100; i >= 1; i--) c. Modifica la variable de control de 7 a 77 en pasos de 7 for(int i = 7; i <= 77; i +=7) d. Modifica la variable de control de 20 a 2 en pasos de 2 for(int i = 20; i >= 2; i -=2) e. Modifica la variable de control segn la siguiente secuencia de valores: 2 , 5 , 6 , 11 , 14 , 17 , 20 for(int j = 2; j <= 20; j += 3) f. Modifica la variable de control segn la siguiente secuencia de valores: 99 , 88 , 77 , 66 , 55 , 44 , 33 , 22 , 11 , 0 for(int j = 99; j >= 0; j -=11)

Ejemplo 9.18 El siguiente programa: PRIMFOR.CPP, utiliza el ciclo for para visualizar los valores del 1 al 100 en su pantalla:
/* El siguiente programa: PRIMFOR.CPP, utiliza el ciclo for para visualizar los valores del 1 al 100 en su pantalla. */ #include <iostream.h> void main(void) { int contador; for(contador = 1; contador <= 100; contador++) cout << contador << ' '; } // Fin de main() // Para cout

FUNDAMENTOS LECCIN 9

9-32

MIGUEL . TOLEDO MARTNEZ

Ejemplo 9.19 El siguiente programa: PRGCONTA.CPP, visualiza un mensaje preguntado por un nmero que indica cuando debe terminar el ciclo. El programa muestra los nmeros entre uno y el v alor tecleado:
/* El siguiente programa: PRGCONTA.CPP, despliega un mensaje preguntando por un nmero que indica cuando debe terminar el ciclo. El programa muestra los nmeros entre uno y el valor tecleado. */ #include <iostream.h> void main(void) { int contador; int valorFinal; cout << "Teclee el valor final y oprima Intro: "; cin >> valorFinal; for(contador = 1; contador <= valorFinal; contador++) cout << contador << ' '; } //Fin de main() //Para cin y cout

ENUNCIADOS COMPUESTOS CON EL CICLO for

Al igual que con los enunciados if-else, si desea ejecutar ms de un enunciado en un ciclo for debe encerrarlos entre llaves.
Ejemplo 9.20 El siguiente programa: SUM1_100.CPP, visualiza los nmeros del 1 al 100 y al mismo tiempo acumula el valor de los nmeros mostrados:
/* El siguiente programa: SUM1_100.CPP, despliega los nmeros del 1 al 100 y al mismo tiempo acumula el valor de los nmeros mostrados. */ #include <iostream.h> void main(void) { int contador; int total = 0; for(contador = 1; contador <= 100; contador++) { cout << "Sumar " << contador << " a " << total; total = total + contador; cout << " da un gran total de " << total << endl; } //Fin del for } //Fin del main() //Para cout

FUNDAMENTOS LECCIN 9

9-33

MIGUEL . TOLEDO MARTNEZ

La ejecucin en una pasada de los enunciados en un ciclo se le conoce comnmente como una iteracin.

Ejemplo 9.21 El siguiente programa: SUMAPROM1.CPP, utiliza el enunciado for para calcular la suma de los enteros comprendidos entre dos nmeros arbitrarios. Al final calcula el promedio de dichos nmeros.
/* El siguiente programa: SUMAPROM1.CPP, solicita dos nmeros enteros; posteriormente suma a todos los enteros comprendidos entre dichos nmeros. Finalmente calcula el promedio de los mismos. */ #include <iostream.h> void main(void) { int contador = 0; double suma = 0.0; int primero, ultimo, temporal; //contador de iteraciones //suma de los enteros //primero y ultimo entero; variable //temporal requerida si primero > ultimo. //Para cout y cin

cout << "Introduzca el primer entero : "; cin >> primero; cout << "Introduzca el segundo entero: "; cin >> ultimo; if (primero > ultimo) { //Se intercambian los valores entre primero y ultimo. temporal = primero; primero = ultimo; ultimo = temporal; } //Fin del if for (int i = primero; i <= ultimo; i++) { contador++; suma += (double)i; } //Fin del for cout << endl << "La suma de los enteros entre " << primero << " y " << ultimo << " = " << suma << endl; cout << "El promedio es de: " << suma / contador << endl; } //Fin de main

FUNDAMENTOS LECCIN 9

9-34

MIGUEL . TOLEDO MARTNEZ

Ejemplo 9.22 El siguiente programa: INTERES.CPP, calcula el inters compuesto mediante la estructura for . Considere el planteamiento del siguiente problema: Una persona invierte $10,000.00 pesos en una cuenta de ahorros que da un inters del 5%. Suponie ndo que todos los intereses se quedan depositados en l a cuenta, calcule e imprima la cantidad que tendr la cuenta al final de cada ao durante 10 aos. Emplee la siguiente frmula para determinar las cantidades.
a = p(1 + r)n

Donde: p es la cantidad invertida originalmente (es decir, el capital), r es la tasa de inters anual, n es la cantidad de aos , y a es la cantidad en depsito al final del ao n.
/* El siguiente programa: INTERES.CPP, calcula el inters compuesto de un capital. */ #include <iostream.h> #include <iomanip.h> #include <math.h> void main(void) { double importe, principal tasa = 10000.0, = 0.05; //Cantidad depositada //Capital inicial //Tasa de inters //Para cout y cin //Para setw() y setiosflags() //Para pow()

cout << "Ao" << setw(21) << "Cantidad depositada" << endl; for(int ano = 1; ano <= 10; ano++) { importe = principal * pow(1.0 + tasa, ano); cout << setw(4) << ano << setiosflags(ios::fixed | ios::showpoint) << setw(21) << setprecision(2) << importe << endl; } //Fin de for } //Fin de main()

CAMBIAR EL INCREMENTO DE UN CICLO for

Cada uno de los ciclos for de los programas anteriores, se incrementan en uno para cada iteracin del ciclo. Sin embargo, el ciclo for no limita sus programas a incrementos de la variable exclusivamente en 1.

FUNDAMENTOS LECCIN 9

9-35

MIGUEL . TOLEDO MARTNEZ

Ejemplo 9.23 El siguiente programa: INCRECIN.CPP, visualiza de cinco en cinco los nmeros comprendidos entre 0 y 100 :
/* El siguiente programa: INCRECIN.CPP , despliega de cinco en cinco los nmeros comprendidos entre 0 y 100 . */ #include <iostream.h> void main(void) { int contador; for(contador = 0; contador <= 100; contador += 5) cout << contador << ' ' ; } //Fin de main() // Para cout

Observe que contador += 5 es equivalente a contador = contador + 5 . Ejemplo 9.24 El siguiente programa: CTADECRE.CPP, utiliza un ciclo for para visualizar los nmeros entre 100 y 1 :
/* El siguiente programa: CTADECRE.CPP , utiliza un ciclo for para desplegar los nmeros entre 100 y 1 . */ #include <iostream.h> void main(void) { int contador; for(contador = 100; contador >= 1; contador--) cout << contador << ' '; } //Fin de main() //Para cout

LAS PARTES DEL ENUNCIADO for SON OPCIONALES

Las tres expresiones de la estructura for son opcionales. Si se omite la condicin, C++ supone que la condicin de continuacin del ciclo es verdadera, creando as un ciclo infinito. La iniciacin podra omitirse si la variable de control se inicializa en otra parte del programa. La expresin de incremento/decremento podra omitirse si el incremento se calcula por medio de instrucciones en el cuerpo del for o si no se necesita un incremento. Si la variable contador ha sido previamente inicializada con el valor deseado, puede omitir la parte de inicializacin dentro del ciclo for :

FUNDAMENTOS LECCIN 9

9-36

MIGUEL . TOLEDO MARTNEZ

int contador = 0; for(;contador < 1000; contador++) cout << contador << ;

El siguiente ejemplo omite las secciones de inicializacin e incremento:


int contador = 0; for (; contador < 1000;) cout << contador ++ << ;

El enunciado for siguiente es un ciclo infinito:


for(;;) // enunciado;

Ejemplo 9.25 El siguiente programa: SUMAPROM2.CPP , es otra posible solucin al programa SUMAPROM1.CPP; en esta solucin no se utilizan todas las partes del ciclo for.
/* El siguiente programa: SUMAPROM2.CPP, solicita dos nmeros enteros; posteriormente suma a todos los enteros comprendidos entre dichos nmeros. Finalmente calcula el promedio de los mismos. */ #include <iostream.h> void main(void) { int contador = 0; double suma = 0.0; int primero, ultimo, temporal; //contador de iteraciones //suma de los enteros //primero y ultimo entero; variable //Para cout y cin

//temporal requerida si primero > ultimo. cout << "Introduzca el primer entero : "; cin >> primero; cout << "Introduzca el segundo entero: "; cin >> ultimo; if (primero > ultimo) { //Se intercambian los valores entre primero y ultimo. temporal = primero; primero = ultimo; ultimo = temporal; } //Fin del if cout << endl << "La suma de los enteros entre " << primero << " y " << ultimo << " = "; for (; primero <= ultimo;) { contador++; suma += (double) primero++; } //Fin del for

FUNDAMENTOS LECCIN 9

9-37

MIGUEL . TOLEDO MARTNEZ

cout << suma << endl; cout << "El promedio es de: " << suma / contador << endl; } //Fin del main()

EL CICLO for NO ES EXCLUSIVAMENTE PARA VARIABLES DE CLASE ENTERO El siguiente ciclo for visualiza las letras del alfabeto:
for(letra = A; letra <= Z; letra++) cout << letra; El siguiente ciclo for incrementa un valor de punto flotante en 0.5 : for(porCiento = 0.0; porCiento <= 100.0; porCiento += 0.5) cout << porCiento << endl;

Ejemplo 9.26 El siguiente programa: LETFLOT.CPP, ilustra el uso de letras y valores de punto flotante dentro de un ciclo for :
/* El siguiente programa: LETFLOT.CPP, ilustra el uso de letras y valores de punto flotante dentro de un ciclo for. */ #include <iostream.h> //Para cout void main (void) { char letra; float porciento; for (letra = 'A'; letra <= 'Z'; letra++) cout << letra; cout << " "; for (letra = 'z'; letra >= 'a'; letra--) cout << letra; cout << endl; for (porciento = 0.0; porciento < 1.0; porciento += 0.1) cout << porciento << endl; } //Fin de main()

CICLO NULO CON for El siguiente ciclo for no hace nada durante 100 iteraciones :
for(contador = 1; contador <= 100; contador++) ; // No hace nada

FUNDAMENTOS LECCIN 9

9-38

MIGUEL . TOLEDO MARTNEZ

CICLOS INFINITOS CON for

Un ciclo for cuya condicin nunca se satisface se conoce con el nombre de ciclo infinito :
Ejemplo 9.27 El siguiente programa: INFINITO1.CPP ilustra un ciclo infinito :
/* El siguiente programa: INFINITO1.CPP, ilustra un ciclo que nunca termina. */ #include <iostream.h> void main (void) { int i; int resultado int valor = 0; = 1; //Para cout

for (i = 0; i < 100; i ++) { cout << i << ' '; resultado = valor * --i; } //Fin del for cout << "Resultado: " << resultado; } //Fin de main()

Ejemplo 9.28 El siguiente programa, INFINITO2.CPP, ilustra un ciclo for infinito , controlado d entro del cuerpo del for .
/* El siguiente progra ma: INFINITO2.CPP , muestra el uso de un ciclo for para emular un ciclo infinito controlado en el cuerpo del mismo. */ #include <iostream.h> #include <ctype.h> void main(void) { char ch; double x, y; // bucle for con sus partes vacas for (;;) { cout << endl << "Introduzca un nmero: "; cin >> x; // procesa el nmero cuando no es cero if (x != 0) //Para cout y cin //Para toupper()

FUNDAMENTOS LECCIN 9

9-39

MIGUEL . TOLEDO MARTNEZ

{ y = 1/x; cout << "1/" << x << " = " << y << endl; cout << "Desea ms clculos? (S/N) "; cin >> ch; if (toupper(ch) != 'S') break; } //Fin de los enunciados if else // Despliega un mensaje de error cout << "Error: No se acepta 0" << endl; } //Fin del for } //Fin del main()

EL OPERADOR COMA DENTRO DE UN CICLO for

En ocasiones la parte de iniciacin y de incremento de un ciclo for, son listas de expresiones separadas por comas. Las comas sirven aqu como operadores de coma que garantizan que las listas de expresiones se evalen de izquierda a derecha. El operador de coma tiene la menor precedencia de todos los operadores de C++. El valor y la clase de una lista de expresiones separadas por comas es el valor y clase de la expresin de la derecha de la lista. El uso ms frecuente del operador de coma es en las estructuras for. Su principal aplicacin es permitirle al programador emplear varias expresiones de iniciacin y/o varias expresiones de incremento. Por ejemplo, puede haber varias variables de control en una misma estructura for que habr que inicializar e incrementar. La razn ms comn para trabajar con varias variables dentro de un for es cuando se trabaja con arreglos.
Ejemplo 9.29 El siguiente programa: FOR_2VAR.CPP, ilustra el uso del operador coma dentro de un ciclo for :
/* El siguiente programa: FOR_2VAR.CPP, ilustra el uso del operador coma dentro de un ciclo for. */ #include <iostream.h> //Para cout void main(void) { int i, j; for (i = 0, j = 100; i <= 100; i++, j++) cout << "i = " << i << " " << "j = " << j << endl; } //Fin de main()

CICLOS for ANIDADOS

Muchas aplicaciones requieren operaciones cclicas dentro de los ciclos. A esto se le llama ciclos anidados. Para tener una idea, piense en los segundos, minutos y horas de un reloj digital de 12 horas. No es solo un contador sencillo? El contador de segundos de 0 a 59, el de
FUNDAMENTOS LECCIN 9

9-40

MIGUEL . TOLEDO MARTNEZ

minutos de 0 a 59, y el de las horas de 0 a 11. Por cada 60 segundos, el contador de minutos se incrementa. Asimismo, por cada 60 minutos, el contador de las horas se i ncrementa. As, el contador de segundos se anida dentro del contador de minutos, y el contador de minutos se anida dentro del contador de las horas.
Ejemplo 9.30 En el siguiente programa: RELDIG.CPP se muestra cmo un reloj digital se puede codificar en un programa C++ usando los ciclos anidados for :
/* El siguiente programa: RELDIG.CPP , muestra el uso de for anidados, para simular un RELOJ DIGITAL. */ #include <iostream.h> void main(void) { // Muestra encabezados cout << "\t\t\tHoras\tMinutos\tSegundos" << endl; //Inicio del reloj for(int horas = 0; horas < 12; ++ horas) for(int minutos = 0; minutos < 60; ++minutos) for(int segundos = 0; segundos < 60; ++segundos) { cout << "\t\t\t\t\t\r"; cout << "\t\t\t" << horas << '\t' << minutos << '\t' << segundos << '\r'; } // final del ciclo for } // Final del main() // Para cout

// Muestra espacio en blanco

Ejemplo 9.31 El programa anterior, RELDIG.CPP, puede presentarse de otra manera utilizando decrementos en vez de incrementos del contador . Llamemos a este programa RELDIG2.CPP.
/* El siguiente programa: RELDIG2.CPP, es otra versin del programa RELDIG.CPP. RELOJ DIGITAL */ #include <iostream.h> void main(void) { // Muestra encabezados cout << "\t\t\tHoras\tMinutos\t\tSegundos" << endl; // Para cout

FUNDAMENTOS LECCIN 9

9-41

MIGUEL . TOLEDO MARTNEZ

//Inicio del reloj for(int horas = 12; horas; -- horas) for(int minutos = 60; minutos; --minutos) for(int segundos = 60; segundos; --segundos) { cout << "\t\t\t\t\t\t\r"; cout << "\t\t\t" << horas << '\t' << minutos << "\t\t" << segundos << '\r'; } // final del ciclo } // Final del main()

// Muestra espacio en blanco

EXAMEN BREVE 25 LOS ENUNCIADOS break Y continue Los enunciados break y continue se pueden usar para modificar la ejecucin de estructuras de control predefinidas, como los ciclos, cuando se presentan ciertas condiciones. En general, el enunciado break se usa para terminar un ciclo inmediatamente y el enunciado continue se usa para pasar por alto una iteracin de ciclo.
EL ENUNCIADO break

En la leccin 8, vio el uso del enunciado break dentro del enunciado switch. Recuerde que el enunc iado break obliga al enunciado switch a terminar. Lo mismo sucede cuando se usa el enunciado break dentro de la estructura de un ciclo. Cuando C++ ejecuta el enunciado break dentro de un ciclo, el ciclo se termina inmediatamente y el control pasa al siguiente enunciado en el ciclo. El enunciado break generalmente se utiliza como parte del enunciado if dentro de un ciclo para terminar la estructura de un ciclo si ocurren ciertas condiciones. La accin del enunciado break dentro de un ciclo while puede ilustrarse como sigue:
while(expresin de verificacin) { enunciado 1; enunciado 2; .................. if(expresin de verificacin) break; ...................... enunciado n; } // Fin del while() Siguiente enunciado despus del while();

Considere el siguiente segmento de programa:


int numero = 1; while(numero < 11) { if(numero == 5) break; cout << En el ciclo while, ahora nmero es: << numero << endl;
FUNDAMENTOS LECCIN 9

9-42

MIGUEL . TOLEDO MARTNEZ

++numero; } // Fin del while() cout << El ciclo termina ahora y el valor de numero es: << numero << endl;

Este ciclo while emplea un enunciado break para terminar el ciclo cuando numero alcanza el valor de 5. Esto es lo que ver como resultado de la ejecucin del ciclo:
En el ciclo while, ahora nmero es: 1 En el ciclo while, ahora nmero es: 2 En el ciclo while, ahora nmero es: 3 En el ciclo while, ahora nmero es: 4 El ciclo termina ahora y el valor de nmero es: 5

Ejemplo 9.32 El siguiente programa: USOBREAK.CPP, ilustra el uso del enunciado break. El programa intenta visualizar los nmeros del 1 al 100 y luego del 100 al 1 . Cuando se alcanza el valor 50 , en ambos casos el ciclo se termina.
/* El siguiente programa: USOBREAK.CPP , ilustra el uso de break en los ciclos for. */ #include <iostream.h> void main(void) { int contador; for (contador = 1; contador <= 100; contador++) { if (contador == 50) break; cout << contador << ' ' ; } //Fin del for cout << endl << endl << "SIGUIENTE CICLO" << endl; for (contador = 100; contador >= 1; contador--) { if (contador == 50) break; cout << contador << ' '; } //Fin del for } //Fin del main() //Para cout

EL ENUNCIADO continue

En ocasiones y sobre la base de una condicin, desear terminar la iteracin en ejecucin. El enunciado continue le permite terminar una iteracin. Cuando C++ encuentra un enunciado continue dentro de un ciclo for, inmediatamente ejecutar la seccin de incremento y posteriormente realiza la prueba de la condicin. Si C++ localiza un enunciado continue dentro de un ciclo while o do, inmediatamente realizar la prueba de la condicin.

FUNDAMENTOS LECCIN 9

9-43

MIGUEL . TOLEDO MARTNEZ

Podemos ilustrar la operacin de continue dentro del ciclo for como sigue:
for(contador = valor inicial; contador expresin de verificacin; contador incrementa o decrementa) { enunciado 1; enunciado 2; .................. if(expresion de verificacin) continue; .................. enunciado n; } // Fin del for() Siguiente enunciado despus del for();

En este caso se puede ver que cuando la expresin de verificacin del enunciado if es verdadera (diferente de cero ), se ejecuta el enunciado continue, obligando a terminar la iteracin en curso. Es importante recordar que slo se termina la iteracin en curso como resultado de continue. Todas las iteraciones subsecuentes se ejecutarn, a menos que, por supuesto, se haya terminado ejecutando un break. El siguiente segmento de programa muestra como funciona continue.
for(int numero = 1; numero < 11; ++numero) { if(numero == 5) continue; cout << En el ciclo for, nmero es ahora: << numero << endl; } // Fin de for() cout << El ciclo termina ahora y el valor de nmero es: << numero << endl; Este es el resultado de la ejecucin del segmento del programa: En el ciclo for, numero es ahora: 1 En el ciclo for, numero es ahora: 2 En el ciclo for, numero es ahora: 3 En el ciclo for, numero es ahora: 4 En el ciclo for, numero es ahora: 6 En el ciclo for, numero es ahora: 7 En el ciclo for, numero es ahora: 8 En el ciclo for, numero es ahora: 9 En el ciclo for, numero es ahora: 10 El ciclo termina ahora y el valor de numero es: 11

Ejemplo 9.33 El siguiente programa CONTINUE.CPP, ilustra el uso de continue para visualizar los nmeros del 1 al 10 , excepto los nmeros 4 , 5 y 6 .

FUNDAMENTOS LECCIN 9

9-44

MIGUEL . TOLEDO MARTNEZ

/* El siguiente programa: CONTINUE.CPP, muestra el uso del enunciado continue para saltar iteraciones. */ #include <iostream.h> void main(void) { for (int i = 0; i <= 10; ++i) { if (i >= 4 && i <= 6) continue; cout << "Paso #" << i << endl; } //Fin del for } //Fin de main() //Para cout

Ejemplo 9.34 El siguiente programa: PARIMP.CPP, utiliza continue en los ciclos for y while para visualizar los nmeros pares e impares comprendidos entre 1 y 100.
/* El siguiente programa: PARIMPAR.CPP, utiliza continue en los ciclos for y while para visualizar los nmeros pares e impares contenidos en el rango 1 a 100 . */ #include <iostream.h> void main(void) { int contador; cout << "NUMEROS PARES" << endl; for (contador = 1; contador <= 100; contador++) { if (contador % 2) // Impar continue; cout << contador << ' ' ; } //Fin del for cout << endl << endl << "NUMEROS IMPARES" << endl; contador = 0; while (contador < 100) { contador++; if (!(contador % 2)) // Pares continue; cout << contador << ' ' ; } //Fin del while } //Fin de main()
FUNDAMENTOS LECCIN 9

//Para cout

9-45

MIGUEL . TOLEDO MARTNEZ

Ejemplo 9.35 Se recomienda evitar el uso de continue y break en sus programas, el ejemplo anterior puede resolverse sin utilizar continue como se muestra en el siguiente programa: NOCONT.CPP:
/* El siguiente programa: NOCONT.CPP, resuelve el programa PARIMPAR sin utilizar continue. */ #include <iostream.h> void main(void) { int contador; cout << "NUMEROS PARES" << endl; for (contador = 1; contador <= 100; contador++) { if (!(contador % 2)) // Pares cout << contador << ' ' ; } //Fin del for cout << endl << endl << "NUMEROS IMPARES" << endl; contador = 0; while (contador < 100) { contador++; if (contador % 2) // Impares cout << contador<< ' '; } //Fin del while } //Fin del main() //Para cout

RAMIFICACIN CON goto Como la mayora de los lenguajes de programacin, C++ proporciona el enunciado goto, el cual le permite continuar la ejecucin de su programa en otra parte del mismo. El formato del enunciado goto es el siguiente:
goto etiqueta; ........ etiqueta:

Ejemplo 9.36 El siguiente programa: GOTO100.CPP, utiliza el enunciado goto para visualizar los nmeros del 1 al 100 .

FUNDAMENTOS LECCIN 9

9-46

MIGUEL . TOLEDO MARTNEZ

/* El siguiente programa: GOTO100.CPP, ilustra el uso del enunciado goto. */ #include <iostream.h> void main(void) { int contador = 1; etiqueta: cout << contador++ << ' '; if (contador <= 100) goto etiqueta; } //Fin de main() //Para cout

Cuando utilice el enunciado goto, la etiqueta debe residir en la misma funcin. En otras palabras, no puede utilizar un goto desde main() a otra funcin o viceversa. Intente, siempre que pueda, no utilizar el enunciado goto.

EXAMEN BREVE 26 Solucin de problemas en accin: Anlisis de un circuito con resistencias en paralelo
PROBLEMA
Vamos a cerrar esta leccin escribiendo un programa que le permita encontrar la resistencia total del circuito para cualquier nmero de resistencias en paralelo como se muestra en la figura 9.5 . Resolveremos el problema de tres diferentes maneras, usando cada una de las tres estructuras de control de iteracin que se vieron en esta leccin. Primero , vamos a definir el problema en trminos de salida, entrada y proceso. Suponga que est trabajando para una empresa industrial y usted est asignado para escribir un programa que permita al ingeniero encontrar la resistencia elctrica equivalente total de un circuito resistivo para cualquier nmero de resistencias en paralelo.

Vfuente

R1

R2

R3

Rn

Figura 9.5 . Resistencias en paralelo.

Una forma sencilla de encontrar la resistencia equivalente en un circuito es usar la regla del producto sobre la suma . Para usar esta regla, se empieza con los primeros dos valores de resistencias (R1 y R2 ) y se calcula la resistencia equiv alente , como sigue:
FUNDAMENTOS LECCIN 9

9-47

MIGUEL . TOLEDO MARTNEZ

Requiv = (R1 x R2 ) / (R1 + R2 )

Observe que la resistencia equivalente para las dos resistencias se encuentra div idiendo el producto de las dos resistencias entre la suma de las mismas. Despus, el valor equivalente obtenido de este clculo se usa con el valor de la tercera resistencia (R3 ) para encontrar un nuevo equivalente, como sigue:
Requiv = (Requiv x R3 ) / (Requiv + R3 )

Despus, este valor equivalente se usa con el valor de la cuarta resistencia (R4 ) para calcular un nuevo valor equivalente , como sigue:
Requiv = (Requiv x R4 ) / (Requiv + R4 )

Este proceso para calcular un nuevo valor de la resistencia equivalente a partir del anterior se contina hasta que se han usado todos los valores de resistencias en el circuito. Observe que el mismo clculo se debe repetir varias veces. Tal operacin de repeticin le sugerir una estructura de ciclo en su programa. Ahora, cree que puede desarrollar un programa que haga las tareas requeridas? Recuerde que el programa debe encontrar la resistencia equivalente de cualquier nmero de resistencias en paralelo. Vamos a definir primero el problema en trminos de salida, entrada y proceso. DEFINICIN DEL PROBLEMA
Salida: Entrada: Proceso: La salida final mostrar la resistencia equivalente de n resistencias en paralelo. El nmero de resistencias en el circuito y el valor individual de cada resistencia . Cada vez que se introduce el valor de una resistencia ( R), la resistencia paralela equivalente ( Requiv ) ser calculada usando la regla de producto sobre la suma como sigue: Requiv = (Requiv x R) / (Requiv + R)

PLANEACIN DE LA SO LUCIN Para no distraer la atencin en la iteracin, no refinaremos paso a paso la solucin del problema. En cambio emplearemos una solucin lineal para el problema.
INICIO Escribir(Descripcin del problema) Escribir(Favor de introducir el nmero de resistencias en paralelo: ) Leer(numero) Establecer contador = 0. Mientras (contador < numero) hacer Inicio Establecer contador = contador + 1. Escribir(Favor de introducir el valor de la resistencia # , contador) Leer(resistencia). si contador == 1 Establecer Requivalente = resistencia sino Requivalente = (Requivalente x resistencia) / (Requivalente + resistencia)
FUNDAMENTOS LECCIN 9

9-48

MIGUEL . TOLEDO MARTNEZ

Fin. Escribir (Requivalente). FIN.

Como puede ver, esto es ms bien un algoritmo sencillo que emplea la estructura de control while . Cada vez que se ejecuta el ciclo, se introduce un valor adicional de la resistencia y se calcula la resistencia equivalente del circuito. Quiz se pregunte por qu se usa el enunciado si/sino dentro del ciclo. Si no se inicializa la primera vez Requivalente, este no tuviese un valor inicial para los clculos posteriores y los resultados seran impredecibles. CODIFICACIN DEL PROGRAMA
/* El siguiente programa: REQUIVALENTE1.CPP, muestra el uso del ciclo while. Calcula la resistencia equivalente de un conjunto de resistencias paralelas. */ #include <iostream.h> void main(void) { // Definicin de las variables int contador = 0; int numero = 0; float resEquiv = 0.0; float resistencia = 0.0; // Contador del ciclo // Nmero de resistencias en el circuito // Resistencia equivalente del circuito // Valores individuales de las resistencias //Para cout y cin

// Escribe el mensaje que describe el programa y obtiene el nmero de // resistencias en paralelo. cout << "Este programa calcular la resistencia equivalente\n" "de cualquier nmero de resistencias en paralelo." << endl << endl; cout << "Escriba el nmero de resistencias en el circuito paralelo: "; cin >> numero; cout << endl; // Calcula la resistencia equivalente con while while(contador < numero) { ++contador;
cout << "Introduzca el valor de la resistencia # " << contador << ": ";

cin >> resistencia; if(contador == 1) resEquiv = resistencia; else


resEquiv = (resEquiv * resistencia) / (resEquiv + resistencia);

} // Fin del while cout.setf(ios::fixed); cout.precision(2); cout << endl << "La resistencia equivalente para el circuito paralelo es: " << resEquiv << " ohms" << endl; } // Fin del main()

Ahora, suponga que quiere usar la estructura de control do/while para realizar la misma tarea. Recuerde que la diferencia principal es que los enunciados del ciclo do/while se ejecutan siempre por lo menos una vez.
FUNDAMENTOS LECCIN 9

9-49

MIGUEL . TOLEDO MARTNEZ

PLANEACIN DE LA SOLUCIN INICIO Escribir(Descripcin del problema) Escribir(Favor de introducir el nmero de resistencias en paralelo: ) Leer(numero) Establecer contador = 0. hacer Inicio si numero == 0 salir del programa. Establecer contador = contador + 1. Escribir(Favor de introducir el valor de la resistencia # , contador) Leer(resistencia) si contador == 1 Establecer Requivalente = resistencia sino Requivalente = (Requivalente x resistencia) / (Requivalente + resistencia) Fin. Mientras (contador < numero) Escribir ( Requivalente) FIN. CODIFICACIN DEL PROGRAMA

/* El siguiente programa: REQUIVALENTE2.CPP, muestra el uso del ciclo do/while. Calcula la resistencia equivalente de un conjunto de resistencias en paralelo. */ #include <iostream.h> void main(void) { // Definicin de las variables int contador = 0; int numero = 0; float resEquiv = 0.0; float resistencia = 0.0; // Contador del ciclo // Nmero de resistencias en el circuito // Resistencia equivalente del circuito // Valores individuales de las resistencias //Para cout y cin

// Escribe el mensaje que describe el programa y obtiene el nmero de // resistencias en paralelo. cout << "Este programa calcular la resistencia equivalente\n" "de cualquier nmero de resistencias en paralelo." << endl << endl; cout << "Escriba el nmero de resistencias en el circuito paralelo: "; cin >> numero; cout << endl; // Calcula la resistencia equivalente con do/while do { if(numero == 0 ) // Se rompe el ciclo si nmero es cero break;

FUNDAMENTOS LECCIN 9

9-50

MIGUEL . TOLEDO MARTNEZ

++contador; cout << "Introduzca el valor de la resistencia # " << contador << ": "; cin >> resistencia; if(contador == 1) resEquiv = resistencia; else resEquiv = (resEquiv * resistencia) / (resEquiv + resistencia); } // Fin del while while(contador < numero); cout.setf(ios::fixed); cout.precision(2); cout << endl << "La resistencia equivalente para el circuito paralelo es: " << resEquiv << " ohms" << endl; } // Fin del main()

Por ltimo, vamos a volver a escribir el algoritmo y a codificar un programa para emplear la estructura de control de iteracin for . Recuerde que con la estructura for el ciclo se ejecuta un nmero determinado de veces; desde un valor inicial hasta otro final del contador . As, por qu no establecer un valor inicial del contador a 1 y hacer una verific acin para el nmero de resistencias en el circuito en paralelo?
PLANEACIN DE LA SOLUCIN INICIO Escribir(Descripcin del problema) Escribir(Favor de introducir el nmero de resistencias en paralelo: ) Leer(numero) para contador =1 hasta numero hacer en pasos de uno en uno Inicio Escribir(Favor de introducir el valor de la resistencia # , contador) Leer(resistencia) si contador == 1 Establecer Requivalente = resistencia sino Requivalente = (Requivalente x resistencia) / (Requivalente + resistencia) Fin. Escribir (Requivalente) FIN. CODIFICACIN DEL PROGRAMA /* El siguiente programa: REQUIVALENTE3.CPP, muestra el uso del ciclo for. Calcula la resistencia equivalente de un conjunto de resistencias en paralelo. */ #include <iostream.h> void main(void) { // Definicin de las variables int numero = 0; // Nmero de resistencias en el circuito float resEquiv = 0.0; // Resistencia equivalente del circuito float resistencia = 0.0; // Valores individuales de las resistencias
FUNDAMENTOS LECCIN 9

//Para cout y cin

9-51

MIGUEL . TOLEDO MARTNEZ

// Escribe el mensaje que describe el programa y obtiene el nmero de // resistencias en paralelo. cout << "Este programa calcular la resistencia equivalente\n" "de cualquier nmero de resistencias en paralelo." << endl << endl; cout << "Escriba el nmero de resistencias en el circuito paralelo: "; cin >> numero; cout << endl; // Calcula la resistencia equivalente con for for(int contador = 1; contador <= numero; ++contador) {
cout << "Introduzca el valor de la resistencia # " << contador << ": ";

cin >> resistencia; if(contador == 1) resEquiv = resistencia; else


resEquiv = (resEquiv * resistencia) / (resEquiv + resistencia);

} // Fin del for cout.setf(ios::fixed); cout.precision(2); cout << endl << "La resistencia equivalente para el circuito paralelo es: " << resEquiv << " ohms" << endl; } // Fin del main()

PENSANDO EN OBJETOS: Identificacin de los objetos de un problema Aqu est usted, novato en C++, y pensando de qu se trata esta maravillosa y nueva tecnologa llamada orientacin a objetos? Las secciones especiales Pensando en o bjetos le acercarn a la orientacin a objetos por medio de un caso de estudio real interesante y estimulante que trata sobre la construccin del simulador de un elevador.
PLANTEAMIENTO DEL PROBLEMA Cierta compaa pretende construir un edificio de oficinas de dos pisos y equiparlo con la ltima tecnologa en elevadores. La compaa quiere que desarrolle un simulador, mediante tcnicas de orientacin a objetos, que modele la operacin del elevador para determinar si dicho elevador cumple con sus necesidades. El elevador, que tiene una capacidad de una persona, est diseado para conservar energa, por lo que slo se mueve cuando es necesario. El elevador comienza el da esperando con la puerta cerrada en el primer piso del edificio. La direccin del elevador, claro est, se alterna: primero hacia arriba, despus hacia abajo. El simulador incluye un reloj que comienza el da con la hora en 0 y que pulsa una vez por segundo. El componente calendarizador del simulador programa al azar la llegada de la primera persona a cada piso (en otra leccin aprender a programar llegadas aleatorias) Cuando la hora del reloj llega a ser igual al tiempo de la primera llegada, el simulador crea una persona nueva para el piso especif icado y la pone ah. La persona entonces oprime el botn del piso para llamar al elevador. El piso destino de la persona nunca es igual al piso en el que arrib.

FUNDAMENTOS LECCIN 9

9-52

MIGUEL . TOLEDO MARTNEZ

Si la primera persona del da llega al piso 1, de inmediato puede subir al elevador (despus de oprimir el botn y esperar a que se abran las puertas por supuesto!). Si la primera persona llega al piso 2, el elevador sube al piso 2 para recogerla. El elevador necesita cinco pulsaciones del reloj para viajar entre los pisos. El elevador indica su llegada a un piso encendiendo una luz encima de la puerta de dicho piso y haciendo sonar una campanilla en su interior. El botn del piso y el botn dentro del elevador correspondiente a tal piso se restablecen, la puerta se abre, el pasajero (si hay alguno cuyo destino era ese piso) sale de l, otro pasajero (suponiendo que hay uno esperando) entra y oprime un botn de destino y el elevador cierra su puerta. Si el elevador necesita moverse, determina la direccin en que ha de hacerlo (decisin sencilla en un elevador de dos pisos) y comienza su movimiento al siguiente piso. Por simplicidad, supongamos que todos los eventos que suceden desde el momento en que el elevador llega a un piso y h asta que cierra sus puertas tardan un tiempo cero. El elevador siempre sabe en qu piso est y a qu piso debe ir. Cuando mucho puede esperar una persona a la vez en cada piso, por lo que, si el piso est ocupado cuando una persona nueva (es decir, no alg uien que ya estaba en el elevador) va a llegar al piso, su llegada se reprograma para un segundo ms tarde. Suponga que la gente llega aleatoriamente a cada piso cada 5 a 20 segundos (en otra leccin aprender cmo generar nmeros aleatorios para simular esta tasa de llegadas) Su meta (a lo largo de estas secciones especiales) es implementar un programa simulador funcional que opere de acuerdo con estas especificaciones. Su programa deber simular varios minutos de la operacin del elevador y determinar si tuvo xito en cumplir con los requerimientos de trfico pronosticados para este edificio de oficinas. TAREA DE LABORATORIO DEL ELEVADOR 1 En esta y las siguientes tareas llevar a cabo los distintos pasos del diseo orientado a objetos. El primero es identificar los objetos del problema. En algn momento describir estos objetos de manera formal y los implementar en C++. Para esta tarea, todo lo que debe hacer es:
1. Identificar los objetos del problema de simulacin del elevador. El planteamiento del problema especifica que muchos objetos trabajan juntos para simular el elevador y que hay una interaccin con las distintas persona, pisos del edificio, botones, etc. Localice los sustantivos en el planteamiento del problema; muy probablemente representan la mayora de los objetos necesarios para implementar la simulacin del elevador. Por cada objeto que identifique, escriba un prrafo muy preciso que contenga todos los hechos acerca de dicho objeto segn el planteamiento del problema.

2.

NOTAS
1. Este es un buen ejercicio de equipo. Idealmente debera trabajar con un grupo de dos a cuatro personas. Esto le ayudar a reforzar sus ideas y a cuestionar y refinar sus enfoques de diseo e implementacin. Su grupo debera competir con otros grupos de la clase para desarrollar el mejor diseo e implementacin. En otra leccin, donde estudiaremos la generacin de nmeros aleatorios, aprender a implementar la aleatorizacin. La generacin de nmeros al azar le ayuda a hacer cosas como simular el lanzamiento de una moneda o de los dados. Tambin le servir para simular la llegada aleatoria de la gente al elevador.

2.

3.

FUNDAMENTOS LECCIN 9

9-53

MIGUEL . TOLEDO MARTNEZ

4.

Hemos hecho algunas suposiciones con fines de simplificacin. Usted decidir si agrega ms detalles. Debido a que el mundo real tambin est orientado a objetos, le ser bastante natural abordar este proyecto, aunque no haya estudiado formalmente la orientacin a objetos. No se preocupe por la perfeccin. El diseo de sistemas no es un proceso perfecto ni completo, por lo que deber trabajar en este proyecto sobre la base de su mejor esfuerzo.

5.

6.

PREGUNTAS
1. 2. Cmo podra decidir si el elevador es capaz de manejar el volumen de trfico pronosticado? Por qu es mucho ms complicado implementar un programa para un edificio de tres o ms pisos? Ms tarde veremos que, una vez creado uno de los objetos del elevador, es fcil crear todos los que queramos. Qu problemas puede pronosticar si tiene varios elevadores, los cuales pueden recoger y descargar pasajeros en todos los pisos del edificio? Por simplicidad, le hemos dado a nuestro elevador y a cada piso una capacidad de un pasajero, Qu problemas puede pronosticar si se intenta aumentar esta capacidad?

3.

4.

FUNDAMENTOS LECCIN 9

9-54

MIGUEL . TOLEDO MARTNEZ

LO QUE NECESITA SABER Antes de continuar con la leccin siguiente, asegrese de haber comprendido los siguientes conceptos:
q Las estructuras de seleccin se utilizan para seleccionar entre alternativas de accin. q La estructura de seleccin if ejecuta una accin dada slo cuando la condicin es verdadera. q La estructura de seleccin if/else especifica acciones dis tintas que debern ejecutarse cuando la condicin es verdadera y cuando es falsa. q Cuando debe ejecutarse ms de una instruccin en un lugar donde normalmente se espera una sola instruccin, habr que encerrar dichas instrucciones entre llaves, lo que formar una instruccin compuesta. Las instrucciones compuestas pueden ir en cualquier lugar donde pueda ponerse una sola instruccin. q Las instrucciones vacas , que indican que no se debe efectuar ninguna accin, se indican poniendo un punto y coma (;) donde debera ir una instruccin. q Las estructuras de repeticin indican que cierta accin debe repetirse mientras alguna condicin sea verdadera. q En esta leccin, aprendi acerca de las tres estructuras de iteracin de control empleadas en C++: while, do/while y for. q while es una estructura preverificadora de ciclo, do/while es una estructura posverificador de ciclo y for es una estructura de ciclo de repeticin fija. Como r esultado, debe considerarse las siguientes sugerencias generales cuando tenga que decidir qu estructura de ciclo usar en una s ituacin dada:
Use while cuando haya una posibilidad de que los enunciados del ciclo no necesiten ser ejecutados. Use do/while cuando los enunciados del ciclo deban ser ejecutados por lo menos una vez. Use for cuando pueda determinar exactamente cuntas veces se debern ejecutar los enunciados del ciclo. As, si el nmero de iteraciones del ciclo se predetermina por el valor de una variable o una constante, use el ciclo for.

q El ciclo while le permite a sus programas ejecutar un ciclo de enunciados sobre la base de que una condicin sea verdadera . q El formato de la estructura de repeticin while es: while(condicin) enunciado; q Los ciclos son grupos de enunciados que la computadora ejecuta repetidamente hasta que se cumpla cierta condicin de terminacin. Dos forma de repeticin son la repeticin controlada por contador y la repeticin controlada por centinela. q Los contadores de ciclo se emplean para contar las repeticiones de un grupo de instrucciones. Por lo general se incrementan (o decrementan) en 1 cada vez que se ejecuta el grupo de instrucciones. q Los valores centinela se utilizan generalmente para controlar repeticiones cuando no se conoce por adelantado cuntas sern y el ciclo instrucciones que obtienen datos cada vez que dicho ciclo se ejecuta. Una vez que se le hallan suministrado todos los datos al programa, se introduce un valor centinela. Los centinelas deben ser diferentes de cualquier dato vlido. q Los programas a menudo utilizan el ciclo while para leer el contenido de un archivo hasta que alcance el fin de archivo. q El enunciado do/while le permite a sus programas ejecutar uno o ms enunciados al menos una vez, posiblemente repetir el ciclo basado en una condicin. q La estructura de repeticin do/while prueba la condicin de continuacin del ciclo al final de l, por lo que el ciclo se ejecutar cuando menos una vez. El formato de la estructura do/while es: do enunciado; while(condicin); q Los programas a menudo utilizan el enunciado do/while para procesar mens .

FUNDAMENTOS LECCIN 9

9-55

MIGUEL . TOLEDO MARTNEZ

q El enunciado for le permite a sus programas repetir uno o ms enunciados un nmero especificado de veces. q La estructura de repeticin for maneja todos los detalles de la repeticin controlada por contador. El formato general de la estructura for es: for(expresin1; expresin2; exprresin3) enunciado; donde expresin1 inicializa la variable de control del ciclo, expresin2 es la condicin de continuacin del ciclo y expresin3 incrementa la variable de control. q El enunciado for consiste de cuatro partes: una iniciacin, una prueba de condicin, los enunciados que se ejecutarn y un incremento. q El enunciado for no requiere que sus programas se incrementen de uno en uno, ni que el incremento sea exclusivamente ascendente. q Cuando la prueba de la condicin en los ciclos for, while, do/while, es falsa , el programa contina su ejecucin en el primer enunciado que sigue al ciclo. q Los enunciados break y continue se pueden usar para interrumpir las iteraciones del ciclo. La ejecucin del enunciado break dentro de un ciclo obliga a toda la estructura del ciclo a terminar inmediatamente y pasar el control al siguiente enunciado despus de la estructura del ciclo . La ejecucin del enunciado continue dentro de un ciclo termina slo con la iteracin del ciclo en curso. q El enunciado break, ejecutado en una de las estructuras de repeticin (for, while y do/while), provoca la salida inmediata de la estructura. q El enunciado continue, ejecutado en una de las estructuras de repeticin (for, while y do/while), saltas las instrucciones que quedan en el cuerpo de la estructura y procede con la siguiente iteracin del ciclo. q El enunciado switch maneja una serie de decisiones en la que se prueba una variable o expresin en particular en busca de ciertos valores que puede tener, tomndose acciones distintas. En m uchos programas es necesario incluir una instruccin break tras las instrucciones de cada case. Es posible que varios case ejecuten las mismas instrucciones, listando juntas las etiquetas de los case antes de las instrucciones. La estructura switch slo puede probar expresiones enteras constantes. No es necesario encerrar entre llaves los case de mltiples enunciados. q En los sistemas UNIX y en muchos otros, el fin de archivo se indica tecleando la secuencia: <ctrl.-d> sola en una lnea. En los sistemas VMS y DOS, el fin de archivo se indica mediante: <ctrl.-z>

FUNDAMENTOS LECCIN 9

9-56

MIGUEL . TOLEDO MARTNEZ

PREGUNTAS Y PROBLEMAS
PREGUNTAS
1. 2. 3. 4. 5. Mencione las tres estructuras de control de iteracin empleadas en C++ . Qu estructura (s) de control de iteracin siempre ejecuta el ciclo por lo menos una vez? Qu estructura (s) de control de iteracin evala la expresin de verificacin antes de que se ejecute el ciclo? Qu estructura (s) de control de iteracin debe emplearse cuando se pueda determinar por anticipado cuntas repeticiones de ciclo sern? Llene los siguientes espacios en blanco.
a. b. c. d. Cualquier programa puede escribirse en trminos de tres estructuras de control: _______________, _________________ y _____________. La estructura de seleccin _____________ sirve para ejecutar una accin cuando cierta condicin es verdadera y otra cuando es falsa. La repeticin de un conjunto de instrucciones un nmero determinado de veces se llama repeticin controlada por _________________. Cuando no se sabe por adelantado cuntas veces se repetir un conjunto de instrucciones, puede emplearse un valor ______________ para terminar la repeticin.

6. 7.

Escriba cuatro instrucciones C++ distintas que sumen 1 a la variable entera x. Escriba instrucciones C++ para realizar cada una de las siguientes tareas: a. b. c. d.
Asgnele a z la suma de x e y e incremente en 1 el valor de x despus del clculo. Determine si el valor de la variable contador es mayor que 10. De ser as, imprima La cuenta es mayor que 10. Decremente en 1 la variable x, luego rstele de la variable total. Calcule el residuo tras dividir q entre divisor y asgnele a q el resultado. Escriba esta instruccin de dos maneras diferentes.

8.

Escriba una instruccin C++ que logre cada una de las siguientes tareas. a. Declare las variables suma y x como de clase int. b. Inicialice a 1 la variable x. c. Inicialice a 0 la variable suma. d. Sume la variable x a la variable suma y asgnele el resultado a la variable suma. e. Imprima La suma es: seguido de la variable suma. Combine las instrucciones que escribi en la pregunta 8 en un programa que calcule e imprima la suma de los enteros de 1 a 10 . Utilice la estructura while para hacer el ciclo a travs de las instrucciones de clculo e incremento. El ciclo deber terminar cuando el valor de x sea 11 .

9.

10. Determine el valor que tendrn las variables despus de que se realice el clculo. Suponga que, al iniciar la ejecucin de las instrucciones, todas las variables tienen el valor entero 5 . a. producto *= x++; b. cociente /= ++x; 11. Escriba una instruccin en C++ para cada una de las siguientes tareas: a. b. c. d. e. f. g. h.
Acepte como entrada la variable entera x mediante cin y >>. Acepte como entrada la variable entera y mediante cin y >>. Inicialice a 1 la variable entera i . Inicialice a 1 la variable entera potencia. Multiplique la variable potencia por x y asgnele el resultado a potencia. Incremente en 1 la variable y. Pruebe y para ver si es menor o igual que x. Enve a la salida la variable potencia por medio de cout y <<.

12. Escriba un programa en C++ que utilice las instrucciones de la pregunta 11 para calcular x elevado a la potencia y. El programa deber tener una estructura de control de repeticin while. 13. Qu har el siguiente ciclo? while(3) cout << Hola << endl;

FUNDAMENTOS LECCIN 9

9-57

MIGUEL . TOLEDO MARTNEZ

14. Identifique y corrija los errores de las siguientes instrucciones: a. while (c <= 5) b. { c. producto *= c; d. ++c; e. cin << value; f. if(sexo == 1) g. cout << Mujer << endl; h. else; i. cout << Hombre << endl; 15. Qu est mal en la siguiente estructura de repeticin while? while(z >= 0) suma += z; 16. Indique si las siguientes oraciones son verdaderas o falsas . Si la respuesta es falsa, explique por qu. a. b.
El caso default es obligatorio en la estructura de seleccin switch . La instruccin break es necesaria en el caso default de una estructura de seleccin switch para salir correctamente de dicha estructura. La expresin (x > y && a < b) es verdadera si la expresin x > y es verdadera o la expresin a < b es verdadera . Una expresin que contenga el operador || es verdadera si uno o ambos operandos son verdaderos. Sume los enteros nones entre 1 y 99 mediante una estructura for. Suponga que ya se han declarado las variables enteras suma y contador. Imprima la cifra 333.546372 en un campo de 15 caracteres de ancho con precisiones de 1, 2 y 3. Imprima los tres nmeros en la misma lnea. Justifique a la izquierda cada nmero. Qu valores imprime? Calcule 2.5 elevado a la potencia 3 utilizando la funcin pow(). Imprima el resultado con una precisin de 2 en un campo de 10 posiciones de ancho. Qu es lo que se imprime? Imprima los enteros del 1 al 20 utilizando un ciclo while y la variable de contador x. Suponga que ya se ha declarado la variable x, pero no ha sido inicializada. Imprima solo 5 enteros por lnea. Sugerencia: emplee el clculo x % 5. Cuando su valor sea 0, imprima un carcter de salto de lnea, de otro modo, imprima un carcter de tabulacin. Repita la pregunta 17 utilizando una estructura for.

c. d. 17. Escriba una instruccin o un conjunto de instrucciones que hagan lo siguiente: a. b. c. d.

e. 18. Encuentre el error en los siguientes segmentos de cdigo y explique la manera de corregirlos. a. x = 1; while(x <= 10); x++; } b. c. for(y = .1; y != 1.0; y += .1) cout << y << endl; switch(n) { case 1: cout << El nmero es 1 << endl; case 2: cout << El nmero es 2 << endl; break; default: cout << El nmero no es 1 o 2 << endl; break; } d.
El siguiente cdigo deber imprimir los valores del 1 al 10

n = 1; while (n < 10) cout << n++ << endl;

FUNDAMENTOS LECCIN 9

9-58

MIGUEL . TOLEDO MARTNEZ

19. Identifique y corrija los errores de los siguientes fragmentos de cdigo (Nota : podra haber ms de un error en cada fragmento): a. if (edad >= 65); cout << La edad es mayor que o igual a 65 << endl; else cout << La edad es menor que 65 << endl; b. if(edad >= 65) cout << La edad es mayor que o igual a 65 << endl; else; cout << La edad es menor que 65 << endl; c. int x = 1, total; while(x <= 10) total += x; ++x; } d. while(x <= 100) total += x; ++x; e. while(y > 0) { cout << y << endl; ++y; } 20. Qu imprime el siguiente programa? #include <iostream.h> void main(void) { int y, x =1, total = 0; while( x <= 10) { y = x * x; cout << y << endl; total += y; ++x; } cout << El total es << total << endl; } 21. Explique la diferencia entre la ejecucin de break y continue dentro de un ciclo. En las preguntas 22-32 , determine la salida que se genera para cada segmento del programa. Suponga que se han incluido los archivos de cabecera apropiados. 22. int a = 1; while(17 % a != 5) { cout << a << << 17 % a << endl; ++a; } // Fin del while 23. int b = 2; do { cout << b << << b / 5 << endl; b *= 2; } // Fin del do/while while (b != 20);

FUNDAMENTOS LECCIN 9

9-59

MIGUEL . TOLEDO MARTNEZ

24. int b = 2; do { cout << b << << b / 5 << endl; b *= 2; } // Fin del do/while while (b != 32); 25. int numero = 1; int producto = 1; do { ++numero; producto *= numero; } // Fin del do/while while(numero < 5); cout << El producto es: << producto << endl; 26. int contador = -3; while(contador < 3) { if(!contador) continue; cout << contador << \t; ++contador } // Fin del while 27. int contador = -3; while(contador < 3) { ++contador; if(!contador) continue; cout << contador << \t; } // Fin del while 28. int contador = -3; while(contador < 3) { ++contador; if(!contador) break; cout << contador << \t; } // Fin del while 29. cout << Angulo\tSeno\tCoseno << endl; cout << ---------\t------\t--------- << endl; const float PI = 3.14159; cout.setf(ios::fixed); cout.precision(3); for(int angulo = 0; angulo < 91; angulo += 5) cout << angulo << \t << sin(angulo * PI / 180) << \t << cos(angulo * PI / 180) << endl; 30. for(int linea = 1; linea < 6; ++linea) { for(int col = 1 ; col < 11 ; ++col) cout << linea << << col << \t;
FUNDAMENTOS LECCIN 9

9-60

MIGUEL . TOLEDO MARTNEZ

cout << endl; } // Fin del for 31. int contador = 0; const int CONTADORMAX = 5; while(contador < CONTADORMAX) { for(int l = 1; l < CONTADORMAX + 1; ++1) cout << l; cout << endl; ++ contador; } // Fin del while 32. int const CONTADORMAX = 5; int veces = 3; do { int contador = 0; while(contador < CONTADORMAX) { for(int j = 1; j < contador + 1; ++j) cout << j; ++contador; cout << endl; } // Fin del while cout << endl; --veces; } // Fin del do/while while(veces != 0); 33. Cundo terminar el siguiente ciclo? enum boolean{Falso,Verdadero }; boolean bandera = Verdadero; // Declara la clase de datos boolean // Define la variable boolean

int numero = 0; int suma = 0; char pregunta = N; while(bandera == Verdadero) { cout << Escriba un nmero entero: << endl; cin >> numero; cout << Quiere continuar (s/n)? << endl; cin >> pregunta; if((pregunta == n) || (pregunta == N)) { bandera = Falso; cout << Ciclo terminado << endl; } // Fin del if else { suma = suma + numero; cout << La suma ahora es << suma << endl; } // Fin del else } // Fin del while

FUNDAMENTOS LECCIN 9

9-61

MIGUEL . TOLEDO MARTNEZ

PROBLEMAS
1. 2. 3. 4. Escriba un programa que calcule el promedio de cualquier nmero de calificaciones usando el ciclo w hile. Resuelva el programa del problema 1 con el ciclo do/while. Resuelva el programa del problema 1 con el ciclo for. Los conductores estn preocupados por el kilometraje que obtienen sus automviles. Un conductor ha conservado el registro de varios tanques llenos de gasolina registrando el kilometraje recorrido y los litros por cada tanque lleno. Desarrolle un programa en C++ que reciba de entrada el kilometraje y los litros utilizados por cada tanque lleno. El programa deber calcular y presentar los kilmetros por litro logrados con cada tanque lleno. Tras procesar toda la informacin de entrada, el programa deber calcular e i mprimir el kilometraje combinado por litros de todos los tanques llenos. Teclee los litros utilizados (-1 para terminar): 12.8 Teclee los kilmetros recorridos: 287 La relacin kilmetros/litros para este tanque fue: 22.421875 Teclee los litros utilizados (-1 para terminar): 10.3 Teclee los kilmetros recorridos: 200 La relacin kilmetros/litros para este tanque fue: 19.417475 Teclee los litros utilizados (-1 para terminar): 5 Teclee los kilmetros recorridos: 120 La relacin kilmetros/litros para este tanque fue: 24.000000 Teclee los litros utilizados (-1 para terminar): -1 El promedio global de kilmetros/litros fue: 21.6014223 5. Desarrolle un programa en C++ que determine si un cliente de una tienda departamental ha excedido el lmite de su cuenta de crdito. Por cada cliente se tiene la siguiente informacin: a. b. c. d. e.
Nmero de cuenta (entero) Balance al inicio del mes Total de artculos que el cliente carg a su cuenta este mes Total de los crditos aplicados a la cuenta del cliente este mes Lmite de crdito.

El programa deber recibir esta informacin, calcular el balance nuevo (= balance inicial + cargos crditos ) y determinar si el nuevo balance excede el lmite de crdito del cliente. Para aquellos clientes cuyo lmite de crdito ha sido excedido, el programa deber presentar su nmero de cuenta, lmite de crdito , balance nuevo y el mensaje Lmite de crdito excedido. Teclee el nmero de cuenta ( -1 para terminar): 100 Teclee el balance inicial: 5394.78 Teclee el total de cargos: 1000.00 Teclee el total de crditos: 500.00 Teclee el lmite de crdito: 5500.00 Cuenta: 100 Lmite de crdito: 5500.00 Balance 5894.78 Lmite de crdito excedido

FUNDAMENTOS LECCIN 9

9-62

MIGUEL . TOLEDO MARTNEZ

Teclee el nmero de cuenta ( -1 para terminar): 200 Teclee el balance inicial: 1000.00 Teclee el total de cargos: 123.45 Teclee el total de crditos: 321.00 Teclee el lmite de crdito: 1500.00 Teclee el nmero de cuenta ( -1 para terminar): 300 Teclee el balance inicial: 500.00 Teclee el total de cargos: 274.73 Teclee el total de crditos: 100.00 Teclee el lmite de crdito : 800.00 Teclee el nmero de cuenta ( -1 para terminar): -1 6. Una gran compaa de productos qumicos paga por comisin a sus agentes de venta. Estos reciben $200.00 a la semana ms 9% de sus ventas brutas en la semana. Por ejemplo, un agente que venda $5000.00 en qumicos en una semana recibir $200.00 ms 9% de $5000.00, es decir, un total de $650.00. Desarrolle un programa en C++ que acepte como entrada las ventas netas de cada vendedor d urante la ltima semana y calcule y despliegue sus ingresos. Procese la informacin de un agente de ventas a la vez. Teclee las ventas en dlares ( -1 para terminar): 5000.00 El salario es $ 650.00 Teclee las ventas en dlares ( -1 para terminar): 6000.00 El salario es $ 740.00 Teclee las ventas en dlares (-1 para terminar): 7000.00 El salario es $ 830.00 Teclee las ventas en dlares (-1 para terminar):- 1 7. Desarrolle un programa en C++ que determine el pago bruto de varios empleados. La compaa paga tiempo normal por las primeras 40 horas trabajadas por cada empleado y paga tiempo y medio todas las horas extra. Usted tiene una lista de los empleados de la compaa, las horas trabajadas por cada uno la semana anterior y la tarifa por hora de cada uno. Su programa deber incluir esta informacin por cada empleado y deber determinar y desplegar el pago bruto del empleado. Teclee las horas trabajadas ( -1 para terminar): 39 Teclee la tarifa por hora del trabajador ($00.00): 10.00 El salario es $390.00 Teclee las horas trabajadas ( -1 para terminar): 40 Teclee la tarifa por hora del trabajador ($00.00): 10.00 El salario es $400.00 Teclee las horas trabajadas ( -1 para terminar): 41 Teclee la tarifa por hora del trabajador ($00.00): 10.00 El salario es $ 415.00 Teclee las horas trabajadas ( -1 para terminar): -1

8.

El proceso para encontrar el nmero ms grande (es decir, el mximo de un grupo de nmeros) es de uso frecuente en las aplicaciones de cmputo. Por ejemplo, un programa que determine el ganador de un concurso de ventas aceptar como entrada la cantidad de unidades vendidas por cada vendedor. El vendedor que haya vendido la mayor cantidad de unidades ganar el concurso. Escriba un programa en C++ que acepte como entrada una serie de 10 nmeros y luego determine e imprima el mayor de ellos. Sugerencia: su programa deber utilizar las siguientes tres variables: 9-63

FUNDAMENTOS LECCIN 9

MIGUEL . TOLEDO MARTNEZ

contador:

numero : maximo : 9.

Contador para contar hasta 10 (es decir, para saber la cantidad de nmeros introducidos y determinar el momento en que se hayan procesados los 10) El nmero actual introducido en el programa. El nmero ms grande hasta el momento.

Escriba un programa en C++ que utilice ciclos y la secuencia de escape de tabulacin \t para imprimir los siguientes valores: N 1 2 3 4 5 10 * N 10 20 30 40 50 100 * N 100 200 300 400 500 1000 * N 1000 2000 3000 4000 5000

10. Mediante un enfoque parecido al del problema 8, encuentre los dos valores ms grandes de los 10 nmeros. Nota : slo puede introducir una vez cada nmero. 11. Modifique el programa EXAMENES.CPP, pgina 11, leccin 8, para validar sus entradas . Si el valor introducido en cualquier entrada es distinto de 1 o 2, contine haciendo el ciclo hasta que el usuario indique un valor correcto. 12. Escriba un programa en C++ que encuentre la resistencia equivalente de cualquier nmero de resistencias en serie. Utilice la estructura de control while. 13. Resuelva el programa del problema 12 empleando la estructura de control do/while. 14. Resuelva el programa del problema 12 empleando la estructura de control for. 15. Con base en la frmula C = 5/9(F-32), genere una tabla de conversin a Celsius para todas las temperaturas pares de 32 grados a 212 grados Fahrenheit. 16. Escriba un programa manejador de mens que calcule la resistencia equivalente de cualquier nmero de resistencias de un circuito en serie o en paralelo. Proporcione el control del ciclo del programa manejador de mens. 17. Escriba un programa que calcule el promedio ( x ) y la desviacin estndar () de una serie de nmeros. El promedio de una serie de nmeros es el mismo que el promedio de los nmeros. La desviacin estndar de una serie de nmeros se encuentra usando la siguiente frmula: (x 1

x) 2 + (x 2 x) 2 + L + (x n x) 2
n

18. Algunos lenguajes de programacin, como BASIC, le permiten usar el comando STEP dentro de un enunciado for como sigue: FOR contador = <valor inicial> TO <valor final> STEP N DO El comando STEP permite al contador de ciclo incrementar en un valor (N), diferente del valor 1 , para cada iteracin de ciclo. Escriba un ciclo for en C++ que pueda simular esta operacin STEP. Proporcione para la entrada del usuario cualquier valor de incremento deseado. Para mostrar esta operacin, use un incremento de cinco para visualizar todos los mltiplos de cinco comprendidos entre 1 y 100 . 19. Para hacer que el programa del reloj digital que se dio en esta leccin funcione de m anera adecuada, deber insertar un retardo de tiempo dentro del ciclo segundos para que el contador segundos se incremente precisamente una vez cada segundo. Para hacer esto, puede insertar un ciclo for que simplemente decremente el contador, como sigue: for(long int reloj = 1000000; reloj > 0; --reloj); Este ciclo no realizar nada sino perder el tiempo. Sin embargo, la cantidad de tiempo que se retarda depende del valor del contador inicial y la velocidad del reloj de la CPU de su sistema. Inserte este ciclo de retardo

FUNDAMENTOS LECCIN 9

9-64

MIGUEL . TOLEDO MARTNEZ

dentro del programa del reloj que se dio en esta leccin y, por ensayo y error, determine el valor del contador que proporcionar un segundo de retardo de su sistema. Compile, ejecute y observe la salida del programa. 20. Utilizando las ideas que vio en el programa del reloj digital en esta leccin, escriba un programa en C++ para mostrar la salida de un contador binario de 4 bits. Un contador binario de 4 bits solamente cuenta en forma binaria desde 0000 al 1111 . El primer valor del contador es 0000, el segundo es 0001 , el tercero es 0010 y as sucesivamente, hasta que llegue el contador al valor final de 1111 . Inserte un retardo en el programa para que el contador se incremente una vez cada dos segundos. Cambie el valor del retar do y observe el efecto en la frecuencia de la cuenta. ( Sugerencia: necesitar cuatro ciclos anidados, uno por cada bit dentro del valor contador) 21. Escriba un programa para encontrar la resistencia equivalente de un circuito en serie-paralelo de una configuracin arbitraria. Un circuito serie-paralelo es uno en el cual estn ambas conexiones del resistor en serie y en paralelo. (Sugerencia: cuando combine resistencias como en este circuito, deber empezar con la ltima resistencia, al final del circuito y trabajar hacia la primera resistencia, al comienzo del circuito) 22. Escriba un programa que emplee el ciclo while para leer un archivo llamado calificaciones que contenga un nmero desconocido de calificaciones . Muestre las calificaciones junto con su promedio. 23. Qu imprime el siguiente programa? #include <iostream.h> void main(void) { int contador = 1; while(contador <= 10) { cout << (contador % 2 ? **** : ++++++++) << endl; ++contador; } } 24. Qu imprime el siguiente programa? #include <iostream.h> void main(void) { int renglon = 10, columna; while(renglon >= 1) { columna = 1 ; while(columna <= 10) { cout << (renglon % 2 ? < : >); ++columna; } --renglon; cout << endl; } } 25. (Problema del else colgante) Determine la salida de los siguientes cdigos cuando x es igual que 9 e y igual a 11 , y cuando x es igual que 11 e y igual que 9. Observe que el compilador ignora las sangras en los programas C++. Adems, el compilador C++ siempre asocia un else con el if previo, a menos que se le indique otra cosa por medio de llaves { }. Debido a que, a primera vista, el programador tal vez no est seguro de a cul if corresponde un else, a esto se le conoce como el problema del else colgante. En el siguiente cdigo eliminamos las sangras para elevar el nivel de dificultad del problema. (Sugerencia: aplique las convenciones de sangrado que ha aprendido) a. if(x < 10) if(y > 10) cout << ***** << endl;

FUNDAMENTOS LECCIN 9

9-65

MIGUEL . TOLEDO MARTNEZ

else cout << ##### << endl; cout << $$$$$ << endl; b. if (x < 10) { if(y > 10) cout << ***** << endl; } else { cout << ##### << endl; cout << $$$$$ << endl; } 26. (Otro problema del else colgante) Modifique el siguiente cdigo para que genere la salida que se presenta. Utilice las tcnicas de sangrado adecuadas. No se puede hacer ningn cambio excepto insertar llaves. El compilador ignora el sangrado en los programas C++. En el siguiente cdigo eliminamos el sangrado para hacer ms interesante el problema. Nota: es posible que no sea necesaria ninguna modificacin. if( y == 8) if( x == 5 ) cout << @@@@@ << endl; else cout << ##### << endl; cout << $$$$$ << endl; cout << &&&&& << endl; a. Suponiendo que x = 5 e y = 8 , se genera la siguiente salida.

@@@@@ $$$$$ &&&&& b. Suponiendo que x = 5 e y = 8 , se genera la siguiente salida. @@@@@ c. Suponiendo que x = 5 e y = 8 , se genera la siguiente salida. @@@@@ &&&&& d. Suponiendo que x = 5 e y = 7 , se genera la siguiente salida. Nota: las ltimas tres instrucciones de salida, las que siguen al else, son parte de una instruccin compuesta. ##### $$$$$ &&&&& 27. Escriba un programa que lea el tamao del lado de un cuadro e imprima con asteriscos y espacios en blanco un cuadro vaco de ese tamao. Su programa deber trabajar con cuadros de cualquier tamao entre 1 y 20 . Por ejemplo, si su programa lee un tamao de 5 , deber imprimir: ***** * * * * * *

***** 28. Un palndromo es un nmero o frase de texto que se lee igual al derecho que al revs. Por ejemplo, los siguientes enteros de cinco dgitos son palndromos: 12321 , 55555, 45554 y 11611 . Escriba un programa que lea un entero de 5 dgitos y determine si es un palndromo . (Sugerencia: utilice los operadores de divisin y mdulo para separar el nmero en sus distintos dgitos) 29. Introduzca un entero que contenga nicamente ceros y unos (es decir, un entero binario) e imprima su equivalente decimal . (Sugerencia: mediante los operadores de mdulo y divisin tome los dgitos binarios del nmero, uno a la vez, de derecha a izquierda. As como en el sistema nmero decimal el dgito de la derecha
FUNDAMENTOS LECCIN 9

9-66

MIGUEL . TOLEDO MARTNEZ

tiene un valor posicional de 1 , el siguiente hacia la izquierda un valor de 10 , luego 100 , luego 1000 , etc. En el sistema numrico binario el nmero de la derecha tiene un valor posicional de 1 , el siguiente a la izquierda un valor de 2 , luego 4 , luego 8 , etc. Por lo tanto, el nmero decimal 234 puede interpretarse como 4 * 1 + 3 * 10 + 2 * 100 . El equivalente decimal de 1101 en binario es 1 * 1 + 0 * 2 + 1 * 4 + 1 * 8 o 1 + 0 + 4 + 8 , es decir, 13) 30. Escriba un programa que despliegue el siguiente patrn cuadriculado : ******** * * * * **** ******** ******** ******** ******** ******** Su programa podr utilizar slo tres instrucciones de salida, cuyas formas son las siguientes: cout << * ; cout << ; cout << endl; 31. Escriba un programa que imprima continuamente las potencias del entero 2, es decir, 2 , 4 , 8 , 16, 32 , 64 , etc. Su ciclo no deber terminar (es decir, deber crear un ciclo infinito) Qu suceder cuando ejecute este programa? 32. Escriba un programa que lea el radio de un crculo (como un valor float) y calcule e imprima el dimetro, la circunferencia y el rea. Utilice 3.14159 para . 33. Qu est mal con la siguiente instruccin? Escriba la instruccin que logre lo que probablemente quiere hacer el programador. cout << ++(x + y); 34. Escriba un programa que lea tres valores float distintos de cero y determine e imprima si pudiesen representar los lados de un tringulo. 35. Escriba un programa que lea tres enteros distintos de cero y determine e imprima si pueden ser los lados de un tringulo rectngulo. 36. Una compaa quiere transmitir datos a travs del telfono, pero est preocupada porque sus telfonos podran estar intervenidos. Toda su informacin se transmite como enteros de cuatro dgitos. Le han pedido a usted que escriba un programa que encripte su informacin de modo que pueda ser transmitida de manera ms segura. Su programa deber leer un entero de cuatro dgitos y encriptarlo como sigue, sustituya cada dgito por (la suma de dicho dgito ms 7) mdulo 10. Despus intercambie el primer dgito con el tercero y el segundo con el cuarto e imprima el entero encriptado. Escriba un programa independiente que acepte como entrada el entero de cuatro dgitos encriptado y lo desencripte, dejando el nmero original. 37. El factorial de un entero no negativo n se escribe n! (que se pronuncia n factorial) y se define como: n! = n (n 1) (n 2) ...1 (para valores de n mayores o iguales que 1) y n! = 1 (para n = 0 ) Por ejemplo, 5! = 5 4 3 2 1 , que es 120 . a. b.
Escriba un programa que lea un entero no negativo y calcule e imprima su factorial . Escriba un programa que estime el valor de la constante matemtica empleando la frmula:
e

= 1+

1 1!

1 2!

1 3!

+L

c.

Escriba un programa que calcule el valor de ex mediante la frmula:


e x

= 1+

x 1!

+L

2!

3!

FUNDAMENTOS LECCIN 9

9-67

MIGUEL . TOLEDO MARTNEZ

38. Encuentre los errores en los siguientes fragmentos de cdigo (Nota: podra haber ms de un error): a. For( x = 100, x >= 1, x++) cout << x << endl; b. El siguiente cdigo debera imprimir si el valor de la variable entera valor es par o non: switch(valor % 2) { case 0; cout << Entero par << endl; case 1; cout << Entero non << endl; } c. El siguiente cdigo debera enviar a la salida los enteros nones del 19 al 1 : for ( x = 19; x >= 1; x += 2) cout << x << endl; d. El siguiente cdigo debera enviar a la salida los enteros pares del 2 al 100 : contador = 2; do { cout << contador << endl; contador += 2; }while(contador < 100); 39. Escriba un programa que sume una secuencia de enteros . Suponga que el primer entero que se lee especifica el nmero de valores que faltan por introducir. Su programa deber leer un solo valor por instruccin de entrada. Una secuencia de entrada tpica podra ser: 5 100 200 300 400 500

donde 5 indica que deben sumarse los siguientes 5 valores. 40. Escriba un programa que calcule e imprima el promedio de varios enteros . Suponga que el ltimo valor ledo es el centinela 9999 . Una secuencia de entrada tpica sera: 3. 8 11 7 9 9999 que indica que el promedio de todos los valores que preceden a 9999 se va a calcular. 41. Qu hace el siguiente programa? #include <iostream.h> void main(void) { int x, y; cout << Teclee dos nmeros enteros en el rango 1 200: ; cin >> x >> y; for(int i = 1; i <= y; i++) { for(int j = 1; j <= x; j ++) cout << @; cout << endl;

FUNDAMENTOS LECCIN 9

9-68

MIGUEL . TOLEDO MARTNEZ

} } 42. Escriba un programa que encuentre el menor de varios enteros . Suponga que la primera cifra leda especifica el nmero de valores que faltan. 43. Escriba un programa que calcule e imprima el producto de los enteros nones del 1 al 15 . 44. La funcin factorial se utiliza con frecuencia en los problemas de probabilidad. El factorial de un entero positivo n (que se escribe n! y se pronuncia n factorial) es igual al producto de los enteros positivos del 1 a n. Escriba un programa que evale los factoriales de los enteros del 1 al 5 . Imprima el resultado en formato de tabla. Qu dificultad podra evitar que usted calcule el factorial de 20 ? 45. Modifique el programa INTERES.CPP , de inters compuesto para que repita sus pasos con intereses de 5% , 6% , 7% , 8% , 9% y 10% . Utilice un ciclo for para variar la tasa de inters . 46. Escriba un programa que imprima los siguientes patrones por separado, cada uno debajo del anterior. Utilice ciclos for para generar los patrones. Todos los asteriscos (*) deben imprimirse con una sola instruccin de la forma cout << *; (esto provoca que los asteriscos se impriman uno despus de otro) Sugerencia: los ltimos dos patrones requieren que cada lnea inicie con una cantidad adecuada de espacio. Finalmente combine su cdigo de los cuatro problemas en un solo programa que imprima los cuatro patrones lado a lado, empleando ingeniosamente ciclos for anidados. a) * ** *** **** ***** ****** ******* ******** ********* ********* b) ********** ********* ******** ******* ****** ***** **** *** ** * c) ********** ********* ******** ******* ****** ***** **** *** ** * d) * ** *** **** ***** ****** ******* ******** ********* **********

47. Una aplicacin interesante de las computadoras es para el dibujo de grficos de barras (a veces llamados histogramas) Escriba un programa que lea cinco nmeros (entre 1 y 30 ) Por cada nmero que lea, su programa debe imprimir una lnea que contenga dicha cantidad de asteriscos adyacentes. Por ejemplo, si su programa lee el nmero siete , deber imprimir: *******. 48. Una empresa de ventas por correo vende cinco tipos distintos de productos cuyos precios de venta son: producto 1 , $2.98; producto 2 , $4.50; producto 3 , $9.98, producto 4 , $4.49 y producto 5 , $6.87. Escriba un programa que lea una serie de pares de nmeros como sigue: a. Nmero de producto b. Cantidad vendida en un da Su programa deber utilizar una instruccin switch para ayudarle a determinar el precio de venta de cada producto; luego deber calcular y desplegar el importe total de la venta de productos de la semana pasada. 49. Modifique el programa CONTACALIF.CPP, de la pgina 343, para que calcule el promedio en puntos de la calificacin de la clase. La calificacin A vale 4 puntos, la de B vale 3, etctera. 50. Modifique el programa INTERES.CPP, pgina 13 , leccin 8, para que slo utilice enteros para calcular el inters compuesto . (Sugerencia: trate todas las cifras monetarias como cantidades enteras de centavos. Luego separe el resultado en su parte de unidades enteras y su parte de centavos utilizando la operacin de divisin y mdulo. Inserte un punto) 51. Suponga que i = 1 , j = 2 , k = 3 y m = 2 . Qu imprimen las siguientes instrucciones? Son necesarios los parntesis en todos los casos? a. cout << ( i == 1 ) << endl; b. cout << ( j == 3 ) << endl;

FUNDAMENTOS LECCIN 9

9-69

MIGUEL . TOLEDO MARTNEZ

c. d. e. f. g. h. i.

cout << ( i >= 1 && j < 4 ) << endl; cout << ( m <= 99 && k < m ) << endl; cout << ( j >= i || k == m ) << endl; cout << ( k + m < j || 3 j >= k ) << endl; cout << ( !m ) << endl; cout << ( ! ( j m ) ) << endl; cout << ( ! (k > m) ) << endl;

52. Escriba un programa que imprima una tabla con el equivalente binario, octal y hexadecimal de los nmeros decimales del 1 al 256 . 53. Calcule el valor de a partir de la serie infinita:

=4

4 3

4 5

4 7

4 9

4 11

+L

Imprima una tabla que muestre el valor de aproximado por un trmino de esta serie, por dos trminos, por tres trminos, etc. Cuntos trminos de esta serie tiene que utilizar antes de obtener 3.14 ? 3.141? 3.1415? y 3.14159 ? 54. ( Triples pitagricos) Un tringulo rectngulo puede tener lados que sean todos enteros. El conjunto de tres valores enteros correspondiente a los lados de un tringulo rectngulo se llama triple pitagrico. Estos tres lados deben satisfacer la relacin de que la suma de los cuadrados de dos de los lados es igual al cuadrado de su hipotenusa. Encuentre todos los triples pitagricos de lado1, lado2 e hipotenusa que no sean mayores que 500 . Utilice un ciclo for anidado triple que pruebe todas las posibilidades. Este es un ejemplo de cmputo de fuerza bruta. 55. Una compaa paga a sus empleados como gerentes (que reciben un salario fijo semanal), obreros (que reciben un salario fijo por hora durante las primeras 40 horas de trabajo y tiempo y medio, es decir 1.5 veces su salario por hora, por el tiempo extra trabajado), trabajadores por comisin (que reciben $250.00 ms 5.7% de sus ventas brutas semanales) o trabajadores a destajo (que reciben una cantidad fija de dinero de cada artculo que producen; cada trabajador a destajo de esta compaa slo trabaja con un tipo de artculo). Escriba un programa que calcule el pago semanal de cada empleado . No necesita saber por adelantado la cantidad de empleados. Cada tipo de empleado tiene su propio cdigo de paga; los gerentes tienen el cdigo 1 , los obreros el cdigo 2 , los trabajadores por comisin el cdigo 3 y los trabajadores a destajo el cdigo 4 . Utilice switch para calcular el pago de cada empleado con base en su cdigo de paga. Con el switch, pdale al usuario (es decir, el empleado de nminas) que introduzca la informacin necesaria para que su programa calcule el pago de los empleados con base en su cdigo de pago. 56. (Leyes de De Morgan) Las leyes de De Morgan a veces pueden simplificar la manera en que expresamos alguna expresin lgica. Estas leyes indican que la expresin !(condicion1 && condicion2) es equivalente lgica de la expresin ( !condicion1 || !condicion2). Adems, la expresin !(condicion1 || condicion2) es equivalente lgica de la expresin (!condicion1 && !condicion2). Con base en las leyes de De Morgan, escriba expresiones equivalentes para las siguientes expresiones y luego un programa que demuestre que la expresin original y la expresin nueva son equivalentes en todos los casos: a. ! ( x < 5 ) && ! ( y >= 7 ) b. c. d. ! ( a == b ) || ! ( g != 5 ) ! ( ( x <= 8 ) && ( y > 4 ) ) ! ( ( i > 4 ) || ( j <= 6 ) )

FUNDAMENTOS LECCIN 9

9-70

MIGUEL . TOLEDO MARTNEZ

57. Escriba un programa que imprima la siguiente forma de rombo. Puede emplear instrucciones de salida que impriman un asterisco (* ) o un espacio en blanco. Maximice el uso de repeticiones (con estructuras for anidadas) y minimice la cantidad de instrucciones de salida. * *** ***** ******* ********* ******* ***** *** * 58. Modifique el programa el problema 57 para que lea un nmero non en el rango de 1 a 19 que indique la cantidad de filas en el rombo . Su programa deber desplegar un rombo del tamao correspondiente. 59. Una crtica a las instrucciones break y continue es que ninguna de las dos es estructurada. De hecho, las instrucciones break y continue siempre pueden reemplazarse con instrucciones estructuradas, aunque hacerlo puede ser complicado. Describa en general cmo hara para quitar todas las instrucciones break de un ciclo y sustituirlas por algn equivalente estructurado. (Sugerencia: la instruccin break sale de un ciclo desde dentro del cuerpo del ciclo. La otra manera de salir es haciendo que la prueba de continuacin del ciclo falle. Considere utilizar en la prueba de continuacin del ciclo una segunda prueba que indique salida anticipada debido a una condicin break) 60. Qu hace el siguiente segmento de programa? for ( i = 1; i <= 5; i++ ) { for ( j = 1; j <= 3; j++) { for( k = 1; k <= 4; k ++) cout << *; cout << endl; } cout << endl; } 61. Describa en general cmo quitara las instrucciones continue de un ciclo y las sustituira con un equivalente estructurado. 62. Describa con 200 palabras o menos qu es y qu hace un automvil. Liste por separado los sustantivos y los verbos. Indicamos que cada sustantivo puede corresponder a un objeto que habr que construir para implementar un sistema, en este caso, un automvil. Seleccione cinco de los objetos y, para cada uno, liste varios atributos y varios comportamientos. Describa brevemente cmo interactan estos objetos entre ellos y con otros objetos de su descripcin. Acaba de efectuar varios de los pasos clave para un diseo orientado a objeto tpico. 63. (Problema de Peter Minuit) La leyenda cuenta que, en 1626, Peter Minuit compr Manhatan en un trueque por $24.00 Hizo una buena inversin? Para responder a la pregunta, modifique el programa INTERES.CPP , de inters compuesto para que inicie con un capital de $24.00 y calcule el inters sobre lo depositado si se hubiera guardado en depsito el dinero hasta hoy (374 aos hasta 2000) Ejecute el programa con tasas de inters de 5% , 6% , 7% , 8% , 9% y 10% , para ver las maravillas del inters compuesto .

FUNDAMENTOS LECCIN 9

9-71

MIGUEL . TOLEDO MARTNEZ

EXAMEN BREVE 24
1. Verdadero o falso: Un ciclo do/while se rompe cuando la expresin de verificacin se evala en cero. 2. Verdadero o falso: El ciclo do/while es un ciclo posverificador . 3. Cul es el error en el siguiente cdigo?
x = 10; do cout << Este es un ciclo do/while << endl; while (x > 0);

4. Corrija el cdigo de la pregunta 3 . 5. Cuntas veces se ejecutar el siguiente ciclo?


x = 1; do cout << Este es un ciclo do/while << endl; while(x <= 10);

6. Cuntas veces se ejecutar el siguiente ciclo?


x = 1; do { cout << Este es un ciclo do/while << endl; ++x; }while(x >= 10);

EXAMEN BREVE 25
1. Liste los tres elementos que deben aparecer en la primera lnea de la estructura del ciclo for. 2. Verdadero o falso: El contador en un ciclo for se modifica despus de que los enunciados del ciclo se ejecutan en una iteracin dada. 3. Verdadero o falso: Un ciclo for siempre puede ser sustituido por un ciclo while , porque ambos tienen bsicamente la misma estructura, slo se codifican de manera diferente. 4. Cuntas veces se ejecutar el siguiente ciclo?
for(int x = 0; x; ++x) cout << Cuntas veces se ejecutar este ciclo? << endl;

5. Cuntas veces se ejecutar el siguiente ciclo?


for(int x = 0; x <= 10; ++x) cout << Cuntas veces se ejecutar este ciclo? << endl;

6. Cundo se deben agrupar (entre llaves) los enunciados del ciclo for ? 7. Suponga que tiene dos ciclos anidados . El ciclo interno se ejecuta 5 veces y el externo 10 veces. Cuntas iteraciones en total estn dentro de la estructura del ciclo anidado? 8. En un ciclo descendente , el contador del ciclo es siempre ______________________.

FUNDAMENTOS LECCIN 9

9-72

MIGUEL . TOLEDO MARTNEZ

EXAMEN BREVE 26
1. El enunciado que har que slo se aborte la iteracin en curso en un ciclo es el enunciado _______________________________. 2. Los enunciados break y continue normalmente se usan como parte de un enunciado ___________________ dentro de la estructura de un ciclo. 3. Cuntas veces se ejecutar el siguiente ciclo?
x = 0; while(x < 0) { cout << Cuntas veces se ejecutar este ciclo? << endl; if(x) break; ++x; } //Fin de while()

RESPUESTA EXAMEN BREVE 24


1. 2. 3. 4. Verdadero: Un ciclo do/while se rompe cuando la expresin de verificacin se evala en cero . Verdadero: El ciclo do/while es un ciclo posverificador . El valor de x nunca cambiar dentro del ciclo , con lo cual se crea un ciclo infinito. El cdigo correcto para la pregunta 3 es como sigue:
x = 10; do { cout << Este es un ciclo do/while << endl; --x; } // Fin del do/while while (x > 0);

6. El ciclo se ejecutar una vez, porque el ciclo do/while es un ciclo posverificador. 7. Sin las limitaciones de una computadora, el ciclo se ejecutar infinitamente , porque x empieza siendo mayor que cero y se incrementa dentro del ciclo. Pero, considerando las limitaciones fsicas de la computadora, se ejecutar 32768 veces antes de reiniciar en 32768 y hacer que la verificacin sea falsa.

RESPUESTA EXAMEN BREVE 25


1. Las tres cosas que pueden aparecen en la primera lnea de una estructura de ciclo for son las siguientes:
La iniciacin del contador de ciclo. La expresin de verificacin del ciclo. El incremento o decremento del contador.

2. Verdadero: El contador en un ciclo for se modifica despus de que los enunciados del ciclo se ejecutan en una iteracin dada.
FUNDAMENTOS LECCIN 9

9-73

MIGUEL . TOLEDO MARTNEZ

3. Verdadero: Un ciclo for siempre puede ser sustituido por un ciclo while, porque ambos tienen bsicamente la misma estructura, slo se codifican de manera diferente. 4. El ciclo se ejecutar cero veces, porque en la primera prueba la condicin de la prueba es cero (falso) 5. El ciclo se ejecutar 11 veces. 6. Cuando exista ms de un enunciado para ejecutarse dentro del ciclo. 7. El ciclo interior se ejecutar 5 veces por cada iteracin del ciclo exterior = 5 x 10 = 50 . 8. En un ciclo descendente , el contador del ciclo es siempre decrementado.

RESPUESTA EXAMEN BREVE 26


1. El enunciado que har que slo se aborte la iteracin en curso en un ciclo es el enunciado continue . 2. Los enunciados break y continue normalmente se usan como parte de un enunciado if dentro de la estructura de un ciclo. 3. Cuntas veces se ejecutar el siguiente ciclo?
x = 0; while(x < 10) { cout << Cuntas veces se ejecutar este ciclo? << endl; if(x) break; ++x; } //Fin de while()

El ciclo se ejecutar dos veces. Cuando x se incrementa en uno al final de la primera iteracin, el enunciado if(x) ser verdadera (diferente de cero) en la segunda iteracin, ocasionando que se ejecute el enunciado break para abortar la estructura del ciclo.

FUNDAMENTOS LECCIN 9

9-74