Estructuras de control condicional Programacin bsica Operadores relacionales
Estructuras de control condicional Programación básica
Operadores relacionales Los operadores relacionales permiten construir expresiones booleanas es decir, expresiones cuyo valor es 1 o 0. Los operadores relacionales permiten comparar valores o expresiones aritméticas. En C el valor 1 se interpreta como verdadero y el 0 como falso. Operador Significado == igualdad != Diferente > Mayor que < Menor que >= Mayor o igual <= Menor o igual
Ejemplos 1 > 2 = 0 falso 3 < 5 = 1 verdadero (7 – 4) == 3 = 1 verdadero 17 >= (5 + 12) = 1 verdadero = 0 falso (3*a – 0. 3) == 0 falso (OJO con los reales) 3 > 1 > 0 = 1 verdadero i = 3; j = 7; i * j != 21 float a=0. 1; Asignar a una variable la mayor de otras dos: a = 17; b = 15; c = a*(a>=b) + b*(b>=a); c = 17 a>=b = 1 y b>=a = 0
Tarea Encuentre el valor de las siguientes expresiones relacionales 2 != 7 3 > 2 -1 <= -2 (5 – 7) > (3 – 4) (3*2 + 5*4) == (8*5/2 + 4*4 – 10) Encuentre el valor asignado a la variable x, suponga a = 3, b = 4, c = 12 x = (2*a > c – b)*c + (c == 2*b + 2*a – 2)*a; x = (a <= b)*(a – b) + (c > 2*a + 5)*(c – 2*a);
Uso de expresiones para tomar decisiones Se pueden utilizar expresiones relacionales para seleccionar entre dos o más expresiones a evaluar. Por ejemplo: (3*a + b)*(a<0) + (5*a – b)*(a>=0) Será igual a 3*a+ b si a es menor que cero, e igual a 5*a – b si a es mayor o igual a cero. Por ejemplo se a = – 3 y b= 4, la expresión se evaluara como: (3*(– 3)+4)*(– 3<0)+(5*(– 3)– 4)*(– 3>=0)=(– 9+4)*(1)+(– 15– 4)*(0)= – 5 Si a = 2 y b = 4, el valor será (3*(2)+4)*(2<0)+(5*(2)– 4)*(2>=0)=(6+4)*(0)+(10– 4)*(1)=6
Ejemplo de conversión con expresiones relacionales El siguiente programa convierte una temperatura leída desde el teclado de la escala Celsius a la Farenheit y viceversa. Se le solicita al usuario el tipo de conversión que desea realizar: main(){ float temp. Original, temp. Convertida; int opcion; cout << "Teclee temperatura: "; cin >> temp. Original; cout << "Tipo de conversión (1 - C a F, 2 - F a C): "; cin >> opcion; //solicita tipo de conversión temp. Convertida = (opcion==1)*(9*temp. Original/5+32)+ (opcion==2)*(5. 0/9*(temp. Original-32)); cout << "Valor convertido: " << temp. Convertida << endl; }
Actividad Modifique el programa de conversión de temperaturas para incluir conversiones de centígrados a Kelvin y Kelvin a centígrados.
Sentencia if La sentencia if permite decidir ejecutar o no una instrucción o un bloque de instrucciones. Sintaxis if (condición) Instrucción o bloque; Un bloque es una secuencia de instrucciones englobadas entre llaves (“{}”). La condición esta formada por una expresión booleana. verdadero condición falso sentencias
Ejemplo de if simple Prueba si un número leído desde el teclado es par. #include <iostream. h> int main() { int numero; cout << "teclee un número: "; cin >> numero; if(numero % 2 == 0) cout << "número par"; return 0; }
Ejemplo 2 de if simple Si el número a es divisible por el número b, se despliega el número de veces que a es mayor que b. #include <iostream. h> int main() { int a, b, n; cout << "teclee un número: "; cin >> a; cout << "teclee un número: "; cin >> b; if(a % b == 0){ n = a / b; cout << a << " es " << n << " veces " << b; } return 0; }
Sentencia if - else La sentencia if – else permite decidir entre ejecutar una instrucción (o un bloque de instrucciones) y otra instrucción (o un bloque de instrucciones) Sintaxis if (condición) Instrucción o bloque; else Instrucción o bloque; falso verdadero condición sentencias
Ejemplo de if - else simple Prueba si un número leído desde el teclado es par. #include <iostream. h> int main() { int numero; cout << "teclee un número: "; cin >> numero; if(numero % 2 == 0) cout << "número par"; else cout << "número impar"; return 0; }
Tarea Escriba un programa que lea tres números reales y decida si forman un triángulo. Suponga que los números se leen de mayor a menor. Escriba un programa que lea tres números reales representando los lados de un triángulo y decida si el triángulo es rectángulo o no. Suponga que los números se leen de mayor a menor. Entregar impreso.
Intersección de dos rectas Programa para determinar si dos rectas se interceptan Suponga que las rectas se representan por la ecuación de la forma y = m x + b Donde m es la pendiente y b es la ordenada al origen. La única forma en que las dos rectas no se interceptan en un punto es cuando son paralelas, es decir, cuando las dos tienen la misma pendiente. Podemos expresar el algoritmo de la siguiente forma si pendiente 1 diferente de pendiente 2 calcular la intersección imprimir resultado sino informar que no se interceptan
Programa #include <iostream. h> int main() { float m 1, m 2, b 1, b 2, x, y; cout << "teclee la pendiente y ordenada al origen 1: "; cin >> m 1 >> b 1; cout << "teclee la pendiente y ordenada al origen 2: "; cin >> m 2 >> b 2; if(m 1 != m 2){ x = (b 2 - b 1)/(m 1 - m 2); y = m 1*x+b 1; cout << "Las rectas se interceptan en: " << x << ", " << y << endl; } else cout << "Las rectas no se interceptan. . . "; return 0; }
Sistema de ecuaciones 2 x 2 Se desea resolver un sistema de ecuaciones de 2 x 2 de la forma a x + b y = c d x + e y = f El sistema puede resolverse con las fórmulas x = (c e – b f) / (a e – b d) y = (a g – c e) / (a e – b d) El sistema tiene solución si el denominador de estas fracciones es diferente de cero. El algoritmo es: si (a f – b e ) != 0 calcular solución mostrar resultado sino informar que no hay solución
Programa sis 2 x 2. cpp #include <iostream. h> int main() { float a, b, c, d, e, f, x, y; cout << "teclee los coeficientes a, b, c, d, e, f: "; cin >> a >> b >> c >> d >> e >> f; if( (a*f - b*e) != 0){ x = (c*e - b*f)/(a*e - b*d); y = (a*f - c*d)/(a*e - b*d); cout << " x = " << x << "ny = " << y << endl; } else cout << "El sistema no tiene soluciónn"; return 0; }
Tarea Un punto está sobre una recta si al avaluar la ecuación y – mx – b se obtiene un valor positivo y está bajo la recta si se obtiene un valor negarivo. Escriba un programa que lea los valores de la pendiente m y la ordenada al origen b, y las coordenadas (x, y) de un punto e imprima si el punto esta sobre o bajo la recta. (x, y) y – mx + b > 0 y = mx + b y – mx + b < 0
Operadores lógicos Existen 4 operadores lógicos en C: and = &&, or = ||, not = !, xor = ^. Los operadores lógicos tienen una prioridad más baja que los operadores relacionales. expresión 1 expresión 2 expresión 1 && expresión 2 expresión 1 || expresión 2 0 0 0 0 1 1 1 0 0 1 1 1 1 expresión ! expresión 1 expresión 2 expresión 1 ^ expresión 2 0 1 0 0 1 1 1 0 Prioridad de evaluación ! && ||
ejemplos de operadores lógicos x > 5 || x == 3 verdadero para x = 3, 6, 7, . . . ! (x == 7) && x % 2 != 0 verdadero para x = 1, 3, 5, 9, 11, . . . x <= -1 || x > 5 || x ==2 verdadero para x = …, -2, -1, 2, 6, 7, 8, . . . En el siguiente fragmento se despliegan solo los múltiplos de 7 o cuadrados perfectos if(num % 7 == 0 || sqrt(num)-floor(sqrt(num))==0)
Discusión Escriba sentencias que sean verdaderas para: x = 1, 2, 4, 8 x = 7, 14, 21, …, 49 x = 1, 2, 3, 6, 7, 8, 9 x = …, - 5, -3, -1, 0, 2, 4, 6, …
Anidamiento Una sentencia if puede tener en su parte verdadera o falsa otra sentencia if. O sea if(condición 1) if(condición 2) if(condición 3) sentencias; else if(condición 2) if(condición 3). . .
Ejemplo de anidamiento Se desea un programa para imprimir un letrero dependiendo de la siguiente tabla: condición letrero cal < 6 “Reprobado” 6 <= cal < 7 “Suficiente” 7 <= cal < 8 “Bien” 8 <= cal < 9 “Muy bien” 9 <= cal < 10 “Excelente”
Diagrama de flujo verdadero falso cal < 6 “Reprobado” verdadero falso cal < 7 verdadero “Suficiente” cal < 8 verdadero “Bien” “Muy bien” falso cal < 9 “Excelente”
#include <iostream. h> int main() { float cal; cout << "teclee la calificación: "; cin >> cal; if(cal < 6) cout << “Reprobadon"; if(cal >= 6 && cal < 7) cout << “Suficienten"; else if(cal < 7) cout << “Suficienten"; if(cal >=7 $$ cal < 8) cout << “Bienn"; else if(cal < 8) cout << “Bienn"; if(cal >=8 && cal < 9) cout << “Muy bienn"; else if(cal < 9) cout << “Muy bienn"; else cout << “Excelenten"; return 0; }
Comparación de 3 números Se desea comparar 3 números leídos desde el teclado, imprimiendo el mayor de ellos. Se puede resolver comparando el primero con el segundo, luego si el primero es mayor, se compara el primero con el tercero. Si el primero no es mayor que el segundo, entonces se compara el segundo con el tercero. falso verdadero “b mayor” b>c falso “c mayor” a>b verdadero falso “c mayor” a>c verdadero “a mayor”
Solución condiciones compuestas Utilizando condiciones compuestas, primero comparamos el primero con los dos restantes, si es mayor que los otros dos, imprimimos el primero, sino, comparamos el segundo con los otros dos, etc. Note que debe usar >= para que se imprime forzosamente un resultado. falso a>=b && a>=c verdadero b>=a && b>=c “b mayor” c>=a && c>=b verdadero “c mayor” verdadero “a mayor”
Anidamiento #include <iostream. h> int main() { float a, b, c; cout << "teclee 3 números: "; cin >> a >> b >> c; if(a > b) if(a > c) Condiciones compuestas #include <iostream. h> int main() { float a, b, c; cout << "teclee 3 números: "; cin >> a >> b >> c; if(a >= b && a >= c) cout << a << endl; else cout << c << endl; if(b >= a && b >= c) else cout << b << endl; else if(b > c) cout << b << endl; if(c >= a && c >= b) else cout << c << endl; return 0; }
Tarea Escriba una sentencia que sea verdadera para x =. . . , -2, -1, 0, 3, 6, 9, 12, 15, 18, . . . Rescriba las siguientes sentencias de if anidados sin usar ningún anidamiento: if ( a < c ) if ( b < c ) x = y; else x = z; if ( a < b ) if ( a >= b ) x = z; else x = y; else x = z;
Tarea casera 1. Escriba un programa en C que lea tres números y los imprima en orden. Ayuda: existen 6 casos: a>b>c, a>c>b, b>a>c, b>c>a, c>a>b y c>b>a. Haga una versión condiciones compuestas y otra con sentencias if anidadas. Parta del diseño del algoritmo, dibuje el diagrama de flujo y escriba el programa en C. Recuerde que el formateo del código es importante. 2. Escriba un programa que para resolver una ecuación cuadrática. Considere todos los casos posibles: 2 soluciones diferentes, una solución doble y raíces complejas conjugadas.
Sentencia switch La sentencia switch permite elegir entre varias alternativas. Sintaxis switch (<expresión>){ case <constante>: [case <constante>: ]<sentencias>; break; . . . [default: <sentencias>; break; ] } caso a Acción del caso a break; caso b Acción del caso b break; caso z Acción del caso z break; Acción por omisión
Proceso Dia_de_la_semana Escribir "Teclee número del día: "; Leer dia; Segun dia Hacer 1: Escribir "domingo"; 2: Escribir "lunes"; 3: Escribir "martes"; 4: Escribir "miércoles"; 5: Escribir "jueves"; 6: Escribir "viernes"; 7: Escribir "sabado"; De Otro Modo: Escribir "día no válido"; Fin. Segun Fin. Proceso
ejemplo de switch Programa para leer un número de día (1 – lunés, … 7 – domingo) SIEMPRE PONGA break AL FINAL DE CADA OPCIÓN EN LA SENTENCIA SWITCH. #include <iostream. h> int main(){ int dia; cout << "teclee el número del día: "; cin >> dia; switch(dia){ case 1: cout << "Lunes" << endl; break; case 2: cout << "Martes" << endl; break; case 3: cout << "Miércoles" << endl; break; case 4: cout << "Jueves" << endl; break; case 5: cout << "Viernes" << endl; break; case 6: cout << "Sabado" << endl; break; case 7: cout << "Domingo" << endl; break; default: cout << "día no válido" << endl; } system("PAUSE"); }
Ejemplo de menú Se elige entre varias opciones de un menú 1 2 3 4 - Microsoft Word"; Yahoo messenger"; Auto. CAD"; Java Games"; Cada opción despliega un mensaje diferente /* Ejemplo-switch-1 */ #include <iostream. h> main(){ int a; cout << "tt. Menu"; cout <<"n------------------"; cout <<"n 1 - Microsoft Word"; cout <<"n 2 - Yahoo messenger"; cout <<"n 3 - Auto. CAD"; cout <<"n 4 - Java Games"; cout <<"n------------------"; cout <<"n. Ingrese numero de su preferencia: "; cin >> a; // leer entrada switch (a){ case 1: // si entrada es 1 cout <<"n. Personal Computer Softwaren"; break; case 2: // si entrada es 2 cout <<"n. Web based Softwaren"; break; case 3: // si entrada es 3 cout <<"n. Scientific Softwaren"; break; case 4: // si entrada es 4 cout <<"n. Embedded Softwaren"; break; default: cout <<"n. Entrada incorrectan"; } system("PAUSE"); }
Ejemplo de empleados Calcular el sueldo mensual de un empleado que trabaja por horas, el pago de cada hora trabajada depende de su categoría: categoria pago x hora A 26. 90 B 24. 30 C 21. 50 Además si el empleado trabaja mas de 150 horas mensuales tiene una bonificación del 5 % de sueldo.
Algoritmo Se ingresara el nombre del empleado, seguido de su categoría y al final el número de horas trabajadas. Algoritmo 1. Leer datos 2. Determinar sueldo con base en su categoría 3. Determinar monto de bonificación 4. Imprimir nombre, categoría y sueldo total Variables (entrada) Variables (salida) nombre – cadena de caracteres categoria – carácter horas - entero pago. Hora – real (float) bono – real (float) sueldo – real (float)
Proceso Pago. Por. Hora 1 Escribir "Nombre del trabajador: "; 2 Leer nombre; 3 Escribir "Categoría: "; 4 Leer categoria; 5 Escribir "Horas trabajadas: "; 6 Leer horas; 7 Segun categoria Hacer 8 1: 9 pago. Hora <- 26. 90; 10 2: 11 pago. Hora <- 24. 30; 12 3: 13 pago. Hora <- 21. 5; 14 Fin. Segun 15 sueldo <- horas*pago. Hora; 16 Si horas>150 Entonces 17 bonificacion <- sueldo*1. 05; 18 Sino 19 bonificacion <- 0; 20 Fin. Si 21 sueldo <- sueldo+bonificacion; 22 Escribir "Sueldo total = ", sueldo; 23 Fin. Proceso
El tipo char y cadena (char[]) La categoría se almacenará en una variable de tipo char (carácter) El nombre del empleado se almacenará en una cadena de caracteres. En C hay que especificar la longitud máxima de la cadena. La declaración sigue la siguiente sintaxis: char variable[longitud máxima]; Ejemplo: char nombre[30]; La lectura solo lee la cadena hasta el primer espacio o hasta la longitud máxima, si teclea “juan perez”, solo se almacenará “juan”.
Declaración y lectura char nombre[7]; //nombre del empleado char categoria; //categoría A, B, C int horas; //horas trabajadas float pago. Hora, sueldo, bonificacion; cout << "nombre del empleado: "; cin >> nombre; cout << "categoría: "; cin >> categoria; cout << "horas trabajadas: "; cin >> horas;
Cálculo del sueldo Se determinará mediante una sentencia switch el pago por hora en función de la categoría. //determinación del pago por horas switch(categoria){ case 'a': case 'A': pago. Hora = 26. 90; break; case 'b': case 'B': pago. Hora = 24. 30; break; case 'c': case 'C': pago. Hora = 21. 50; break; } //calculo del sueldo sin bonificación sueldo = horas*pago. Hora; //cálculo de bonificación if(horas>150) bonificacion = 0. 05*sueldo; else bonificacion = 0. 0; //sueldo total sueldo = sueldo+bonificacion;
Salida de resultados La salida se presentará en forma tabular //Salida en forma tabular cout << "nnombret. Categt. Horast. Pago/Hrt. Boni. tsueldon" <<nombre<<"t"<<categoria<<"t"<<horas<<"t"<<pago. Hora<< "t"<<bonificacion<<"t"<<sueldo<<endl;
Actividad Escriba un algoritmo y el diagrama de flujo y haga el programa en C correspondiente, que lea dos números reales y un símbolo de operación y realice la operación aritmética seleccionada (+, -, *, /, ^(potencia, función pow), %(residuo flotante, función fmod)) entre los dos números tecleados. Utilice la sentencia switch. Verifique el segundo número no sea cero para las operaciones de % y / y envíe el mensaje adecuado en estos casos. Si el operador no es alguno de los considerados, envíe el mensaje adecuado al usuario. Ejemplo: Teclear 3. 5 7. 8 * 7. 4 16. 3 / 8. 44 3. 1 % 7. 6 2. 3 ^ obtener 27. 3 0. 45399 2. 24 106. 138
Ejemplo El siguiente algoritmo despliega el número de días que tiene cada mes del año. 1 Proceso sin_titulo 2 Escribir "Ingrese numero de mes" 3 Leer mes 4 Segun mes Hacer 5 1, 3, 5, 7, 8, 10, 12: 6 Escribir "el mes ", mes, " tiene 31 dias“ 7 4, 6, 9, 11: 8 Escribir "el mes ", mes, " tiene 30 dias" 9 2: 10 Escribir "el mes ", mes, " tene 28 dias, 29 si es bisiesto" 11 De Otro Modo: 12 Escribir "no existe es emes" 13 Fin. Segun 14 Fin. Proceso
Programa en C #include <iostream> using namespace std; main(){ int op; cout << "Ingrese el numero de mes (1 -12): "; cin >> op; switch(op){ case 1: case 3: case 5: case 7: case 8: case 10: case 12: cout <<"El mes "<<op<<" tiene 31 díasn"; break; case 4: case 6: case 9: case 11: cout <<"El mes "<<op<<" tiene 31 diasn"; break; case 2: cout <<"El mes "<<op<<" tiene 28 días, 29 si es bisieton"; break; defaul: cout<<"NO EXISTE EL MES "<<op<<endl; } system("pause"); }
Actividad Escribir una versión del anterior programa utilizando sentencias if-else. Haga el diagrama de flujo y el programa en pseudo código.
Sentencia ? : La sentencia if puede abreviarse mediante el operador ? : . La sintaxis es: condición ? operando 1 : operando 2; Esta muy relacionado a la sentencia if/else. El operador regresa el operando 1 si la condición es verdadera y regresa el operando 2 si es falsa. Ejemplo: cout << ( cal >= 60 ? “Aprobado” : “Reprobado”); Esta sentencia imprimirá “Aprobado” se cal es mayor o igual a 60 e imprimirá “Reprobado” si es menor que 60. Note que los paréntesis son necesarios dado que el operador ? : tiene la menor precedencia. También es válido: cal >= 60 ? cout << “Aprobado” : cout << “Reprobado”;
Ejemplos Sentencia if sentencia ? : if(a>5) x = 6; else x = 7; a>5 ? x=6: x=7; if(x>8 && x<12)? a=2*b+c: a=3*b+c; a = 2*b+c; else a = 3*b+c; if(a>b) if(b>c) x = 5*a+c; else x = 6*a+b; else x = 8*a+4*b; (a>b)? (b>c? x=5*a+c: x=6*a+b; ): x=8*a+4*b;
Tarea Traduzca las sentencias if a sentencias con el operador ? : . if(x>8) y = 23; else z = -5; if(x>=8 && x!=12) z = sqrt(6*x); else if(x>0) z = sin(3*x); else z = sin(5*x);
else colgado if (x < y) if (x < z) cout << "Hola" ; else cout << "Adiós" ;
Solución if (x < y){ if (x < z) cout << “Hola" ; } else cout << "Adiós" ;
Actividad Hacer los siguientes programas con el operador ? : 1. Escriba un programa que lea un número y determine si es par o impar. Utilice el operador ? : . 2. Escriba un programa que lea tres números reales representando los lados de un triángulo y decida si el triángulo es rectángulo o no. Suponga que los números se leen de menor a mayor.
- Slides: 54