Você está na página 1de 12

Guin 2: Estructuras de control

Expresiones y sentencias.
Expresin: Combinacin de operandos mediante operadores. La expresin ms simple es un operando aislado (una constante o una variable. La asignacin tambin posee un valor, que es el que adquiere la variable a la izquierda del signo igual. As se pueden realizar asignaciones mltiples. Ejemplo 2.1. Realizar un programa que asigne el nmero diez a tres variables enteras y despus imprima sus valores. #include <stdio.h> int main() { int a, b, c; a = b = c = 10; /* las tres variables valen lo mismo */ printf("a: %d, b: %d, c: %d.\n", a, b, c); system("pause"); return 0; } Ejercicio: Modificar el programa anterior para que lea por teclado el valor de una variable adicional y posteriormente asigne el valor de dicha variable adicional a las tres variables anteriores ("a", "b" y "c") mediante una asignacin mltiple. Un programa es un conjunto de sentencias. En C cada sentencia debe finalizar con un punto y coma. Una sentencia compuesta (bloque) es un conjunto de sentencias encerrado entre llaves.

La sentencia if.
Permite elegir la accin o acciones a realizar en funcin del valor de verdad de una expresin. if (<expresin>)

<sentencia> else <sentencia> Ejemplo 2.2. Realizar un programa que imprima por pantalla el valor absoluto de un entero pedido por el teclado. #include <stdio.h> int main() { int x, y; printf("Escribe un entero: "); scanf("%d", &x); if (x >= 0) y = x; else y = -x; printf("\nValor absoluto: %d.\n", y); system("pause"); return 0; } Ejercicio: Modificar el programa anterior para que lea por teclado dos enteros y posteriormente imprima en pantalla el mximo de ambos. Pueden escribirse sentencias anidadas, donde cada sentencia else es, a su vez, otra sentencia if-else. Ejemplo 2.3. Realizar un programa que lea un nmero a travs del teclado e indique si dicho nmero es positivo, negativo o igual a cero. #include <stdio.h> int main(){ int x; printf("Escribe un entero:"); scanf("%d", &x); putchar('\n'); /* Imprime un carcter de salto de lnea */

if (x != 0) { if (x > 0) printf("El entero es positivo.\n"); else printf("El entero es negativo.\n"); } /* Estas llaves pueden omitirse */ else printf("El entero es igual a cero.\n"); system("pause"); return 0; } Ejercicio: Modificar el programa anterior para que en primer lugar determine si el entero introducido por teclado es igual a cero, y en caso contrario discrimine si es positivo o negativo. Si existen sentencias if-else anidadas, cada sentencia else corresponde siempre a la sentencia if ms prxima. Ejemplo 2.4. Ejecutar el siguiente programa y comprobar que la sentencia else se halla vinculada a la segunda condicin, aunque por el estilo de escritura (sangrado) parezca que dicha sentencia depende de la primera condicin. #include <stdio.h> int main() { int a; printf("Escribe un entero: "); scanf("%d", &a); if (a >= 0) if (a == 1) printf("La variable \"a\" vale uno.\n"); else printf("El valor de \"a\" es negativo.\n"); system("pause"); return 0; }

Ejercicio: Modificar el programa anterior para que la sentencia else quede ahora vinculada a la primera condicin.

La sentencia switch.
Si un programa debe elegir una opcin entre varias, resulta ms legible si se usa una sentencia switch en vez de varias sentencias if-else anidadas. switch (<expresin entera>) { case const_1: <sentencia/s> break; /* opcional */ case const_2: <sentencia/s> break; /* opcional */ ... case const_n: <sentencia/s> break; /* opcional */ default: <sentencia/s> } Ejemplo 2.5. Realizar un programa que imprima por pantalla un comentario a una calificacin numrica introducida a travs del teclado. #include <stdio.h> int main() { unsigned nota; /* No existen notas negativas */ printf("Escribe una nota: "); scanf("%u", &nota); /* puts() imprime una cadena de caracteres */ switch (nota) { case 0: puts("\nNi idea."); break; case 1: case 2: case 3: puts("\nCasi ni idea."); break; case 4: puts("\nCasi apruebas."); break; case 5: puts("\nPor los pelos."); puts("Hay que aplicarse."); break; case 6: puts("\nBien aprobado."); break; case 7: case 8: puts("\nNotable."); break; case 9:

