Documente Academic
Documente Profesional
Documente Cultură
Programacin estructurada Estructuras condicionales La sentencia if La clusula else Encadenamiento y anidamiento El operador condicional ?: La sentencia switch Estructuras repetitivas/iterativas El bucle while El bucle for El bucle dowhile Bucles anidados Cuestiones de estilo Vectores y matrices Algoritmos de ordenacin Algoritmos de bsqueda
Programacin estructurada
IDEA CENTRAL: Las estructuras de control de un programa slo deben tener un punto de entrada y un punto de salida.
La programacin estructurada... mejora la productividad de los programadores. mejora la legibilidad del cdigo resultante.
La ejecucin de un programa estructurado progresa disciplinadamente, en vez de saltar de un sitio a otro de forma impredecible
Gracias a ello, los programas resultan ms fciles de probar se pueden depurar ms fcilmente se pueden modificar con mayor comodidad
Estructuras de control - C
-1-
Fernando Berzal
Secuencia Conjunto de sentencias que se ejecutan en orden Ejemplos: Sentencias de asignacin y llamadas a rutinas.
Seleccin Elige qu sentencias se ejecutan en funcin de una condicin. Ejemplos: Estructuras de control condicional if-then-else y case/switch
Iteracin Las estructuras de control repetitivas repiten conjuntos de instrucciones. Ejemplos: Bucles while, do...while y for.
Teorema de Bhm y Jacopini (1966): Cualquier programa de ordenador puede disearse e implementarse utilizando nicamente las tres construcciones estructuradas (secuencia, seleccin e iteracin; esto es, sin sentencias goto).
Bhm, C. & Jacopini, G.: Flow diagrams, Turing machines, and languages only with two formation rules. Communications of the ACM, 1966, Vol. 9, No. 5, pp. 366-371 Dijkstra, E.W.: Goto statement considered harmful. Communications of the ACM, 1968, Vol. 11, No. 3, pp. 147-148
Estructuras de control - C -2 Fernando Berzal
El orden secuencial de ejecucin no altera el flujo de control del programa respecto al orden de escritura de las instrucciones.
Sin embargo, al describir la resolucin de un problema, es normal que tengamos que tener en cuenta condiciones que influyen sobre la secuencia de pasos que hay que dar para resolver el problema:
Segn se cumplan o no determinadas condiciones, la secuencia de pasos involucrada en la realizacin de una tarea ser diferente
Las estructuras de control condicionales o selectivas nos permiten decidir qu ejecutar y qu no en un programa.
Estructuras de control - C
-3-
Fernando Berzal
Condicin_1
Cierta
Cierta
Condicin_2
Falsa
Falsa
Bloque_1
Bloque_3
Bloque_
Bloque_2
Bloque_5
SIENTONCES
SIENTONCESSINO
Sintaxis
if (condicin) sentencia;
if (condicin) { bloque }
Consideraciones acerca del uso de la sentencia if - Olvidar los parntesis al poner la condicin del if es un error sintctico (los parntesis son necesarios) - Confundir el operador de comparacin == con el operador de asignacin = puede producir errores inesperados - Los operadores de comparacin ==, !=, <= y >= han de escribirse sin espacios. - => y =< no son operadores vlidos en C. - El fragmento de cdigo afectado por la condicin del if debe sangrarse para que visualmente se interprete correctamente el mbito de la sentencia if:
if (condicin) { // Aqu se incluye el cdigo // que ha de ejecutarse slo // si se cumple la condicin del if // (sangrado para que se vea dnde // empieza y dnde acaba el if) }
Error comn:
if (condicin); sentencia;
es interpretado como
if (condicin) ; // Sentencia vaca sentencia;
#include <stdio.h> int main (int argc, char *argv[]) { int x; printf(Dme un numero); scanf(%d,&x); if (x>0) { printf(El numero %d es positivo,x); } return 0; }
Estructuras de control - C
-6-
Fernando Berzal
La clusula else
Una sentencia if, cuando incluye la clusula else, permite ejecutar un bloque de cdigo si se cumple la condicin y otro bloque de cdigo diferente si la condicin no se cumple.
Condicin_1
Cierta
Cierta
Condicin_2
Falsa
Falsa
Bloque_1
Bloque_3
Bloque_4
Bloque_2
Bloque_5
SIENTONCES
SIENTONCESSINO
Sintaxis
if (condicin) sentencia1; else sentencia2;
#include <stdio.h> void main () { int x; printf(Dme un numero: ); scanf(%d,&x); if (x>=0) { printf(El numero %d es positivo, x); } else { printf(El numero %d es negativo, x); } }
Encadenamiento
Las sentencias if se suelen encadenar:
if else if
#include <stdio.h> void main () { float nota; printf(Dme una nota: ); scanf(%f,¬a); if (nota>=9) { printf(Sobresaliente); } else if (nota>=7) { printf(Notable); } else if (nota>=5) { printf(Aprobado); } else { printf(Suspenso); } }
Anidamiento
Las sentencias if tambin se pueden anidar unas dentro de otras.
El operador condicional ?:
C proporciona una forma de abreviar una sentencia if
Sintaxis
condicin? expresin1: expresin2
equivale a
if (condicin) expresin1 else expresin2
Slo se evala una de las sentencias, por lo que deberemos ser cuidadosos con los efectos colaterales.
Ejemplos
max = (x>y)? x : y; min = (x<y)? x : y; med = (x<y)? ((y<z)? y: ((z<x)? x: z)): ((x<z)? x: ((z<y)? y: z));
Estructuras de control - C
- 11 -
Fernando Berzal
Se selecciona a partir de la evaluacin de una nica expresin. La expresin del switch ha de ser de tipo entero. Los valores de cada caso del switch han de ser constantes. La etiqueta default marca el bloque de cdigo que se ejecuta por defecto (cuando al evaluar la expresin se obtiene un valor no especificado por los casos del switch). En C, se ejecutan todas las sentencias incluidas a partir del caso correspondiente, salvo que explcitamente usemos break:
switch (expresin) { case expr_cte1: sentencia1; break; case expr_cte2: case expr_cte3: sentenciaN; } switch (expresin) { case expr_cte1: sentencia1; break; case expr_cte2: sentencia2; break; default: sentencia; }
- 12 Fernando Berzal
Estructuras de control - C
Ejemplo
#include <stdio.h> void main() { int nota; printf(Calificacin: ); scanf(%d, ¬a); switch (nota) { case case case case case 0: 1: 2: 3: 4: printf(Suspenso); break;
case 5: case 6: printf(Aprobado); break; case 7: case 8: printf(Notable); break; case 9: printf(Sobresaliente); break; case 10: printf(Matrcula); break; default: printf(Error); } }
Si trabajamos con datos de tipo real, tendremos que usar sentencias if encadenadas.
Estructuras de control - 13 Fernando Berzal
Podramos escribir un programa en el que apareciese repetido el cdigo que deseamos que se ejecute varias veces, pero Nuestro programa podra ser demasiado largo. Gran parte del cdigo del programa estara duplicado, lo que dificultara su mantenimiento en caso de que tuvisemos que hacer cualquier cambio, por trivial que fuese ste. Una vez escrito el programa para un nmero determinado de repeticiones (p.ej. sumar matrices 3x3), el mismo programa no podramos reutilizarlo si necesitsemos realizar un nmero distinto de operaciones (p.ej. matrices 4x4).
Las estructuras de control repetitivas o iterativas, tambin conocidas como bucles, nos permiten resolver de forma elegante este tipo de problemas. Algunas podemos usarlas cuando conocemos el nmero de veces que deben repetirse las operaciones. Otras nos permiten repetir un conjunto de operaciones mientras se cumpla una condicin.
El bucle while
Condicin
Bloque S
No
MUY IMPORTANTE En el cuerpo del bucle debe existir algo que haga variar el valor asociado a la condicin que gobierna la ejecucin del bucle.
Estructuras de control - C
- 15 -
Fernando Berzal
Estructuras de control - C
- 16 -
Fernando Berzal
// // // //
Nmero de datos Suma de los datos Nmero ledo desde el teclado Contador
printf (Nmero total de datos: ); scanf (%d,&total); suma = 0; // Inicializacin de la suma i = 0; // Inicializacin del contador while (i<total) { printf (Dato %d: , i); scanf (%lf,&n); suma = suma + n; i++; } printf (Suma total = %lf\n, suma); }
Tal como est implementado el programa, fcilmente podramos calcular la media de los datos (suma/total). EJERCICIO Ampliar el programa anterior para que, adems de la suma y de la media, nos calcule tambin el mximo, el mnimo, la varianza y la desviacin tpica de los datos. Pista:
Estructuras de control - C
En los ejemplos anteriores se conoce de antemano el nmero de iteraciones que han de realizarse (cuntas veces se debe ejecutar el bucle): En este caso, la expresin del while se convierte en una simple comprobacin del valor de una variable contador (una variable que se incrementa o decrementa en cada iteracin y nos permite contabilizar la iteracin en la que nos encontramos). En otras ocasiones, puede que no conozcamos de antemano cuntas iteraciones se han de realizar. Ejemplo Sumar una serie de nmeros hasta que el usuario introduzca un cero
#include <stdio.h> void main() { double suma; double n;
suma = 0; // Inicializacin de la suma printf (Introduzca un nmero (0 para terminar): ); scanf (%lf, &n); while (n!=0) { suma = suma + n; printf (Introduzca un nmero (0 para terminar): ); scanf (%lf, &n); } printf (Suma total = %lf\n, suma); }
El bucle for
Se suele emplear en sustitucin del bucle while cuando se conoce el nmero de iteraciones que hay que realizar. Sintaxis
for (exp1; exp2; exp3) { bloque; }
equivale a
Estructuras de control - C
Bucle while #include <stdio.h> void main() { long i, n, factorial; printf ("Introduzca un nmero: "); scanf ("%ld", &n); factorial = 1; i = 1; while (i<=n) { factorial *= i; i++; } printf ("factorial(%ld) = %ld", n, factorial); }
Estructuras de control - C - 20 Fernando Berzal
En un bucle for La primera expresin, expr1, suele contener inicializaciones de variables separadas por comas. En especial, siempre aparecer la inicializacin de la variable que hace de contador. Las instrucciones que se encuentran en esta parte del for slo se ejecutarn una vez antes de la primera ejecucin del cuerpo del bucle (bloque). La segunda expresin, expr2, es la que contiene una expresin booleana (la que aparecera en la condicin del bucle while equivalente para controlae la ejecucin del cuerpo del bucle). La tercera expresin, expr3, contiene las instrucciones, separadas por comas, que se deben ejecutar al finalizar cada iteracin del bucle (p.ej. el incremento/decremento de la variable contador). El bloque de instrucciones bloque es el mbito del bucle (el bloque de instrucciones que se ejecuta en cada iteracin).
Estructuras de control - C
- 21 -
Fernando Berzal
Nmero de iteraciones N N+1 N-k N N+1 N-k N/k (N-j)/k log2 N log2 N + 1
Si nunca deja de cumplirse la condicin del bucle, nuestro programa se quedar indefinidamente ejecutando el cuerpo del bucle, sin llegar a salir de l.
Estructuras de control - C - 22 Fernando Berzal
El bucle do while
Tipo de bucle, similar al while, que realiza la comprobacin de la condicin despus de ejecutar el cuerpo del bucle. Sintaxis
do sentencia; while (condicin);
El bloque de instrucciones se ejecuta al menos una vez. Especialmente indicado para validar datos de entrada (comprobar que los valores obtenidos estn dentro del rango de valores esperados).
Estructuras de control - C
- 23 -
Fernando Berzal
IMPORTANTE En todos nuestros programas debemos asegurarnos de que se obtienen datos de entrada vlidos antes de realizar cualquier tipo de operacin con ellos.
Estructuras de control - C
- 24 -
Fernando Berzal
#include <stdio.h> #include <math.h> void main() { // Declaracin de variables double n; double r; double prev; // Nmero real // Raz cuadrada del nmero // Aproximacin previa de la raz
// Entrada de datos do { printf("Introduzca un nmero positivo: "); scanf("%lf", &n); } while (n<0); // Clculo de la raz cuadrada r = n/2; do { prev = r; r = (r+n/r)/2; } while (fabs(r-prev) > 1e-6); // Resultado printf("La raz cuadrada de %lf es %lf", n, r); }
NOTA: La funcin abs nos da el valor absoluto de un nmeo entero. Para trabajar con reales hemos de usar fabs.
Estructuras de control - C
- 25 -
Fernando Berzal
Bucles anidados
Los bucles tambin se pueden anidar:
Ejemplo
#include <stdio.h> void main () { int n,i,k; n = 0; for (i=1; i<=2; i++) { for (k=5; k>=1; k-=2) { n = n + i + k; } } printf("N vale %d", n); }
Paso N i k 1 0 ? ? 1 5 3 1 1 2 3 4 6 5 3 4 10 5 3 4 12 2 5 3 1 1 5 3 6 2 3 4 19 5 3 4 24 5 3 4 27 3 5 3 6 2 7
Estructuras de control - C
- 26 -
Fernando Berzal
Cuestiones de estilo
Escribimos cdigo para que lo puedan leer otras personas, no slo para que lo traduzca el compilador.
Identificadores
q
En ocasiones, se permite el uso de nombres cortos para variables locales cuyo significado es evidente (p.ej. bucles controlados por contador)
for (elemento=0; elemento<N; elemento++ ) for (i=0; i<N; i++)
Constantes
q
Se considera una mala costumbre incluir literales de tipo numrico (nmeros mgicos) en medio del cdigo. Se prefiere la definicin de constantes simblicas (con #define o, mejor an, con enum).
for (i=0; i<79; i++) for (i=0; i<columnas-1; i++)
Estructuras de control - C
- 27 -
Fernando Berzal
Expresiones
q
max = (a > b) ? a : b;
Comentarios
q
Comentarios descriptivos: Los comentarios deben comunicar algo. Jams se utilizarn para parafrasear el cdigo y repetir lo que es obvio.
i++; /* Incrementa el contador */
Estructuras de control - C
- 28 -
Fernando Berzal
Estructuras de control
q
Sangras: Conviene utilizar espacios en blanco o separadores para delimitar el mbito de las estructuras de control de nuestros programas. Lneas en blanco: Para delimitar claramente los distintos bloques de cdigo en nuestros programas dejaremos lneas en blanco entre ellos. Salvo en la cabecera de los bucles for, slo incluiremos una sentencia por lnea de cdigo. Sean cuales sean las convenciones utilizadas al escribir cdigo (p.ej. uso de sangras y llaves), hay que ser consistente en su utilizacin. while () { } while () { } for (;;) { } if () { }
for (;;) { }
if () { }
El cdigo bien escrito es ms fcil de leer, entender y mantener (adems, seguramente tiene menos errores)
Estructuras de control - C
- 29 -
Fernando Berzal