Programación 1 Grado de Ingeniería Robótica Tema 3: Sentencias de control ● Índice (sesión 7/10/2016): – Estructuras de iteración – while ● do...while ● for Sentencias de entrada – Scanf Traza de un programa ● ● 2 Tema 3: Sentencias de control ● Estructuras de iteración – Permiten que un conjunto de sentencias se puedan repetir un número determinado de veces – Aspectos clave ● ● ● Cuerpo del bucle: ¿qué conjunto de instrucciones son las que se van a repetir? Condición: determina si el cuerpo se ejecuta una vez más o si el bucle debe terminar Contadores: uso de un contador que, a priori, determina el número de repeticiones del bucle 3 Tema 3: Sentencias de control ● Estructuras de iteración: sentencia while while (condicion_a_cumplir) { cuerpo_del_bucle; } *se puede usar la versión sin llaves cuando el cuerpo conste de una única instrucción (no recomendado) 4 Tema 3: Sentencias de control ● Estructuras de iteración: sentencia while – cuerpo_del_bucle; ● – Conjunto de instrucciones que se ejecutarán de forma interrumpida mientras se cumpla la condición condicion_a_cumplir ● ● Valor booleano (SI/NO) que proviene de una variable o una expresión lógica También puede ser una constante o valor, pero... 5 Tema 3: Sentencias de control ● Estructuras de iteración: sentencia while while (true) { cargaBateria = cargaBateria + 1; } ... while (estaLloviendo==true) { velocidad = moderada; parabrisasActivo = true; } 6 Tema 3: Sentencias de control ● Estructuras de iteración: sentencia while – Si condicion_a_cumplir no se modifica dentro del bucle (ni su valor puede modificarse de forma externa), el bucle se realizará ininterrumpidamente (si es cierta) ● – Eso ocurrirá usando constantes o valores Siempre que se haga un bucle ... ● Estudiar los posibles valores de la variable usada en la condición ... y su evolución a lo largo del bucle 7 Tema 3: Sentencias de control ● Estructuras de iteración: sentencia while while ( estaLloviendo==true ) { velocidad = moderada; parabrisasActivo = true; aguaRecogida = leerSensorLluvia(); if( aguaRecogida>0 ) estaLloviendo=true; else estaLloviendo = false; } 8 Tema 3: Sentencias de control ● Estructuras de iteración: sentencia while ... ¿Condición ? SI Cuerpo del bucle NO ... 9 Tema 3: Sentencias de control ● Estructuras de iteración: sentencia do … while do { cuerpo_del_bucle; } while (condicion_a_cumplir); *se puede usar la versión sin llaves cuando el cuerpo conste de una única instrucción (no recomendado) 10 Tema 3: Sentencias de control ● Estructuras de iteración: sentencia do … while – Debe entenderse como un caso específico de while donde al menos, el cuerpo del bucle se ejecutará una vez – La comprobación se realizará al final de la iteración, una vez ejecutadas todas las instrucciones del cuerpo del bucle – Debemos tener cuidado con el punto y coma, ya que aparece en la estructura do{...} while(); pero no en while(){...} 11 Tema 3: Sentencias de control ● Estructuras de iteración: sentencia do … while ... Contienen exactamente el mismo código !! Cuerpo del bucle ¿Condición ? SI Cuerpo del bucle NO ... 12 Tema 3: Sentencias de control int contador = 0; do { contador = contador +1; printf("Sumamos uno al contador \n"); } while(contador<3); 13 Tema 3: Sentencias de control ● Sentencia de entrada: scanf – La sentencia scanf nos permite leer desde la terminal la entrada realizada por teclado por el usuario. – Permite asociar el/los valor/es introducidos a diferentes variables declaradas previamente. – Se utilizan una serie de marcas, de forma análoga a printf, para dar formato a la entrada en base a los tipos base 14 Tema 3: Sentencias de control ● Sintaxis básica scanf(cadena de control, &var1, &var2, …, &varN); ● La cadena de control debe ir entre comillas dobles e incluir tantas marcas como valores queramos solicitar al usuario. Cada marca consta de un '%' y una letra indicando el tipo esperado. – ● ● Ejemplo: “%d %c” → Esperamos que el usuario introduzca un entero y un carácter simple. Cada variable debe venir precedida de '&', usado para el manejo de punteros (se verá en futuros temas) La ejecución se detendrá hasta que el usuario haya introducido valores paras las N variables solicitadas 15 Tema 3: Sentencias de control ● Sintaxis básica scanf(cadena de control, &val1, &val2, …, &valN); ● ● Como uso básico, utilizaremos los tipos usados hasta ahora con printf, salvo por el manejo del tipo double – Usando printf, podemos usar %f , %g, %e sin problema – Con scanf, debemos usar la marca %lf para double El resto de valores base usados hasta ahora se mantienen: c → char d → int f → float 16 Tema 3: Sentencias de control ● Sentencia de entrada: scanf – Ejemplo: obtener un número par del usuario do { printf("Introduce un número entero par \n"); scanf("%d", &valor); printf("Valor introducido: %d\n",valor); } while(valor%2 != 0); 17 Tema 3: Sentencias de control ● Sentencia de entrada: scanf (ejemplo con diferentes tipos) double peso, imc; int altura; char nom,ap1,ap2; printf("Introduce tus iniciales \n"); scanf("%c %c %c", &nom,&ap1, &ap2); printf("Introduce tu altura en centímetros\n"); scanf("%d", &altura); printf("Introduce tu peso en kilos\n"); scanf("%lf", &peso); printf("Peso: %g kilogramos y Altura: %d,%02d metros\n",peso, (altura/100),altura%100); imc = peso/((altura/100.0)*(altura/100.0)); printf("El IMC de %c%c%c es %g\n", nom,ap1,ap2, imc ); 18 Tema 3: Sentencias de control ● scanf es una fuente común de errores y problemas – Sintaxis compleja, tipos de datos, ejecución del programa, etc. scanf bloquea el programa hasta que se hayan introducido tantos valores como variables solicitadas Se recomienda usar printf para comprobar que las variables introducidas tienen el formato adecuado ● – → practicar !! 19 Tema 3: Sentencias de control ● Estructuras de iteración – En algunas ocasiones, conocemos de antemano el número de veces que debemos ejecutar el cuerpo de un bucle. – Para ello, añadimos un variable contadora que forma parte de condición →sentencia for 20 Tema 3: Sentencias de control ● Estructuras de iteración: sentencia for declaración_variable_contadora; for (inicialización; condición; modificación) { cuerpo_del_bucle; } *se puede usar la versión sin llaves cuando el cuerpo conste de una única instrucción (no recomendado) 21 Tema 3: Sentencias de control ● Estructuras de iteración: sentencia for (uso básico) – Inicialización – Asocia el valor inicial a la variable contadora ● Nombres comunes de variables: i, j, z Condición – Realiza una comprobación sobre la variable contadora → el resultado será V o F Modificación ● ● ● Cambia el valor de la variable contadora 22 Tema 3: Sentencias de control ● Estructuras de iteración: sentencia for ... Inicialización Modificación cuerpo_del_bucle; SI Condición NO ... 23 Tema 3: Sentencias de control ● Estructuras de iteración: sentencia for (uso básico) – La inicialización se realiza una única vez (0 y 1 son los valores iniciales más comunes) – Si la condición no se cumple, no se realiza ni el cuerpo del bucle ni la modificación – La condición suele comprobar que la variable contadora no supere un cierto umbral que determina el número de iteraciones – La modificación suele consistir en incrementos sobre la variable contadora 24 Tema 3: Sentencias de control ● Estructuras de iteración: sentencia for (uso básico) int i; for(i=0;i<=10;i++) printf("7 por %d es: %d\n",i,7*i); ● ● ● Inicialización: darle a i el valor 0 Condición: es i menor o igual que 10 Modificación: aumentar el valor de i en 1 i++ equivale a i=i+1 7 por 0 es: 0 7 por 1 es: 7 7 por 2 es: 14 7 por 3 es: 21 7 por 4 es: 28 7 por 5 es: 35 7 por 6 es: 42 7 por 7 es: 49 7 por 8 es: 56 7 por 9 es: 63 7 por 10 es: 70 25 Tema 3: Sentencias de control ● Equivalencia entre for y while for (inicialización; condición; modificación) { cuerpo_del_bucle; } inicialización while (condición) { cuerpo_del_bucle; modificación; } 26 Tema 3: Sentencias de control ● Estructuras de iteración: sentencia for → problemas comunes – Ejecución de iteraciones adicionales – Uso de menor/mayor que en lugar de menor/mayor o igual que ● Obviar el valor 0 y asumir que el contador empieza en 1 Bucles no controlados (número de iteraciones variable) – Ocurre cuando la variable contadora se modifica en el cuerpo del bucle – Sólo cuando se tenga experiencia y sea estrictamente necesario Bucles que nunca terminan ● ● ● Cambio de menor por mayor (o viceversa), decrementos en lugar de incrementos, etc. 27 Tema 3: Sentencias de control ● Traza de un programa – Secuencia de estados por los que pasa un programa, a través de los valores tomados por sus variables – Muy útiles para tareas de comprensión y depuración Permiten detectar y corregir errores, así como comprobar que el programa hace lo que realmente queremos Obtendremos la traza de un programa ejecutando de forma manual sus sentencias ● – ● Al programar → libreta y bolígrafo 28 Tema 3: Sentencias de control ● Traza de un programa – Ejemplo ● ● Todos los días paso por una librería y me compro una serie de libros siguiendo este patrón – día 1 → 1 libro, día 2 → 2 libros, día N → N libros Si tengo una estantería donde caben M libros – ¿ qué día llegaré a casa y no podré poner todos los libros que he comprado ? 29 Tema 3: Sentencias de control ● Traza de un programa int capacidadMaxima = 15, capacidadActual=0, dia=0; do { dia = dia +1; capacidadActual = capacidadActual +dia; }while(capacidadActual<=capacidadMaxima); printf("Rebasamos la capacidad el día %d", dia); 30 Tema 3: Sentencias de control ● Traza de un programa Ejecución del do...while dia capacidadActual #1 1 0+1 =0 #2 2 1+2 =3 #3 3 3+3 =6 #4 4 6 + 4 = 10 #5 5 10 + 5 = 15 #6 6 15 + 6 = 21 #7 31 Ejercicios para practicar ● ● Mostrar todos los múltiplos de un número dado en el rango [0,100] (ambos inclusive) – Pedir el número por consola – Uso del operando módulo → % Mostrar un menú donde, dados dos números enteros (elegidos por el programador, p.e. 15 y 7), el usuario pueda elegir entre realizar lo siguiente: – Mostrar el resultado de su suma y volver a mostrar el menú – Mostrar el resultado de su resta y volver a mostrar el menú – Mostrar el resultado de su multiplicación y volver a mostrar el menú – Mostrar el resultado de su división y volver a mostrar el menú – Mostrar el resultado de su módulo y volver a mostrar el menú – Salir del menú 32 Programación 1 Grado de Ingeniería Robótica