case 10: puts("\nSobresaliente"); break; default: puts("\nNota no permitida."); } system("pause"); return 0; } Si se omite la sentencia break, el flujo de ejecucin del programa contina ejecutando el conjunto de sentencias encerradas entre llaves, aunque stas se encuentren precedidas por otras etiquetas case. Ejercicio: Suprimir las sentencias break del programa anterior, ejecutarlo y comprobar el resultado. Limitaciones: - No es posible comprobar si el valor de la expresin pertenece a un rango de valores, nicamente se puede comprobar que la expresin coincide con una de las etiquetas precedidas por la palabra reservada case. - Ni la expresin ni las etiquetas pueden ser datos reales (de tipo float o double). Tan slo pueden ser de tipo entero o carcter. Ejercicio: Desarrollar un programa que lea por teclado dos reales (double) y el signo de uno de los siguientes operadores: +, -, *, /. El programa, segn el carcter del operador, seleccionar la operacin y mostrar el resultado en la pantalla. Tambin presentar un mensaje de error en el caso de que el usuario escriba un carcter distinto de los permitidos.

El bucle while.
Pertenece a la categora de bucles condicionales. La sentencia (simple o compuesta) se ejecuta de cero a n veces segn el valor de verdad de la expresin (condicin de entrada). while (<expresin>) <sentencia> Ejemplo 2.6. Escribir un programa que lea caracteres del teclado y los imprima por pantalla encriptados, a excepcin del carcter de salto de lnea ('\n'). La clave de encriptacin vale diez, de modo que el carcter que se imprime es el que hace diez a partir del carcter original, segn el cdigo de entrada/salida usado (ASCII en los ordenadores personales). Nota: La funcin getchar() lee un carcter de la entrada estndar, y la funcin putchar() lo escribe en la salida estndar.

/* programa sencillo de encriptacin */ #include <stdio.h> #define K 10 /* clave de encriptacin */ int main() { char ch; while ((ch = getchar()) != EOF) { if (ch == '\n') putchar(ch); /* '\n' no se encripta */ else putchar(ch + K); /* otro se encripta */ } /* las llaves se pueden omitir */ system("pause"); return 0; } Ejemplo 2.7. Escribir un programa que imprima por pantalla la suma de los cien primeros nmeros naturales. Nota: Obsrvese como el programa lleva a cabo una suma iterada: En cada iteracin del bucle se aade al acumulador (suma) el valor correspondiente del contador (n). Al principiosuma vale cero, lo cual es lgico puesto que todava no se le ha aadido ningn sumando. #include <stdio.h> #define TOPE 100 int main() { unsigned n = 1, sum = 0; while (n <= TOPE) { sum += n; /* sum = sum + n; */ n++; } printf("\nLa suma es: %u.\n", sum); system("pause"); return 0; }

Ejercicio: Tomando como base el programa del ejemplo 2.7, escribir otro que imprima la suma de los cuadrados de los k primeros nmeros naturales. El usuario deber introducir por teclado un valor para k mayor o igual que la unidad.

El bucle do-while.
La sentencia (simple o compuesta) se ejecuta de una a n veces segn el valor de verdad de la expresin (condicin de salida), la cual se comprueba tras cada iteracin. do <sentencia> while (<expresin>); Ejemplo 2.8. Escribir un programa para adivinar un nmero. /* programa para adivinar un nmero */ #include <stdio.h> #define NUM 1000 /*nmero a adivinar */ int main() { int elegido; do { printf("\nDame un entero: "); scanf("%d", &elegido); } while (elegido != NUM); puts("\nAcertaste!!!"); system("pause"); return 0; } Ejercicio: Rescribir el ejemplo 2.7 haciendo uso de la sentencia dowhile.

