You are on page 1of 25
CapituLo 4 Estructuras de seleccion: sentencias if y switch Contenido 4.1. Estructuras de control 4.2. Lasentencia if 43. Sentencia condicién doble if _else 44, Sentencias if_else anidadas 4.5. Sentencia de switch: condiciones multi- ples 4.6. Expresiones condicionales: el operador ?: 4.7. Evaluacion en cortocircuito de expresiones logicas Smee steerer aE 4.8. Puesta a punto de programas 4.9. Errores frecuentes de programacion RESUMEN EJERCICIOS PROBLEMAS EJERICIOS RESUELTOS PROBLEMAS RESUELTOS INTRODUCCION Los programas definidos hasta este punto se ejecutan de modo secuencial, es decir, una sentencia después de otra. La ejecuci6n comienza con la primera sentencia de la funci6n y prosigue hasta la Ultima sentencia, cada una de las cuales se ejecuta una sola vez. Esta forma de pro- ‘gramacion-es adecuada para resolver problemas senci- ilos. Sin embargo, para la resolucién de problemas de tipo general se necesita la capacidad de controlar cuales son las sentencias que se ejecutan y en qué momentos. Las estructuras 0 construcciones de control controlan la secuencia 0 flujo de ejecucién de las sentencias. Las es- tructuras de control se dividen en tres grandes categorias en funci6n del flujo de ejecucion: secuencia, seleccién y repeticion. Este capitulo considera las estructuras selectivas 0 condicionales —sentencias if y switch— que con- trolan si una sentencia o lista de sentencias se ejecu- tan en funcién del cumplimiento 0 no de una condi- cién. Para soportar estas construcciones, el estandar ANSI/ISO C++ soporta el tipo légico bool CONCEPTOS CLAVE Estructura de control, Estructura de control selectiva Sentencia break. Sentencia compuesta. © Sentencia enum, * Sentencia if, ‘* Sentencia switch. * Tipo de dato bool. 152 Programacién en C++. Algoritmos, estructura de datos y objetos 4.1. ESTRUCTURAS DE CONTROL Las estructuras de control controlan el flujo de ejecucién de un programa o funcién. Las estructuras de control permiten combinar instrucciones o sentencias individuales en una simple unidad légica con tun punto de entrada y un punto de salida, Las instrucciones 0 sentencias se organizan en tres tipos de estructuras de control que sirven para controlar el flujo de la ejecucién: secuencia, seleccién (decisidn) y repeticion. Hasta este momento s6lo se ha utilizado el flujo secuencial, Una sentencia compuesta es un conjunto de sentencias encerradas entre Haves ({ y }) que se utiliza para especificar un flujo secuencial sentencia,; sentencia,; sentencia,; El control fluye de la sentencia, a la sentencia:, y asi sucesivamente. Sin embargo, existen problemas que requieren etapas con dos o mas opciones o alternativas a elegir en funcién del valor de una condicién 0 expresién. 4.2. LA SENTENCIA IF En C++, la estructura de control de seleccién principal es una sentencia if. La sentencia if tiene dos alternativas 0 formatos posibles. El formato mas sencillo tiene la sintaxis siguiente: Acci6n se ejecuta sila expresién | gia es verdadera Expresién logica que determina ssila accion se ha de ejecutar La sentencia if funciona de la siguiente manera. Cuando se alcanza la sentencia if dentro de un programa, se evalia la expresién entre paréntesis que viene a continuacién de if. Si Expresién es ver- dadera, se ejecuta Acci dn; en caso contrario no se ejecula Acci6n (en su formato més simple, Accién es una sentencia simple, y en los restantes formatos, es una sentencia compuesta). En cualquier caso la ejecucién del programa continéa con la siguiente sentencia del programa. La Figura 4.1 muestra un diagrama de flujo que indica el flujo de ejecucién del programa. Estructuras de selecci6n: sentencias ify ewitch 153 1 2. if (condicion) sentencia Eewreaar > n >> d; if (mtd == 0) cout << n << "es divisible por" << d << endl; Ejecucion Introduzca dos enteros: 36 4 36 es divisible por 4 Este programa lee dos ntimeros enteros y comprueba cual es el valor del resto de la divisién n en- te d(n & a). Siel resto es cero, n es divisible por d. (En nuestro caso 36 es divisible por 4, ya que 36: 4=9y el resto es 0.) Ejemplo 4.2 Representar la superacion de un examen (Nota >= 5, Aprobado) Programacién en C++. Algoritmos, estructuras de datos y objetos | Lf (wota >= 5) cout << "Aprobado" << endl; Ejemplo 4.3 // programa demol if #include —/// E/S de C++ using namespace std; void main() { float numero; // obtener némero introducido por usuario cout << “Introduzca un ntimero positivo o negativo cin >> ndmero; // comparar nimero con cero if (mimero > 0) cout << numero << es mayor que cero” << endl; } La ejecucién de este programa produce Introduzca un nimero positive o negativo: 10.15 10.15 es mayor que cero Si en lugar de introducir un niimero positivo se introduce un niimero negativo, ;qué sucede? Nada, El programa es tan simple que s6lo puede comprobar si el ntimero es mayor que cero, // programa demo2 if #include using namespace std; void main() { float numero; // obtener numero introducido por usuario cout "introduzca un niimero positivo o negativo cin >> mimero; // comparar numero a cero if (numero > 0) cout << numero << "es mayor que cero" << endl; if (numero < 0) cout << numero << "es menor que cero" << endl; Estructuras de seleccién: sentencias isy ewiech 185 if (numero == 0) cout << numero << "es igual a cero" << endl; } Este programa menor que cero. Realmente, una tercera sentenci igual a cero. implemente afiade otra sentencia if que comprueba si el ntimero introducido es 4 se aflade también que, comprueba si el niimero es Ejercicio 4.1 Visualizar el valor absoluto de un nimero leido del teclado. // Programa de cdlculo del valor absoluto de la entrada #include #include using namespace std; int main() { cout << "Introduzca un nimero:" int valor; cin >> valor; if (Valor < 0) Valor = -valor; cout << Valor << "es positivo" << endl; return 0; 4.3. SENTENCIA: CONDICION DOBLE 1F-ELSE Un segundo formato de la sentencia if es la sentencia if-else. Ja siguiente sintaxis: te formato de la sentencia if tiene Tf (Bxpresién) Accién, else Accién, —? Expresion égica que Accion que se realiza ditermina la. accion | Sila expresion logica 2 eiecutar Accién se ejecuta os falsa Sila expresion logica @s vordadera En este formato Accién, y Accién, son individualmente o bien una tinica sentencia que termina en un Punto y coma (;) 0 un grupo de sentencias encerrado entre Haves. Cuando se ejecuta la sentencia if- else, se evilia Expresion. Si Expresién es verdadera, se ejecuta Accién, y en caso contrario se ejecuta Accién,. La Figura 4.2 muestra la semantica de la sentencia if-else. Exoresion verdadera : falsa [ aeoan Figura 4.2. Diagrama de flujo de la representacién de una sentencia if-else. 156 — Programacion en C++. Aigoritmos, estructuras de datos y objetos Ejemplos Lif (salario >= 100.000) salario_neto = salario — impuestos; else salario_neto = salario; Si salario es mayor que 100.000, se calcula el salario neto, resténdole los impuestos; en caso contrario (e1se), el salario neto es igual al salario (bruto). if (Nota >= 5) cout << "Aprobado” << endl; else cout << "Suspenso” << endl; Formatos 1.|4£ (expresion_16gica) 2. |if (expresién_1égica) sentencia sentencia, else sentencia, 3. |i (expresién_légica) sentencia 4.\if (expresién_légica) sentencial else sentencia, Si expresi6n logica es verdadera, se ejecuta sentencia o bien sentencia,, $i es falsa (si 1no, en caso contrario), se ejecuta sentencia, Ejemplos 1. if (x > 0.0) producto = producto * x; 2. if (x I= 0.0) producto = producto * x; | // se ejecuta la sentencia de asignacién cuando x no es igual a 0. // en este caso producto se multiplica por x y el nuevo valor se // guarda en producto reemplazando el valor antiguo. // si x es igual a 0, la multiplicacién no se ejecuta. Ejemplo 4.4 | | Prueba de, visibilidad (igual que 4.1, al que se ha afiadido la cldusula else) a void main() 4 int n, dz cout << "Introduzca dos enteros:"; 157 Estructuras de seleccién: sentencias i y swi cin >> n >> dy if (ntd == 0) cout << n << “es divisible por" << d << endl; else cout << n << "no es divisible por" << d << endl; Ejecucion Introduzca dos enteros 36 5 36 no es divisible por 5 Comentario 0, es falss 36 no es divisible por 5, ya que 36 dividido entre 5 produce un resto de 1 (n 8 se ejecuta la cléusula ese). Ejemplo 4.5 Calcular el mayor de dos nimeros leidos del teclado y visualizarto en pantalla. void main() t int x, y? cout << "Introduzca dos enteros:"; cin >> x >> y; if (x > y) cout << x << endl; else cout << y << endl; } Ejecucion Introduzca dos enteros: 17 54 54 Comentario Si x es mayor que y, la condicién es “verdadera” (true) y se evaliia a 1; en caso contrario 1a condicién es “falsa” (false) y se evaltia a 0. De este modo se imprime x cuando es ma- yor que y, como en el ejemplo de la ejecucién, 4.4. SENTENCIAS 1F-ELSE ANIDADAS Hasta este momento, las sentencias if implementan decisiones que implican una o dos altemativas. En esta seccidn se mostrar c6mo se puede utilizar la sentencia i£ para implementar decisiones que impli quen diferentes alternativas. Una sentencia if es anidada cuando la sentencia de la rama verdadera o la rama falsa es a su vez una sentencia if . Una sentencia if anidada se puede utilizar para implementar decisiones con varias alternativas © multi-alternativas. 158 — Programacién en C++. Algoritmos, estructuras de datos y objetos Sintaxis if (condicién,) sentencia, else if (condicién,) sentencia, else if (condicién,) sentencia, else sentencia, Ejemplo 4.6 // incrementar contadores de nimeros positivos, nimeros // negativos o ceros if (x > 0) num_pos = num pos + 1; else if (x < 0) num_neg = num_neg + 1; else num_ceros = num_ceros + 1; La sentencia if anidada tiene tres alternativas. Se incrementa una de las tres variables (num_pos, num_neg y num_ceros) en 1, dependiendo de que x sea mayor que cero, menor que cero 0 igual cero, respectivamente. Las cajas muestran la estructura légica de la sentencia i£ anidada; la segunda sentencia if es la accion o tarea falsa (a continuaciGn de else) de la primera sentencia if, La ejecucién de la sentencia if anidada se realiza como sigue: se comprueba la primera condicién (x > 0); sies verdadera, num_pos se incrementa en 1 y se salta el resto de la sentencia if. Sila pri- mera condicién es falsa, se comprueba la segunda condici6n (x < 0); si es verdadera num_neg se in- crementa en uno; en caso contrario se incrementa num_ceros en uno. Es importante considerar que la segunda condiciGn se comprucba sélo si la primera condicién es falsa. 4.4.1. Sangria en las sentencias if anidadas El formato multibifureacién se compone de una serie de sentencias if anidadas, que se pueden escri en cada Iinea una sentencia if. La sintasxis multibifurcacién anidada es Formato 1 if (expresién_légica,) sentencia, Estructuras de seleccién: sentencias iry switch 159 else if (expresién_légica.) else if (expresién_légica,) sentencia, else if (expresién_légica,) sentencia, else sentencia, Formato 2 if (expresién_légica,) sentencia, else if (expresidn_16gica,) sentencia, else if (expresién_légica,) sentencia, else if (expresién_légica,) sentencia, else sentencia, Ejemplos i ik dxe OF if (y > 0) z= sqrt(x) + sart(y); 2. if (x > 0) if (y > 0) 2 = sqrt(x) + sart(y); else cerr << "\n *** Imposible calcular 2" << endl; Ejemplo 4.7 // comparacién_if // ilustra las sentencias compuestas if-else #include using namespace std; void main() cout << " introduzca un numero positivo o negativo cin >> ndmero; // comparar niimero a cero if (numero > 0) { cout << numero << " es mayor que cero" << endl; 160 Programacién en C++. Algoritmos, estructuras de datos y objetos cout << "pruebe de nuevo introduzca un ntimero negativo" << endl; } else if (numero < 0) { cout << numero << " es menor que cero” << endl; cout << "pruebe de nuevo introduciendo un ntimero negativo" << endl; + else { cout << numero << " es igual a cero” << endl; cout <<" Zpor qué no introduce un nimero negativo? << endl; + + 4.4.2. Comparacion de sentencias if anidadas y secuen de sentencias if Los programadores tienen dos alternativas: (1) usar una secuencia de sentencias i£; (2) una tniea sen- tencia if anidada. Por ejemplo, la sentencia if del Ejemplo 4.6 se puede reescribir como la siguiente secuencia de sentencias if if (x > 0) num_pos = num_pos + 1; if (x < 0) num_neg = num_neg + 1; if ( x == 0) num_ceros = num_ceros + 1; Aunque la secuencia anterior es I6gicamente equivalente a la original, no es tan legible ni eficiente. Al contrario que la sentencia i anidada, la secuencia no muestra claramente cusil es la sentencia a eje- cutar para un valor determinado de x. Con respecto a la eficiencia, la sentencia if anidada se ejecuta mas ripidamente cuando x es positivo ya que la primera condiciGn (x > 0) es verdadera, lo que signi- fica que la parte de la sentencia i£ a continuacién del primer e1se se salta, En contraste, se comprue- ban siempre las tres condiciones en la secuencia de sentencias if. Si x es negativa, se comprueban dos condiciones en las sentencias if anidadas frente a las tres condiciones de las secuencias de senten- cias if. Una estructura tipica if-else anidada permitida es: if (nGmero > 0) ce Ad sag , else { cea eeee) { u } else Estructuras de seleccién: sentencias is y ewicch 161 if (// { nen ) > dt ) Ejercicio 4.2 Existen diferentes formas de escribir sentencias if anidadas. 1. if (a > 0) if (b> 0) +#a; else if (c > 0) if (a <5) +b; else if (b < 5) +4c; else else if (c <5) —b; else —c; else a = 0 2 if (a> 0) if (b> 0) +a; else if (c > 0) if (a <5) +4 // forma més legible else if (b <5) +e; else —a; else if (¢ <5) —b; else — else a= 0; 3. if (a > 0) if (b> 0) ta; else if (c > 0) if (a <5) ++b; else if (b < 5) +4c; else —a; else if (c < 5) else —c; else a=0 // forma més legible Ejercicio 4.3 Calcular el mayor de tres nimeros enteros. void main() { int a, b, c, mayor; cout << "Introduzca tres enteros cin >> a >> b >> c; 162 Programacién en C++. Algoritmos, estructuras de datos y objetos if (a> b) if (a > c) mayor = a; else mayor = c; else if (b> c) mayor = b; else mayor = ¢; cout << "El mayor es " << mayor << endl; Ejecucion Introduzea tres enteros: 77 54 85 El mayor es 85 Analisi Al ejecutar el primer if, la condicién (a > b) es verdadera, entonces se ejecuta la segunda if. En el segundo if la condicién (a > ¢) es falsa, en consecuencia el primer else y mayor = 85 y se termi- na la sentencia if y se ejecuta la tiltima linea y se visualiza BL mayor es 85. 4.5. SENTENCIA swrrcH: CONDICIONES MULTIPLES La sentencia switch es una sentencia C+ que se utiliza para seleccionar una de entre miiltiples alter nativas. La sentencia switch es especialmente ttil cuando la seleccién se basa en el valor de una varia- ble simple o de una expresin simple denominada expresién de control o selector. El valor de esta ex- presiGn puede ser de tipo int 0 char, pero no de tipo double Sintaxis switch (selector) 4 case etigueta, : sentencias,; break; case etigueta, : sentencias,; break; case etiqueta, : sentencias,; break; default: sentencias,; 7/ opcional , La expresién de control o selector se evalia y se compara con cada una de las etiquetas de case, La expresiGn selector debe ser un tipo ordinal (por ejemplo, int, char, bool pero no float 0 string). Cada etiqueta es un valor tinico, constante, y cada etiqueta debe tener un valor diferente de los otros. Si el valor de la expresién selector es igual a una de las etiquetas case —por ejemplo, eriqueta— entonces la ejecucién comenzard con la primera sentencia de la secuencia secuencia, y continuaré hasta que se encuentra una sentencia break (o hasta que se encuentra el final de la sentencia de control switch). Estructuras de seleccién: sentencias ity switch 163 El tipo de cada etiqueta debe ser el mismo que la expresin de selector. Las expresiones estén per- mitidas como etiquetas pero s6lo si cada operando de la expresidn es por si misma una constante —por ejemplo, 4 + 8 obienm * 15, siempre que m hubiera sido definido anteriormente como constante con nombre. el valor del selector no esté listado en ninguna etiqueta case, no se ejecutard ninguna de las op- ciones a menos que se especifique una accién por defecto (omisién). La omisién de una etiqueta de fault puede crear un error légico dificil de prever. Aunque la etiqueta default es opcional, se reco- mienda su uso a menos que se esté absolutamente seguro de que todos los valores de selector estén incluidos en las etiquetas case. Una sentencia break consta de la palabra reservada break seguida por un punto y coma, Cuando Ja computadora ejecuta las sentencias siguientes a una etiqueta case, continiia hasta que se alcanza una sentencia break. Si la computadora encuentra una sentencia break, termina la sentencia switch. Si se omiten las sentencias break, después de ejecutar el cédigo de case, a computadora ejecutard el cédigo que sigue a la siguiente case Ejemplo 1 switch (opcién) { case 0: cout << "Cero break; case 1 cout << "Uno!" << endl; break, case 2 cout << "Dos!" << endl; break; default: cout << "Fuera de rango" << endl; << endl; Ejemplo 2 switch (opcién) { case 0: case 1: case 2: cout << "Menor de 3"; break; case 3: cout << "Igual a 3"; break; default: cout << "Mayor que 3" Ejemplo 4.8 Comparacién de las sentencias i£-e1se-i£ y switch. 164 Programacién en C++. Algoritmos, estructuras de datos y objetos ‘Se necesita saber si un determinado caracter car es una vocal. Solucién con :f-c1se-ir if ((car ta’) || (car 'A')) cout << car << "es una vocal" << endl; else if ((car == ‘e') || (car == 'E')) cout << car << "es una vocal" << endl; else if ((car == 'i') || (car == 'I')) cout << car una vocal" << endl; else if ((car I] (car oh) cout << car una vocal" << endl; else if ((car I| (car == ‘v'y) cout << car una vocal" << endl; else cout << car << "no es una vocal" << endl; Solucion con swic switch (car) { case ‘a’: case case ‘e’: case case 'i': case 'I': case ‘0’: case '0': case 'u': case cout << car break; default cout << car << "no es una vocal" << endl; es una vocal" << endl; Ejemplo 4.9 // Programa de ilustracién de la sentencia switch #include using namespace std; int main() { char nota; cout << "Introduzca calificacién (A-H) y pulse Intro:"; cin >> nota; switch (nota) { case 'A': cout << "Excelente." << "Examen superado\n"; break; cout << "Notable."; cout << "Suficiencia\n’ break; cout << "Aprobado\n" break; case 'C Estructuras de seleccién: sentencias ify ew case 'D' case 'F': cout << "Suspendido\n"; break; default cout "no es posible esta nota"; , cout << "Final de programa" << endl; return 0; Cuando se ejecuta la sentencia switch, se evaltia nota; si el valor de la expresisn es igual al valor de una etiqueta, entonces se transfiere el flujo de control a las sentencias asociadas con la etiqueta co- rrespondiente. Si ninguna etiqueta coincide con el valor de nota se ejecuta la sentencia default y las sentencias que vienen detras de ella. Normalmente, la tiltima sentencia de las sentencias que vienen de: pués de una case es una sentencia break. Esta sentencia hace que el flujo de control del programa salte a la tiltima sentencia de switch. Si no existiera break, se ejecutarian también las sentencias res- tantes de la sentencia switch. Ejecucién de prueba 1 Introduzca calificacién (A-H) y pulse Intro: A Excelente. Examen superado Final de programa Ejecucién de prueba 2 Introduzca calificacién (A-H) y pulse Intro: B Notable. Suficiencia Final de programa Ejecucién de prueba 3 Introduzca calificacién (A-H) y pulse Intro: B No es posible esta nota Final de programa Precaucion Si se olvida break en una sentencia switch, el compilador no emitira un mensaje de error, ya que se habra escrito una sentencia switch correcta sintacticamente, pero no realizard las ta- reas previstas. Ejemplo 4.10 int tipo_vehiculo; cout << “Introduzca tipo de vehiculo cin >> tipo_vehiculo, peaje; 166 Programacién en C++. Algoritmos, estructuras de datos y objetos switch(tipo_vehiculo) « case 1: cout << "turismo"; peaje = 500; break; ———> Si se omite esta break, el vehiculo primero serd turismo y luego autobiis. case 2: cout << “autobis" peaje = 3000; break; case 3: cout << "motocicleta"; peaje = 300; break, "vehiculo no autorizado"; ‘Cuando la computadora comienza a ejecutar una sentencia case, no detiene su ejecucién hasta que se encuentra o bien una sentencia break o bien una sentencia switch. 4.5.1. Caso particular case Esti permitido tener varias expresiones case en una alternativa dada dentro de la sentencia switch. Por ejemplo, se puede escribir: switch(c) { case '0': case '1': case '2': case '3': case ‘4 case '5': case '6': case '7': case '8': case '9 num_digitos++; // se incrementa en 1 el valor de num _digitos break; case '': case '\t': case '\n': num_blancos++; // se incrementa en 1 el valor de num blancos break; default: num_distintos++; 4.5.2. Uso de sentencias switch en ments La sentencia if-else es més versatil que la sentencia switch y se puede utilizar unas sentencias if-else anidadas o multidecisin, en cualquier parte que se utiliza una sentencia case. Sin embargo, normalmente, la sentencia switch es mas clara. Por ejemplo, la sentencia switch es idénea para im- plementar mens. Un mend de un restaurante presenta una lista de alternativas para que un cliente elija entre sus dife- rentes opciones, Un ment en un programa de computadora hace la misma funcidn: presentar una lista de alternativas en Ia pantalla para que el usuario elija una de ellas. Estructuras de seleccién: sentencias iy swiech 167 4.6. EXPRESIONES CONDICIONALES: EL OPERADOR ?: Las sentencias de selecci6n (ify switch) consideradas hasta ahora son similares a las sentencias pre- vistas en otros lenguajes, tales como C y Pascal. Sin embargo, C++ ha heredado un tercer mecanismo de selecci6n de su lenguaje raiz C, una expresién que produce uno de dos valores, resultado de una ex- presi6n légica o booleana (también denominada condicién). Este mecanismo se denomina expresién condicional. Una expresi6n condicional tiene el formato C? A : B y es realmente una operacisn ter- naria (tres operandos) en el que C,A y B son los tres operandos y ? es el operador Sintaxis condicién ? expresién, : expresi6n, condicién es una expresién Iégica expresién,/expresién, son expresiones compatibles de tipos Se evalia condicién, si el valor de condicién es verdadera (distinto de cero) entonces se devuel- ve como resultado el valor de expresion,; si el valor de condicién es falsa (cero), se devuelve como resultado el valor de expresién,, Uno de los medios mis sencillos del operador condicional (2 ) es utilizar el operador condicional y Hamar a una de dos funciones, Ejemplos Ila == b ? funciéni() : funcién2(); es equivalente a la siguiente sentencia: if (a == b) funciénl(); else funcién2( 1.2 El operador 2: se utiliza en el siguiente segmento de c6digo para asignar el menor de dos valo- res de entrada asignados a Menor. int Entradal; int Entrada2; cin >> Entradal >> Entrada2; int Menor = Entradal <= Entrada2 ? Entradal : Entrada2 Ejemplo 4.11 #include using namespace std; void main() { float nl, n2; cout << "Introduzca dos nimeros positivos o negativos:"; cin >> nl >> n2; 168 Programacién en C++. Algoritmos, estructuras de datos y objetos //if-else cout << endl << "if-else"; if (nl > n2) cout << nl << else cout << nl << ">" << n2; >" << n2; // operador condicional cout << endl << condiciona: nl > n2 ? cout << nl << " : cout << nl <<" < >" << n2 "<< n2; 4,7. EVALUACION EN CORTOCIRCUITO DE EXPRESIONES LOGICAS Cuando se evaltian expresiones légicas en C+ se puede emplear una técnica denominada evaluacién en cortocircuito. Este tipo de evaluacién significa que se puede detener la evaluacién de una expresién légica tan pronto como su valor pueda ser determinado con absoluta certeza. Por ejemplo, si el valor % Iso, la expresidn légica (soltero == ‘'s') && (sexo “h') && de(soltero == 's') es 45) sera falsa con independencia de cual sea el valor de las otras condi (edad > 18) && (edad ciones. La raz6n es que una expresiGn l6gica del tipo falso && (...) debe ser siempre falsa, cuando uno de los operandos de la operacién AND es falso. En consecuencia, no hay necesidad de continuar la evaluacidn de las otras condiciones cuando (soltero == 's') se evaliia a falso. El compilador C+ utiliza este tipo de evaluacién, Es decir, 1a evaluacién de una expresién ldgica de la forma al 8& a2 se detiene si la subexpresién a1 de la izquierda se evaltia a falsa. C+ realiza evaluacisn en cortocircuito con los operadores && y | |, de modo que evaltia primero la expresin mas a la izquierda de las dos expresiones unidas por && 0 bien por | |. Si de esta evaluacién se deduce la informacién suficiente para determinar el valor final de la expresién (independiente del valor de la segunda expresién), el compilador de C++ no evaltia la segunda expresién Ejemplo Si x es negativo, la expresisn (>= 0) && (y > 1) se evalia en cortocircuito ya que x uso. En el caso del operador | | se produce una situacién similar. Si la primera de las dos expresiones unidas por el operador | | es verdadera, entonces la expresin completa es verdadera, con independen- cia de que el valor de Ia segunda expresin sea verdadero o falso. La raz6n es que el operador | | OR produce resultado verdadero si el primer operando es verdadero. Otros lenguajes, distintos de C++, utilizan evaluacién completa. En evaluacién completa, cuando dos expresiones se unen por un simbolo 6 0 | |, Se evaltian siempre ambas expresiones y, a continuaci6n, se utilizan las tablas de verdad de &6 0 bien | | para obtener el valor de la expresién final. = 0 serd falso y, por tanto, el valor final de la expresién seré Ejemplo Si x es cero, la condicién if ((x 1= 0.0) && (y/x > 7.5)) Estructuras de selecci6n: sentencias ity switch 169 es falsa ya que (x != 0.0) es falsa. Por consiguiente, no hay necesidad de evaluar la expresi6n (y / x > 7.0) cuando x sea cero. Sin embargo, si altera el orden de las expresiones, al evaluar el com- pilador la sentencia if if ((y / x > 7.5) && (x se produciria un error en tiempo de ejecucién de divisién por cero («division by zero»). El orden de las experiencias con operadores && y | | puede ser critico en determinadas situa- ciones. 4.8. PUESTA A PUNTO DE PROGRAMAS Estilo y disento 1. Elestilo de escritura de una sentencia if ¢ if-else es el sangrado de las diferentes lineas en el formato siguiente: if (expresién_légica) sentencia, else sentencia, if (expresién_légica) { sentencia, sentencia, , else { sentencia,.; sentencia, + En el caso de sentencias if-else-if utilizadas para implementar una estructura de selec- cin multialternativa se suele escribir de la siguiente forma: if (expresién_légica,) sentencia, else if (expresién_l6gica,) sentencia, 170 Programacién en C++. Algoritmos, estructuras de datos y objetos else if (expresicn_légica,) sentencia, else sentencia,., 2. Una construccién de seleccién miltiple se puede implementar mas eficientemente con una es- tructura if-else-if que con una secuencia de sentencias independientes if. Por ejemplo, cout <. Introduzea not. cin >> nota if (nota <0 || nota > 100) { cout << nota << " no es una nota valida.\n"; return'?' , if (nota >= 90( && (nota <= 100) return 'A'; if (nota >= 80) && (nota < 90) return 'B'; if (nota >=70) && (nota < 80) return 'C'; if (nota >= 60) && (nota < 70) return 'D'; if (nota < 60) return 'F'; Con independencia del valor de nota se ejecutan todas las sentencias i; 5 de las expresiones légi- cas son expresiones compuestas, de modo que se ejecutan 16 operaciones con independencia de la nota introducida, En contraste, las sentencias if anidadas reducen considerablemente el niimero de operacio- nes a realizar (3 a 7), todas las expresiones son simples y no se evaltian todas ellas siempre. cout << "Introduzca nota cin >> nota if (nota <0 || nota > 100) { cout << nota << " no es una nota valida. \n" return '? } else if (nota >= 90) return 'A'; else if (nota >= 80) return 'B'; else if (nota >= 70) return 'C else if (nota >= 60) return 'D'; else return 'F* 4.9, ERRORES FRECUENTES DE PROGRAMACION 1. Uno de los errores mas comunes en una sentencia if es utilizar un operador de asignacion (-) en lugar de un operador de igualdad (=). Estructuras de seleccién: sentencias 2. Enuna sentencia i anidada, cada claisula e1se se corresponde con la it precedente més cer- cana. Por ejemplo, en el segmento de programa siguiente. if (a > 0) if (10 > 0) c=a+b; else c =a + abs(b); d a*b* cj {Cual es la sentencia if asociada a else? EI sistema més ffcil para evitar errores es el sangrado o indentacién, con lo que ya se apre- cia que la cléusula else se corresponde a la sentencia que contiene condicién b > 0 if (a> 0) if (b> 0) c=at+b; else c =a + abs(b); d=a*b*c; 3. Las comparaciones con operadores == de cantidades algebraicamente iguales pueden producir una expresién légica falsa, debido a que la mayoria de los nimeros reales no se almacenan exactamente. Por ejemplo, aunque las expresiones reales siguientes son equivalentes: son algebraicamente iguales, la expresién a* (1 / a) == 1.0 puede ser falsa debido a que a es real. 4. Cuando en una sentencia switch o en un bloque de sentencias falsas una de las Ilaves ({, }) pis. s Gparece un mensaje de error tal como: Error ...: Cumpound statement missing } in function Si no se tiene cuidado con la presentacién de la escritura del cédigo, puede ser muy dificil localizar la Have que falta, 5. El selector de una sentencia switch debe ser de tipo entero 0 compatible entero. Asi, las cons- tantes reales 2.4, -4.5, 3.1416 no pueden ser utilizadas en el selector. 6 Cuando se utiliza una sentencia switch, asegiirese que el selector de switch y las etiquetas case son del mismo tipo (int, char 0 bool pero no £1oat). Si el selector se evaliia aun valor no listado en ninguna de las etiquetas case, la sentencia switch no gestionard ninguna accion; por esta causa se suele poner una etiqueta default para resolver este problema. 172 Programacién en C++. Algoritmos, estructuras de datos y objetos RESUMEN Sentencia if Una alternativa if (a t= 0) resultado = a/b; Dos alternativas Lf (a >= 0) cout << a << " es positive” << endl; else cout << a << " es negativo" << endl; He tedee eel en eee | Sentencia switch Miiltiples alt in ales aon switch (sig car) { if (x <0) case ‘A's case’a’: { cout << "Sobresaliente" << endl; cout << "Negativo" < endl; break; abs_x = -x; case ‘B's case 'b': + cout << “Notable” << endl; else if (x == 0) break { case ‘C's case ‘c's cout << "Cero" << endl; cout << "Aprobado” << endl; abs_x = 0; break; } case 'D': case ‘d's else cout << "Suspenso” << end { break; cout << “Positive” << endl; default abs_x = x; cout << "nota no valida” << endl; } // fin de switch EJERCICIOS 4.1. ,Qué valor se asigna a consumo en la sentencia if Siguiente si velocidad es 120? if (velocidad > 80) consumo = 10.00; else if (velocidad > 100) consumo = 12.00; else if (velocidad > 120) consumo = 15.00; 4.2. Explique las diferencias entre las sentencias de la columna de ta izquierda y de la columna de la derecha, Para cada una de ellas deducir el valor final de x si el valor inicial de x es 0. if (x >= 0) if (x >= 0) x = xt; x= xt]; else if (x >= 1); if (x >= 1) x = 42; x = xt2; 4.3. {Que salida producird el siguiente c6digo cuando Se inserta en un programa completo? int x = 2; cout << "Arranque\n"; frites 2) if (x t= 0) cout << "Hola desde el segundo if.\n"; else cout << cout << "Fin\n’ cout << "Arranque de nuevo\n"; if (x > 3) if (x t= 0) cout << "Hola desde el segundo if.\n"; else cout << "Hola desde el else.\n"; cout << "De nuevo fin\n"; lola desde el else.\n"; 44, 47. 48. {Qué hay de incorrecto en el siguiente eédigo? if (x = 0) cout << x << * = O\n"; else cout << x <<" != 0\n"; {Cuil es el error del siguiente cédigo? if (x > ony else cout << "conforne. << endl; Escribir una sentencia if-then-else que clasifique un entero x en una de las siguientes categorias y escriba un mensaje adecuado: © obien 0 100 Se trata de escribir un programa que clasifique enteros lefdos del teclado de acuerdo a los si- guientes puntos: 1, Si es 30 0 mayor, o negativo, visualizar un mensaje en ese sentido; en caso contrario, si es un nuevo primo, potencia de 2, 0 tun niimero compuesto, visualizar el mensaje co- srespondiente; si son cero 0 1, visualizar ‘cero’ 0 ‘unidad’, PROBLEMAS 4. Un archivo contiene dos fechas en el formato dia (131), mes (1 a 12) y aiio (entero de cuatro di- gitos), correspondientes a la fecha de nacimiento y la fecha actual, respectivamente. Escribir un programa que calcule y visualice la edad del indi- viduo. Si es la fecha de un bebé (menos de un afio de edad), la edad se debe dar en meses y dias; en caso contrario, la edad se calcularé en afios. Estructuras de selecci6n: sentencias 49. 4.10. 4d 4.12, 42. 173 Y switch Escribir un programa que determine el mayor de tres mimeros, El domingo de Pascua es el primer domingo des- pues de la primera luna lena posterior al equi- noccio de primavera, y se determina mediante el siguiente céculo sencillo: afio mod 19 io mod 4 aflo mod 7 (19 * A+ 24) mod 30 (24 B+4*C4+6"D+5) mod zum oooe (22+ D+ 2) Donde N indica el némero de dia del mes de mar- 0 (si N es igual 0 menor que 3) 0 abril (si es mayor que 31). Construir un programa que deter- mine fechas de domingos de Pascua. Codificar un programa que escriba la calificacién correspondiente a una nota, de acuerdo con el siguiente criterio: 0 25.0 cout << "Fin\n"; oe cout << "Arranque de nuevo\n"; else if (x > 3) yr Af (x 1= 0) cout << "Hola desde el 4.2. {Qué valor se asigna a consumo en la sentencia segundo if.\n"; 4 siguiente si velocidad es 120? else Af (velocidad > 80) ‘consumo = 10.00; else if (velocidad > 100) consumo = 12.00; cout << "Hola desde el else.\n"; cout << "De nuevo fin\n"; eds, 4.8, Eseribir una sentencia s#-e186 que visualice la - ee t palabra nita si el valor de la variable nota es ee. ie mayor que 100 y Baja si el valor de esa nota es A . 100 43. Qué salida producird el cddigo siguiente, cuan- Syiey Sas do se inserta en un programa completo? 4.6, ;Cudl es la salida de este segmento de pro- int primera opcion = 1; rama? switch (primera_opcion + 1) eee ‘ case 1: cout << x << endl; cout << "Cordero asado\n"; ‘ break; cout << x << endl; 2s int x = 2; cout << "Chuleta lechal\n” cout << x << endl; break; { 3: cout << x << endl; cout << “Chuletén\n"; int x = 3; ae cout << x << endl; cout << "Postre de pastel\n"; + break; cout << x << end default: > pees ne 4.7. Escribir una sentencia if-e1se que clasifique 44, } Qué salida produciré el siguiente cédigo, cuan- do se inserta en un programa completo? int x= 2; 48. cout << "Arrangue\n"; if (x <= 3) if (x I= 0) cout << "Hola desde el segundo if.\n"; x <0 obien 0 100 Escribir un programa que determine si un ao es bisiesto. Un afo es bisiesto si es miltiplo de 4 (por ejemplo 1984). Sin embargo, los afios miil- tiplos de 100 sélo son bisiestos cuando a la vez son miltiplos de 400 (por ejemplo, 1800 no es bisiesto, mientras que 2000 si lo es). PROPLEMAS RESUELTOS EN: Estructuras de seleccién: sentencias ify switch 175 1. Schaum (McGraw-Hill) de Joyanes, L. y Sanchez, L. Programacién en C++ (andlisis y cédigo fuente, pag. 69). | 2 Sitio web del libro, www. mie. es/joyanes (cédigo fuente). 41. Escribir un programa que introduzca el mimero 4.4. Escribir un programa que lea dos mimeros ente- de un mes (1 a 12) y el ako y visualice el mimero ros y visualice el menor de los dos. de dias de ese mes. 45. Escribir y comprobar un programa que resuelva 4.2. Cuatro enteros entre 0 y 100 representan las pun- la ecuacién cuadritica (ax* + bx + ¢ = 0). tuaciones de un estudiante de un curso de infor- mdtica. Escribir un programa para encontrar la 446 Escribir un programa que lea tres enteros y emi- ‘media de estas puntuaciones y visualizar una ta- 1a un mensaje que indique si estan 0 no en orden bla de notas de acuerdo al siguiente cuadro: numérico. 3 4.7. Escribir un programa que lea los valores de tres Media Puntuacién lados posibles de un tridéngulo a, by c, y calcule Shahn ie en el caso de que formen un tridngulo su drea y Een su perimetro, sabiendo que su drea viene dada [80-90) B por la siguiente expresion: [70-80) c (60-70) D Area = \p (p—a\ip — bp — 0) [0-60) E : donde p es el semiperimetro del tridngulo p = =(atb+el 4.3. Se desea calcular el salario neto semanal de los : - tabgladores dena empresa de acuerdo'a las” “4\g, Escribir y ejecitar-un programa que simile un siguientes normas: calculador simple. Lee dos enteros y un cardcter. Horas semanales trabajadas < = 38, a una tasa Siel carécter es un +, se visualiza la suma; si es dada, un, se visualiza la diferencia; si es un *, se vi- Horas extras (38 0 més), a una tasa 50 por 100 sualiza el producto; si es un /, se visualiza el superior a la ordinaria, cociente; y si es un % se imprime el resto. Impuestos 0 por 100, si el salario bruto es menor 4.9. Escribir un programa que calcule los dngulos © igual a 300 euros. Impuestos 10 por 100, si el salario bruto es ma- yor de 300 euros. agudos de un tridngulo rectdngulo a partir de las longitudes de los catetos.

You might also like