You are on page 1of 56

Estructuras de control condicional

Computacin

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 aritmticas. 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 3<5 (7 4) == 3 17 >= (5 + 12) i = 3; j = 7; i * j != 21 float a=0.1; = 0 falso = = = = 0 1 1 1 falso verdadero verdadero verdadero

(3*a 0.3) == 0
3>1>0

=
=

0
1

falso (OJO con los reales)


verdadero

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);

Sentencia if
La sentencia if permite decidir ejecutar o no una instruccin o un bloque de instrucciones.
Sintaxis if (condicin)

Instruccin o bloque;
Un bloque es una secuencia de instrucciones englobadas entre llaves ({}). La condicin esta formada por una expresin booleana. verdadero condicin

falso

sentencias

Ejemplo de if simple
Prueba si un nmero ledo desde el teclado es par. #include <iostream.h> int main() { int numero; cout << "teclee un nmero: "; cin >> numero; if(numero % 2 == 0) cout << "nmero par"; return 0; }

Ejemplo 2 de if simple
Si el nmero a es divisible por el nmero b, se despliega el nmero de veces que a es mayor que b. #include <iostream.h> int main() { int a,b,n; cout << "teclee un nmero: "; cin >> a; cout << "teclee un nmero: "; 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 instruccin (o un bloque de instrucciones) y otra instruccin (o un bloque de instrucciones)
Sintaxis if (condicin)

Instruccin o bloque;
else Instruccin o bloque;

falso condicin sentencias

verdadero

sentencias

Ejemplo de if - else simple


Prueba si un nmero ledo desde el teclado es par. #include <iostream.h> int main() { int numero; cout << "teclee un nmero: "; cin >> numero; if(numero % 2 == 0) cout << "nmero par"; else cout << "nmero impar"; return 0; }

Tarea
Escriba un programa que lea tres nmeros reales y decida si forman un tringulo. Suponga que los nmeros se leen de mayor a menor.

Escriba un programa que lea tres nmeros reales representando los lados de un tringulo y decida si el tringulo es rectngulo o no. Suponga que los nmeros se leen de mayor a menor.

Entregar impreso.

Interseccin de dos rectas


Programa para determinar si dos rectas se interceptan Suponga que las rectas se representan por la ecuacin de la forma y=mx+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 pendiente1 diferente de pendiente2 calcular la interseccin imprimir resultado sino

informar que no se interceptan

Programa
#include <iostream.h> int main() { float m1,m2,b1,b2,x,y; cout << "teclee la pendiente y ordenada al origen 1: "; cin >> m1 >> b1; cout << "teclee la pendiente y ordenada al origen 2: "; cin >> m2 >> b2; if(m1 != m2){ x = (b2 - b1)/(m1 - m2); y = m1*x+b1; cout << "Las rectas se interceptan en: " << x << ", " << y << endl; } else cout << "Las rectas no se interceptan..."; return 0; }

Sistema de ecuaciones 2x2


Se desea resolver un sistema de ecuaciones de 2x2 de la forma ax+by=c dx+ey=f El sistema puede resolverse con las frmulas x = (c e b f) / (a e b d) y = (a g c e) / (a e b d) El sistema tiene solucin si el denominador de estas fracciones es diferente de cero. El algoritmo es: si (a f b e ) != 0 calcular solucin mostrar resultado

sino
informar que no hay solucin

Programa sis2x2.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 solucin\n"; return 0; }

Tarea
Un punto est sobre una recta si al avaluar la ecuacin 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 lgicos
Existen 4 operadores lgicos en C: and = &&, or = ||, not = !, xor = ^. Los operadores lgicos tienen una prioridad ms baja que los operadores relacionales.
expresin1 0 0 1 1 expresin2 0 1 0 1 expresin1 && expresin2 0 0 0 1 expresin1 0 0 1 1 expresin2 0 1 0 1 expresin1 || expresin2 0 1 1 1

expresin

! expresin

expresin1 0 0 1 1

expresin2 0 1 0 1

