Funciones en programaci´
on y condicionales II
Estructuras condicionales y validaci´on de datos
Jonatan Gom´ez Perdomo, Ph.D. [email protected] Arles Rodr´ıguez, Ph.D.(c)
[email protected] Camilo Cubides, Ph.D.(c)
Grupo de investigaci´on en vida artificial – Research Group on Artificial Life – (Alife) Departamento de Ingenier´ıa de Sistemas e Industrial
Agenda
1 La estructura de control condicional s´ı (if)
Valor absoluto de un n´umero El m´aximo entre dos n´umeros El operador condicional ternario ?:
2 La estructura condicional sin opci´on alternativa
Impresi´on de n´umeros con signo El operador l´ogico “condicional”
3 Estructuras condicionales enlazadas
El descuento del d´ıa
4 La estructura de conmutaci´on (switch)
Detecci´on de vocales min´usculas
La estructura de control condicional s´ı (if)
El condicional
if
I
Es posible tener programas en los que se deban cubrir diferentes casos, para los cuales se deber´an retornar diferentes valores dadas unas condiciones.
Representaci´
on de condicionales con diagramas de
flujos
Un condicional se puede representar gr´aficamente mediante un diagrama de flujo de la siguiente manera.
<bloque_prev>
<cond>
<bloque_V> <bloque_F>
<bloque_sigui>
La estructura de control condicional s´ı (if)
Esquema en C++ de un condicional y su ejecuci´
on
Un esquema textual que en C++ representa una estructura condicional es la que se da en el siguiente fragmento de c´odigo.
<bloque_prev> if(<cond>){ <bloque_V> }else{ <bloque_F> }; <bloque_sigui>
Donde, despu´es de ejecutar el bloque de instrucciones previas<bloque_prev>, se ejecutar´a el bloque <bloque_V>si <cond> se eval´ua verdadero, en caso de que <cond> se eval´ue falso de ejecutar´a<bloque_F>. Despu´es de ejecutar el bloque <bloque_V>o el bloque<bloque_F> se continua con la ejecuci´on del resto del programa, es decir, el resto de las instrucciones del bloque
Agenda
1 La estructura de control condicional s´ı (if) Valor absoluto de un n´umero
El m´aximo entre dos n´umeros El operador condicional ternario ?:
2 La estructura condicional sin opci´on alternativa
Impresi´on de n´umeros con signo El operador l´ogico “condicional”
3 Estructuras condicionales enlazadas
El descuento del d´ıa
4 La estructura de conmutaci´on (switch)
Detecci´on de vocales min´usculas
La estructura de control condicional s´ı (if) Valor absoluto de un n´umero
Valor absoluto de un n´
umero I
Ejemplo
La funci´on que permite calcular el valor absoluto de un n´umero real es una funci´on que recibe como par´ametro de entrada un n´umero real y retorna la distancia de ese valor al origen. La funci´on valor absoluto en notaci´on matem´atica se define como
valor absoluto:R→R
(x)7→
(
x, six ≥0;
Valor absoluto de un n´
umero II
Ejemplo (continuaci´on)
Un diagrama de flujo que representa el condicional que est´a impl´ıcito en la funci´on valor absoluto es el siguiente
double valor;
x >= 0
valor = x; valor = -x;
return valor;
La estructura de control condicional s´ı (if) Valor absoluto de un n´umero
Valor absoluto de un n´
umero III
Ejemplo (continuaci´on)
La codificaci´on en C++ de esta funci´on junto con su programa principal es #include<iostream>
#include<cstdlib>
Valor absoluto de un n´
umero IV
Ejemplo (continuaci´on)
double valor_absoluto(double x){ double valor;
if(x >= 0){ valor = x; }else{
valor = -x; };
La estructura de control condicional s´ı (if) Valor absoluto de un n´umero
Valor absoluto de un n´
umero V
Ejemplo (continuaci´on)
int main(){ double x;
cout << "x? = "; cin >> x;
cout << "El valor absoluto es: "; cout << valor_absoluto(x);
Agenda
1 La estructura de control condicional s´ı (if)
Valor absoluto de un n´umero
El m´aximo entre dos n´umeros
El operador condicional ternario ?:
2 La estructura condicional sin opci´on alternativa
Impresi´on de n´umeros con signo El operador l´ogico “condicional”
3 Estructuras condicionales enlazadas
El descuento del d´ıa
4 La estructura de conmutaci´on (switch)
Detecci´on de vocales min´usculas
La estructura de control condicional s´ı (if) El m´aximo entre dos n´umeros
El m´
aximo entre dos n´
umeros I
Ejemplo
Una funci´on que permite determinar el m´aximo de dos n´umeros reales, se puede definir como
maximo dos numeros :R×R−→R
aqu´ı se tienen dos casos, si el n´umero aes mayor que b el valor m´aximo es
a; en otro caso se debe retornar b. En notaci´on matem´atica esto puede ser escrito de la siguiente forma
maximo dos numeros:R×R→R
(a,b)7→
(
a, si a>b;
El m´
aximo entre dos n´
umeros II
Ejemplo (continuaci´on)
Un diagrama de flujo que representa el condicional que est´a impl´ıcito en la funci´on m´aximo entre dos n´umeros es el siguiente
a > b
return a; return b;
La estructura de control condicional s´ı (if) El m´aximo entre dos n´umeros
El m´
aximo entre dos n´
umeros III
Ejemplo (continuaci´on)
La regla de traducci´on de la funci´on es similar a la anterior, s´olo hay que tener en cuenta la instrucci´on condicional, y que si no se cumple la condici´on especificada en elif, se ejecutar´a el flujo de instrucciones especificado bajo el alcance de la instrucci´onelse
double maximo_dos_numeros(double a, double b){ if(a > b){
return a; }else{
return b; };
Agenda
1 La estructura de control condicional s´ı (if)
Valor absoluto de un n´umero El m´aximo entre dos n´umeros
El operador condicional ternario ?:
2 La estructura condicional sin opci´on alternativa
Impresi´on de n´umeros con signo El operador l´ogico “condicional”
3 Estructuras condicionales enlazadas
El descuento del d´ıa
4 La estructura de conmutaci´on (switch)
Detecci´on de vocales min´usculas
La estructura de control condicional s´ı (if) El operador condicional ternario ?:
El operador condicional
?:
I
El operador condicional ternario
?:
II
A partir de la sintaxis general de un condicional if
if(<cond>){ <bloque_1> }else{
<bloque_2> };
se tiene que la sintaxis general de un operador condicional ?: que es equivalente al condicional ifes la siguiente
La estructura de control condicional s´ı (if) El operador condicional ternario ?:
El operador condicional ternario
?:
III
es importante tener en cuenta que el operador condicional siempre retorna el resultado de la evaluaci´on de la expresi´on seleccionada.
Ejemplo
La siguiente funci´on permite calcular el valor absoluto de un n´umero real, pero utilizando el operador condicional?: en vez del condicionalif presentado en un ejemplo previo
double valor_absoluto(double x){ double valor;
valor = x >= 0 ? x : -x; return valor;
El operador condicional ternario
?:
IV
Ejemplo
Una funci´on equivalente a la anterior, que es m´as compacta y que tambi´en permite calcular el valor absoluto, es la siguiente
double valor_absoluto(double x){ return x >= 0 ? x : -x;
La estructura condicional sin opci´on alternativa
Agenda
1 La estructura de control condicional s´ı (if)
Valor absoluto de un n´umero El m´aximo entre dos n´umeros El operador condicional ternario ?:
2 La estructura condicional sin opci´on alternativa
Impresi´on de n´umeros con signo El operador l´ogico “condicional”
3 Estructuras condicionales enlazadas
El descuento del d´ıa
4 La estructura de conmutaci´on (switch)
Detecci´on de vocales min´usculas
La estructura condicional sin opci´
on alternativa I
Cuando en el flujo de un programa se desea que se ejecute un grupo de instrucciones cuando un condicional se evalu´e verdadero, y que se continue con la ejecuci´on del resto del programa se halla o no ejecutado la
instrucciones del condicional, se tiene un caso de condicional sin opci´on alternativa.
La estructura condicional sin opci´on alternativa
La estructura condicional sin opci´
on alternativa II
Una representaci´on mediante diagramas de flujos de un condicional sin opci´on alternativa es la siguiente
<bloque_prev>
<cond>
<bloque>
La estructura condicional sin opci´
on alternativa en
C++ I
En unif la parte alternativa else es opcional, es decir, en el siguiente fragmento de c´odigo
<bloque_prev> if(<cond>){
<bloque> };
<bloque_sigui>
se ejecutar´a un grupo de instrucciones<bloque>si <cond>se eval´ua verdadero, en cualquier caso, se halla o no ejecutado el bloque de instrucciones <bloque>, se salta a la siguiente estructura
La estructura condicional sin opci´on alternativa Impresi´on de n´umeros con signo
Agenda
1 La estructura de control condicional s´ı (if)
Valor absoluto de un n´umero El m´aximo entre dos n´umeros El operador condicional ternario ?:
2 La estructura condicional sin opci´on alternativa Impresi´on de n´umeros con signo
El operador l´ogico “condicional”
3 Estructuras condicionales enlazadas
El descuento del d´ıa
4 La estructura de conmutaci´on (switch)
Detecci´on de vocales min´usculas
Impresi´
on de n´
umeros con signo I
Ejemplo
Cuando se realiza la impresi´on de un n´umero en la consola o cualquier otro dispositivo de salida, es a veces se desea que si un n´umero es positivo, este sea impreso con el signo+, es decir, que para el caso del n´umero
La estructura condicional sin opci´on alternativa Impresi´on de n´umeros con signo
Impresi´
on de n´
umeros con signo II
Ejemplo (continuaci´on)
Un diagrama de flujo que describe las instrucciones para imprimir un n´umero con signo es el siguiente
x > 0.0
cout << "+";
Impresi´
on de n´
umeros con signo III
Ejemplo (continuaci´on)
Una funci´on en C++ que permite imprimir los n´umeros con signos es la siguiente
double imprimir_numero(double x){ if(x > 0.0){
cout << "+"; };
cout << x; return x; };
La estructura condicional sin opci´on alternativa El operador l´ogico “condicional”
Agenda
1 La estructura de control condicional s´ı (if)
Valor absoluto de un n´umero El m´aximo entre dos n´umeros El operador condicional ternario ?:
2 La estructura condicional sin opci´on alternativa
Impresi´on de n´umeros con signo
El operador l´ogico “condicional”
3 Estructuras condicionales enlazadas
El descuento del d´ıa
4 La estructura de conmutaci´on (switch)
Detecci´on de vocales min´usculas
El operador l´
ogico “condicional” I
Ejemplo
En los lenguajes de programaci´on t´ıpicamente est´an definidos los
operadores l´ogicos de la negaci´on (¬), la conjunci´on (∧) y la disyunci´on (∨), pero el condicional y el bicondicional no lo est´an, por lo tanto si se quiere utilizar estos operadores es necesario construir las funciones que permitan utilizar estos operadores. Para el caso del condicional y a partir de la tabla de verdad para el operador condicional definido en el cap´ıtulo de l´ogica
ξ(p) ξ(q) ξ(p →q)
V V V
V F F
F V V
La estructura condicional sin opci´on alternativa El operador l´ogico “condicional”
El operador l´
ogico “condicional” II
Ejemplo (continuaci´on)
se puede definir una funci´on que permite calcular la operaci´on condicional de un par de variables booleanas y que retorna el resultado de operar los valores mediante un condicional, de la siguiente manera
condicional:B×B−→B
aqu´ı se tienen dos casos, primero, si el antecedente es verdadero y el consecuente es falso, entonces el resultado de aplicar el condicional el falso, para cualquier otro caso el condicional es verdadero. En notaci´on matem´atica esto puede ser escrito de la siguiente manera
condicional :B×B→B
(p,q)7→
(
El operador l´
ogico “condicional” III
Ejemplo (continuaci´on)
Una posible codificaci´on en C++ de esta funci´on seria bool condicional(bool p, bool q){
if(p == true && q == false){ return false;
}else{
return true; };
La estructura condicional sin opci´on alternativa El operador l´ogico “condicional”
El operador l´
ogico “condicional” IV
Ejemplo (continuaci´on)
obs´ervese que es posible construir una funci´on que utilice s´olo una estructuraif sin la sentenciaelse que es mucho m´as sencilla que la funci´on presentada anteriormente,
bool condicional(bool p, bool q){ if(p){
return q; };
return true; };
Agenda
1 La estructura de control condicional s´ı (if)
Valor absoluto de un n´umero El m´aximo entre dos n´umeros El operador condicional ternario ?:
2 La estructura condicional sin opci´on alternativa
Impresi´on de n´umeros con signo El operador l´ogico “condicional”
3 Estructuras condicionales enlazadas
El descuento del d´ıa
4 La estructura de conmutaci´on (switch)
Detecci´on de vocales min´usculas
Estructuras condicionales enlazadas
Estructuras condicionales enlazadas I
Estructuras condicionales enlazadas
Estructuras condicionales enlazadas III
La codificaci´on en C++ de las estructuras condicionales enlazadas es la siguiente
<bloque_prev> if(<cond_1>){ <bloque_1> }else if(<cond_2>){
<bloque_2> }
...
}else if(<cond_i>){ <bloque_i> }
...
}else if(<cond_n-1>){ <bloque_n-1> }else{
Estructuras
if
enlazadas III
donde despu´es de ejecutar las instrucciones previas<bloque_prev>se ejecutar´a<bloque_1> si<cond_1>se eval´ua verdadero, en caso de que <cond_1> se eval´ue falso de ejecutar´a<bloque_2>si <cond_2>se eval´ua verdadero, y as´ı se continuar´a revisando cada una de las condiciones si la anterior se eval´ua falso. Si alg´un<cond_i> se eval´ua verdadero se ejecuta su respectivo <bloque_i>y despu´es de ejecutar todas las instrucciones del <bloque_i> se continua ejecutando las instrucciones siguientes al
condicional enlazado <bloque_sigui>.
Estructuras condicionales enlazadas El descuento del d´ıa
Agenda
1 La estructura de control condicional s´ı (if)
Valor absoluto de un n´umero El m´aximo entre dos n´umeros El operador condicional ternario ?:
2 La estructura condicional sin opci´on alternativa
Impresi´on de n´umeros con signo El operador l´ogico “condicional”
3 Estructuras condicionales enlazadas El descuento del d´ıa
4 La estructura de conmutaci´on (switch)
Detecci´on de vocales min´usculas
El descuento del d´ıa I
Ejemplo
Una tienda tiene las siguientes promociones
Estructuras condicionales enlazadas El descuento del d´ıa
El descuento del d´ıa II
Ejemplo (continuaci´on)
La siguiente funci´on permitir´a calcular el valor deseado
pago final(n,precio) =valor
Si se establecen las variables:
precio := Valor de cada producto
n:= N´umero de productos
El descuento del d´ıa III
Ejemplo (continuaci´on)
pago final:Z×R→R
(n,precio)7→
n∗precio, n≤5;
n∗precio∗0.95, 5<n≤10;
n∗precio∗0.90, 10<n ≤20;
Estructuras condicionales enlazadas El descuento del d´ıa
El descuento del d´ıa IV
Ejemplo (continuaci´on)
La codificaci´on en C++ de esta funci´on es
double pago_final(int n, double precio){ double valor;
if(n <= 5){
valor = n * precio;
}else if(5 < n && n <= 10){ valor = n * precio * 0.95; }else if(10 < n && n <= 20){ valor = n * precio * 0.90; }else{
valor = n * precio * 0.80; };
El descuento del d´ıa V
Ejemplo (continuaci´on)
Otra posible escritura de la funci´on puede ser
double pago_final(int n, double precio){ if(n <= 5){
return n * precio;
}else if(5 < n && n <= 10){ return n * precio * 0.95; }else if(10 < n && n <= 20){
return n * precio * 0.90; }else{
return n * precio * 0.80; };
La estructura de conmutaci´on (switch)
Agenda
1 La estructura de control condicional s´ı (if)
Valor absoluto de un n´umero El m´aximo entre dos n´umeros El operador condicional ternario ?:
2 La estructura condicional sin opci´on alternativa
Impresi´on de n´umeros con signo El operador l´ogico “condicional”
3 Estructuras condicionales enlazadas
El descuento del d´ıa
4 La estructura de conmutaci´on (switch)
Detecci´on de vocales min´usculas
La estructura de conmutaci´
on (
switch
) I
La estructura de conmutaci´on (switch)
La estructura de conmutaci´
on (
switch
) II
if(<var_entera> == <num_1>){ <bloque_1>
}else if(<var_entera> == <num_2>){ <bloque_2>
} ...
}else if(<var_entera> == <num_i>){ <bloque_i>
} ...
}else if(<var_entera> == <num_n-1>){ <bloque_n-1>
}else{
La estructura de conmutaci´
on (
switch
) III
en este caso se utiliza una instrucci´onswitch, la cual sirve para abreviar una instrucci´onifenlazada como la anterior. El aspecto general de una instrucci´on switches la siguiente:
La variable aparece ´unicamente como par´ametro de la instrucci´on switch.
La estructura de conmutaci´on (switch)
La estructura de conmutaci´
on (
switch
) IV
A continuaci´on se escribe el cuerpo de instrucciones a realizar en cada caso.
Se termina con una instrucci´onbreakque obliga a que se deje de ejecutar la instrucci´onswitch.
La estructura de conmutaci´
on (
switch
) V
La codificaci´on en C++ de una estructuraswitches la siguiente switch(<var_entera>){
case <num_1>: <bloque_1> break;
case <num_2>: <bloque_2> break;
...
case <num_i>: <bloque_i> break;
La estructura de conmutaci´on (switch)
La estructura de conmutaci´
on (
switch
) VI
case <num_i>: <bloque_i> break;
...
case <num_n-1>: <bloque_n-1> break;
default:
<bloque_n> break;
Agenda
1 La estructura de control condicional s´ı (if)
Valor absoluto de un n´umero El m´aximo entre dos n´umeros El operador condicional ternario ?:
2 La estructura condicional sin opci´on alternativa
Impresi´on de n´umeros con signo El operador l´ogico “condicional”
3 Estructuras condicionales enlazadas
El descuento del d´ıa
4 La estructura de conmutaci´on (switch) Detecci´on de vocales min´usculas
La estructura de conmutaci´on (switch) Detecci´on de vocales min´usculas
Detecci´
on de vocales min´
usculas I
Ejemplo
La siguiente funci´on permite determinar si dada una letra, ´esta es una vocal min´uscula, en caso de no ser as´ı, entonces por defecto se retorna
falso.
es vocal minuscula:ASCCI→B
(ch)7→
V, si ch=a;
V, si ch=e;
V, si ch=i;
V, si ch=o;
V, si ch=u;
Detecci´
on de vocales min´
usculas I
Ejemplo (continuaci´on)
Hay que tener presente que todo car´acter es representado por un n´umero entero, por eso es posible utilizar una variable de tipo car´acter dentro de una instrucci´onswitch. La codificaci´on de la anterior funci´on matem´atica en C++ puede ser la siguiente.
bool es_vocal_minuscula(char ch){ bool value;
La estructura de conmutaci´on (switch) Detecci´on de vocales min´usculas
Detecci´
on de vocales min´
usculas II
Ejemplo (continuaci´on)
bool es_vocal_minuscula(char ch){ bool value;
switch(ch){ case ’a’:
value = true; break;
case ’e’:
value = true; break;
case ’i’:
Detecci´
on de vocales min´
usculas III
Ejemplo (continuaci´on)
case ’o’:
value = true; break;
case ’u’:
value = true; break;
default:
value = false; break;
};
La estructura de conmutaci´on (switch) Detecci´on de vocales min´usculas
Detecci´
on de vocales min´
usculas IV
Cuando en una instrucci´onswitchvarios casos se tratan de la misma forma, entonces estos se pueden agrupar en uno o varios casos, como se muestra en el siguiente ejemplo.
Ejemplo
En este ejemplo se agruparon todos lo casos de las vocales en uno solo. bool es_vocal_minuscula(char ch){
bool value; switch(ch){
Detecci´
on de vocales min´
usculas V
Ejemplo (continuaci´on)
switch(ch){ case ’a’: case ’e’: case ’i’: case ’o’: case ’u’:
value = true; break;
default:
value = false; break;
};
La estructura de conmutaci´on (switch) Detecci´on de vocales min´usculas
Detecci´
on de vocales min´
usculas VI
Detecci´
on de vocales min´
usculas VII
Ejemplo
En este ejemplo se agruparon todos lo casos de las vocales en uno solo y se retorn´o directamente el resultado de la evaluaci´on de cada caso.
bool es_vocal_minuscula(char ch){ switch(ch){
case ’a’: case ’e’: case ’i’: case ’o’: case ’u’:
return true; default:
return false; };
Validaci´on de datos usando condicionales
Agenda
1 La estructura de control condicional s´ı (if)
Valor absoluto de un n´umero El m´aximo entre dos n´umeros El operador condicional ternario ?:
2 La estructura condicional sin opci´on alternativa
Impresi´on de n´umeros con signo El operador l´ogico “condicional”
3 Estructuras condicionales enlazadas
El descuento del d´ıa
4 La estructura de conmutaci´on (switch)
Detecci´on de vocales min´usculas
Validaci´
on usando condicionales I
Teniendo en cuenta que el algoritmo para el c´alculo del ´area de un rect´angulo dada la definici´on del tipo de dato podr´ıan estarse leyendo largos o anchos negativos. La notaci´on matem´atica tambi´en permite restringir el dominio y el rango de los conjuntos quedando la funci´on de la siguiente forma
area rectangulo :R0,+×R0,+→R0,+
Validaci´on de datos usando condicionales
Validaci´
on usando condicionales II
Dicha validaci´on es suficiente a nivel de notaci´on matem´atica, pero en programaci´on dichas validaciones sobre los par´ametros de entrada corresponder´an al programa principal. Para realizar estas validaciones se tienen dos opciones, el uso de un condicional ´o el uso de un ciclo (este ´
ultimo se explicar´a en el capitulo de ciclos).
´
Area de un rect´
angulo validando datos I
Ejemplo
La codificaci´on en C++ de la funci´on para calcular el ´area de un
rect´angulo haciendo la validaci´on de la positividad tanto del ancho como de la altura es la siguiente
#include<iostream> #include<cstdlib>
using namespace std;
double area_rectangulo(double l, double a){ return l * a;
Validaci´on de datos usando condicionales
´
Area de un rect´
angulo validando datos II
Ejemplo (continuaci´on)
int main(){ double largo; double ancho;
cout << "largo? = "; cin >> largo;
if(largo < 0){
cout << "El largo no es valido"; cout << endl;
´
Area de un rect´
angulo validando datos III
Ejemplo (continuaci´on)
cout << "ancho? = "; cin >> ancho;
if(ancho < 0){
cout << "El ancho no es valido"; cout << endl;
system("pause"); return EXIT_FAILURE; };
cout << "El area del rectangulo es: "; cout << area_rectangulo(largo, ancho); cout << endl;