Tema 4: Estructuras de control
Selectivas (if, switch), operador ternario ‘?:’. Repetitivas o cíclicas (while, do while, for, break, continue).
Estructuras de control 1) Selectivas
1a) Simple y múltiple: Se usan para decidir hacer algo en determinado punto, o decidir entre dos acciones Ejemplos:
if (resultado >= 3)
printf(“aprobó \n”);
else
printf(“no aprobó \n”);
if (temperatura < 0)
printf(“congelado \n”); if (resultado >= 3)
{ printf(“aprobó \n”);
printf(“felicitaciones \n”); } else
{ printf(“no aprobó \n”);
printf(“suerte la próxima \n”); } Simple Multiple
Profs. Buitrago - Jiménez
1) Selectivas (cont.)
Ejemplo: para tomar una decisión basado en varias condiciones if (resultado >= 18)
printf(“aprobó con 5 \n”);
else if (resultado >= 14)
printf(“aprobó con 4 \n”);
else if (resultado > = 10)
printf(“aprobó con 3 \n”);
else
printf(“no aprobó \n”);
Estructuras de control 1) Selectivas
1b) switch:
Esta es la otra manera de llevar a cabo una selección múltiple, pero sólo se usa para interrogar una sola variable, todas las ramas dependen del valor de esa variable.
Tiene un caso “default” que captura todos los casos no especificados (esto es opcional).
¿qué sucede si se comenta el “break”
del case 2?
ver ejemploC1A/ejC1A
int number;
switch (number) {
case 0:
printf(“ninguno \n”);
break;
case 1:
printf(“uno \n”);
break;
case 2:
printf(“dos \n”);
break;
default:
printf(“muchos \n”);
Profs. Buitrago - Jiménez }
1) Selectivas
1c) expresión condicional:
if (a > b) z = a;
else
z = b;
z = ( a > b ) ? a: b;
Cálculo en z del máximo de a y b
Sintaxis: expresión 1 ? expresión 2 : expresión 3
La expresión 1 es evaluada. Si ésta es no cero (verdadera), entonces la expresión 2 es evaluada. En caso contrario (expresión 1 es cero (falso)) la expresión 3 es evaluada.
Sólo una, expresión 2 o expresión 3, es evaluada.
Obs.: El operador condicional ?: es "ternario", en el sentido de que se aplica a tres expresiones o elementos. La mayoría de los operadores en C son "binarios"
(como la adición (+) y la sustracción (-)), y hay algunos "unarios" como ++ y -- ver ejC2
Profs. Buitrago - Jiménez
Operador ‘?:’
El operador ternario ‘?:’ no está restringido al formato de asignación, como en el siguiente ejemplo:
y = x > 9 ? 100 : 200;
Se puede tener un uso más amplio de este operador, tal como se muestra en este otro ejemplo:
Archivo main.c
#include <stdio.h>
int f1(int) , f2(void) ; main ()
{ int t;
printf("\nIngrese un entero: ");
scanf("%d",&t);
printf("\n");
t ? f1(t)+f2() :
printf("\nIngresó cero\n");
}
Archivo f1.c int f1(int n)
{ printf("%d",n);
return 0;
}
Archivo f2.c int f2(void)
{ printf(" fue el valor que Ud.
ingresó \n");
return 0;
}
ver ejemploC1B
2) Repetitivas
Esta instrucción repite el bloque de instrucciones hasta que la condición al inicio sea falsa.
2a) lazo “while”
char s1[100];
int i = 0;
scanf (“%s”, s1);
while (s1[i] != ‘\0’) i++;
printf (“longitud es %d \n”, i);
Ejemplo:
Al finalizar el programa, i es la longitud
del arreglo de caracteres s1. ver ejemploC3/ejC3
Estructuras de control 2) Repetitivas
Es similar al lazo “while” excepto que la prueba de la condición se lleva a cabo al final del lazo. Esto garantiza este se ejecute al menos una vez antes de terminar
2b) lazo “do . . . while”
int valor;
do {
printf(“Ingrese un número entero distinto de cero”);
printf(“o 0 para salir: \n”);
scanf (“%d”, &valor);
} while (valor != 0);
Ejemplo:
importante no olvidar
este punto y coma ver ejemploC3/ejC3
Profs. Buitrago - Jiménez
2) Repetitivas
Es para lazos donde se conoce el número de iteraciones de antemano.
2c) lazo “for”
Ejemplo: promedio de los números en un arreglo.
float arreglo[100];
float total = 0.0;
int i;
. . .
for (i=0; i < m; i++) total + = arreglo[i];
total = total / m;
. . . Consta de 3 partes:
• La inicialización de la variable del lazo
• La condición de terminación / prueba. Se sale cuando esta es falso.
• El tercero se ejecuta cada vez que el bloque de instrucciones del lazo se termina. Corresponde a un incremento de la variable índice del lazo.
Estructuras de control 2) Repetitivas
Obs. Se permite en estos lazos tener varias variables de control.
for ( h = 100, i = 0; h >= i; h--, i++);
2c) lazo “for” (cont.)
“break”: Esta instrucción es usada para salida abrupta de un lazo
“continue”: Es similar al “break”, pero obliga un salto inmediato a la instrucción de control del lazo.
• Lazo “while”, salta a la condición de prueba.
• Lazo “do . . . while”, salta a la condición de prueba.
• Lazo “for”, salta a la condición de prueba e inicia la iteración siguiente.
Profs. Buitrago - Jiménez
Ejemplo. Programa que imprime un vector de números reales de longitud 15 como una matriz de 3 filas y 5 columnas:
#include <stdio.h>
#include <stdlib.h>
main() {
int i, n = 15;
float a[ ] = {0., 1., 2., 3., 4., 5., 6., 7., 8., 9., 10., 11., 12., 13., 14. };
char c;
for (i = 0; i < n; i++ )
{ if (i%5 == 4 || i == n-1) c = ‘\n’;
else
c = ‘ ’;
printf(“%5.2f %c”, a[i], c);
} }
for (i = 0; i < n; i++ )
printf (“%5.2f %c”, a[i],
(i%5 == 4 || i == n-1) ? ‘\n’ : ‘ ‘);
ver ejemploC4/ejC4 y ejemploC4A1/ejC4A1
Profs. Buitrago - Jiménez
Estructura de control for
Se puede dar un uso amplio a las expresiones que conforman una estructura cíclica for, tal como se ilustra en el siguiente ejemplo:
Archivo main.c
#include <stdio.h>
int leer_num(void), indicador(void);
int cuadrado(int);
main () { int t;
for(indicador(); t=leer_num();
indicador()) cuadrado(t);
}
Archivo indicador.c
int indicador(void) { printf(": ");
return 0;
}
Archivo leer_num.c int leer_num(void) { int t;
scanf("%d",&t);
return t;
}
Archivo cuadrado.c
int cuadrado(int num)
{ printf("%d\n",num*num);
return 0;
} ver ejemploC4B
Se puede dar un uso amplio a las expresiones que conforman una estructura cíclica for, tal como se ilustra en el siguiente ejemplo:
/* Programa para sumar los enteros del 1 al 5 */
#include <stdio.h>
void main(void) {
int i=1, suma=0; /* primera forma */
for ( ; i<=5 ; ) { suma += i;
++i;
} printf("suma 1 = %d\n", suma);
suma=0; /* segunda forma */
for (i=1; i<=5; ++i) suma+=i;
printf("suma 2 = %d\n", suma);
for(i=1, suma=i; i<5 ; ++i, suma+=i) /* tercera forma */;
printf("suma 3 = %d\n", suma);
for(i=1, suma=0; i<=5 ; suma+=i, ++i) /* cuarta forma */;
printf("suma 4 = %d\n", suma);
4 formas distintas de escribir un bucle for para sumar los enteros del 1 al 5.
ver ejC_4formasFOR