Programación 1 Grado de Ingeniería Robótica Tema 3: Sentencias de control ● Índice (sesión 30/09/2016): – Algoritmos y programas – Estructura secuencial – Estructuras de selección 2 Tema 3: Sentencias de control ● Algoritmos y programas – Algoritmo – Conjunto de instrucciones que permiten hallar la solución a un determinado problema Programa ● ● Conjunto de sentencias escritas en un lenguaje determinado para que un ordenador lleve a cabo una tarea 3 Tema 3: Sentencias de control ● Algoritmos y programas – ● Los programas codificar algoritmos Ejemplo.- tarea: obtener el área de un triángulo – Algoritmo: multiplicar la base del triángulo por la altura del mismo y dividirla entre dos – Programa int base=3, altura=5; double area = base*altura/2.0; printf("El area de un triángulo de base %d y altura %d es %g\n", base, altura, area); 4 Tema 3: Sentencias de control ● Algoritmos y programas – En un determinado instante, el estado de un programa queda definido por el valor que tienen sus variables – El estado de un programa es dinámico, y puede cambiar con la ejecución de sentencias dentro del mismo → Es imprescindible realizar las sentencias adecuadas en el orden adecuado 5 Tema 3: Sentencias de control ● Estructura secuencial de un programa – Las instrucciones de un programa se ejecutan una tras otra de manera consecutiva en el orden establecido – Ejemplo: int valorA=11, valorB=4, resultado; ... resultado = valorA/valorB; valorA = valorA + 1; // resultado = 2 valorA = valorA + 1; resultado = valorA/valorB; // resultado = 3 No es lo mismo 6 Tema 3: Sentencias de control ● Estructura secuencial de un programa – Problemas comunes al seleccionar mal el orden de las instrucciones ● ● ● Uso de variables no inicializadas Impresión de variables antes de contener el valor final Instrucciones que no llegan a ejecutarse 7 Tema 3: Sentencias de control ● Estructuras de selección – Permiten que el programa determine las sentencias a ejecutar en base a condiciones ● Las condiciones se suelen obtener a partir de operadores relacionales, integrando como operandos valores, variables o constantes 8 Tema 3: Sentencias de control ● Estructuras de selección – Ejemplos donde se utilizan estructuras de selección ● ● ● Si el robot no tiene batería: ir a la zona de carga Si el robot está cerca de un obstáculo: reducir su velocidad Si el semáforo esta en rojo: detenernos, en cualquier otro caso: continuar 9 Tema 3: Sentencias de control ● Estructuras de selección: sentencia if if (condicion_a_cumplir) instruccion_a_realizar; cuando la instrucción sea una única línea if (condicion_a_cumplir) { instruccion_a_realizar; } cuando la instrucción tenga más de dos líneas 10 Tema 3: Sentencias de control ● Estructuras de selección: sentencia if – condicion_a_cumplir ● Valor que represente una condición (SI/NO) – Variable de tipo bool* *recuerda usar: #include <stdbool.h> – – El resultado de un operador relacional Variable de otro tipo (int, char, double, ...) → se maneja como una variable bool, tomando el valor false si vale 0 o true para cualquier otro valor → !! No aconsejado 11 Tema 3: Sentencias de control ● Guía de operaciones para operaciones lógicas varA ● varB ! varA varA && varB varA || varB true true false true true false true true false true true false - false true false false - false false Operadores relacionales – Mayor que, menor que, igual que → <, >, == – Mayor o igual que, menor o igual que → <=, >= – Distinto de → != 12 Tema 3: Sentencias de control ● Estructuras de selección: sentencia if bool fumador=true; double dineroAhorrado=500; ... if (fumador) dineroAhorrado = 0; ... if ( dineroAhorrado>1000 ) fumador = false; 13 Tema 3: Sentencias de control ● Estructuras de selección: sentencia if – El uso de llaves es: ● ● Opcional si la instrucción a ejecutar tiene una línea Obligatorio si la instrucción tiene dos o más líneas – Si no se añaden llaves, solamente la primera instrucción después del if (condicion_a_cumplir) será condicional: la segunda y sucesivas se ejecutarán siempre 14 Tema 3: Sentencias de control ● Estructuras de selección: sentencia if bool condicionCumplida = false; if(condicionCumplida) printf("Primera instrucción \n"); printf("Segunda instrucción \n"); printf("Tercera instrucción \n"); if(condicionCumplida) { printf("Primera instrucción \n"); printf("Segunda instrucción \n"); printf("Tercera instrucción \n"); } 15 Tema 3: Sentencias de control ● Estructuras de selección: sentencia if – La condicion_a_cumplir puede obtenerse mediante la combinación (usando operadores lógicos) de diferentes (sub)condiciones ● ● Uso (casi) obligatorio de paréntesis para determinar el orden de las operaciones – También es aconsejable a la hora de realizar operaciones aritméticas 1+2*3 no es lo mismo que (1+2)*3 Ejemplo (asumir variables de tipo bool, salvo tiempoEnEspera (int)) if(oscuridad || bateriaAgotada || (tiempoEnEspera>60 && !prioridad)) cameraEncendida = false; 16 Tema 3: Sentencias de control ● Estructuras de selección: sentencia if – Un programa con sentencias if puede visualizarse como un diagrama de la siguiente forma instruccionA(); if(condicion) instruccionSiSeCumpleCondicion(); instruccionB(); instruccionC(); 17 Tema 3: Sentencias de control ● Estructuras de selección: sentencia if – Un programa con sentencias if puede visualizarse como un diagrama de la siguiente forma Instrucción a Condición Instrucción ejecutada si cumple la condición Instrucción b Instrucción c 18 Tema 3: Sentencias de control ● Estructuras de selección: sentencia if … else – En ocasiones, tenemos instrucciones que sólo queremos que se ejecuten cuando no se de la condición → opción else if (condicion_a_cumplir) { instruccion_a_realizar_condicion_verdadera; } else { instruccion_a_realizar_condicion_falsa; } 19 Tema 3: Sentencias de control ● Estructuras de selección: sentencia if … else int dineroAhorrado = 25500; int precioCoche = 15000; if (dineroAhorrado<precioCoche) printf("Necesitas ahorrar, sólo tienes %d euros \n",dineroAhorrado); else printf("Ya puedes comprarte el coche de %d euros \n",precioCoche); 20 Tema 3: Sentencias de control ● Estructuras de selección: sentencia if … else – Podemos anidar condiciones usando la combinación else if double distancia; ... if(distancia<500) printf("Cerca \n"); else if(distancia<1500) printf("Distancia media \n"); else printf("Lejos\n"); 21 Tema 3: Sentencias de control ● Estructuras de selección: sentencia if...else Instrucción a Condición NO SI Instrucción ejecutada si se cumple la condición Instrucción ejecutada si NO se cumple la condición Instrucción b Instrucción c 22 Tema 3: Sentencias de control ● Estructuras de selección: sentencia if...else double distancia; ... distancia<500 SI “Cerca” NO distancia<1500 NO SI “Distancia Media” “Lejos” ... 23 Tema 3: Sentencias de control ● Estructuras de selección múltiple: switch … case – Cuando necesitamos seleccionar entre múltiples opciones usaremos switch, que usa como condiciones los posibles valores de una variable manejada como entera switch (variable_entera_a_evaluar) { case resultado_a: instruccion_a_realizar_resultado_a; break; case resultado_b: instruccion_a_realizar_resultado_b; break; default : instruccion_a_realizar_resultado_diferente_a_b; } 24 Tema 3: Sentencias de control ● Estructuras de selección múltiple: switch … case int numHermanos=6; // Prueba a usar 0,1,2,3,4 ... switch (numHermanos) { case 0: printf("Hijo/a único\n"); break; case 1: printf("Pareja \n"); break; case 2: printf("Familia numerosa \n"); break; default : printf("Familia muy numerosa \n"); } * los valores que aparecen dentro de case deben ser constantes enteras 25 Tema 3: Sentencias de control ● Estructuras de selección múltiple: switch … case – La sintaxis es algo compleja → practicar – Si el valor de la variable no está entre los valores de los case → default (es opcional, puede no aparecer) – La sentencia break evita que se ejecuten las instrucciones siguientes ● ● Por defecto, se ejecuta la instrucción del case correspondiente y la ejecución continúa hasta encontrar un break o terminar el switch Por tanto, el orden de los case importa si no vamos a usar sentencias break 26 Tema 3: Sentencias de control ● Estructuras de selección múltiple: switch … case int numHermanos=6; // Prueba a usar 0,1,2,3,4 ... switch (numHermanos) { case 0: printf("Hijo/a único\n"); case 1: printf("Pareja \n"); case 2: printf("Familia numerosa \n"); default : printf("Familia muy numerosa \n"); } 27 Tema 3: Sentencias de control ● Estructuras de selección múltiple: switch … case case(valor a): switch(variable) Instrucción a break; case(valor b): Instrucción b break; Si no hay opción por defecto (default) y el valor de variable no fuera a, b ni c case(valor c): Instrucción c break; default: Instrucción default ... 28 Tema 3: Sentencias de control ● Uso de enumeraciones junto a switch … case enum paloPoker{pica, corazon, trebol, diamante }; enum paloPoker miCarta = pica; switch (miCarta) { case diamante: printf("Diamante \n"); break; case trevol: printf("Trébol \n"); break; case corazon: printf("Corazón \n"); break; case pica: printf("Pica \n"); break; default : printf("La carta no es de poker \n"); } 29 Tema 3: Sentencias de control ● Otra forma de definir constantes const – const tipo identificador = valor; ● ● ● ● const.- palabra clave usado para crear constantes tipo.- palabra clave que determina el tipo de la variable: char, short, int, float, double identificador.- nombre asignado a la variable: elección del desarrollador valor.-valor compatible con el tipo de la variable 30 Tema 3: Sentencias de control ● Otra forma de definir constantes const – Ejemplo – const double cambioEuroPesetas = 166.386; Diferencias con #define ● ● #define afecta durante el proceso de pre-procesado, antes de la compilación(donde p.e., se eliminan los comentarios). const permite indicar de forma explícita el tipo de la constante 31 Tema 3: Sentencias de control ● Otra forma de definir constantes const – Diferencias con #define #include <stdio.h> #define VALOR_DEFINE 7 int main(int argc, char **argv) { const double valorDefine = 7; printf("La mitad de valor define: %g \n",VALOR_DEFINE/2); printf("La mitad de valor define: %g \n",valorDefine/2) return 0; } 32 Programación 1 Grado de Ingeniería Robótica