Está en la página 1de 15

Semana 9 Operadores condicionales y operadores iterativos del ANSI C

Mag. Ing. Sergio Salas A.

El operador condicional
Resultado = Expresin 1 ? Expresin 2 : Expresin 3

Se evala esta condicin

Si es falsa Resultado = Expresin 2 Si es verdadera Resultado = Expresin 1

unsigned char a = 10, b = 16; unsigned char maximo; void main() { maximo = (a>b)?a:b; }

//maximo = b

Mag. Ing. Sergio Salas A.

Sentencias de seleccin: if( )


if ( Expresin) Instruccin 1; else Instruccin 2; Condicin verdadera porque el argumento es mayor a 0.

Caso contrario la condicin es falsa porque el argumento es 0.

if (Expresin) { Instruccin 1; Instruccin 2; } else { Instruccin 3; Instruccin 4; }

Se utiliza la apertura y cierre de la llave cada vez que hay ms de una sentencia dentro del condicional

Mag. Ing. Sergio Salas A.

Ejemplos de condicionales compuestos


if ( (a>b) && (a >c) ) { } if ( (a != b) || (a !=c) ) { } if ( a == b) { } //Si a es igual a b //Si a es diferente de b o a es diferente de c //Si a es mayor que b y a es mayor que c

Mag. Ing. Sergio Salas A.

Errores comunes con la sentencia if


unsigned char a = 5, b = 7, c; void main() { if ( a = b) { c = 10; } while(1); } unsigned char a = 5, b=7,c; void main() { if( a > 4 & b > 6) { c = 10; } while(1); } Error a = b, es decir a = 7 y como es una asignacin vlida el argumento de if es 1 y por tanto la condicin es considerada verdadera por lo cual c = 10.

No afecta el resultado ya que a>4 = 1 y b>6 = 1 La operacin AND entre ambos valores da 1 y por tanto la condicin es considerada verdadera y c = 10. Sin embargo, es importante tener en cuenta que se est realizando la operacin AND y no la operacin lgica. Mag. Ing. Sergio Salas A.

La evaluacin de varios estados con if


unsigned char k = 0; void main() { TRISB = 0xFF; while(1) { if(PORTB <10) k = 10; else if(PORTB >=10 && PORTB <=50) k = 50; else if(PORTB >50 && PORTB < 150) k = 100; else if(PORTB >=150 && PORTB < 200) k =150; else k = 200; } }

El problema de este anidamiento if-else if es que se deben evaluar todas las condiciones hasta llegar a la vlida. Una vez hallada la condicin vlida se sale de la sentencias if. Si existen muchas condiciones para evaluar, el anidamiento if-else if puede resultar ineficiente. Mag. Ing. Sergio Salas A.

Sentencias de seleccin switch( )


Para resolver el problema de ineficiencia debido a mltiples condiciones posibles para una variable se puede hacer uso de la sentencia switch() que nicamente evala la opcin correcta y ejecuta las instrucciones especificadas para dicha condicin. La sentencia tiene la siguiente estructura: switch (condicin) { case condicin 1: Instrucciones; break; case condicin 2: Instrucciones; break; case condicin N: Instrucciones; break; default: Instrucciones; } Mag. Ing. Sergio Salas A.

Ejemplo del uso de switch( )


unsigned char resul; void main() { TRISB = 0xFF; switch(PORTB) { case 0: resul = 10; break; case 1: resul = 11; break; .. .. case 200: resul = 245; break; default: resul = 0; }

Mag. Ing. Sergio Salas A.

Importancia de la sentencia switch( )


Es muy til para el diseo de una mquina de estados que permite organizar de manera muy eficiente la ejecucin de un programa.
#define ESTADO1 0 #define ESTADO2 1 #define ESTADO3 2 #define ESTADO4 3 #define ESTADO5 4 #define ESTADO1 5 unsigned char estado; void main() { switch(estado) { case ESTADO 1: Rutina 1 break; case ESTADO 2: Rutina 2 break; case ESTADO 3: Rutina 3 break; case ESTADO 4: Rutina 4 break; case ESTADO 5: Rutina 5 break; Rutina 6

DEFAULT: } }

Mag. Ing. Sergio Salas A.

Sentencias iterativas: bucle for


for (expresin inicial; condicin de la expresin, incremento de la expresin) { Instrucciones }
Ejemplos: unsgined char i; for (i = 0; i<10; i++) { k = i; } //k = 9, i = 10 Bucle infinito: for ( ; ; ) { unsigned char i; for (i = 0; i<=10; i++) { k = i; } //k = 10, i = 11

Instrucciones Mag. Ing. Sergio Salas A.

Sentencias iterativas: bucle while( )


while (condicin) { Instrucciones }

Ejemplo: int p = 10; while (p<20) { Instrucciones }

Bucle infinito: while ( 1 ) { Instrucciones }

Mag. Ing. Sergio Salas A.

Sentencias iterativas: bucle do while( )


Aqu al menos las intrucciones se ejecutan una sola vez si es que la condicin dentro del while() es falsa desde un inicio. do { Instrucciones }while(condicin); Ejemplo: unsgined char a=2,k=0; void main() { k = 5; do { a ++; }while(k<4); } //a = 3 Mag. Ing. Sergio Salas A.

Sentencias iterativas: goto


Muy similar a la sentencia goto en lenguaje ensamblador. De la misma manera, requiere del uso de etiquetas. Cierta literatura sobre el lenguaje ANSI C recomienda no abusar de este tipo de sentencia dado que podra ocasionar problemas al compilador. En el caso de ANSI C para sistemas embeebidos esto no aplica ya que la sentencia goto tiene relacin directa con la misma sentencia en lenguaje ensamblador. Ejemplo: unsigned char p = 0; INICIO: p++; if(p<100) goto INICIO; Instrucciones

Mag. Ing. Sergio Salas A.

La sentencia continue
continue es una sentencia que se utiliza dentro de los bucles iterativos para controlar el flujo de estos. Esta instruccin normalmente se utiliza dentro de un condicional if para generar la siguiente iteracin. Ejemplo: Hacer un programa que sume los nmeros pares del 1 al 10.

unsigned char suma; void main() { unsigned char i = 0; for( i = 0; i<=10; i++) { if(i%2 != 0) continue; suma+ = i; } while(1); }
Mag. Ing. Sergio Salas A.

La sentencia break
Esta sentencia se utiliza para finalizar la iteracin cuando ocurre cierta condicin en su interior.

Ejemplo: Calcular el factorial de 5. unsigned char fact = 1; void main() { for(i = 1; i<10; i++) { if(i<6) fact = fact*i; else break; } while(1); }

Mag. Ing. Sergio Salas A.

También podría gustarte