expresin1 ^ expresin2 0 1 1 0

0
1

1
0

Prioridad de evaluacin ! && ||

ejemplos de operadores lgicos


x > 5 || x == 3 ! (x == 7) && x % 2 != 0 x <= -1 || x > 5 || x ==2 verdadero para x = 3, 6, 7, ... verdadero para x = 1, 3, 5, 9, 11, ... verdadero para x = , -2, -1, 2, 6, 7, 8, ...

En el siguiente fragmento se despliegan solo los mltiplos de 7 o cuadrados perfectos


if(num % 7 == 0 || sqrt(num)-floor(sqrt(num))==0)

Discusin
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(condicin1) if(condicin2) if(condicin3) sentencias;

else
if(condicin2) if(condicin3) ...

Ejemplo de anidamiento
Se desea un programa para imprimir un letrero dependiendo de la siguiente tabla:
condicin cal < 6 6 <= cal < 7 letrero Reprobado Suficiente

7 <= cal < 8


8 <= cal < 9

Bien
Muy bien

9 <= cal < 10 Excelente

#include <iostream.h> int main() { float cal; cout << "teclee la calificacin: "; cin >> cal; if(cal < 6) cout << Reprobado\n"; else if(cal < 7) cout << Suficiente\n"; else if(cal < 8) cout << Bien\n"; else if(cal < 9) cout << Muy bien\n"; else cout << Excelente\n"; return 0; }

#include <iostream.h> int main() { float cal; cout << "teclee la calificacin: "; cin >> cal; if(cal < 6) cout << Reprobado\n"; if(cal >= 6 && cal < 7) cout << Suficiente\n"; if(cal >=7 $$ cal < 8) cout << Bien\n"; if(cal >=8 && cal < 9) cout << Muy bien\n"; else cout << Excelente\n"; return 0; }

Comparacin de 3 nmeros
Se desea comparar 3 nmeros ledos desde el teclado, imprimiendo el mayo 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.

verdadero

a>b
verdadero

b>c

falso

falso

verdadero

a>c

b mayor

c mayor

c mayor

a mayor

Solucin con 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 verdadero

a>=b && a>=c


falso

verdadero

b>=a && b>=c b mayor


verdadero

a mayor

c>=a && c>=b c mayor

Anidamiento
#include <iostream.h> int main() { float a, b, c; cout << "teclee 3 nmeros: "; cin >> a >> b >> c; if(a > b) if(a > c) cout << a << endl; else cout << c << endl; else if(b > c) cout << b << endl;

Condiciones compuestas
#include <iostream.h> int main() { float a, b, c; cout << "teclee 3 nmeros: "; cin >> a >> b >> c; if(a >= b && a >= c) cout << a << endl; else if(b >= a && b >= c) cout << b << endl; else if(c >= a && c >= b) cout << c << endl; return 0; }

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 ningn anidamiento:

if ( a < c ) if ( b < c ) x = y; else x = z; 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 nmeros 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 versin con condiciones compuestas y otra con sentencias if anidadas.

Sentencia switch
La sentencia switch permite elegir entre varias alternativas.
Sintaxis switch (<expresin>){ case <constante>:[case <constante>:]<sentencias>;break; ...

[default:<sentencias>;break;]
}
caso a Accin del caso a Accin del caso b break;

caso b

break;

caso z

Accin del caso z

break;

Accin por omisin

ejemplo de switch
Programa para leer un nmero de da (1 luns, 7 domingo)
#include <iostream.h> int main(){ int dia; cout << "teclee el nmero del da: "; cin >> dia; switch(dia){ case 1:cout << "Lunes" << endl;break; case 2:cout << "Martes" << endl;break; case 3:cout << "Mircoles" << 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 << "da no vlido" << endl; } system("PAUSE"); }

SIEMPRE PONGA break AL FINAL DE CADA OPCIN EN LA SENTENCIA SWITCH.

Modifique el programa de los das de la semana para desplegar entre semana si el da es de 1 a 5, sabado si es 6 y domingo si es 7. utilice una sola sentencia cout para el caso de los das entre semana.

