Transcript Clase4

CI2125 TEORIA
semana 4
•Estructura Algorítmica: SELECCIÓN
• Selección Simple: “SI”
• Ejemplo en C: if
• Selección Doble: “SI-SINO”
• Ejemplo en C: if – else
• Selección Doble en cascada: “SI-SINO-SI”
• Ejemplo en C: if – else { if – else { … } …. }
• Selección Múltiple: “SEGÚN”
• Ejemplo en C: switch
Expresiones Lógicas en C
#include <stdio.h>
#define TRUE 1
#define FALSE 0
Cualquier variable entera con
un valor distinto de cero, se
considera Verdadera
void main()
{
int a,b,x,y; /* se declaran de tipo entero */
x =5; y = 10;
a = TRUE;
b = a && x;
printf(“b= %d\n”, b );
b = a && y;
printf(“b= %d\n”, b );
b = x == y;
printf(“b= %d\n”, b );
b = a && x != y;
}
Resultado:
b=1
b=1
b=0
TRUE
TRUE
FALSE
Expresiones Lógicas en C
/* Aplicación de Operadores en C */
#include <stdio.h>
#define TRUE 1
#define FALSE 0
Que imprime
Este programa ??
void main()
{
int i= 15, j, k, l;
j = (( 15 > i--) > ( 14 < ++i )) && TRUE;
printf(“\nEl valor de j es: %d”, j);
}
k = ! ( ‘b’ != ‘d’ ) > ( i – 16 );
printf(“\nEl valor de k es: %d”, k);
Imprime:
l = ( ! ( 34 > ( 70 % 2 )) || FALSE );
printf(“\nEl valor de l es: %d ”, l);
El valor de j es: 0
El valor de k es: 1
El valor de l es: 0
Estructura de Selección Simple “SI”
V
Pseudocódigo (acción simple)
condición
SI ( condición )
acción a
F
acción
En C:
If ( condición )
sentencia_1;
If ( condición )
{
sentencia_1;
sentencia_2;
}
Pseudocódigo (acción compuesta)
SI ( condición )
{
acción 1
acción 2
.
.
.
acción n
}
Estructura de Selección Simple “SI”
Problema: Codificar un programa que al recibir el promedio de un alumno
en un curso, escribe “Aprobado” si el promedio es mayor o igual a 6
Análisis:
1
Entrada: Se recibe variable de tipo real que
representa el promedio del alumno. Pre-condición:
dato real.
Salida: Se debe imprimir si esta aprobado si se
cumple la condición establecida, con el formato
“Aprobado”
Proceso: Si se cumple la expresión lógica ‘el
promedio es mayor o igual a 6’, entonces se
imprimirá “Aprobado”.
Sea Pro la variable real que representa el promedio
Diagrama de
Flujo
2
INICIO
Pro
Pro >= 6
V
F
Verificación:
Corrida
1
2
3
4
“Aprobado”
3
Dato Pro
6,75
5,90
4,00
8,80
Resultado
“Aprobado”
“Aprobado”
FIN
Estructura de Selección Simple “SI”
Problema: Codificar un programa que al recibir el promedio de un alumno
en un curso, escribe “Aprobado” si el promedio es mayor o igual a 6
Diagrama de
Flujo
2
INICIO
Pro
Pro >= 6
4
Codificación en Lenguaje C
/* Promedio curso:
El programa recibe como dato el promedio de un
alumno en un curso , escribe “Aprobado” si su
promedio es mayor o igual a 6 */
#include <stdio.h>
#define VALOR 6
V
F
“Aprobado”
void main()
{
float Pro;
printf( "Ingrese el promedio del curso: \a \n " );
scanf( "%f", &Pro );
if ( Pro >= VALOR)
printf( " \”Aprobado\” \n" );
FIN
}
Estructura de Selección Doble “SI – SINO”
Pseudocódigo (acción simple)
V
condición
acción A
En C:
If ( condición )
sentencia_1;
else
sentencia_2;
F
SI ( condicion)
acciona
SINO
accionb
acción B
If ( condición ) {
sentencia_1;
sentencia_2;
}
else {
sentencia_3;
sentencia_4;
}
Pseudocódigo (acción compuesta)
SI ( condicion ) {
acciona1
.
.
accionan
}
SINO {
accionb1
.
.
accionbn
}
Estructura de Selección Doble “SI – SINO”
Problema: Codificar un programa que al recibir el promedio de un alumno en un curso,
escribe “Aprobado” si el promedio es mayor o igual a 6, sino escribir “Reprobado”
Análisis:
1
Entrada: Se recibe variable de tipo real que
representa el promedio del alumno. Pre-condición:
dato real.
Salida: Se debe imprimir si esta aprobado si se
cumple la condición establecida, con el formato
“Aprobado”, sino “Reprobado”
Proceso: Si se cumple la expresión lógica ‘el
promedio es mayor o igual a 6’, entonces se
imprimirá “Aprobado, sino “Reprobado”
Sea Pro la variable real que representa el promedio
Verificación:
Corrida
1
2
3
4
3
Dato Pro
6,75
5,90
4,00
8,80
Resultado
“Aprobado”
“Reprobado”
“Reprobado”
“Aprobado”
Diagrama de
Flujo
2
INICIO
Pro
V
Pro >= 6
“Aprobado”
F
“Reprobado”
FIN
Estructura de Selección Doble “SI – SINO”
Problema: Codificar un programa que al recibir el promedio de un alumno en un curso,
escribe “Aprobado” si el promedio es mayor o igual a 6, sino escribir “Reprobado”
Diagrama de
Flujo
2
/* Promedio curso: El programa recibe como dato el promedio de
un alumno en un curso , escribe “Aprobado” si su promedio es
mayor o igual a 6, sino escribe “Reprobado” */
INICIO
#include <stdio.h>
#define VALOR 6
Pro
V
Pro >= 6
“Aprobado”
F
“Reprobado”
FIN
Codificación en Lenguaje C
void main()
{
float Pro;
printf( "Ingrese el promedio del curso: \a \n " );
scanf( "%f", &Pro );
if ( Pro >= VALOR)
printf( " \”Aprobado\” \n" );
else
printf( " \”Reprobado\” \n" );
}
4
Estructura de Selección Doble en Cascada “SI-SINO-SI”
Pseudocódigo ( accion simple )
SI ( condicion1 )
accion1
SINO
SI ( condicion2 )
accion2
SINO
SI ( condicion3 )
accion3
.
.
.
SINO
acciondefecto
Estructura de Selección Doble en Cascada “SI-SINO-SI”
Pseudocódigo ( accion compuesta)
SI ( condicion1 ) {
acciona1
…
accionan
}
SINO
SI ( condicion2 ) {
accionb2
…
accionbn
}
SINO
.
.
SINO {
acciondefecto1
….
acciondefecton
}
En C:
If ( condición_a )
sentencia_a;
else
if ( condición_b )
sentencia_b;
else
sentencia_por_defecto;
If ( condición_a ) {
sentencia_a1;
sentencia_a2;
}
else if ( condición_b ) {
sentencia_b1;
sentencia_b2;
}
else
sentencia_por_defecto;
Estructura de Selección Doble en Cascada “SI-SINO-SI”
Problema: Codificar un programa que al recibir un numero entero, determine si pertenece
al intervalo (10,100) e imprimir “Si pertenece”, de lo contrario imprimir “No pertenece”
Análisis:
1
Entrada: Se recibe variable de
tipo entera, num.
Salida: Se debe imprimir “Si
pertenece” si num pertenece a
(10,100) de lo contrario se
imprime “No pertenece”
Proceso: El algoritmo debe
determinar si la variable num, se
encuentra dentro o fuera del
intervalo, para lo cual se usa una
estructura de selección en
cascada. Verificamos si el num
<= 10, si 0 < num < 100, o si por
defecto num > = 100, en cuyos
casos se imprime lo que
corresponda.
2
Diagrama de
Flujo
INICIO
num
V
num <= 0
“No pertenece”
F
(num >0) y
(num<100)
V
“Si pertenece”
FIN
F
“No pertenece”
Estructura de Selección Doble en Cascada “SI-SINO-SI”
Verificación:
3
Corr num Resultado
1
8 “No pertenece”
2
11 “Si pertenece”
3
99 “Si pertenece”
4
1000 “No pertenece”
Codificación
4
/* Programa que determina si num
pertenece al intervalo (10,100) */
#include <stdio.h>
#define RANGO_INF 10
#define RANGO_SUP 100
void main()
{
int num;
printf( "Introduce un número " );
scanf( "%i", &num );
if ( num < RANGO_INF )
printf ( “No pertenece \n" );
else
if ( (num>RANGO_INF) && (num<RANGO_SUP) )
printf ( “Si pertenece \n" );
else printf( “No pertenece \n" );
}
Estructura de Selección Doble en Cascada “SI-SINO-SI”
Problema: Leer los datos de las ventas de tres vendedores de una
tienda de discos, escribir las mismas en forma descendente”
Análisis:
Entrada: Se reciben tres variables de tipo flotante, p, s y r.
1
Salida: Se deben imprimir las mismas variables ordenadas
descendentemente, es decir, de mayor a menor.
Proceso: El algoritmo debe comparar las variables entre si y determinar
la mayor de todas, y luego compara las dos restantes y determina la
mayor de estas dos y encontrar asi la intermedia y la menor.
Para esto, se usa una estructura de selección en cascada, que permite
comparar dos variables, p > s ?, si es verdad, entonces compara p > r
?, si esto es verdad, compara s > r ?, si todo esto se cumple, es decir
p>s>r es Verdadero, entonces imprime p, s, r. Esto es una sola rama del
árbol que se genera en la estructura de selección en cascada. De las
diferentes ramas salen todos los posibles casos: p>r>s, r>p>s, r>s>p,
s>p>r, s>r>p,
Estructura de Selección Doble en Cascada “SI-SINO-SI”
Problema: Leer los datos de las ventas de tres vendedores de una tienda de discos,
escribir las mismas en forma descendente
2
Diagrama de
Flujo
INICIO
p, s, r
V
V
V
p, s, r
s>r
p>r
F
p, r, s
F
p>s
F
V
V
r, p, s
s, p, r
FIN
p>r
s>r
F
F
r, s, p
s, r, p
3 Verificar !
Estructura de Selección Doble en Cascada “SI-SINO-SI”
/* Imprime en orden descendente, 3 valores de ventas */
#include <stdio.h>
void main()
{
float p, s, r;
printf( "Ingrese las ventas de los tres vendedores" );
scanf( "%f %f %f", &p, &s, &r );
if ( p > s )
if ( p > r )
if ( s > r )
printf(“\n El orden es: %f %f %f”,p,s,r);
else
printf(“\n El orden es: %f %f %f”,p,r,s);
else printf(“\n El orden es: %f %f %f”,r,p,s);
else if ( s > r )
if ( p > r )
printf(“\n El orden es: %f %f %f”,s,p,r);
else
printf(“\n El orden es: %f %f %f”,s,r,p);
else printf((“\n El orden es: %f %f %f”,r,s,p);
}
4
Codificación
en C:
Estructura de Selección Múltiple “SEGÚN”
Estructura de Selección Múltiple “SEGÚN”
selector
valor1
acción 1
valor2
acción 2
Valor3, valor4
acción 3
valor5
acción 5
valorx
acción x
Estructura de Selección Múltiple “SEGÚN”
Pseudocódigo ( acción simple )
Pseudocódigo ( acción compuesta)
SEGÚN ( selector ) {
CASO c1 : accion1
CASO c2 : accion2
CASO c3 : accion3
.
.
.
CASO cn : accionn
DEFECTO : acciondefecto
}
SEGÚN ( selector ) {
CASO c1 : {
acciona1
…
accionan
}
CASO c2 : accion2
CASO c3 : accion3
.
.
.
CASO cn : accionn
DEFECTO : acciondefecto
}
Estructura de Selección Múltiple “SEGÚN”
Código en C:
switch ( selector )
{
case c1: acción_c1;
acción_c11;
break;
case c2: acción_c2;
break;
case c3: acción_c3;
acción_c31
break;
.
.
.
case cn: acción_cn;
break;
default : accion_defecto; /*opcional*/
}
/* Ejemplo switch */
int numero; /* 1 es Primavera…*/
char nombreEst; /* estaciones */
switch (numero) {
case 1 :
nombreEst = ‘P’;
break;
case 2 :
nombreEst = ‘V’;
break;
case 3 :
nombreEst = ‘O’;
break;
default :
nombreEst = ‘I’;
}
Estructura de Selección Múltiple “switch”
#include <stdio.h>
int main()
{
int num;
printf( "Introduce un número " );
scanf( "%i", &num );
if ( num==1 )
printf( "Es un 1\n" );
else if ( num==2 );
printf( "Es un 2\n" );
else if ( num==3 )
printf( "Es un 3\n" );
else
printf( "No era ni 1, ni 2, ni 3\n“);
}
múltiples casos con if-else
con switch
#include <stdio.h>
int main()
{
int num;
printf( "Introduce un número " );
scanf( "%i", &num );
switch( num )
{
case 1:
printf( "Es un 1\n" );
break;
case 2:
printf( "Es un 2\n" );
break;
case 3:
printf( "Es un 3\n" );
break;
default:
printf( "No es ni 1, ni 2, ni 3\n" );
break;
}
}
Estructura de Selección Múltiple “switch”
Problema: Construir diagrama de flujo y el programa en C, que al
recibir como datos dos variables enteras, Obtenga el resultado de
evaluar la siguiente función
| t/5, si Op = 1
| t ** t, si Op = 2
F(t) = | 6*t/2, si Op=3, 4
| 1, para cualquier otro caso
Análisis:
1
Entrada: Se reciben dos variables enteras, Op representa el tipo de
operación a realizar, y t el valor que se usa para el calculo de la función
Salida: Se deben imprimir el resultado de la función f(t), para Op y t
dado.
Proceso: El algoritmo debe comparar el valor de Op, contra las
opciones dadas por la función, que son: 1,2,3,4, y cualquier otro caso, y
en cada caso realizar el calculo correspondiente de la función para el t
dado.
Para esto usaremos una estructura de selección múltiple “Según”.
Estructura de Selección Múltiple “switch”
2
Diagrama de
Flujo
INICIO
Op, t
Op
1
cal  t/5
2
3, 4
cal  6*t/2
cal  t**t
otro
cal  1
Op, t,
cal
FIN
3 Verificar !
Estructura de Selección Múltiple “switch”
4
/* funcion matematica, El programa obtiene el resultado de una funcion */
#include <stdio.h>
Codificación
#include <math.h>
void main()
en C:
{
int Op, t;
float cal;
printf( "Ingrese la opcion del calculo de la función y el valor a calcular" );
scanf( "%d %d", &Op, &t );
switch( Op )
{
case 1:
cal = t/5; break;
case 2:
cal = pow(t,t); break;
case 3:
case 4:
cal = 6*t/2; break;
default:
cal = 1; break;
}
printf( “Resultado f(%d) = %f, para Op=%d \n“, t, cal, Op );
}
Estructura de Selección Múltiple “SEGÚN”
#include <stdio.h>
#define TRUE 1
int main()
{
int mes, dias, bisiesto; /* bisiesto es TRUE si el año es bisiesto */
bisiesto = TRUE;
/* suponemos que el año es bisiesto */
printf( "Introduce el numero del mes \n “);
scanf( "%i", &mes );
switch( mes )
{
case 1:
/* los meses enero, marzo, mayo, julio, agosto, octubre y diciembre tienen 31 dias */
case 3: case 5: case 7: case 8: case 10:
/* verificar la sintaxis del compilador DevC++, lineal o cada case debajo del otro */
case 12:
dias = 31;
break;
case 2:
if ( bisiesto )
Dado el numero del mes
dias = 29;
Determinar numero de días
else dias = 28;
break;
Se supone año bisiesto
default:
dias = 30;
break;
}
printf ( “Dias del mes son %d\n “,dias);
}