Soluciones Algorı́tmicas Ofelia Cervantes y David Báez López January 10, 2013 2 Capı́tulo 3 Condiciones En la vida real, a menudo es conveniente tomar una decisión acerca de cuál es el siguiente paso a tomar dependiendo de la situación que se presenta. Por ejemplo, a dónde ir de vacaciones. Muchas veces la decisión se toma dependiendo de la cantidad de dinero con la que se cuenta. En otras ocasiones depende del clima apropiado para la actividad que deseamos realizar en las vacaciones. Y en otras ocasiones depende de la disponibilidad del transporte y si hay alojamiento disponible para todos los miembros del grupo que desea ir a vacacionar. Esta toma de decisiones que dependen de una o más condiciones también se presenta en el diseño de una aplicación. Este tipo de situaciones se cononocen como CONDICIONES y es el tema de este capı́tulo. 3.1. Condiciones Las condiciones surgen cuando se trata de efectuar una operación o cálculo dependiendo de SI se cumple una condición. Por ejemplo, en el cálculo de una división podemos decidir si la división no se efectúa si el divisor es igual a cero para evitar un mensaje de error y que la corrida se interrumpa. Otra situación se presenta cuando se quiere tomar la raı́z cuadrada de un número negativo. En este caso se checa SI la condición de que el radicando sea positivo se cumple para poder calcular la raı́z cuadrada y enviamos un mensaje SI el radicando es negativo indicando que no podemos efectuar la división. En pseudocódigo, una condición usa la palabra clave Si y tiene el siguiente formato: Si condición Entonces instrucciones; FinSi 3 4 CAPÍTULO 3. CONDICIONES La palabra clave Si antecede a la condición. La condición puede incluir una combinación de condiciones. Si las condiciones se cumplen, es decir, son VERDADERAS, Entonces se ejecutan las instrucciones y al terminar se continúa con la instrucción que sigue abajo de la instrucción FinSi. Ejemplo 2.1 Condición simple con Si. Si realizamos la división de dos números pero queremos checar que el divisor no sea cero podemos usarlo de la siguiente manera: Escribir ‘Ingrese a y b: ’; Leer a, b; Si b ∼= 0 Entonces c = a/b; Mostrar “La division es: ”, c; FinSi Notamos que en el caso de que se tenga b = 0 no se ejecuta ninguna acción. Otro caso cuando se presenta cuando simplemente se tiene una variable lógica en la condición. Por ejemplo, si checa es una variable lógica y deseamos ejecutar un conjunto de instrucciones cuando dicha variable es verdadera, podemos escribir simplemente: Lógica: checa; Leer a, b; Si checa Entonces c = a/b; Mostrar “La division es: ”, c; FinSi La condición se cumple si la variable lógica es verdadera y entonces efectuamos la instrucción que sigue que es c = a/b. 3.1.1. La condición Si - Si no En el ejemplo de la división podrı́a ser deseable tener una indicación de que la división no se pudo efectuar mediante un mensaje. Esto lo podemos lograr usando la foma de la condición Si Si no cuyo formato es Si condición Entonces instrucciones 1; Si no instrucciones 2; FinSi 3.1. CONDICIONES 5 se cumplen las condiciones se procede a ejecutar las instrucciones 2 y al terminarse se continúa con la instrucción que sigue al FinSi. Es posible tener varios Si no en un mismo Si. Ejemplo 2.2 División de dos números con Si-Si no El ejemplo 2.2 se puede mejorar si le agregamos un mensaje en caso de que no se pueda realizar la división porque el denominador sea igual a cero. La condición Si-Si no es ahora: Escribir ‘Ingrese a y b: ’; Leer a, b; Si b !=0 Entonces c = a/b; Mostrar “La división es: ”, c; Sino Mostrar: “La división no se puede realizar porque b = 0.”; FinSi Vemos que el algoritmo es más completo ya que le da más información al usuario en caso de que b = 0. Ejemplo 2.3 Intereses de una cuenta bancaria Un banco paga intereses a los depósitos dependiendo del saldo. Si el saldo es menor a $10,000.00 se paga un interés anual de 3 %, pero si es mayor a $10000.00 se paga un interés anual de 4 %. Escriba un algoritmo que reciba el saldo, calcule el interés correspondiente y muestre el saldo de la cuenta al final del primer año. Para realizar nuestro algoritmo usamos una condición Si-Si no para poder determinar el interés que se va a pagar al cuenta habiente y Mostrar su saldo final. Como sabemos, el interés que se paga se suma al saldo anterior multiplicando el saldo actual por (1 + interés) para obtener el saldo nuevo. El razonamiento serı́a de la siguiente manera: Primero se da el nombre del algoritmo. El segundo paso es iniciar el algoritmo. Recibir el saldo. Empezar la condición: • Si el saldo es menor a $10,000.00 calcular un interés de 3 %. Saldo ← Saldo = Saldo * (1 + 0.03); • Si el saldo es mayor a $10,000.00 calcular un interés de 4 %. Saldo ← Saldo = Saldo * (1 + 0.04); 6 CAPÍTULO 3. CONDICIONES Mostrar el saldo final. Un algoritmo es el siguiente: Nombre: Cálculo del saldo de una cuenta bancaria INICIO Variables: Saldo; Escribir: “Dame el saldo actual: ”; Leer: Saldo; // Empieza la condición. Si Saldo <10000.00 Entonces Saldo ← Saldo*(1 + 0.03); Si no Entonces Saldo ← Saldo*(1 + 0.04); Fin Si Mostrar: “El saldo final es: ”, Saldo; Fin 3.1.2. Condiciones anidadas Una condición es anidada si está dentro de otra condición. El formato de una condición anidada es: Este es el Si anidado Si condición A Entonces instrucciones 1; Si no Si condición B Entonces instrucciones 2; Si no instrucciones 3; FinSi FinSi Ejemplo 2.4 Depósitos con interés con Condición Anidada 3.1. CONDICIONES 7 Como ejemplo consideremos el Ejemplo 2.1 anterior pero ahora supongamos que si el saldo es mayor a un millón de pesos se le paga un interés de 6 %. El algoritmo, en la parte de la condición, es ahora de la siguiente manera: Si Saldo <10,000.00 Entonces Si no FinSi Saldo ← Saldo*(1 + 0.03); Si Saldo <100,000.00 Entonces Saldo ← Saldo*(1 Si no Saldo ← Saldo*(1 FinSi Aquı́ se sabe que el Saldo < un millón. + 0.04); Aquı́ se sabe que el Saldo > un millón. + 0.06); Un caso sencillo de anidamiento es cuando la condición anidada es simple. Esto es lo que se usa con más frecuencia. En dado caso se tiene el formato: Este es el Si anidado Si condición A Entonces instrucciones 1; Si no Si condición B Entonces instrucciones 2; FinSi FinSi Ejemplo 2.5 Calificaciones numéricas y alfabéticas Consideremos la asignación de una calificación alfabética a un rango dado de calificaciones numéricas de la siguiente manera: Si la calificación está en el rango de: 9.1 a 10 asignar la calificación A Excelente. 8.1 a 9.0 asignar la calificación B Muy bien. 7.5 a 8.0 asignar la calificación C Bien. Menos de 7.5 asignar la calificación R Reprobado. 8 CAPÍTULO 3. CONDICIONES El algoritmo para checar qué calificación se da debe checar primero si la calificación es mayor de 9.0. Si esto se cumple la calificación numérica correspondiente es A Excelente. Si la condición anterior no se cumple, entonces checamos si la calificación es mayor de 8.0. En esta parte ya no se puede tener una calificación mayor a 9.0 porque esto ya se descartó en la primera condición. Si ahora se cumple la condición se asigna la letra B Muy bien. La siguiente condición se ejecuta cuando la calificación es mayor o igual a 7.5 en cuyo caso se asigna C Bien. En caso de que no se cumpla ninguna de las condiciones anteriores se asigna R Reprobado. Usando una condición podemos codificarlo en pseudocódigo como: Si calificación > 9.1 Entonces Mostrar: “La calificación es A Excelente”; Si no Si calificación >8.0 Entonces Mostrar: “La calificación es B Muy bien.”; FinSi Si no Si calificación >= 7.5 Mostrar: “La calificación es C Bien.”; FinSi Si no Mostrar: “La calificación es R Reprobado.”; FinSi Vemos como se usa el Si no de manera repetida y se usan dos condiciones anidadas. Ejemplo 2.6 Condición con variables lógicas En este ejemplo usamos una variable lógica para la condición del Si. Supongamos que se necesita realizar un Si donde la condición de la variable lógica es verdadera o falsa. Lógica: a; Entero: B, c; .. . a = verdadero; Si a Entonces B = 3*c; 3.2. CONDICIONES EN C++ 9 Si no B = c + 1; FinSi; Vemos en este caso que no se pone ninguna condición sobre la variable lógica a y la condición se cumple solamente conque a sea verdadera. 3.2. Condiciones en C++ Las condiciones en C++ usan la palabra clave if. La condición simple tiene el formato siguiente: if (condición) { instrucciones 1;} Si la condición se cumple entonces se ejecutan las instrucciones 1. La condición puede incluir una o varias lı́neas de instrucciones. En este último caso el conjunto de instrucciones debe estar delimitado por llaves. Una buena costumbre es siempre delimitar por llaves aun cuando se trate de una lı́nea solamente. Las condiciones pueden ser comparar que dos variables sean iguales, una mayor o menor que la otra, o que sean distintas. Las variables pueden ser reales, flotantes, dobles, alfanuméricas o lógicas. Los operadores de relación para realizar las condiciones se muestran en la tabla 2.1 y los operadores lógicos se muestran en la Tabla 2.2. Cuadro 3.1: Operadores de relación. Definición Ejemplo Operador > Mayor que A >B Mayor que o igual a A >= B >= < Menor que C >4 Menor que o igual a X <= 8 <= == Igual a X == Z != Distinto a a != 8.2 Cuadro Operador && k ! 3.2: Operadores lógicos. Definición Ejemplo Y lógico (AND) A && B O lógico (OR) A kB No lógico (NOT) !X Ejemplo 2.6 Código en C++ del Ejemplo 2.1 10 CAPÍTULO 3. CONDICIONES Este ejemplo checa si el denominador de una división es distinto de cero. De ser ası́ efectúa la división. El código es: #include<iostream.h> int main( ) { float a, b, c; cout>> “Ingrese a y b”; cin <<a <<b; \\ Empieza la condición if (b != 0) { c = a/b; cout<<“El resultado de la division es: ”<< c<< “\n”; } } Para el ejemplo 2.2 tenemos que a la condición se le agrega el caso cuando b = 0. El código en C++ queda como: #include<iostream.h> int main( ) { float a, b, c; cout>> “Ingrese a y b”; cin <<a <<b; if (b != 0) { c = a/b; cout<<“El resultado de la division es: ”<< c<< “\n”; } else {cout<<“La division no se puede realizar. \n”;} } 3.2.1. Si anidado en C++ El Si anidado en C++ se forma por lo general usando el Si-Si no. El formato es: if (condición 1) { instrucciones 1} 3.2. CONDICIONES EN C++ 11 else if (condición 2) { instrucciones 2} else if (condición 3) { instrucciones 3} .. . else if (condición n) { instrucciones n} else { instrucciones n+1} [Instrucción siguiente ] Si la condición 1 se cumple, entonces, se ejecutan las instrucciones 1 y se prosigue con la instrucción que sigue después de las instrucciones n+1. Si la condición 1 no se cumple, entonces, se checa la condición 2 y si esta se cumple se ejecutan las instrucciones 2. La siguiente instrucción que se ejecuta es la que sigue después de las instrucciones n+1. Si la condición 2 no se cumple se checa si se cumple la condición 3, y ası́ continuamos. Si ninguna de las condiciones de la 1 a la n se cumple, entonces se ejecutan las instrucciones n+1 y al terminar se prosigue con la instrucción siguiente. Veamos como se codifica en C++ el ejemplo 2.3. Ejemplo 2.7 Calificaciones numéricas y literales En este ejemplo se usa un si anidado. Una simple codificación en C++ produce el siguiente código: #include<iostream.h> int main( ) { float Saldo; cout<<“Dame el saldo actual: \n”; cin >> Saldo; if (Saldo < 10000) {Saldo = Saldo*(1 + 0.03);} else {if (Saldo < 100000) Saldo = Saldo*(1 + 0.04); else {Saldo = Saldo*(1 + 0.06);} } Vemos que el if anidado tiene su condición que si se cumple se efectúa Saldo = Saldo*(1 + 0.04) ya que la cantidad es mayor de $10,000.00 pero menor de 12 CAPÍTULO 3. CONDICIONES $100,000.00. Pero si no se cumple entonces vamos al else que indica que la cantidad es mayor a un millón y el interés que se paga es de 6 %. El ejemplo 2.4 nos ilustra otro ejemplo de if anidado. Ejemplo 2.8 Calificaciones numéricas y literales La codificación en C++ del ejemplo 2.4 nos indica el uso de if anidados. Los if son simples en este ejemplo. Podemos ver que es de la siguiente manera: #include<iostream.h> int main( ) { float calificacion; cout<<“Dame una calificación: \n”; cin >> calificacion; if (calificacion >9.1) {cout <<“La calificacion es A Excelente.”;} else if (calificacion >8.1) {cout <<“La calificacion es B Muy bien.”;} else if (calificacion >= 7.5) {cout <<“La calificacion es C Bien.”;} else {cout <<“La calificacion es R Reprobado. Lo siento mucho.”;} } Ejemplo 2.9 Condición múltiple En ocasiones la condición consiste en dos o más condiciones que se deben satisfacer. 3.3. Casos Hay ocasiones en las que el uso de las condiciones anidadas hace muy difı́cil diseñar una aplicación. En esos casos contamos con una instrucción llamada casos que nos permite ejecutar distintas instrucciones dependiendo del valor de una condición o de un conjunto de condiciones. Algunas condiciones anidadas pueden expresarse de manera simplificada, pues trabajan sobre la misma variable. Los casos se aplican cuando las opciones a seguir, dependen de valores numéricos enteros o de variables alfanuméricas. Cuando una decisión se toma según diferentes valores de una expresión, por simplicidad puede expresarse como: Según expresión { Caso valor 1: {instrucciones en caso de que la expresión produzca valor 1} 3.3. CASOS 13 Caso valor 2: {instrucciones en caso de que la expresión produzca valor 2} .. . Caso valor n: {instrucciones en caso de que la expresión produzca valor n} default: {instrucciones en caso de que la expresión no produzca ninguno de los valores anteriores} } Notemos que valor 1 a valor n deben ser constantes (no pueden ser expresiones). La descripción anterior es válida siempre que la expresión sea un entero o un caracter alfanumérico. La manera en que funciona esta condición es la siguiente: Primero se checa el valor de la expresión. Dependiendo del valor de la condición la siguiente instrucción es la que corresponde al caso de ese valor. Después de ejecutar dichas instrucciones se sale de la instrucción y la siguiente condición es la que sigue a la llave que cierra la condición del Según-Caso. Un ejemplo nos muestra la manera en que trabaja la instrucción Segun-Caso. Ejemplo 2.10 Número del mes. Se desea realizar una aplicación que muestre el nombre del mes dado un número del 1 al 12. En este caso, realizar el algoritmo usando solamente Si anidados lo hace muy complicado de seguir. En cambio usando Según-Caso lo hace muy sencillo. Si la variable es número mes y es un entero entonces vemos que podemos tener: Según número mes Caso 1: Mostrar: “El mes es enero.”; Caso 2: Mostrar: “El mes es febrero.”; Caso 3: Mostrar: “El mes es marzo.”; Caso 4: Mostrar: “El mes es abril.”; Caso 5: Mostrar: ’“El mes es mayo.”; Caso 6: Mostrar: “El mes es junio.”; Caso 7: Mostrar: “El mes es julio.”; 14 CAPÍTULO 3. CONDICIONES Caso 8: Mostrar: “El mes es agosto.”; Caso 9: Mostrar: “El mes es septiembre.”; Caso 10: Mostrar: “El mes es octubre.”; Caso 11: Mostrar: “El mes es noviembre.”; default: Mostrar: “El mes es diciembre.”; Como se observa, el uso de una condición Según-Caso hace más claro el proceso de decisiones. Ejemplo 2.11 Números de un dado. Un dado tiene seis caras. Dado un número del 1 al 6, se desea mostrar el número que aparece en la cara opuesta del dado, recordando que: el lado opuesto del es 1 “seis” 2 “cinco” 3 “cuatro” 4 “tres” 5 “dos” 6 “uno” En este algoritmo se pueden usar condiciones anidadas pero es más fácil usar Según-Caso. El algoritmo queda como: Según dado Caso 1: Mostrar: “El lado opuesto es seis.”; Caso 2: Mostrar: “El lado opuesto es cinco.”; Caso 3: Mostrar: “El lado opuesto es cuatro.”; Caso 4: Mostrar: “El lado opuesto es tres.”; Caso 5: Mostrar: “El lado opuesto es dos.”; Caso 6: Mostrar: “El lado opuesto es uno.”; Default: Mostrar: “No se dió un número del 1 al 6.”; Notamos que el default incluye aquellos casos donde se da un número que no está en el dado. 3.3. CASOS 3.3.1. 15 Casos en C++ Los casos en C++ usan las palabras clave switch-case. El formato es switch(variable) { case 1: Instrucciones 1; break case 2: Instrucciones 2; break .. . case n: Instrucciones n; break default: Instrucciones D; } El ejemplo de la sección anterior lo podemos escribir en código C++ de la siguiente manera: switch (numero mes) { case 1: cout<<“El mes es enero.”; break; case 2: cout<<“El mes es febrero.”; break; .. . case 11: cout<<“El mes es noviembre.”; break; default: cout<<“El mes es diciembre.”; } El ejemplo 2.3 en código C++ queda como sigue: switch (dado) { case 1: cout<<“El break; case 2: cout<<“El break; case 3: cout<<“El break; case 4: cout<<“El break; case 5: cout<<“El lado opuesto es 6.”; lado opuesto es 5.”; lado opuesto es 4.”; lado opuesto es 3.”; lado opuesto es 2.”; 16 CAPÍTULO 3. CONDICIONES break; case 6: cout<<“El lado opuesto es 1.”; break; default: cout<<“No se dio un digito del 1 al 6.”; } 3.4. Ejemplos