Soluciones Algor´ıtmicas

Anuncio
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
Descargar