INGENIERÍA INFORMÁTICA Lenguajes de Programación E.P.S PRÁCTICAS de Lenguaje C Curso 02-03 Tema: Estructuras de Control I Lenguajes de Programación Estructuras de Control I ESTRUCTURAS DE CONTROL I 1 Preparación previa y objetivos 1.1 Preparación Previa Editar + Compilar + Depurar errores Sintácticos y Semánticos Declarar variables con tipos simples y usarlas en expresiones simples Entrada/Salida reducida con printf y scanf Iniciación y motivación a la programación estructurada 1.2 Objetivos de la Sesión Principales Aprender el uso de las variables lógicas y los operadores de relación. Aprender la sintaxis y semántica de las estructuras de control condicionales (if / else; switch / case). Secundarios Aprender a analizar el código desarrollado por otras personas Aprender a modificar el código desarrollado por otras personas Prácticas Pág. 2 Lenguajes de Programación Estructuras de Control I 2 Operadores relacionales y variables/ sentencias lógicas Los operadores de relación (>, >=, <, <=, = =, != ) devuelven un “valor 0” (1 generalmente) para una condición VERDADERA y un CERO para una condición de FALSA. Mediante los operadores lógicos ‘AND ‘ (&&) y ‘OR’ (| |) podemos combinar variables lógicas para obtener expresiones lógicas más elaboradas. Veamos dos ejemplos: Ejemplo 1: Predecid el resultado de los programas sin ejecutarlos. A continuación, compilarlos y ejecutarlos para comprobar la predicción. #include <stdio.h> /* Resultado de una expresión lógica. Funcion AND*/ void main() { float resultado; resultado = 0 && printf("0 && 0 = resultado = 0 && printf("0 && 1 = resultado = 1 && printf("1 && 0 = resultado = 1 && printf("1 && 1 = } 0; %f\n",resultado); 1; %f\n",resultado); 0; %f\n",resultado); 1; %f\n",resultado); ¿Cuándo una sentencia con “&&” es verdadera? ¿Cuándo es falsa? #include <stdio.h> /* Resultado de una expresión lógica. Funcion OR*/ void main() { float resultado; resultado = 0 || printf("0 || 0 = resultado = 0 || printf("0 || 1 = resultado = 1 || printf("1 || 0 = resultado = 1 || printf("1 || 1 = } 0; %f\n",resultado); 1; %f\n",resultado); 0; %f\n",resultado); 1; %f\n",resultado); ¿Cuándo una sentencia con “||” es verdadera? ¿Cuándo es falsa? Prácticas Pág. 3 Lenguajes de Programación Estructuras de Control I Para averiguar el resultado de una expresión lógica basta sustituir los operadores relacionales por su valor (0 o 1) y aplicar los criterios sobre el AND y el OR. Ejemplo 2: Editad el programa, analizadlo y predecid su resultado sin ejecutarlo. A continuación, compiladlo y ejecutadlo para comprobar la predicción. #include <stdio.h> void main() { int variable_logica; variable_logica = (5 < 7) && ((8 > 5) || (7 > 3)); printf("Que es esto => %d",variable_logica); } Ejercicio 1: Substituid en el programa anterior los valores 7 y 5 por dos variables enteras, n1 y n2, asignadas por el usuario por medio de instrucciones de entrada/salida. Probad los siguientes valores: n1=5, n2=7; n1=9, n2=8; n1=1, n2=9. Intentad predecir el valor de la variable lógica antes de ejecutar. (No olvideis de adjuntar todos los programas que hayais escrito o modificado en vuestra practica) Ejercicio 2: Dada la sentencia lógica: ((numero>=1.0) && (numero <=10.0))||((numero>=90.0) && (numero<=100.0)) Qué resultado obtendremos para: numero=11, numero=5, numero=105, numero=-1? Qué rango de valores podemos darle a la variable numero para que el resultado de la expresión sea: 1 | | 0, 1 | | 1? 3 Sentencias condicionales 3.1 La sentencia if / else Las sentencias lógicas son utilizadas por las sentencias condicionales if / else para controlar nuestro programa. Veamos un primer ejemplo: Ejemplo 3: #include <stdio.h> void main() { float numero; /* Valor proporcionado por el usuario. */ printf("Deme un numero del 1 al 10 => "); scanf("%f",&numero); if (numero > 5) printf("El numero es mayor que 5.\n"); printf("El numero leido fue %f.",numero); Prácticas Pág. 4 Lenguajes de Programación Estructuras de Control I } Editad el programa y analizadlo. Predecid el resultado del programa sin ejecutarlo, suponiendo que se introduzca como entrada el valor 6. A continuación compilad el programa y ejecutadlo para comprobar la predicción. Repetid la ejecución con los valores de entrada 5 y 4. Si tenéis problemas para entender el funcionamiento de la nueva estructura de control, utilizad la ayuda para obtener información sobre la palabra reservada (“keyword”) if, y/o preguntad al profesor de prácticas. Ejercicio 3: Añadid una condicional al programa anterior para controlar que el número introducido está entre 1 y 10. Sólo imprimiremos por pantalla en este caso. Ejercicio 4: Modificad el programa propuesto en el Ejercicio 8 de la práctica anterior para evitar la división por cero. Podemos dotar a nuestros programas de una estructura más rica mediante el uso de la sentencia else: Ejemplo 4.A: #include <stdio.h> void main() { float numero; /* Valor proporcionado por el usuario. */ printf("Deme un numero del 1 al 10 => "); scanf("%f",&numero); if (numero > 5) printf("El numero es mayor que 5.\n"); else printf("El numero es menor que 5.\n");} Ejemplo 4.B: Predecid el resultado del siguiente programa sin ejecutarlo, suponiendo que se introduzca como entrada el valor 11. A continuación compilad el programa y ejecutadlo para comprobar la predicción. Si es necesario ejecutadlo paso a paso para comprender su funcionamiento. Repetid la ejecución con los valores de entrada 5 y 93. #include <stdio.h> void main() { float numero; /* Valor proporcionado por el usuario. */ printf("\n\nDeme un numero del 1 al 100 => "); scanf("%f",&numero); if ((numero >= 1.0) && (numero <= 10.0)) printf("El numero es inferior a 10."); else if ((numero >= 90.0) && (numero <= 100.0)) printf("El numero es superior a 90."); else printf("El numero está entre 10 y 100."); } Prácticas Pág. 5 Lenguajes de Programación Estructuras de Control I Ejercicio 5: Modificad el programa del Ejercicio 4 de manera que de producirse una división por cero el programa de un mensaje de error y efectúe la operación en caso contrario. 3.2 La sentencia switch / case Mediante el uso de varias sentencias if / else, podemos implementar una selección entre varias alternativas: Ejemplo 5: Editad el programa y analizadlo. Predecid el resultado del programa sin ejecutarlo, suponiendo que se introduzca como entrada el valor ‘A’. A continuación compilad el programa y ejecutadlo para comprobar la predicción. Si es necesario ejecutadlo paso a paso para comprender su funcionamiento. #include <stdio.h> void main() { char eleccion; /* Elección del usuario. */ printf("\n\nElija la forma de la ley de Ohm que corresponda:\n"); printf("A] Voltaje B] Intensidad C] Resistencia\n"); printf("Su eleccion (A, B, o C) => "); eleccion = getche(); if (eleccion == 'A') printf("V = I * R"); else if (eleccion == 'B') printf("I = V / R"); else if (eleccion == 'C') printf("R = V / I"); else printf("Eleccion incorrecta.\n"); } Sin embargo, el lenguaje C dispone de una instrucción que permite codificar varias sentencias if / else: Ejercicio 6: Añadid un switch / case al programa del Ejercicio 5 que permita al usuario escoger la operación a realizar. El Ejercicio 7 os ayudará a preparar la prueba de la siguiente práctica. Los Ejercicios 8 y 9 son opcionales. Ejercicio 7: Programad el juego de adivinar un número. Utilizad las funciones random y randomize para generar un número aleatorio entre 1 y 20. Si el usuario lo acierta felicitadle, sino decidle que número había generado el ordenador. (La ayuda del compilador debe proporcionaros toda la información necesaria sobre random y randomize). Prácticas Pág. 6 Lenguajes de Programación Estructuras de Control I Ejercicio 8: Acceso aleatorio a un vector. Definid el vector de caracteres char premios[ ]={‘c’,’m’, ‘a’,’v’, ‘d’,’n’}; Debemos interpretarlos como sigue: ‘c’= coche, ‘m’= moto, ‘a’= apartamento, ‘v’= viaje, ‘d’= dinero, ‘n’= nada. Usad la generación de números aleatorios para simular una Lotería. Generad un número del 0 al 5 e imprimid el número y el premio correspondiente (usad un switch/case para seleccionar el premio a partir del caracter). Si no ha tocado nada, dadle el pésame. Si el premio es “dinero”, decid al jugador que pulse una tecla para saber la cantidad que le ha tocado y generad un número entre 0 y el premio máximo (en euros) que queráis otorgar. Ejercicio 9: Usad las funciones standard ceil( ), floor( ) para hacer un programa que dado un número real positivo (introducido por el usuario) devuelva (por pantalla) el entero más cercano (esto es, Implementad una función round( )). (La ayuda del compilador debe proporcionaros toda la informaci’on necesaria sobre random y randomize).. Prácticas Pág. 7 Lenguajes de Programación Estructuras de Control I Agradecimientos: Esta práctica está basada en las prácticas de Ingeniería informática realizadas por el Dept. Informàtica, Escola Tècnica Superior d'Enginyeria, Universitat Autònoma de Barcelona Prácticas Pág. 8