Ejemplo de men
Se elige entre varias opciones de un men 1 - Microsoft Word"; 2 - Yahoo messenger"; 3 - AutoCAD"; 4 - Java Games"; Cada opcin despliega un mensaje diferente
/* Ejemplo-switch-1 */ #include <iostream.h> main(){ int a; cout << "\t\tMenu"; cout <<"\n-----------------------------------"; cout <<"\n1 - Microsoft Word"; cout <<"\n2 - Yahoo messenger"; cout <<"\n3 - AutoCAD"; cout <<"\n4 - Java Games"; cout <<"\n-----------------------------------"; cout <<"\nIngrese numero de su preferencia: "; cin >> a; // leer entrada switch (a){ case 1: // si entrada es 1 cout <<"\nPersonal Computer Software\n";break; case 2: // si entrada es 2 cout <<"\nWeb based Software\n";break; case 3: // si entrada es 3 cout <<"\nScientific Software\n";break; case 4: // si entrada es 4 cout <<"\nEmbedded Software\n";break; default: cout <<"\nEntrada incorrecta\n"; } 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 categora: categoria A B C pago x hora 26.90 24.30 21.50

Adems si el empleado trabaja mas de 150 horas mensuales tiene una bonificacin del 5 % de sueldo.

Algoritmo
Se ingresara el nombre del empleado, seguido de su categora y al final el nmero de horas trabajadas. Algoritmo 1. Leer datos

2. Determinar sueldo en base a su categora


3. Determinar monto de bonificacin 4. Imprimir nombre, categora y sueldo total

Variables (entrada) nombre cadena de caracteres categoria carcter horas - entero

Variables (salida) pagoHora real (float) bono real (float) sueldo real (float)

El tipo char y cadena (char[])


La categora se almacenar en una variable de tipo char (carcter)

El nombre del empleado se almacenar en una cadena de caracteres.


En C hay que especificar la longitud mxima de la cadena. La declaracin sigue la siguiente sintaxis: char variable[longitud mxima]; Ejemplo: char nombre[30];

La lectura solo lee la cadena hasta el primer espacio o hasta la longitud mxima, si teclea juan perez, solo se almacenar juan.

Declaracin y lectura
char nombre[7]; //nombre del empleado char categoria; //categora A, B, C int horas; //horas trabajadas float pagoHora, sueldo, bonificacion; cout << "nombre del empleado: "; cin >> nombre; cout << "categora: "; cin >> categoria; cout << "horas trabajadas: "; cin >> horas;

Clculo del sueldo


Se determinar mediante una sentencia switch el pago por hora en funcin de la categora. //determinacin del pago por horas switch(categoria){ case 'a':case 'A':pagoHora = 26.90;break; case 'b':case 'B':pagoHora = 24.30;break; case 'c':case 'C':pagoHora = 21.50;break; } //calculo del sueldo sin bonificacin sueldo = horas*pagoHora; //clculo de bonificacin 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 << "\nnombre\tCateg\tHoras\tPago/Hr\tBoni.\tsueldo\n" <<nombre<<"\t"<<categoria<<"\t"<<horas<<"\t"<<pagoHora<< "\t"<<bonificacion<<"\t"<<sueldo<<endl;

Tarea
Escriba un programa que despliegue un men con las opciones: a. Capital de Blgica? b. Ro ms grande se Sudamrica? c. Sistema operativo de Microsoft? d. Premio novel de qumica mexicano? lea un carcter de a a d y despliegue la respuesta de la opcin elegida. Utilice un sentencia switch.

