SENTENCIAS DE CONTROL
En este módulo veremos lo relacionado a las sentencias de control que
maneja C. Es importante que se comprendan bien porque son herramientas básicas
en la implementación de programas.
De acuerdo a la sintaxis utilizada en C, una sentencia puede ser una proposición o ninguna proposición (si hablamos de una sentencia vacía) o un conjunto de proposiciones (cuando se encuentran agrupadas entre llaves). Dentro de este capítulo utilizaremos la palabra sentencia con las tres acepciones.
Las sentencias IF
La sentencia de control if
nos sirve para verificar que se cumpla una condición en el programa. Su forma
general es
if(expresión) sentencia;
else sentencia;
donde sentencia puede ser una
sola proposición o un conjunto de proposiciones delimitadas por llaves.
Ejemplo:
Queremos dividir dos números
cualesquiera donde el divisor sea diferente de cero.
Necesitamos dos variables de
tipo real (para que también acepte valores enteros) para recibir los datos y
una para almacenarlo.
Creamos el pseudocódigo:
si divisor<>0 entonces
división=dividendo/divisor;
de otro modo
manda mensaje de error;
Y al codificar en C
if (divisor!=0)
divisior=dividendo/divisor;
else
printf("Error en el divisor");
Si se cumple la condición
(que divisor sea diferente de cero) entoncesse realizará la división; si no, se
mandará un mensajede error.
Ifs anidados
La expresión "ifs
anidados" se refiere a que podemos utilizar una sentencia if dentro de
otra sentencia if. Esto se emplea cuando se tienen que cumplir varias
condiciones para poder ejecutar una acción.
Ejemplo:
Hagamos un algoritmo que
seleccione una asignatura.
menu()
inicio
variable opcion:caracter;
escribe('A)Español');
escribe('B)Matemáticas');
escribe('C)Historia');
escribe('D)Biologia');
escribe('Opcion: ');
lee(opcion);
escribe('Escogió ');
si opcion='A'entonces
escribe('Español')
de otro modosiopcion='B'
entoncesescribe('Matemáticas')
de otro modosiopcion='C'
entonces escribe('Historia')
de otromodosi opcion='D' entonces escribe('Biologia')
de otro modo escribe('una asignatura inexistente')
fin;
Codificándolo en C:
#include<stdio.h>
menu()
{
char opcion;
printf("A)Español\n");
printf("B)Matemáticas\n");
printf("C)Historia\n");
printf("D)Biologia\n");
printf("Opción:
");
scan("%c",&opcion);
printf("Escogió
");
if (opcion=='A')
printf("español");
else if (opcion=='B')
printf("matamáticas");x
else if (opcion=='C')
printf("historia");
else if (opcion=='D')
printf("biologia");
else printf("una
asignaturainexistente.");
}
En el programa anterior, después de haber mandado a pantalla las opciones, leemos la respuesta. Para determinar la opción que se escogió, se recurre a las sentencias if. Cuando la evaluación sea verdadera es decir, cuando encontremos el valor que leímos en opcion, ejecutaremos en este caso la función correspondiente.
Las condiciones se codifican
en orden de importancia es decir, la condición más importante se evalúa
primero, enseguida la que le sigue en importancia y así sucesivamente hasta
llegar a la menosimportante.En este caso, todas las condiciones eran igualmente
importantes por lo que no importa el orden en que se evalúen.
Switch
Cuando se anidan muchos ifs,
el código puede volverse difícil de entender aún para el autor. Para darle
mayor transparencia, en C utilizamos la sentencia de decisión múltiple switch.
Switch es utilizada cuando
una variable es sucesivamente comparada con una lista de enteros o de
caracteres. Cuando se encuentra la correspondencia, se ejecuta una sentencia o
el bloque de sentencias.
La forma general de una
sentencia switch es
switch(expresión)
{
case constante1:
secuencia desentencias;
break;
case constante2:
secuencia desentencias;
break;
case constente3:
secuencia desentencias;
break;
.
.
.
default:
secuencia desentencias;
}
switch es el indicador del
tipo de sentencia de control.
{ } delimitan lo que abarca
la sentencia switch.
case especifica donde
comienza la evaluación de la variable con la constante que sucede al case
En caso de que encontremos
el valor de la variable en un case se ejecutarán la secuencia de sentencias
relacionadas con este hasta encontrar un break.
Las sentencias asociadas a
Default serán ejecutadas si no se
encuentra ninguna correspondencia con el valor de la variable que estamos
evaluando en alguno de los case. El final de estas sentencias las determina la
} del switch. Esta sentencia es opcional (se puede o no incluir).Si no está
presente, no se ejecutará ninguna sentencia en caso de que ningún case
corresponda al valor que estamos buscando.
La diferencia entre switch e
if es que la primera sólo puede comprobar la igualdad, mientras que if puede
evaluar expresiones relacionales o lógicas.
No puede haber dos
constantes case que tengan los mismos valores sólo en el caso de que la
sentencia switch este anidada (que haya una dentro de otra).
Ejemplifiquemos el switch
optimizando el ejemplo anterior. Ahora, codifiquemos el algoritmo de menú, pero
utilizando un switch en vez de ifs.
menu()
{
char opcion;
printf("A)Español\n");
printf("B)Matemáticas\n");
printf("C)Historia\n");
printf("D)Biología\n");
printf("Opción: ");
scan("%c",&opcion);
printf("Escogió ");
switch(opcion)
{
case'A':printf("español");
break;
case 'B':printf("matemáticas");
break;
case 'C': printf("historia");
break;
case 'D': printf("biologia");
break;
default: printf("escogiste unaasignaturainexistente");
}
}
Se denomina bucles a las
proposiciones de control que nos permiten ejecutar una sentencia hasta que se
cumpla cierta condición.
Entre sus ventajas se encuentra,
el compactar el código es decir, si tenemos que realizar una tarea varias
veces, basta con escribirla una sola vez dentro de un bucle, para que pueda
efectuarse las veces que deseamos. También ayuda que el código sea más
entendible.
Los bucles soportados por C
son el for, el while y eldo-while.
For
El formato general para
implementar el bucle for es
for(inicialización;condición;incremento)
sentencia;
Inicialización es una
sentencia de asignación que nos sirve como variable de control del bucle.
Condición es una expresión que nos indica la condición que debe cumplirse para
que continué el bucle e incremento define como va cambiando el valor dela
variable de control cada vez que se repite el bucle.
Sentencia es el conjunto de
proposiciones que se van a realizar en cada uno de los bucles.
Por ejemplo hagamos
algoritmo para crear una línea en la pantalla un sencillo marco con código
ASCII.
inicio
desde (x=1;x<80;incrementa x)
inicio
posicionate(x,1);
escribe ("Ä");
posicionate(x,24);
escribe("Ä");
fin
escribe("Ú");
escribe("¿");
escribe("À");
escribe("Ù");
desde(x=1;x<80;incrementa x)
inicio
posicionate(1,x);
escribe("Æ")
posicionate(80,x);
escribe("Æ");
fin
fin
Codificándolo
main()
{
for(x=1;x<80;x++)
{
gotoxy(x,1);
printf("Ä");
gotoxy(x,24);
printf("Ä");
}
gotoxy(1,1);
printf("Ú");
gotoxy(80,1);
Printf("¿");
gotoxy(1,24);
printf("À");
gotoxy(80,24);
printf("Ù");
for(x=0;x<24;x++)
{
gotoxy(1,x);
printf("Æ");
gotoxy(80,x);
printf("Æ");
}
}
EL programa anterior, dibuja
un marco en la pantalla con código ASCII.
x=1 nos indica que vamos a
empezar a contar desde el 1. Después se verifica que x sea menor que 80 o 24(en
el segundo for). Si es así, se ejecutan las sentencias que se encuentran dentro
del bucle para finalmente, incrementar el valor de x y volver a evaluar. El
ciclo se termina cuando x es igual o mayor a 80 o que 24 (en el segundo for).
Una de las principales
características del for es que la condición (para determinar si se ejecutan o
no las sentencias que contiene) se evalúa al principio del ciclo. Por esto, el
código dentro del bucle no será ejecutado si la condición es false al comienzo.
Debido a la flexibilidad del
lenguaje C, se puede utilizar el operador coma para permitir dos o más variables
de control Por ejemplo:
for
(i=0,j=4;i*j<4;i++,j--)
{
.
.
.
}
En este caso, estamos
inicializando a i y a j dentro del bucle. Al mismo tiempo, en la sección de
incremento, aumentamos a iy disminuimos el valor de j. Esto es completamente
válido.
Bucle Infinito
Es aquel que no tiene fin.
En este tipo de ciclos, no necesitamos especificar ninguna de las tres
proposiciones que lo constituyen
for (;;) printf("Bucle
infinito");
o basta dejar la de la
condición vacía como se muestra a continuación:
for(x=0;;x++)
printf("Bucle infinito");
La forma de romper un bucle
infinito es mediante la sentencia break. Cuando se encuentra esta proposición
dentro de un ciclo, trunca el bucle y se procede a ejecutar el código que se
encuentra inmediatamente después de él.
main()
}
for(;;)
{
printf("Número: ");
scanf("%d",&x);
if(x==9) break;
}
printf("Digitaste %d números antes de romperelciclo",x);
}
El bucle anterior se repite hasta
que se teclea el número 9 y depués se imprime en pantalla la cantidad de veces
que pulsó un número antes de romper el ciclo.
Bucle sin cuerpo
Según la sintaxis de C,
existen las sentencias vacías por tanto, podemos tener un bucle for o cualquier
otro, que no tenga cuerpo. Este tipo de ciclos se usan regularmente para
retardar la ejecución del programa. Veamos como crear uno:
main()
{
int num;
printf("Piensa un número del 1 al 10.");
lapso();
printf("Que número pensaste: ");
scanf("%d",&num);
.
.
.
}
lapso()
{
int tiempo
int valor=100;
for (tiempo=0;tiempo<valor;tiempo++);
}
En el programa anterior, se dá cierto tiempo para que pienses un número y luego
lo escribas.
Este es otro de los bucles
disponibles en C. Su forma general es
while(condición)sentencia;
donde sentencia es una
sentencia vacía, una única o un bloque de sentencias. El bucle itera mientras
se cumpla la condición (puede ser cualquier expresión). Cuando ya no se cumple,
el control del programa pasa a la línea siguiente al código del bucle.
Ejemplo:
Hagamos un programa que nos
devuelva el valor absoluto de un número y que se repita todas las veces que
deseemos. Necesitaremos una variable tipo float (para que tenga mayor rango)que
reciba el número.
También ocuparemos una
variable que nos sirva para determinar si continua o no en el programa. Si la
variable es igual a 'S' continuará y si es igual a 'N', terminará. Sólo
aceptará esos dos valores.
Elabora el algoritmo y
compáralo con el programa que se encuentra a continuación:
#include <ctype.h>
#include<conio.h>
#include<stdio.h>
#include <math.h>
main()
{
char respuesta;
clrscr();
respuesta='\0';
while (respuesta!='N')
{
float x;
printf("Dame un número: ");
scanf("%f",&x);
x=fabs(x);
printf("Su valor absoluto es: %f\n",x);
printf("Presione 'N' para salir...\n");
respuesta=toupper(getch());
}
}
Inicializamos la variable
respuesta con carácter nulo ('\0')
para asegurarnos de que al
menos se entre una vez al ciclo.
Al final del bucle, preguntamos
si quiere continuar o no. Congetch() leemos el carácter. toupper() nos sirve
para convertir el carácter recibido por getch() a mayúsculas; de esta manera
validamos que se acepte 'S' o 'N' minúsculas.
En caso de que la respuesta
sea afirmativa, se repite el ciclo.
Como en el caso del for,
podemos utilizar bucles while sin cuerpo. Por ejemplo:
while((letra=getch())!='M');
En letra se guardará el
valor que se lea con getch() y esto se repetirá hasta que letra sea igual a
'M'.
DO-WHILE
La característica principal
del Do-while es que analiza la condición del bucle al final del ciclo, lo que
garantiza que el bloque de sentencias se ejecute al menos una vez. Su forma
general es
do{
sentencia
}while(condición);
Las llaves no son necesarias
cuando sentencia corresponde a una sola proposición, pero se recomienda que
utilizarlas para mejorar la legibilidad del programa.
Como ejemplo, modifiquemos
el programa anterior utilizando do-while:
#include <ctype.h>
#include<conio.h>
#include<stdio.h>
#include <math.h>
main()
{
char respuesta;
clrscr();
do{
float x;
printf("Dame un número: ");
scanf("%f",&x);
x=fabs(x);
printf("Su valor absoluto es: %f\n",x);
printf("Continuar...\n");
respuesta=toupper(getch());
}while(respuesta!='N');
}
En esta ocasión, no
necesitamos inicializar respuesta ya que por las características de do-while de
todos modos se ejecutaría la primera vez. La única diferencia es que ahora la
condición se comprueba al final del bucle y no al principio como lo hace for
ywhile.
La sentencia break tiene dos
usos:
1)Para determinar el final
de un case en una sentencias witch analizado en este mismo capítulo, y
2)Terminar la ejecución de
un bucle y saltar a la evaluación condicional del ciclo.
Veamos en que consiste el
segundo uso:
Cuando utilizamos una
sentencia break dentro de un bucle, éste se termina inmediatamente y el control
del programa pasa a la línea que está inmediatamente después del ciclo. Por ejemplo:
#include<stdio.h>
main()
{
int x;
for(x=0;;)
{
if(x==250) break;
x++;
}
printf("%d",x);
}
El programa anterior hay un
ciclo infinito que es truncado cuando x es igual a 250.
Exit()
Esta sentencia da lugar a la
terminación del programa.
Los programadores la
utilizan cuando no se satisface una condición obligatoria en la ejecución de un
programa ya que detiene su ejecución y fuerza la vuelta al sistema operativo.
La función exit() requiere
de un argumento entero ya que se supone que un proceso de alto nivel sería
capaz de acceder al valor contenido en el argumento . Normalmente se utiliza un
argumento 0 (exit(0))para indicar que se trata de una terminación normal y
otros argumentos para indicar algún tipo de error.
Por ejemplo, imagine un
programa al que se tenga que dar una clave de acceso para iniciar. La función
main() de este programa sería como esta:
main()
{
char clave[]="clave";
char password[5];
printf("Proporcione clave de acceso: ");
scanf("%s",password);
if(password!=clave)exit(1);
.
.
.
}
Al iniciar el programa, se
pide la clave de acceso. En caso de que no sea la especificada, el programa
termina sin esperar nada más.
Continue es una sentencia de significado opuesto al break.En vez de forzar
la terminación del bucle, continue obliga una nueva iteración del ciclo y salta
cualquier código que exista entre este. Por ejemplo:
do{
int years,tope=12;
gotoxy(5,5);
clreol();
printf("Años: ");
scanf("%d",&years);
if (years<=0) continue;
if (years<=tope)
printf("Lo siento, este programa no es paraniños");
}while(tope!=18);
En el ciclo anterior,
utilizamos el continue para verificar que la edad se mayor que cero. En caso de
que ésta sea cero o menos vuelve a comenzarlo sin llegar a ejecutar las
instrucciones del bucle restantes. Al no comparar la condición que puede
terminar el ciclo, éste se repite.
No se preocupe, si por ahora
no sabe cuando utilizar un for, while odo-while. La experiencia le irá
indicando cuando es más conveniente utilizar uno u otro. Lo más importante es
entender el funcionamiento de cada uno.
Regresar a la Pagina Principal