1 Capítulo 2 – Estructuras de ControlÍndice del capítulo 2.1 Introducción 2.2 Algoritmos 2.3 Pseudocódigo 2.4 Estructuras de Control 2.5 La Estructura de Selección if 2.6 La Estructura de Selección if/else 2.7 La Estructura de Repetición while 2.8 Formulación de Algoritmos: Caso de Estudio 1 (Repetición Controlada por Contador) 2.9 Formulación de Algoritmos con Refinación Descendente Paso a Paso: Caso de Estudio 2 (Repetición Controlada por Centinela) Formulación de Algoritmos con Refinación Descendente Paso a Paso: Caso de Estudio 3 (Estructuras de Control Anidadas) Operadores de Asignación Operadores de Incremento y Decremento
2 Capítulo 2 – Estructuras de ControlÍndice del capítulo Fundamentos de la Repetición Controlada por Contador La Estructura de Repetición for Ejemplos del Uso de la Estructura for La Estructura switch de Selección Múltiple La Estructura de Repetición do/while Las Instrucciones break y continue Operadores Lógicos Confusión de los Operadores de Igualdad (==) y Asignación (=) Resumen de la Programación Estructurada
3 Antes de escribir un programa2.1 Introducción Antes de escribir un programa Entender a fondo el problema Contar con un enfoque cuidadosamente planificado para resolverlo Al escribir un programa Saber los tipos de “bloques de construcción” disponibles Emplear principios correctos de construcción de programas
4 Problemas de computación2.2 Algoritmos Problemas de computación Pueden resolverse ejecutando una serie de acciones en un orden específico Algoritmo=procedimiento para resolver problemas en términos de: Acciones a ejecutar Orden en que se ejecutarán las acciones Ejemplo: levantarse por la mañana para ir a clase Control del Programa Especifica el orden en que se deben ejecutar las instrucciones
5 No se ejecuta en la computadora2.3 Pseudocódigo Pseudocódigo Lenguaje artificial e informal usado para el desarrollo de algoritmos Similar al inglés común No es un lenguaje de programación No se ejecuta en la computadora Ayuda a “pensar” en el programa antes de escribirlo en un lenguaje de programación Fácilmente convertible en un programa de C++ Describe sólo instrucciones ejecutables No es necesario declarar variables
6 2.4 Estructuras de ControlEjecución Secuencial Sentencias ejecutadas en orden Transferencia de control Siguiente sentencia a ejecutar NO es siguiente en secuencia 3 estructuras de control (Bohm y Jacopini, 1966) Estructura de Secuencia Por defecto, los programas se ejecutan secuencialmente Estructuras de Selección if (selección única), if/else (doble selección), switch (selección múltiple) Estructuras de Repetición o Lazos while, do/while, for
7 2.4 Estructuras de ControlPalabras clave de C++ No pueden usarse como identificadores, como es el caso de los nombres de variables
8 2.4 Estructuras de ControlDiagrama de Actividad en UML Representación gráfica de un algoritmo Símbolos conectados por flechas de transición: orden de ejecución Rectángulo redondeado (símbolo de acción) Cualquier tipo de acción Círculo negro (Estado inicial) Círculo negro sobre círculo blanco (Estado final) Romboide (símbolo de decisión) Rectángulos con esquina doblada: Anotaciones
9 2.4 Estructuras de ControlEstructuras de control entrada única/salida única Se conecta el punto de salida de una estructura de control con el punto de entrada de la siguiente Combinación de estructuras de control Apilamiento de estructuras de control Anidamiento de estructuras de control
10 2.5 Estructura de Selección ifPara elegir entre alternativas de acción Ejemplo en pseudocódigo: Si la nota del estudiante es mayor o igual que 60 Imprime “Aprobado” Si la condición es cierta (true) Se ejecuta la sentencia de impresión y el programa continúa en la siguiente sentencia Si la condición es falsa (false) Se ignora la sentencia de impresión, y el programa continúa Las tabulaciones hacen que los programas se lean fácilmente C++ ignora los caracteres de espacios en blanco (tabuladores, espacios, saltos de línea, etc.)
11 2.5 Estructura de Selección ifTraducción a C++ Si la nota del estudiante es mayor o igual que 60 Imprime “Aprobado” if ( nota >= 60 ) cout << "Aprobado"; Símbolo diamante (símbolo de decisión) Indica que debe tomarse una decisión Contiene una expresión que puede ser verdadera o falsa Evalúa la condición, sigue el camino Estructura if Entrada única/Salida única
12 2.5 Estructura de Selección ifDiagrama de actividad en UML Se puede tomar una decisión a partir de cualquier expresión. cero - false no cero - true Ejemplo: 3 - 4 es true
13 2.6 Estructura de Selección if/elseEjecuta la acción sólo cuando la condición es VERDADERA if/else Diferentes acciones si la condición es verdadera o falsa Pseudocódigo Si la nota del estudiante es mayor o igual a 60 Imprime “Aprobado” sino Imprime “Suspenso” Código C++ if ( nota >= 60 ) cout << "Aprobado"; else cout << "Suspenso";
14 2.6 Estructura de Selección if/elseOperador condicional ternario (?:) Tres argumentos (condición, valor si true, valor si false) Escritura del código: cout << ( nota >= 60 ? "Aprobado" : "Suspenso" ); Condición Valor si verdadera Valor si falsa
15 2.6 Estructura de Selección if/elseEstructuras if/else anidadas Una dentro de otra, evalúan múltiples casos Si una condición se cumple, se saltan las demás sentencias Si la nota del estudiante es mayor o igual que 9 Imprime “MH” sino si la nota del estudiante es mayor o igual que Imprime “SB” sino si la nota del estudiante es mayor o igual que Imprime “NT” sino si la nota del estudiante es mayor o igual que Imprime “AP” sino Imprime “SU”
16 2.6 Estructura de Selección if/elseEjemplo if ( nota >= 9 ) // 9 o más cout << "MH"; else if ( nota >= 8 ) // 8-8, cout << "SB"; else if ( nota >= 7 ) // 7-7, cout << "NT"; else if ( nota >= 5 ) // 5-5, cout << "AP"; else // menor que cout << "SU";
17 2.6 Estructura de Selección if/elseInstrucción compuesta Conjunto de sentencias contenidas entre un par de llaves if ( nota >= 5 ) cout << "Aprobado.\n"; else { cout << "Suspenso.\n"; cout << "Tienes que repetir curso.\n"; } Sin llaves, cout << " Tienes que repetir curso.\n"; siempre se ejecutaría Bloque Conjunto de sentencias entre llaves
18 2.7 Estructura de Repetición whileLa acción debe repetirse mientras cierta condición sea verdadera Pseudocódigo Mientras haya más elementos en mi lista de la compra Compra el siguiente elemento y elimínalo de la lista El lazo while se repite hasta que la condición se vuelva falsa Ejemplo: encontrar la 1ª potencia de 2 > 1000 int producto = 2; while ( producto <= 1000 ) producto = 2 * producto;
19 2.7 Estructura de Repetición whileDiagrama de actividad UML del bucle while
20 2.8 Formulación de Algoritmos (Repetición Controlada por Contador)El bucle se repite hasta que el contador alcanza un valor determinado. El contador controla nº iteraciones bucle. Repetición definida Antes de iniciar la ejecución del ciclo se conoce la cantidad de repeticiones Ejemplo Un grupo de 10 alumnos hizo un examen. Tenemos acceso a las notas de este examen (enteros en el rango de 0 a 10). Calcular el valor medio de las notas del grupo.
21 2.8 Formulación de Algoritmos (Repetición Controlada por Contador)Pseudocódigo del ejemplo: Da al total el valor 0 Da al contador de calificaciones el valor 1 Mientras el contador de calificaciones sea menor o igual que 10 Introduce la siguiente calificación Suma la calificación al total Suma 1 al contador de calificaciones Da al valor medio del grupo el valor del total dividido entre 10 Imprime el valor medio A continuación: código C++ para este ejemplo
22 Declaración de variables locales// Fig. 2.7: fig02_07.cpp // Cálculo del promedio con repetición controlada por contador. #include
23 21 // fase de procesamientowhile ( contadorNotas <= 10 ) { // realiza el ciclo 10 veces cout << "Introduce la nota: "; // solicita entrada cin >> nota; // lee la nota total = total + nota; // suma la nota al total contadorNotas = contadorNotas + 1;// incrementa contador } 28 // fase de terminación promedio = total / 10; // división entera 31 // Visualización de resultado cout << "El promedio del grupo es " << promedio << endl; 34 return 0; // indica que el programa terminó correctamente 36 37 } // fin de la función main El contador se ve incrementado cada vez que se ejecuta el ciclo. Finalmente, el contador provoca la finalización del bucle. Introduce la nota: 98 Introduce la nota : 76 Introduce la nota : 71 Introduce la nota : 87 Introduce la nota : 83 Introduce la nota : 90 Introduce la nota : 57 Introduce la nota : 79 Introduce la nota : 82 Introduce la nota : 94 El promedio del grupo es 81
24 2.9 Formulación de Algoritmos (Repetición Controlada por Centinela)Consideremos la modificación del ejemplo: Desarrolle un programa de cálculo del promedio de un grupo que procese una cantidad arbitraria de notas cada vez que se ejecute el programa No se conoce el número de estudiantes ¿Cómo sabrá el programa cuándo terminar? Valor centinela Indica “fin de la entrada de datos” El bucle finaliza cuando se introduce el centinela Valor del centinela: no puede confundirse con una valor de entrada válido (-1 en este caso) Repetición indefinida (no se conoce el nº iteraciones)
25 2.9 Formulación de Algoritmos (Repetición Controlada por Centinela)Refinación descendente paso a paso Comenzamos con una representación del pseudocódigo de la parte superior Determina el promedio del grupo en el examen La dividimos en tareas menores, y las escribimos en el orden en que necesitan ejecutarse (1ª refinación: secuencia) Inicializa las variables Introduce, suma y cuenta las notas del examen Calcula e imprime el promedio del grupo
26 2.9 Formulación de Algoritmos (Repetición Controlada por Centinela)Muchos programas pueden dividirse en 3 fases: Inicialización Inicializa las variables del programa Procesamiento Introduce los datos de entrada, ajusta las variables del programa de acuerdo con los datos de entrada Terminación Calcula e imprime los resultados finales Ayuda a dividir los programas para la refinación descendente
27 2.9 Formulación de Algoritmos (Repetición Controlada por Centinela)2º Refinamiento Refinamiento de la fase de inicialización Inicializa las variables puede refinarse como: Inicializa el total a cero Inicializa el contador a cero Refinamiento de la fase de Procesamiento Introduce, suma y cuenta las notas del examen Introduce la primera nota (puede ser el centinela) Mientras el usuario no introduzca el valor centinela Suma esta nota al total Suma 1 al contador de calificaciones Introduce la siguiente nota (puede ser el centinela) Requiere estructura de repetición No sabemos nº notas repetición controlada por centinela
28 2.9 Formulación de Algoritmos (Repetición Controlada por Centinela)Refinamiento de la fase de Terminación Calcula e imprime el promedio del grupo puede refinarse como: Si el contador de notas no es igual a 0 Establece el promedio como el total dividido entre el contador de notas Imprime el promedio sino Imprime “No se introdujeron notas” A veces, son necesarios más de 2 pasos de refinamiento para traducir pseudocódigo a C++ A continuación: programa C++ ¿División por cero?
29 Tipo de datos double usado para representar números decimales.// Fig. 2.9: fig02_09.cpp // Programa de promedio con repetición controlada por centinela. #include
30 Conversión explícita o molde: 26 // Fase de procesamiento // Pide la primera nota al usuario cout << "Introduce la nota, -1 para terminar: "; // solicitud cin >> nota; // lee la nota 31 // lazo hasta que el usuario introduzca el valor centinela while ( nota != -1 ) { total = total + nota; // suma nota al total contadorNotas = contadorNotas + 1; // incrementa contador 36 cout << "Introduce la nota, -1 para terminar: "; // solicitud cin >> nota; // lee la siguiente nota 39 } // fin del bucle while 41 // fase de terminación // si el usuario introdujo al menos una nota ... if ( contadorNotas != 0 ) { 45 // calcula el promedio de todas las notas introducidas promedio = static_cast< double >( total ) / contadorNotas; 48 Importante indicar al usuario lo que debe hacer Incrementa contador sólo si nota válida Líneas 33 y 44: Apilamiento de estructuras de control Conversión explícita o molde: static_cast
31 Manipulador de flujo con parámetros setprecision(2) // visualiza el promedio con 2 dígitos de precisión cout << "El promedio del grupo es " << setprecision( 2 ) << fixed << promedio << endl; 52 } // finaliza la parte if del if/else 54 else // si no se introducen notas, se imprime un mensaje cout << "No se introdujeron notas" << endl; 57 return 0; // indica que el programa terminó satisfactoriamente 59 60 } // fin de la función main Manipulador de flujo con parámetros setprecision(2) imprime 2 dígitos después del punto decimal (redondeado para ajustar la precisión). Los programas que usen esto deben incluir
32 2.10 Formulación de Algoritmos: (Estructuras de Control Anidadas)Planteamiento del problema Una universidad tiene una lista de resultados de un test de 10 estudiantes (1 = apto, 2 = no apto). Escriba un programa que analice los resultados. Si son aptos más de 8 estudiantes, imprima “Aumente la Matrícula". Nótese que El programa procesa 10 resultados Número fijo uso de lazo controlado por contador Se emplean 2 contadores Uno para contar cuántos estudiantes son aptos Otro para contar cuántos estudiantes son no aptos Cada resultado del test es 1 o 2 Si no es 1, suponemos que es 2
33 2.10 Formulación de Algoritmos: (Estructuras de Control Anidadas)Nivel superior Analiza los resultados de los exámenes y decide si debe aumentar la matrícula Primer refinamiento Inicializa las variables Introduce las 10 calificaciones y cuenta los aptos y no aptos Imprime un resumen de resultados del examen y decide si debe aumentar la matrícula 2º refinamiento: Especificación de variables La instrucción puede refinarse como: Inicializa aptos a cero Inicializa noAptos a cero Inicializa el contador de estudiantes (contEstud) a uno Sólo inicializo los contadores
34 2.10 Formulación de Algoritmos: (Estructuras de Control Anidadas)10 calificaciones repetición controlada por contador La instrucción Introduce las 10 calificaciones y cuenta los aptos y no aptos puede refinarse como: Mientras el contador de estudiantes sea menor o igual que 10 Introduce el siguiente resultado Si el estudiante es apto Suma 1 a aptos sino Suma 1 a noAptos Suma 1 al contador de estudiantes Estructura if/else ANIDADA en lazo mientras
35 2.10 Formulación de Algoritmos: (Estructuras de Control Anidadas)La instrucción Imprime un resumen de resultados del examen y decide si debe aumentar la matrícula puede refinarse como: Imprime el número de aptos Imprime el número de no aptos Si son aptos más de 8 estudiantes Imprime “Aumente la matrícula” A continuación, el programa en C++
36 Variables locales: Declaración + Inicialización// Fig. 2.11: fig02_11.cpp // Análisis de resultados de examen. #include
37 if/else anidado en while// si resultado es 1, incrementa aptos; if/else anidado en while if ( resultado == 1 ) // if/else anidado en while aptos = aptos + 1; 28 else // si resultado no es 1, incrementa no aptos noAptos = noAptos + 1; 31 // el incremento en contEstud provoca la terminación del lazo contEstud = contEstud + 1; 34 } // fin de while 36 // fase de terminación; muestra número de aptos y no aptos cout << “Aptos " << aptos << endl; cout << “No Aptos " << noAptos << endl; 40 // Si son aptos más de 8 estudiantes, imprime "aumenta matrícula" if ( aptos > 8 ) cout << "Aumente matrícula " << endl; 44 return 0; // terminación correcta 46 47 } // fin de función main if/else anidado en while
38 Introduzca el resultado (1 = apto, 2 = no apto): 1Aptos 6 No Aptos 4 Aptos 9 No Aptos 1 Aumente matrícula
39 2.11 Operadores de asignaciónAbreviaturas de expresiones de asignación Compilación más rápida Ejemplo: Operador de asignación de suma (+=) c = c + 3; se puede abreviar como c+=3; Sentencias de la forma variable = variable operador expresión; pueden reescribirse como variable operador= expresión; Otros operadores de asignación d -= (d = d - 4) e *= (e = e * 5) f /= (f = f / 3) g %= (g = g % 9)
40 2.12 Operadores de Incremento y DecrementoOperador de incremento (++) Incrementa la variable en 1 c++ es lo mismo que c += 1 (c=c+1) Operador de decremento (--) Decrementa la variable en 1 c-- es lo mismo que c -= 1 (c=c-1)
41 2.12 Operadores de Incremento y DecrementoPreincremento/Predecremento (+ rápido) El operador se escribe ANTES de la variable (++c o --c) Se modifica la variable, y a continuación se evalúa la expresión. Postincremento/Postdecremento El operador se escribe DESPUÉS de variable (c++ o c--) Se ejecuta la expresión en la que está la variable, y a continuación se modifica la variable.
42 2.12 Operadores de Incremento y DecrementoSi c = 5, entonces cout << ++c; c toma el valor 6, a continuación se imprime 6 cout << c++; Se imprime 5 (cout se ejecuta antes del incremento). A continuación c toma el valor 6 Cuando la variable no está en una expresión El preincremento y el postincremento tienen el mismo efecto Es lo mismo: ++c; cout << c; que c++;
43 // Fig. 2.14: fig02_14.cpp // Preincremento y postincremento. #include
44 24 return 0; // indica terminación correcta 26 27 } // fin de función main 5 6
45 2.12 Operadores de Incremento y DecrementoTabla de precedencia de operadores Operadores Asociatividad Tipo ( ) Izquierda a derecha Paréntesis static_cast
46 2.13 Fundamentos de la Repetición Controlada por ContadorLa repetición controlada por contador requiere: Nombre de una variable de control (o contador de ciclo) Valor inicial de la variable de control La condición que prueba el valor final de la variable de control El incremento/decremento que tendrá la variable de control cada vez que se ejecute un ciclo Ejemplo: programa que imprime los números del 1 al 10
47 Al terminar el bucle, contador vale 11// Fig. 2.16: fig02_16.cpp // Repetición controlada por contador. #include
48 1 2 3 4 5 6 7 8 9 10
49 2.13 Fundamentos de la Repetición Controlada por ContadorLa declaración int contador = 1; Nombra la variable de control contador Declara contador como un entero Reserva espacio en memoria para contador Da a contador un valor inicial de 1 Si declaro int contador = 0; puedo cambiar el bucle: while (++contador <= 10) cout << contador << endl;
50 2.14 La Estructura de Repetición forManeja todos los detalles de la repetición controlada por contador Formato general del lazo for for ( inicialización; TestContinuaciónLazo;incremento ) sentencia Ejemplo: imprimir los enteros del 1 al 10 for(int contador = 1; contador <= 10; contador++) Valor final de la variable de control para la que la condición es cierta Separador obligatorio ; Separador obligatorio ; Palabra clave for Nombre variable control Valor inicial de la variable de control Condición de continuación del lazo No punto y coma después de la última sentencia Incremento de la variable de control
51 // Fig. 2.17: fig02_17.cpp // Repetición controlada por contador con la estructura for. #include
52 1 2 3 4 5 6 7 8 9 10
53 2.14 La Estructura de Repetición forDiagrama de actividad en UML del lazo for
54 2.14 La Estructura de Repetición forLazo for puede rescribirse como lazo while inicialización; while ( TestContinuaciónLazo ){ sentencia incremento; } Inicialización e incremento Para varias variables, se usan listas separadas por comas for (int i = 0, j = 0; j + i <= 10; j++, i++) cout << j + i << endl;
55 2.14 La Estructura de Repetición forLazo for terminado en ; = lazo de retardo for ( inicialización; TestContinuaciónLazo;incremento ); Puede ser incremento, decremento o cualquier modificación del contador Si la condición inicial es falsa, el lazo for NUNCA se ejecuta. Declaración variable de control en inicialización el ámbito de la variable de control es el lazo for
56 2.14 Ejemplos de uso de la Estructura forModificar variable control de 1 a 100 con incremento 1 for (int i = 1; i <= 100; i++) Modificar variable control de 100 a 1 con incremento -1 for (int i = 100; i >= 1; i--) Modificar variable control de 7 a 77 en pasos de 7 for (int i = 7; i <= 77; i += 7) Modificar variable control de 20 a 2 en pasos de -2 for (int i = 20; i >= 2; i -= 2) Modificar variable control sobre la secuencia: 2, 5, 8, 11, 14, 17, 20. for (int j = 2; j <= 20; j += 3) Modificar la variable control sobre secuencia: 99, 88, 77, 66, 55, 44, 33, 22, 11, 0 for (int j = 99; j >= 0; j -= 11)
57 // Fig. 2.20: fig02_20.cpp // Suma con for. #include
58 2.15 Ejemplo de Uso de la Estructura forPrograma para calcular el interés compuesto Una persona invierte 1000€ en una cuenta de ahorros que da un interés del 5%. Suponiendo que todos los intereses se quedan depositados en la cuenta, calcula e imprime la cantidad que tendrá la cuenta al final de cada año durante 10 años. Emplea la siguiente fórmula para determinar las cantidades: a = p(1+r) p es la cantidad invertida inicialmente (es decir, el capital), r es la tasa de interés anual, n es el número de años, y a es la cantidad en depósito al final del año n. n
59 // Fig. 2.21: fig02_21.cpp // Cálculo del interés compesto. #include
60 24 // Títulos de las columnas de la tabla de salidacout << "Año" << setw( 21 ) << "Cantidad depositada" << endl; 26 // fijamos el formato de número en punto flotante cout << fixed << setprecision( 2 ); 29 // calculamos la cantidad en depósito para cada uno de los 10 años for ( int anho = 1; anho <= 10; anho++ ) { 32 // calculamos la nueva cantidad para el año especificado cantidad = capital * pow( interes, anho ); 35 // salida de una fila de la tabla cout << setw( 4 ) << anho << setw( 21 ) << cantidad << endl; 39 } // fin de for 41 return 0; // indica finalización correcta 43 44 } // fin de la función main Manipulador de flujo con parámetros: Fija el ancho del campo de al menos 21 caracteres. Si la salida es menor, se justifica a la derecha. pow(x,y) = x elevado a y.
61 Años Cantidad depositada Los números están justificados a la derecha debido a las sentencias setw (en las líneas 4 y 21).
62 2.16 La Estructura switch de Selección MúltipleComprueba múltiples valores en el valor de una variable Serie de etiquetas case y un caso opcional default switch ( variable ) { case valor1: // se toma si variable == valor1 sentencias break; // necesario para salir del switch case valor2: case valor3: // se toma si variable == valor2 o == valor3 break; default: // se toma si variable no cumple ningún caso previo sentencias break; }
63 2.16 La Estructura switch de Selección Múltiple
64 2.16 La Estructura switch de Selección MúltipleSiguiente ejemplo Programa para leer calificaciones (A-F) Muestra la cantidad de notas con cada calificación Detalles sobre caracteres Los caracteres únicos suelen almacenarse en un tipo de datos char char un entero de 1 byte chars pueden almacenarse como ints Se pueden tratar los caracteres como int o char 97 es la representación numérica de ‘a’ (ASCII) Usa comillas simples para obtener la representación numérica de un carácter cout << "El carácter (" << 'a' << ") tiene el valor " << static_cast< int > ( 'a' ) << endl; Imprime El carácter (a) tiene el valor 97
65 // Fig. 2.22: fig02_22.cpp // Cuenta de calificaciones indicadas por letras. #include
66 Líneas 30-31: No es necesario que vayan entre llaves// lazo hasta que el usuario escriba la secuencia fin-de-fichero while ( ( grade = cin.get() ) != EOF ) { 24 // determina qué nota se introdujo switch ( grade ) { // switch anidado en while 27 case 'A': // la nota es A case 'a': // o a aCont; // incrementa aCont break; // necesario para salir de switch 32 case 'B': // la nota es B case 'b': // o b bCont; // incrementa bCont break; // sale de switch 37 case 'C': // la nota es C case 'c': // o c cCont; // incrementa cCont break; // sale de switch 42 Líneas 28-29: Compara grade (un int) con las representaciones numéricas de A y a. Líneas 30-31: No es necesario que vayan entre llaves Línea 41: break causa la finalización de switch y el programa continúa en la primera sentencia después de la estructura switch. Si no ponemos break, se ejecuta el siguiente caso Línea 23: Las sentencias de asignación tienen un valor, que es el de la variable a la izquierda del =. El valor de esta sentencia es el devuelto por cin.get(). Esto puede usarse para inicializar múltiples variables: a = b = c = 0; cin.get() usa la notación punto (se explicará en el capítulo 6). Esta función lee un carácter del teclado (después de pulsar Enter), y lo asigna a grade. cin.get() devuelve EOF (fin-de-fichero) después de introducir el carácter EOF, para indicar el fin de los datos. EOF puede ser ctrl-d (UNIX) o ctrl-z (WINDOWS), dependiendo de tu SO.
67 Daos cuenta de la sentencia default, que recoge todos los demás casos.case 'D': // la nota es D case 'd': // o d dCont; // incrementa dCont break; // sale de switch 47 case 'F': // la nota es F case 'f': // o f fCont; // incrementa fCont break; // sale de switch 52 case '\n': // ignora cambios de línea, case '\t': // tabuladores, case ' ': // y espacios en la entrada break; // sale de switch 57 default: // recoge los demás caracteres cout << "Letra de calificación incorrecta." << " Introduzca una nueva calificación." << endl; break; // opcional; en cualquier caso se saldrá de switch 62 } // fin de switch 64 } // fin de while 66 Este test es necesario porque se pulsa Enter después de cada letra de nota. Esto añade un carácter de nueva línea que debe ser eliminado. Asimismo, queremos ignorar cualquier espacio en blanco. Daos cuenta de la sentencia default, que recoge todos los demás casos.
68 67 // Salida del resumen de resultadoscout << "\n\Los totales para cada calificación son:" << "\nA: " << aCont // número de notas A << "\nB: " << bCont // número de notas B << "\nC: " << cCont // número de notas C << "\nD: " << dCont // número de notas D << "\nF: " << fCont // número de notas F << endl; 75 return 0; // indica finalización correcta 77 78 } // fin de función main
69 Introduzca las calificaciones indicadas con letras.Teclee el carácter EOF para terminar la entrada de datos. a B c C A d f E Letra de calificación incorrecta. Introduzca una nueva calificación. D b ^Z Los totales para cada calificación son : A: 3 B: 2 C: 3 D: 2 F: 1
70 2.17 La Estructura de Repetición do/whileSimilar a la estructura while Prueba la condición de continuación del ciclo al final, no al principio El cuerpo del lazo se ejecuta al menos una vez Formato do { sentencias } while ( condición );
71 Notad el preincremento en el test de continuación de lazo.// Fig. 2.24: fig02_24.cpp // Uso de la estructura de repetición do/while. #include
72 2.18 Las Instrucciones break y continueSentencia break Salida inmediata de while, for, do/while, switch El programa continúa en la primera sentencia después de la estructura Usos comunes Salida antes de tiempo de un bucle Saltar el resto de una estructura switch
73 Sale de la estructura for cuando se ejecuta break.// Fig. 2.26: fig02_26.cpp // Uso de la instrucción break en una estructura for. #include
74 26 return 0; // indica terminación correcta 28 29 } // fin de función main Salida del ciclo con el valor de x en 5
75 2.18 Las Instrucciones break y continueInstrucción continue Usada en while, for, do/while Salta el resto del cuerpo del lazo Continúa con la siguiente iteración del ciclo Estructuras while y do/while Tras la ejecución de la instrucción continue, se evalúa de inmediato la prueba de continuación del ciclo Estructura for Se ejecuta la expresión de incremento A continuación, se evalúa la prueba de continuación del ciclo
76 Salta a la siguiente iteración del lazo.// Fig. 2.27: fig02_27.cpp // Uso de la instrucción continue en una estructura for. #include
77 26 27 } // fin de la función main Se utiliza continue para no imprimir el valor 5
78 Usados como condiciones en lazos y sentencias if && (Y lógico )2.19 Operadores Lógicos Usados como condiciones en lazos y sentencias if && (Y lógico ) verdadero si las dos condiciones son verdaderas == y >= tienen mayor precedencia que && if ( género == 1 && edad >= 65 ) ++mujeresMayores; Error: 3
79 ! (NO lógico, negación lógica)2.19 Operadores Lógicos ! (NO lógico, negación lógica) Devuelve verdadero cuando su condición es falsa, y viceversa ! tiene mayor precedencia que == paréntesis if ( !( nota == valorCentinela ) ) cout << "La siguiente nota es " << nota << endl; Alternativa: if ( nota != valorCentinela ) cout << "La siguiente nota es " << nota << endl; Orden de precedencia: ! && || Todos se asocian de izquierda a derecha
80 Tabla de precedencia de operadores y asociatividad2.19 Operadores Lógicos Tabla de precedencia de operadores y asociatividad Operadores Asociatividad Tipo ( ) Izquierda a derecha Paréntesis static_cast
81 2.20 Confusión de los Operadores de Igualdad (==) y Asignación (=)Error común No suelen producir errores de sintaxis Aspectos que causan el problema Cualquier expresión que produzca un valor puede servir en la parte de decisión de cualquier estructura de control Cero = falso, Distinto-de-cero = verdadero Las sentencias de asignación producen un valor (asignado a la variable de la izquierda del operador de asignación)
82 2.20 Confusión de los Operadores de Igualdad (==) y Asignación (=)Ejemplo if ( codigoPago == 4 ) cout << "¡Tienes una extra!" << endl; Si el código de pago es 4, se da una bonificación Si == es reemplazado por = if ( codigoPago = 4 ) cout << "¡Tienes una extra!" << endl; El codigoPago se fija en 4 (no importa el valor que tuviera antes) La sentencia es verdadera (pues 4 es distinto de cero) Se da la bonificación en cualquier caso
83 2.20 Confusión de los Operadores de Igualdad (==) y Asignación (=)Lvalues (valores izquierdos) Expresiones que pueden utilizarse del lado izquierdo de un operador de asignación Pueden ser modificados (variables) x = 4; Rvalues (valores derechos) Sólo aparecen al lado derecho de las asignaciones Constantes, como números (no se puede poner 4 = x;) Lvalues pueden usarse como rvalues, pero no viceversa
84 2.21 Resumen de la Programación EstructuradaProgramas más fáciles de entender, probar, depurar y modificar Resumen de estructuras de control de C++ Apilamiento Anidamiento
85 2.21 Resumen de la Programación EstructuradaReglas de la programación estructurada Sólo se usan estructuras de control de entrada única/salida única Reglas 1) Comienza por el “diagrama de flujo más sencillo” 2) Cualquier rectángulo (acción) puede reemplazarse con dos rectángulos (acciones) en secuencia 3) Cualquier rectángulo (acción) puede reemplazarse con cualquier estructura de control (secuencia, if, if/else, switch, while, do/while o for) 4) Las reglas 2 y 3 pueden aplicarse con la frecuencia que se desee y en cualquier orden
86 2.21 Resumen de la Programación EstructuradaRepresentación de la Regla 1: comienzo por una única acción Representación de la Regla 2 (Regla de apilamiento): reemplazar cualquier rectángulo con una secuencia de rectángulos
87 2.21 Resumen de la Programación EstructuradaRepresentación de la Regla 3 (Regla de Anidamiento): reemplazar cualquier rectángulo con una estructura de control
88 2.21 Resumen de la Programación EstructuradaCualquier programa C++ puede expresarse en términos de: Secuencia Selección if, if/else, o switch Cualquier selección puede reescribirse como una sentencia if Repetición while, do/while o for Cualquier estructura de repetición puede reescribirse como una sentencia while Combinadas de dos formas: Apilamiento Anidamiento