El bucle for.
Permite aumentar la legibilidad de los bucles en algunos casos y escribirlos de forma ms compacta. Al principio, y una sla vez, se ejecuta la expresin de inicializacin. Posteriormente se evala la expresin de test. Si sta es

cierta, se ejecuta la sentencia (simple o compuesta) y tras ella la expresin de actualizacin. El ciclo "test-sentencia-actualizacin" se repite mientras sea cierta la expresin de test. for (<inicializacin>; <test>; <actualizacin>) <sentencia> El formato anterior puede reescribirse del siguiente modo: <inicializacin>; while (<test>) { <sentencia> <actualizacin>; } Ejemplo 2.9. Escribir un programa que imprima por pantalla el factorial de un entero mayor o igual a cero introducido por el usuario a travs del teclado. #include <stdio.h> int main() { unsigned i, n; unsigned fact = 1; printf("\nEscribe un entero: "); scanf("%u", &n); for (i = 1; i <= n; i++) fact *= i; /* fact = fact * i; */ printf("\nFactorial de %u: %u.\n", n, fact); system("pause"); return 0; } Ejercicio: Rescribir el programa del ejemplo 2.7 mediante el uso de la sentencia for. Ejemplo 2.10. Escribir un programa que cuente desde uno hasta diez e imprima por pantalla dicha cuenta. #include <stdio.h> int main() { unsigned i; for (i = 1; i <= 10; i++)

printf("Cuenta: %d.\n", i); system("pause"); return 0; } Ejercicio: Modificar el programa del ejemplo 2.10 para que imprima la cuenta, en orden inverso, desde diez hasta uno. Ejemplo 2.11. Escribir un programa que imprima en orden las letras minsculas del abecedario y sus cdigos ASCII. #include <stdio.h> int main() { char ch; for (ch = 'a'; ch <= 'z'; ch++) printf("ASCII de %c: %d.\n", ch, ch); system("pause"); return 0; } Ejercicio: Modificar el programa del ejemplo 2.11 para que imprima, en orden inverso, las letras maysculas del abecedario y sus cdigos ASCII. Ejemplo 2.12. Comprobar que el siguiente programa contiene un bucle infinito y, por lo tanto, la ejecucin del programa se detiene en ste y para salir del mismo es necesario cerrar su ventana. #include <stdio.h> int main() { for ( ; ;) puts("Eternidad"); puts("Esta sentencia no se ejecuta."); system("pause"); return 0; } Ejemplo 2.13. Es posible omitir, cuando sea conveniente, algunas de las expresiones de la sentencia for: #include <stdio.h> int main() { unsigned i = 1;

for (; i <= 10; ) { printf("Cuenta: %d.\n", i); i++; } system("pause"); return 0; }

Las sentencias break; y continue;.


La sentencia break; puede utilizarse con los tres bucles anteriores. Cuando el programa llega a esta sentencia dentro de un bucle, el flujo abandona este ltimo y pasa a ejecutar la siguiente sentencia del programa. Normalmente se usa la sentencia break; cuando existe ms de una razn para abandonar la estructura iterativa: La ms importante se suele escribir como condicin del bucle y las dems se codifican como sentencias if (...) break;. Ejemplo 2.14. Escribir un programa que lea caracteres del teclado y los imprima por pantalla hasta que el usuario escriba el carcter de fin de fichero (^Z), el cual se encuentra codificado en el fichero de encabezamiento <stdio.h> como la constante EOF, o bien dicho usuario escriba en el teclado el carcter de salto de lnea ('\n'). #include <stdio.h> int main() { char ch; while ((ch = getchar()) != EOF) { if (ch == '\n') break; putchar(ch); /* no depende del "if" */; } system("pause"); return 0; } La sentencia continue; dentro de un bucle evita el resto de la iteracin y desvia el flujo del programa de nuevo hacia la expresin de test. Puede utilizarse en las tres sentencias iterativas anteriormente definidas, pero no en una sentencia switch.