Switch(variable){ case a : cout << jhsjkhkjhkjfhjkhfjkbkjnfkn<< endl; break;

Tarea casera
Modifique el programa de los das de la semana para desplegar entre semana si el da es de 1 a 5, sabado si es 6 y domingo si es 7.

Escriba un programa que lea un valor de temperatura en K, C o F y la convierta a las otras dos escalas, lea el tipo de conversin mediante un men y una sentencia switch.

Escriba un programa que lea dos nmeros reales y un smbolo de operacin y realice la operacin aritmtica seleccionada (+, -, *, /) entre los dos nmeros tecleados. Utilice la sentencia switch. Ejemplo: Teclear 3.5 7.8 * 7.4 16.3 / obtener 27.3 0.45399

Solucin de una cuadrtica


La ecuacin cuadrtica en forma general es ax2 + bx +c = 0

La solucin puede encontrarse con la frmula:

b b 2 4ac x 2a
Hay tres casos posibles dependiendo del valor del radicando >0 b2 4ac =0 <0 Dos races diferentes Una raz repetida Races complejas conjugadas

Diseo de un programa para resolver una cuadrtica.

Algoritmo 1. Leer valores de los coeficientes

2. Determinar el valor del discriminante


3. Si el discriminante es mayor que cero encontrar las 2 races diferentes y mostrarlas en la pantalla, sino 4. Si el discriminante es igual a cero determinar la raz doble y mostrarla en la pantalla, sino 5. Determinar las races complejas conjugadas y mostrarlas en la pantalla.

Variables
Coeficientes: a coeficiente de x2, real (float)

b coeficiente de x, real (float)


c trmino independiente, real (float) d discriminante, real (float) Declaracin: float a, b, c, d; Lectura: cout << Teclee los coeficientes a, b, c: ;

cin >> a >> b >> c;


Determinacin del discriminante: d = b*b 4*a*c;

Variables para almacenar las races:


x1, x2 races diferentes, reales (float) xdoble raz doble (float) xreal, ximg parte reala e imaginaria de la raz compleja Declaracin: float x1,x2,x, xreal, ximag;

Determinacin de cada caso


Utilizaremos una sentencia if anidada:
If(d>0){ x1 = (-b sqrt(d))/2/a; x2 = (-b + sqrt(d))/2/a;

cout << x1 =\t<< x1 << \nx2 =\t << x2 << endl;


}else If(d=){ xdoble = (-b sqrt(d))/2/a; cout << Raiz doble\nx =\t<< xdoble << endl; }else{ xreal = -b/2/a; ximag = (sqrt(-d))/2/a;

cout << x real =\t<< xreal << \nximag =\t << ximg << endl;
}

Ejemplo
Dos vehculos se mueven a diferentes velocidades en t = 0 y con aceleraciones constantes y diferentes y se encuentran en diferente posicin, haga un programa que determine en que tiempos y posiciones ambos vehculos coinciden.

Sea x01, v1 y a1 la posicin, la velocidad y la aceleracin con que se mueve el primer vehculo y x02, v2 y a2 la posicin, la velocidad y la aceleracin en que se mueve el segundo vehculo.
Las ecuaciones de movimiento de cada cuerpo son:

x1 = x01+ v1 t + 0.5a1 t2

x2 = x02 +v2 t + 0.5a2 t2

Los tiempos pedidos se encuentran cuando x1 = x2 o


x01 + v1 t + 0.5a1 t2 = x02 +v2 t + 0.5a2 t2 Simplificando se llega a 0.5 (a1 a2) t 2 + (v1 v2) t +x01 x02 = 0 Esta es una ecuacin cuadrtica de la forma a x2 + b x + c = 0 Con a = 0.5(a1 a2) b = (v1 v2) Cuya solucin es: c = x01 x02

b b 2 4ac x 2a
Esta tiene solucin cuando b2 4 a c > 0

Algoritmo
1. Leer los valores del primer vehculo
2. Leer los valores del segundo vehculo 3. Calcular los coeficientes a, b y c 4. Calcular el valor del discriminante

5. Si el discriminante es mayor o igual a cero


calcular los valores de t y guardarlos en t1, t2, pos1 , pos2 si t1>0 imprimir se encontrarn en t1 en pos1 si t2>0 imprimir se encontrarn en t2 en pos2 6 sino informar que no se encuentran en ningn tiempo

Declaracin y lectura de variables


//variables de entrada float x01,v1,a1,x02,v2,a2; //coeficientes de la cuadrtica y discriminante float a,b,c,d; //tiempos float t1,t2,pos1,pos2; //lectura de datos cout << "teclee el t1, x01 y a1: "; cin >> t1 >> x01 >> a1; cout << "teclee el t2, x02 y a2: "; cin >> t2 >> x02 >> a2;

Solucin del problema


a = 0.5*(a1-a2); b = v1-v2; c = x01-x02; d = b*b - 4*a*c; if(d>0){ t1 = (-b+sqrt(d))/2/a; t2 = (-b-sqrt(d))/2/a; if(t1>0){ pos1 = x01+v1*t1+0.5*a1*t1*t1; cout << "se encontrarn en "<<t1<<" s en " <<pos1<<" m"<<endl; } if(t2>0){ pos2 = x01+v1*t2+0.5*a1*t2*t2; cout <<"se encontrarn en "<<t2<<" s en " <<pos2<<" m"<<endl; } }else cout << "NO se encuentran"<<endl; system("PAUSE"); }

