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.

 

 

SENTENCIAS CONDICIONALES

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");
}
}

 

 

Bucles

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.

 

 

While

 

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.

 

 

Break

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

 

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  < Back >

Regresar a la  Pagina Principal

 

By “Hackers Mexico”

 


STARMEDIA        CERRAR