Ejemplo 2.15. Modificar el programa del ejemplo 2.14 para que lea caracteres del teclado y los imprima por pantalla a excepcin del carcter de salto de lnea ('\n'), el cual se ignorar cada vez que el usuario lo escriba. Dicho programa finalizar su ejecucin cuando el usuario escriba el carcter de fin de fichero (^Z), el cual se encuentra codificado en el fichero de encabezamiento <stdio.h> como la constante EOF. #include <stdio.h> int main() { char ch; while ((ch = getchar()) != EOF) { if (ch == '\n') continue; putchar(ch); /* no depende del "if" */; } system("pause"); return 0; }

Ejercicios de afianzamiento.
Escribir un programa que acepte tres enteros a travs del teclado e imprima por pantalla el mayor y el menor de stos. Desarrollar un programa que resuelva la ecuacin de segundo grado: a x2 + b x + c. Para ello, el programa pedir en primer lugar los tres coeficientes reales. A continuacin, segn el signo del discriminante (b2 - 4 a c), presentar un mensaje para indicar al usuario si la ecuacin posee dos soluciones reales, una solucin doble o no tiene solucin en el conjunto de los nmeros reales. En los dos primeros casos el programa mostrar la solucin: (-b SQRT(b2 4 a c)) / 2 a. Codificar tres programas que sean equivalentes entre si y proporcionen el mismo resultado. El primero de ellos utilizara la sentencia while, el segundo la sentencia do-while y el tercero la sentencia for. Desarrollar un programa que muestre por pantalla la suma de los cien enteros siguientes a un entero positivo suministrado a travs del teclado. Escribir un programa que lea del teclado temperaturas expresadas en grados Farenheit y las convierta a grados Celsius. El programa finalizar cuando lea

un valor de temperatura igual a 999. La conversin de grados Farenheit (F) en Celsius (C) viene dada por la siguiente expresin: C = 5/9 * (F - 32). Nota: Para que la divisin de 5 entre 9 d como resultado un nmero real y no cero, el dividendo, el divisor o ambos deben ser de tipo real. Esto puede conseguirse mediante un moldeado (conversin de tipo) o escribiendo directamente las constantes como datos reales (double). Codificar un programa que muestre los n primeros trminos de la sucesin An = 1/2n. El primer trmino de la misma se corresponde con n igual a uno. El valor de n debe suministrarse a travs del teclado. Modificar el programa anterior para que muestre la suma de los n primeros trminos de la sucesin An = 1/2n. El primer trmino de la misma se corresponde con n igual a uno. El valor de n debe suministrarse a travs del teclado. Desarrollar un programa para calcular el mximo comn divisor de dos enteros positivos (unsigned) suministrados por teclado mediante el Algoritmo de Euclides, el cual se describe a continuacin. Sea T el mximo comn divisor de X e Y (T = MCD (X, Y)). Entonces se cumple: a) X > Y => T = MCD (X, Y) = MCD (X - Y, Y). b) X < Y => T = MCD (X, Y) = MCD (X, Y - X). c) X = Y => T = MCD (X, Y) = X = Y. Ejemplo: Hallar el mximo comn divisor de 1000 y 450. MCD (1000, 450) = MCD (550, 450); MCD (550, 450) = MCD (100, 450); MCD (100, 450) = MCD (100, 350); MCD (100, 350) = MCD (100, 250); MCD (100, 250) = MCD (100, 150); MCD (100, 150) = MCD (100, 50); MCD (100, 50) = MCD (50, 50); MCD (50, 50) = 50.

Você também pode gostar