else colgado
if (x < y) if (x < z) cout << "Hola" ; else cout << "Adis" ;
F
x<y

v v
x<z

Adios Hola x<y F v

if (x < y) if (x < z) cout << "Hola" ; else cout << "Adis" ;

x<z

Adios

Hola

Solucin
if (x < y){ if (x < z) cout << Hola" ; } else cout << "Adis" ;

o
if (x < y && x < z) cout << Hola" ; else cout << "Adis" ;

Sentencia ?:
La sentencia if puede abreviarse mediante el operador ?:. La sintaxis es: condicin ? operando1 : operando2; Esta muy relacionado a la sentencia if/else. El operador regresa el operando1 si la condicin es verdadera y regresa el operando2 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 parntesis son necesarios dado que el operador ?: tiene la menor precedencia. Tambin es vlido: cal >= 60 ? cout << Aprobado : cout << Reprobado;

Ejemplos
Sentencia if if(a>5) x = 6;else x = 7; sentencia ?: a>5 ? x=6: x=7;

if(x>8 && x<12)


a = 2*b+c; else a = 3*b+c; if(a>b) if(b>c) x = 5*a+c;

(x>8 && x<12)?a=2*b+c:a=3*b+c;

(a>b)?(b>c?x=5*a+c:x=6*a+b;):x=8*a+4*b;

else
x = 6*a+b; else x = 8*a+4*b;

Ejercicios
Traducir a if y = (a>b)?3*a+b:2*a+b;

z =a>=2*x?(a<6)?4*a:5*a:3*a+1;

Qu valores se imprimen? int a=8,b=9,x=5,y,z; y = (a>b)?3*a+b:2*a+b; z =a<=2*x?(a<6)?4*a:5*a:3*a+1; cout <<"y = "<< y <<" z= " <<z<<endl;

#include <iostream.h> main(){ int n; //numero par con operador ?: cout << "teclee n:"; cin >> n; n%2==0?cout << "numero par\n":cout << "numero impar\n"; system("PAUSE"); }
#include <iostream.h> main(){ int a,b,c,m; //numero mayor con operador ?: cout << "teclee a,b,c:"; cin >> a>>b>>c; a>=b ? a>=c ? cout << a : cout << c:b>=c ? cout << b:cout << c; a>=b ? a>=c ? m = a : m = c : b>=c ? m = b : m = c; cout << endl; cout << m << endl; system("PAUSE"); }

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); Traduzca la siguiente sentencia con ? A if

x = (y>5)?2*y+1:(z<10)?3*y+2:5*z+1;

Tarea casera
Escriba un programa que lea tres nmeros reales representando los lados de un tringulo y decida si el tringulo es rectngulo o no. Suponga que los nmeros se leen de menor a mayor.

(punto extra) Escriba un programa para resolver una ecuacin cuadrtica. Considere el caso en que las soluciones sean complejas utilizando el operador ?:.

You might also like