martes, 10 de enero de 2017

ESTRUCTURAS DE CONTROL

CAPITULO 4         ESTRUCTURAS DE CONTROL 






En nuestra vida cotidiana, todos tenemos una lógica a seguir, continuamente
tomamos decisiones, y estas decisiones repercuten en nuestra acción siguiente. Por
ejemplo, supongamos el caso de un estudiante de nivel preparatoria que cursa el
sexto semestre, él está pensando en presentar el examen para la universidad, sin
embargo, sus calificaciones no le han dado mucho aliento últimamente, y está en
riesgo de tener que repetir ese semestre, si ocurre eso, el resultado que tenga en el
examen no importará. Lo que valla a pasar marcará el camino a seguir en su vida.
Analicemos de una forma general este caso:
curso el sexto semestre
presento el examen de admisión
si paso el examen y además paso el semestre
estaré en la universidad
si paso el semestre pero no paso el examen
estaré trabajando
si no paso el semestre
curso el sexto semestre (es decir, regresa al principio)
Estas son las opciones que él se plantea, aunque algunos pensarán en otras más.
Puede estudiar, trabajar o repetir todos los pasos anteriores.
En la programación también se tienen que tomar decisiones que influirán en el
comportamiento del programa, y también se pueden repetir series de pasos hasta
obtener un resultado. En el presente capítulo aprenderemos eso.
41
if
Se trata de una estructura de selección. Es decir que si se cumple el condicional se
ejecutarán varias instrucciones más. En el ejemplo anterior, observamos que :
si paso el examen y además paso el semestre
estaré en la universidad
“si” podemos interpretarlo como el if de código c++
“paso el examen y además paso el semestre” es la condición
“estaré en la universidad” es la acción a ejecutar.
Escribamos el código:
#include <iostream.h>
int main(){
char examen[2],semestre[2];
     cout<<"Contesta si o no a las preguntas"<<endl;
     cout<<"Pasaste el examen?"<<endl;
 cin.get(examen,2);
 cin.ignore(20,'\n');
 cout<<"Pasaste el semestre?"<<endl;
     cin.get(semestre,2);
 cin.ignore(20,'\n');           //ignora el enter
     if((examen[0]=='s')&&(semestre[0]=='s')){
          cout<<"estas en la universidad"<<endl;
     }
     cout<<"fin del programa"<<endl;
     cin.get();     //espera a que oprimas enter
     return 0;
}
Analicemos lo que nos importa, la sentencia if.
42
La condición a cumplir es: (examen[0]= =’s’)&&(semestre[0]= =’s’), en realidad se
trata de dos condiciones que se deben de cumplir: que la variable examen tenga el
carácter ‘s’ y que la variable semestre tenga el carácter ‘s’ (vease la tabla 7
operadores relacionales y de igualdad). Si la primera condición se cumple, entonces
comprueba la segunda condición (gracias a la conjunción lógica &&).
Un condicional regresa 1 en caso de ser verdadero y un 0 en caso de ser falso, esto
dos valores, en c++ están definidos como tipos de datos booleanos, true y false
respectivamente, así que si el condicional resulta true (verdadero), se evalúa la
siguiente instrucción dentro del bloque if, en caso contrario no hace nada.
En el ejemplo anterior el bloque de instrucciones a ejecutar en caso de ser verdadera
la condición se encuentra dentro de llaves, pero no es necesario cuando sólo se trata
de una sola línea de código.
Cuando queremos, además controlar las opciones en caso de que la condición
resulte falsa, tenemos que incluir aquellas instrucciones en un bloque else.
Por ejemplo, en el código anterior podemos añadir un else a la sentencia if, de
manera que nos quede de la siguiente forma:
if((examen[0]=='s')&&(semestre[0]=='s')){
          cout<<"estas en la universidad"<<endl;
}
else{
          cout<<"no estas en la universidad"<<endl;
}
Igualmente el bloque de instrucciones a ejecutar se estructura dentro de llaves,
aunque tampoco es necesario cuando se trata de una sola instrucción.
43
En ocasiones necesitaremos construir bloques de instrucciones if y else más
complejos, es decir anidamientos. El ejemplo del estudiante también nos ayudará a
visualizar este concepto.
si paso el examen y además paso el semestre
estaré en la universidad
si paso el semestre pero no paso el examen
estaré trabajando
si no paso el semestre
curso el sexto semestre
Construyendo mejor esta serie de decisiones, podemos acomodarla de la siguiente
forma, al estilo seudocódigo.
if paso el examen y además paso el semestre
estaré en la universidad
else
if paso el semestre pero no paso el examen
estaré trabajando
else
curso el sexto semestre
De esta manera controlamos las posibles respuestas que pudiese dar. En caso de
que pase el examen y el semestre estará en la universidad, si pasa el semestre pero
no pasa el examen estará trabajando, y en cualquier otro caso, cursará el semestre.
Nuestro código ya terminado quedará de la siguiente manera:
44
#include <iostream.h>
int main(){
char examen[2],semestre[2];
     cout<<"Contesta si o no a las preguntas"<<endl;
     cout<<"Pasaste el examen?"<<endl;
 cin.get(examen,2);
 cin.ignore(20,'\n');
 cout<<"Pasaste el semestre?"<<endl;
     cin.get(semestre,2);
 cin.ignore(20,'\n');           //ignora el enter
     if((examen[0]=='s')&&(semestre[0]=='s'))
          cout<<"estas en la universidad"<<endl;
     else
          if((examen[0]=='n')&&(semestre[0]=='s'))
               cout<<"estaras trabajando"<<endl;
     else
          cout<<"cursa el sexto semestre"<<endl;       
     cout<<"fin del programa"<<endl;
     cin.get();     //espera a que oprimas enter
     return 0;
}
En esta ocasión se eliminaron las llaves que no eran necesarias.
? :
Este se trata de un operador del tipo condicional al estilo if/else. Se utiliza para
condicionales cortos (de una sola línea).
Por ejemplo:
45
#include <iostream.h>
int main(){
    int calificacion;
    cout<<"Cual fue tu calificacion del semestre?"<<endl;
    cin>>calificacion;
    cout<<(calificacion>=6 ? "pasaste" : "reprobaste");
    cin.ignore();
    cin.get();
    return 0;
}
La forma de este operador es la siguiente:
condición ? acción a ejecutar en caso verdadero : acción a ejecutar en caso falso ;
La condición es: calificación>=6. En caso de ser verdadera se enviará “pasaste”
como argumento a la instrucción cout, en caso contrario se enviará reprobaste.
switch …
Muchas veces nos metemos en aprietos cuando necesitamos tener el control sobre
muchas opciones que pudiese tomar el usuario, porque resulta muy complicado
pensar en varios if/else anidados, para esos casos tenemos otra herramienta muy
cómoda, la estructura de selección múltiple switch.
La forma general es:
switch (parámetro a evaluar o comparar){
case a : //cuando el parámetro tiene un valor a
Acciones a ejecutar;
case b: //cuando el parámetro tiene un valor b
Acciones a ejecutar
.
46
.
.
caso por default;
}
#include <iostream.h>
int main(){
    int opcion;
    cout<<"Menu de opciones"<<endl;
    cout<<"1.­ Opcion 1"<<endl;
    cout<<"2.­ Opcion 2"<<endl;
    cout<<"3.­ Opcion 3"<<endl;
    cout<<"elige una opcion"<<endl;
    cin>>opcion;
    switch(opcion){
         case 1:
              cout<<"ejecucion 1"<<endl;
              break;
         case 2:
              cout<<"ejecucion 2"<<endl;
              break;
         case 3:
              cout<<"ejecucion 3"<<endl;
              break;
         default:
                 cout<<"es una opcion no valida"<<endl;
                 break;
    }
    cout<<"presiona enter para salir"<<endl;
    cin.ignore();
    cin.get();
    return 0;
}
Notemos que “opcion” es una variable de tipo entero, asi que case 1 , se refiere a
que la variable “opcion” tiene un valor de 1. Si se tratase de una variable de tipo
carácter, entonces debería de escribirse case ‘1’.
47
Encontramos una nueva instrucción, break. Esta se encarga de alterar el flujo de
control. Cuando se encuentra un break, inmediatamente se salta el resto de la
estructura. No es exclusiva de la estructura switch, también se puede colocar en
bloques if, for, while o do while (que se verán a continuación). Sin embargo
es mejor no depender demasiado del break.
while
La sentencia de control while se encarga de repetir un bloque de código mientras
se cumpla una condición. El bloque de código se debe de encontrar entre llaves,
excepto si es una sola línea.
La forma general de esta instrucción es la siguiente:
while (condición a cumplir) {
acciones a ejecutar;
}
Un ejemplo de éste lo podemos ver en el cálculo del promedio de 10 números,
pensemos que son las calificaciones del semestre. Mirando rápidamente la forma de
estructurar nuestro programa (algo que se debe de hacer siempre, y antes de
sentarse frente a nuestro ordenador), podemos pensar en la siguiente solución:
Declarar variables e inicializarlas
Mientras (no se hagan 10 iteraciones){
Leer una calificación
Sumarla al total
Determinar que se ha hecho una iteración
}
48
calcular el promedio
mostrar el promedio
El programa queda como sigue:
#include <iostream.h>
int main(){
    int calificacion, suma=0, iteracion=1;
    float promedio;
    while(iteracion<=10){
          cout<<"teclea tu calificacion "<<iteracion<<endl;
          cin>>calificacion;
          suma+=calificacion;
          ++iteracion;
    }
    promedio=(float)suma/(iteracion­1);
    cout<<"el promedio de calificaciones es: "
        <<promedio<<endl;
    cin.ignore();
    cin.get();
    return 0;
}
El programa es sencillo, quizá una parte que pudiese causar dudas es el cálculo del
promedio. Lo que sucede es que se realiza un cast para convertir temporalmente la
variable suma de int a float, así se hará la división y se tendrá un resultado
decimal cuando sea necesario.
Hasta aquí nuestro programa va bien, pero puede mejorar, podemos tener un mejor
control del programa y hacer que el usuario decida cuantas calificaciones va a
introducir. Podemos hacer que el usuario simplemente teclee un “-1” cuando acabe
de escribir sus calificaciones, así, en lugar de comparar el número de iteraciones,
comprobará si la calificación es igual a “-1” para salirse.
Aquí el programa:
49
#include <iostream.h>
int main(){
    int calificacion=0, suma=0, iteracion=0;
    float promedio=0;
    while(calificacion!=­1){
          ++iteracion;
          suma+=calificacion;
          cout<<"teclea tu califiaccion "<<iteracion<<endl;
          cin>>calificacion;
    }
    promedio=(float)suma/(iteracion­1);
    cout<<"el promedio de calificaciones es: "
        <<promedio<<endl;
    cin.ignore();
    cin.get();
    return 0;
}
Podemos ver como cambiando unas instrucciones de lugar y un valor obtenemos un
mejor resultado.
La variable “iteracion” la inicializamos con un valor de 0, al inicio del bucle le
aumentamos una unidad, luego a “suma” le añadimos la calificación que en este
caso aún es 0, luego pide y lee la calificación tecleada.
Al siguiente ciclo comprueba si se escribió “-1”, si no entonces aumenta el contador
“iteracion”, suma la calificación introducida, por ejemplo un 8, y pide la siguiente, el
usuario teclea, de nuevo, 8.
Hace de nuevo una comprobación y entra de nuevo al ciclo, aumenta el valor de
“iteracion” a hora tiene un 3, “suma” ahora vale 8 que era lo que tenía antes más el 8
recientemente leído, es decir 16, pide la siguiente calificación, y teclea la persona
“-1”.
50
Otra comprobación da como resultado un falso (por que se escribió -1) y por lo tanto
no entra al ciclo, entonces calcula el promedio, donde notemos que a “iteracion” se le
resta uno para tener el verdadero número de calificaciones introducidas. Por último
presenta el resultado.
Hay otras formas de hacer este programa, por ejemplo cuando no esta inicializada la
variable de calificaciones o iteraciones, y necesitamos que ese ciclo se ejecute por lo
menos una vez. En este caso podemos usar algo muy parecido, se trata de la
sentencia do while.
do while
Cuando necesitamos que un ciclo se ejecute por lo menos una vez, es necesaria
esta sentencia.
La forma general es:
do{
Acciones a ejecutar;
}
while(condicion a cumplir);
Pongamos como ejemplo el mismo de la estructura switch, el menú de opciones.
Necesitamos que por lo menos una vez lea la opción que elige, y en caso de que
elija una no disponible, en lugar de aparecer el mensaje “es una opción no válida” y
termine el programa, espere a que el usuario escoja una de la lista.
El programa de ejemplo:
51
#include <iostream.h>
int main(){
    int opcion;
    do{
        cout<<"elije una opcion de la lista"<<endl;
        cout<<"1.­opcion 1"<<endl;
        cout<<"2.­opcion 2"<<endl;
        cout<<"3.­opcion 3"<<endl;
        cin>>opcion;
    }while((opcion<1)||(opcion>3));
    cout<<"esta opcion si fue valida"<<endl;
    cin.ignore();
    cin.get();
    return 0;
}
Nunca debemos olvidar el punto y coma después del while. Usada en combinación
con el bloque switch, podemos tener muy buenos resultados y encontrar varias
aplicaciones de ellos.
for
El ciclo for es al que más se recurre cuando se requiere realizar operaciones
secuenciales, en donde se conoce el número de iteraciones o la condición a
comprobar.
La forma general de esta sentencia es:
for(asignación inicial ; condición ; instrucción ) {
bloque de instrucciones;
}
52
Si se trata de una sola instrucción a ejecutar no es necesario ponerla entre llaves,
incluso podría ponerse dentro del paréntesis el for, separado por una coma.
for(asignación inicial ; condicion ; instrucción1)
unica instrucción;
ó, si se trata de una instrucción muy corta podría ponerse:
for(asignación inicial ; condicion ; instrucción1 , instrucción 2)
Pensemos en una aplicación. Hagamos un programa que calcule las coordenadas de
un proyectil que se mueve en movimiento parabólico. Almenos determinaremos 10
puntos por los que pasa. Si se tienen dudas acerca de las fórmulas recomiendo que
consulten un libro sobre física.
Las formulas son las siguientes:
x= Visint 
y=Visint
1
2
gt
2
Donde Vi es la velocidad inicial.
 es el ángulo con el que es lanzado.
