Posteado por: wozgeass | agosto 31, 2009

Programando en C para linux (tercera parte).


Estructuras Condicionales.

En este capitulo revisaremos los distintos metodos con los que C controla el flujo logico de un programa.

Como vimos el capitulo anterior, los operadores relaciona binarios que se usan son:

==, !=, <, <=, > y >=

Ademas los operadores logicos binarios:

||, &&

y el operador logico negacion ‘!’, que solo toma un argumento.

Sentencia if.

if (condicion)

sentencias;


if (condicion)

sentencia1;

else

sentencia2;


if (condicion1)

sentencia1;

else if(condicion2)

sentencia2;

else

sentencian;

EL flujo logico de esta estructura es de arriba hacia abajo. La primera sentencia se ejecutara y se saldra de la estructura if si la primera condion es verdadera. Si la primera condicion fue falsa, y existe otra condicion, se evalua, y si la condicion es verdadera, entonces se ejecutara la sentencia asociada. Si existen mas condiones dentro de la estructura if, se van evaluando estas, siempre y cuando las condiones que le precedan y sean falsas.

Las sentencias que esta asociada a la palabra reservada else, se ejecuta si todas la condiciones de la estructura if fueron falsas.

ej.

#include<stdio.h>

main(){
int calificacion;
printf(“Dame tu calificacion\n”);
scanf(“%d”, &calificacion);
if (calificacion == 10){
printf(“sacaste 10\n”);
printf(“eres todo un nerd\n”);
}
if (calificacion < 10 && calificacion > 5){
printf(“eres un estudiante regular\n”);
printf(“pero hechale mas ganas. . .!!\n”);
}
if (calificacion > 10){
printf(“debe ser un numero menor o igual a 10…^_^\n”);
printf(“<<<^_^>>>\n”);
}
}

El operador ?:

El operador tiene el siguiente formato:

<expresion1> ? expresion2  : expresion3;

Por ejemplo, para asignar el maximo de num y num1 a la variable resul, usando ?, tendriamos:

resul = (num > num1)  ? num  : num1;

Que es lo mismo que:

if (num > num1)

resul = num;

else

resul = num1;

El uso del operador ? para reemplazar las sentencias if . . . else no se restringe solo a asignaciones, como en el ejemplo anterior. Se pueden ejecutar una o mas llamadas de funcion usando el operador ? poniendolas en las expresiones que forman los operandos, como en el ejemplo siguiente:

#include<stdio.h>

//funcion que recibe un entero y lo imprime

funcion(int valor){

printf(“<%d>\n”, valor);

}

//funcion que imprime un letrero

funcion1(){

printf (“introducido\n”);

}

main(){

int valor;

printf(“Introduce el valor:\n”);

scanf(“%d”, &valor);

//imprimira el mensaje apropiado

valor ? funcion(valor) + funcion1() : printf(“Cero introducido”);

}

La sentencia switch

Aunque con la estructura if  . . . else if se pueden realizar comprobaciones multiples, en ocasiones no es muy elegante. Por lo anterior, C tiene incorporada una sentencia de bifurcacion multiple llamada switch. Con esta sentencia, la computadora comprueba una variable sucesivamente frente a una lista de constantes enteras o de caracteres. Despues de encontrar una coincidencia, la computadora ejecuta la sentencia o bloque de sentencias que se asocian con la constante. La forma de general de la sentencia de switch es:

switch(variable){

case constante1:

secuencias . . .

break;

case constante2:

secuencias . . .

break;

case constante3:

sentencias . . .

break;

}

Donde la computadora ejecuta la sentencia default si no coincide ninguna constante con la variable. Esta ultima opcion es opcional.
Cuando encuentra una coincidencia, la computadora ejecuta las sentencias asociadas con el case hasta encontrar  un break, o hasta el
final de la sentencia swith en el caso de que se emplee default o sea el ultimo case.

Las limitaciones que tiene case respecto a la estructura if son:

  • Con switch solo se puede comprobar por igualdad, mientras que con if puede ser por cualquier operador relacional.
  • No se pueden tener dos constantes en un solo case.

La forma como se puede simular el ultimo punto, es teniendo una sentencia nula incluyendo solo un ‘;’  o permitiendo que la sentencia switch caiga omitiendo las sentencias como se muestra a continuacion:

#include<stdio.h>

