Download Control condicional - fc

Document related concepts

Ordenamiento de burbuja wikipedia , lookup

Fernando Couto wikipedia , lookup

Transcript
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
=
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 tempOriginal,tempConvertida;
int opcion;
cout << "Teclee temperatura: ";
cin >> tempOriginal;
cout << "Tipo de conversión (1 - C a F, 2 - F a C): ";
cin >> opcion; //solicita tipo de conversión
tempConvertida = (opcion==1)*(9*tempOriginal/5+32)+
(opcion==2)*(5.0/9*(tempOriginal-32));
cout << "Valor convertido: " << tempConvertida << 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
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=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 intersección
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 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 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 solución\n";
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ón1
expresión2
expresión1 && expresión2
expresión1
expresión2
expresión1 || expresión2
0
0
0
0
0
0
0
1
0
0
1
1
1
0
0
1
0
1
1
1
1
1
1
1
expresión
! expresión
expresión1
expresión2
expresión1 ^ expresión2
0
1
0
0
0
1
0
0
1
1
1
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ón1)
if(condición2)
if(condición3)
sentencias;
else
if(condición2)
if(condición3)
...
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”
falso
cal < 8
falso
verdadero
cal < 9
“Bien”
“Muy bien”
“Excelente”
#include <iostream.h>
int main()
{
float cal;
cout << "teclee la calificación: ";
cin >> cal;
if(cal < 6)
cout << “Reprobado\n";
#include <iostream.h>
int main()
{
float cal;
cout << "teclee la calificación: ";
cin >> cal;
if(cal < 6)
cout << “Reprobado\n";
if(cal >= 6 && cal < 7)
cout << “Suficiente\n";
else if(cal < 7)
cout << “Suficiente\n";
if(cal >=7 $$ cal < 8)
cout << “Bien\n";
else if(cal < 8)
cout << “Bien\n";
if(cal >=8 && cal < 9)
cout << “Muy bien\n";
else if(cal < 9)
cout << “Muy bien\n";
else
else
cout << “Excelente\n";
cout << “Excelente\n";
return 0;
}
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>c
“b mayor”
falso
“c mayor”
verdadero
a>b
falso
“c mayor”
verdadero
a>c
“a mayor”
Solución 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
verdadero
falso
b>=a && b>=c
“b mayor”
verdadero
c>=a && c>=b
“c mayor”
“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;
cout << a << endl;
else
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;
cout << c << endl;
return 0;
}
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
else
x = z;
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 con 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";
FinSegun
FinProceso
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 - Microsoft Word";
2 - Yahoo messenger";
3 - AutoCAD";
4 - Java Games";
Cada opción 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 categoría:
categoria
A
B
C
pago x hora
26.90
24.30
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
pagoHora – real (float)
bono – real (float)
sueldo – real (float)
Proceso PagoPorHora
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
pagoHora <- 26.90;
10
2:
11
pagoHora <- 24.30;
12
3:
13
pagoHora <- 21.5;
14
FinSegun
15
sueldo <- horas*pagoHora;
16
Si horas>150 Entonces
17
bonificacion <- sueldo*1.05;
18
Sino
19
bonificacion <- 0;
20
FinSi
21
sueldo <- sueldo+bonificacion;
22
Escribir "Sueldo total = ",sueldo;
23 FinProceso
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 pagoHora, 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':pagoHora = 26.90;break;
case 'b':case 'B':pagoHora = 24.30;break;
case 'c':case 'C':pagoHora = 21.50;break;
}
//calculo del sueldo sin bonificación
sueldo = horas*pagoHora;
//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 << "\nnombre\tCateg\tHoras\tPago/Hr\tBoni.\tsueldo\n"
<<nombre<<"\t"<<categoria<<"\t"<<horas<<"\t"<<pagoHora<<
"\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 que 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 FinSegun
14 FinProceso
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ías\n";break;
case 4:case 6:case 9:case 11:
cout <<"El mes "<<op<<" tiene 31 dias\n";break;
case 2:
cout <<"El mes "<<op<<" tiene 28 días, 29 si es
bisieto\n";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 ? operando1 : operando2;
Esta muy relacionado a la sentencia if/else.
El operador regresa el operando1 si la condición 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 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)
(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" ;
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.