t es el tiempo.
g es la gravedad.
La forma en que pensaría hacer este programa es la siguiente:
Declarar e inicializar variables
Pedir datos
for (contador=1; hasta que el contador llegue a 10; aumentar contador){
Calcular coordenada x
53
Calcular coordenada y
Imprimir las coordenadas
}
Termina el programa.
No parece tan complicado ¿verdad? Pues en realidad no lo es tanto. El programa
terminado aquí está.
#include <iostream.h>
#include <math.h>
int main (){
    int t;
    float x=0,y=0,ang,vi, grav=9.81;
    cout<<"cual es el angulo de lanzamiento?"<<endl;
    cin>>ang;
    cout<<"cual es la velocidad inicial?"<<endl;
    cin>>vi;
    ang=((ang*3.141592)/180);
    for(t=0;t<=10;t++){
x=(vi*cos(ang)*t);
y=(vi*sin(ang)*t)­(0.5*grav*t*t);
cout<<"t= "<<t<<" x= "<<x<<" y= "<<y<<endl;
    } 
    cout<<"fin del programa"<<endl;  
    cin.ignore();
    cin.get();
    return (0);
}
El ciclo for comienza inicializando la variable del tiempo en 0. La condición que se
tiene que cumplir para entrar en el ciclo es que t sea menor o igual a 10.
Cuando entra en el ciclo calcula las coordenadas x y y. Hacemos uso de las
funciones cos y sin que se encuentran dentro de la librería math.h. Dichas funciones
calculan el coseno y el seno de un ángulo determinado en radianes, es por eso que
la variable “ang” es transformada a radianes. Luego de haber calculado las
54
coordenadas, las imprime en pantalla. Y finalmente ejecuta la última instrucción del
for aumentar una unidad a t (t++).
En el momento en el que la variable t sea mayor que 10, no entrará en el ciclo y
llegará el fin del programa.


No hay comentarios:

Publicar un comentario