main(){

char cadena[20];

int num_vocales = 0;

int num_espacio = 0;

int num_otras = 0;

printf(“Introduce la cadena”);

scanf(“%s”, cadena);

for (int indice = 0; indice < sizeof(cadena); indice++){

switch(cadena[indice]){

case ‘a’:

case ‘e”:

case ‘i’:

case ‘o’:

case ‘u’:

num_vocales++;

break;

case ‘ ‘:

num_espacio++;

break;

default:

num_otras++;

break;

}

}

}

Iteraciones.

Seguramente te preguntaras, ¿Que es iteracion? Simplemente repite un conjunto de instrucciones hasta que se cumple cierta condicion.

Sentencia for.

La sentencia for tiene el siguiente formato:

for(<expresion> ; <expresion1> ;  <expresion2>){

sentencias a repetir

}

En donde <expresion> se usa para realizar la inicializacion de variables usando una o varias sentencias, si se usan varias sentencias debera usarse el operador ‘,’ para separarlas. Por lo general, establece el valor de la variable de control de ciclo. La <expresion1> se usa para la condicion de terminacion del ciclo y <expresion2> es el modificador a la variable de control de ciclo cada vez que la computadora lo repite, pero tambien puede ser mas que un incremento:

ej.

#include<stdio.h>

main(){

int variable;

for (variable = 5 ; variable >= 0; variable–)

// si existe una sentencia despues de for podemos omitir los parentesis

printf(“variable=[%d]\n”, variable);

}

genera la siguiente salida a pantalla…

variable=[5]
variable=[4]
variable=[3]
variable=[2]
variable=[1]
variable=[0]

Todas las siguientes sentencias for son validas en C. Las aplicaciones practicas de tales sentencias no son importantes aqui, ya que tan solo se intenta ilustrar algunas caracteristicas que pueden ser de utilidad:

for ( x=0; ( (x>3) && (x<9) ); x++ )
for ( x=0, y=4; ( (x>3) && (x<9) ); x++, y+=2)
for ( x=0, y=4, z=4000; z; z/=10)

En el segundo ejemplo se muestra la forma como multiples expresiones pueden aparecer, siempre y cuando esten separadas por  una coma ‘,’ .

En el tercer ejemplo, el ciclo continuara iterando hasta que z se convierta en 0.

Sentencia while.

La sentencia while es otro ciclo o bucle disponible en C. Su formato es:

while(<expresion>){

sentencias;

}

Donde sentencia puede ser una sentencia vacia, una sentencia unica o un bloque de sentencias que se repetiran. Cuando un flujo del programa llega a esta instruccion, primero se revisa si la condicio es verdad para ejecutar las sentencias, y despues el ciclo while re repetira mientras la condicion sea verdadera. Cuando llega a ser falsa, el control del programa pasa a linea que sigue al ciclo.

En el siguiente ejemplo se muestra una rutina de entrada desde el teclado, la cual se cicla mientras no se pulse A:

#include<stdio.h>

main(){

char caract;

while(caract != ‘0’)

caract = getchar();

}

Antes de entrar al ciclo  se inicializa la variable caract a nulo. Despues pasa a la sentencia while donde se comprueba si caract no es igual a ‘A’, como sea verdad entonces se ejecuta la sentencia de bucle (caract = getchar();). La funcion getchar() lee el siguiente caracter del flujo estandar(teclado) y lo devuelve, que en nuestro ejemplo es el caracter que haya sido tecleado. Una vez que se ha pulsado un tecla, se asigna a caracter y se comprueba la condicion nuevamente. Despues de pulsar ‘0’, la condicion llega a ser falsa porque caracter es igual a ‘0’, con lo que el ciclo termina.

De lo anterior, se tiene que tanto el ciclo for, como el ciclo while comprueba la condicion e lo alto del ciclo, por lo que el codigo dento del ciclo no se ejecuta siempre.

otro ejemplo:

#include<stdio.h>

main(){

int valor = 3;

while(valor > 0){

printf(“valor = [%d]\n”, valor);

}

}

Que genera la siguiente salida en pantalla:

x = 3

x = 2

x = 1

Como se observa, dentro del ciclo tenemos mas de una sentencia, por lo que se requiere usar la llave abierta y la cerrada { . . . } para que el grupo de sentencias sean tratadas como una unidad.

Como el ciclo while pueda aceptar tambien expresiones, y no solamente condiciones lo siguiente es valido:

while(valor–);

while(x = x+ 1);

while(x += 5);

Si se usan este tipo de expresiones, solamente cuando el resultado de x–, x = x + 1 o x + 5 sea cero, la condicion fallara y se poda salir del  ciclo.

Un ultimo ejemplo:

