En C existen estas
construcciones para implementar algoritmos:
- Sentencias simples y sentencias compuestas (con las
llaves).
- Construcciones condicionales:
if ( expresión) sentencia
[ else sentencia ]
switch ( expresión) { caso1 caso2 ... casoN }
- Construcciones iterativas:
while ( expresión) sentencia
do sentencia while ( expresión);
for ( expresión; expresión; expresión ) sentencia
- Instrucciones de control de flujo: break, continue y goto.
4.1 Sentencias (statements)
Una sentencia es
un fragmento de código.
Una sentencia
simple es una expresión terminada en punto y coma.
Una sentencia
compuesta es una serie de sentencias entre llaves.
sentencia_simple;
// sentencia
compuesta: varias sentencias entre llaves.
{
sentencia
sentencia
...
}
Ejemplos:
/* sentencia simple */
x = y * 5 + sqrt(z);
/* sentencia compuesta con llaves */
{
a = b;
b = x + 1;
printf ( “hay %d productos”, num_prod );
}
/* sentencias compuestas dentro de otras */
{
{ x=1; y=2; }
{ z=0; printf(“hola\n”); }
}
4.2 Sentencia if
La construcción if sirve para ejecutar código sólo si una condición es cierta:
if ( condición )
sentencia
La condición
es una expresión de cualquier clase.
- Si el resultado de la expresión es CERO,
se considera una condición FALSA.
- Si el resultado de la expresión NO ES CERO,
se considera una condición CIERTA.
Ejemplo:
int x = 1;
main()
{
if ( x == 1 )
printf (“la variable x vale uno\n”);
if ( x>=2 && x<=10 )
printf (“x está entre 2 y 10\n”);
}
4.3 Construcción else
Con la
construcción else se pueden definir acciones para cuando la
condición del if sea falsa.
La sintaxis es
if ( condición )
sentencia
else
sentencia
Ejemplo:
if ( x==1 )
printf (“la variable x vale uno\n”);
else
printf (“x es distinta de uno\n”);
4.4 Bucle while
Para ejecutar el
mismo código varias veces, se puede utilizar:
while ( condición )
sentencia
La sentencia
se ejecuta una y otra vez mientras la condición sea cierta.
Ejemplos:
main()
{
int x=1;
while ( x < 100 )
{
printf(“Línea número %d\n”,x);
x++;
}
}
Ejemplo usando el
operador de predecremento:
main()
{
int x=10;
while ( --x )
{
printf(“una línea\n”);
}
}
En cada iteración
se decrementa la variable x y se comprueba el valor devuelto por --x. Cuando esta expresión devuelva un cero, se abandonará el bucle.
Esto ocurre después de la iteración en la que x vale uno.
4.5 Bucle for
También se pueden
ejecutar bucles con for, según esta sintaxis:
for ( expresión_inicial; condición; expresión_de_paso )
sentencia
La expresión_inicial
se ejecuta antes de entrar en el bucle.
Si la condición
es cierta, se ejecuta sentencia y después expresión_de_paso.
Luego se vuelve a
evaluar la condición, y así se ejecuta la sentencia una y otra
vez hasta que la condición sea falsa.
El bucle for es (casi) equivalente a
expresión_inicial;
while ( condición )
{
sentencia
expresión_de_paso;
}
Ejemplo típico de uso:
int i;
...
for ( i=0; i<10; i++ )
printf (“%d “, i );
4.6 Bucle for: omisión de expresiones
Las tres
expresiones del bucle for se pueden omitir, con el siguiente resultado.
Se omite
|
Resultado
|
expresión_inicial
|
no se hace nada
antes del bucle
|
condición
|
la condición es
siempre cierta (1)
|
expresión_de_paso
|
no se hace nada
tras cada iteración
|
Ejemplos:
for ( ; resultado!=-1 ; ) { ... }
for ( ; ; ) { /* Bucle infinito */ }
4.7 Bucle do...while
Parecido al bucle while, pero iterando al menos una vez.
Sintaxis:
do {
sentencia
} while ( condición );
La sentencia
se ejecuta al menos la primera vez; luego, mientras la condición sea
cierta, se itera la sentencia.
Se recomienda no
utilizar esta construcción, porque las construcciones while y for bastan para diseñar cualquier clase de
bucles. Muy pocos programas hoy día usan esta construccíón.
4.8 Control de bucles: break y continue
break y continue
permiten controlar la ejecución de bucles while, for y do...while
Se puede salir de
un bucle directamente con break.
continue va directamente al final del bucle y
emprende una nueva iteración.
while (...)
{
...
...
break;
...
}
while (...)
{
...
...
continue;
...
}
4.9
Instrucción goto
Sirve para saltar
incondicionalmente a un punto cualquiera del programa. La sintaxis es
goto etiqueta;
etiqueta es un identificador que indica el punto al
que queremos saltar. La etiqueta se define colocándola en el punto adecuado
seguida de dos puntos.
Sólo se puede
saltar a una etiqueta que se encuentre en la misma función donde se invoca a goto.
Ejemplo:
parriba: // declaración de etiqueta
...
// salto directo a una etiqueta
if (error) goto pabajo;
...
if (repetir) goto parriba;
pabajo: // declaración de etiqueta
4.10 Construcción switch
Se utiliza para
ejecutar acciones diferentes según el valor de una expresión.
Ejemplo de sintaxis:
switch ( expresión )
{
case valor1:
... sentenciasA...
break;
case valor2:
... sentenciasB ...
break;
case valor3:
case valor4:
... sentenciasC ...
break;
default:
... sentenciasD ...
}
Las sentenciasA se
ejecutarán si expresión adquiere el valor1.
Las sentenciasB se
ejecutarán si adquiere el valor2.
Las sentenciasC se
ejecutarán si adquiere el valor3 o el valor4,
indistintamente.
Cualquier otro
valor de expresión conduce a la ejecución de las sentenciasD; eso
viene indicado por la palabra reservada default.
Ejemplo de switch:
int opcion;
printf ( "Escriba 1 si desea continuar; 2 si desea terminar: " );
scanf ( "%d", &opcion );
switch ( opcion )
{
case 1:
printf ("Vale, continúo\n");
break;
case 2:
salir = 1;
break;
default:
printf ("opción no reconocida\n");
}
4.11 Precauciones con if y bucles
Asignaciones en los if
y los bucles
Hemos visto que
una asignación es una expresión. Por ello se puede colocar dentro de cualquier
construcción if, while o
similar:
if ( variable = valor ) { ... }
Este uso muchas
veces es erróneo, porque casi siempre pretendemos escribir:
if ( variable == valor ) { ... }
Pero como es
correcto, el compilador no abortará si se encuentra estas construcciones (de
todas formas, muchos compiladores emiten una advertencia si encuentran
asignaciones dentro de ifs).
Bucles for
Aunque el C lo
permite, es conveniente no modificar la variable contadora dentro del bucle.