#include<stdio.h>
main()
{
char carac;
carac = ”;
while ( (carac = getchar()) != ‘0’ )
putchar(carac);
}

En este ejemplo se usan las funciones de la biblioteca estandar getchar()  —-> lee el caracter del teclado y putchar() —–> escribe la cadena en pantalla. El ciclo while procedera a leer del teclado y lo mostrara hasta que el caracter ‘0’ sea leido.

La sentencia do-while.

Al contrario de los ciclos for y while que comprueban la condicion en lo alto del bucle, el bucle do … while la examina en la parte del mismo. Esta caracteristica provoca que un ciclo do … while siempre se ejecute al menos una vez. La forma generica del ciclo es:

do{

sentencias;

}while(condicion);

Aunque no son necesarias las llaves cuando solo esta presente una sentencia, se usan normalmente por legitimidad y para evitar confusion (respecto al lector, y no del compilador) con la sentencia while.

ej.

#include<stdio.h>

main()
{
int num;
do
{
scanf(“%d”, &num);
} while ( num <= 100 );
}

Este programa usa un ciclo for para leer numeros desde el teclado hasta que uno de ellos es menor o igual a 100.

#include<stdio.h>
main(){
int opc;
printf(“1. Derivadas\n”);
printf(“2. Limites\n”);
printf(“3. Integrales\n”);
do
{
printf(” Teclear una opcion: “);
scanf(“%d”, &opc);
switch(opc)
{
case 1:
printf(“\tOpcion 1 seleccionada\n\n”);
break;
case 2:
printf(“\tOpcion 2 seleccionada\n\n”);
break;
case 3:
printf(“\tOpcion 3 seleccionada\n\n”);
break;
default:
printf(“\tOpcion no disponible\n\n”);
break;
}
} while( opc != 1 && opc != 2 && opc != 3);
}

Uso de <break> y <continue>.

Como se comento uno de los usos de la sentencia break es terminar un case en la sentencia switch. Otro uso es forzar la terminacion inmediata de un ciclo, saltando la prueba condicional del ciclo.

Cuando se encuentra la sentencia break en un bucle, la computadora termina inmediatamente el ciclo y el control del programa pasa a la siguiente sentencia del ciclo.

ej.

#include<stdio.h>
main(){
int i;
for (i = 0 ; i < 100 ; i++){
printf(“%d\n”, i);
if(i == 10)
break;
}
}

Este programa muestra en pantalla los numeros del 0 al 10, cuando alcanza el valor 10 se cumple la condicion de la sentencia if, cuando alcanza el valor de 10 se cumple la condicion de la sentencia if, se ejecuta la sentencia break y sale del ciclo.

La sentencia continue funciona de manera similar a la sentencia break. Sin embargo, en vez de forzar la salida, continue fuerza la siguiente iteracion, por lo que salta el codigo que falta para llegar a probar la condicion.

ej.

include<stdio.h>
main()
{
int x;
for( x=0; x<100; x++){
if (x%3)
continue;
printf(“%d “,x);
}
}

Finalmente considero el siguiente ejemplo donde se leen valores enteros y se procesan de acuerdo a la siguientes condiciones.

ej.

#include<stdio.h>
main(){
int valor;
while( scanf(“%d”, &valor) == 1 && valor != 0){
if ( valor<0 ){
printf(“Valor no valido\n”);
break;
/* Salir del ciclo */
}
if ( valor>100){
printf(“Valor no valido\n”);
continue;
/* Pasar al principio del ciclo nuevamente */
}
printf(“Se garantiza que el valor leido esta entre 1 y 100”);
}

wozgeass: push eax, 1

int 80h

EOF!!!

hasta el proximo post…

Anuncios

Responses

  1. oh, soy del salvador y me interezaria que realizaras uno de apuntadores

  2. claro, espero tener uno muy pronto no mas de 2 semanas, la verdad me estoy concentrando en uno de procesadores esperalo dentro de muy pronto..


Responder

Introduce tus datos o haz clic en un icono para iniciar sesión:

Logo de WordPress.com

Estás comentando usando tu cuenta de WordPress.com. Cerrar sesión / Cambiar )

Imagen de Twitter

Estás comentando usando tu cuenta de Twitter. Cerrar sesión / Cambiar )

Foto de Facebook

Estás comentando usando tu cuenta de Facebook. Cerrar sesión / Cambiar )

Google+ photo

Estás comentando usando tu cuenta de Google+. Cerrar sesión / Cambiar )

Conectando a %s

Categorías

A %d blogueros les gusta esto: