50
50
50
inst 1
inst 1
inst 2
inst 2
inst 3
inst 3
.
.
inst n
inst n
fin
}
3.5.1 Estructura de control selectiva simple si (if)
Estructura de control que dirige a la computadora para ejecutar una o ms
instrucciones solamente si lacondicin es verdadera. Si la condicin es falsa no
realiza ninguna accin.El trmino condicin lo utilizaremos a lo largo de este libro
para referirnos a una o ms condiciones.Existen dos formas de representarlo,
dependiendo del nmero de instrucciones que se desean realizarsi la condicin se
cumple:1. Si se requiere ejecutar una sola instruccin, cuando se cumpla la
condicin se representa de la siguienteforma:
Diagrama de flujo Pseudocdigo Lenguaje C
si
(condicin)
if (condicin)
FVInst 1condicin
inst 1
inst 1
EjemplosEjemplosEjemplos
51
Si la condicin se cumple se realiza la instruccin 1.Una posibilidad en el cdigo
sera:
if
(i)printf(%d, i/2); 2. Si se requiere ejecutar un bloque de instrucciones, cuando
se cumpla la condicin se representa de lasiguiente forma:
Diagrama de flujo Pseudocdigo Lenguaje C
si
(condicin)
if (condicin)
Inst 1Inst 2Inst 3condicinFV inicio
{
inst 1
inst 1
inst 2
inst 2
inst 3
inst 3
fin
}
Nota:
Si existe ms de una instruccin para realizar, es necesario utilizar inicio y fin para
agrupar las instrucciones,es su alcance sintctico, si no se usa el inicio y fin slo
se ejecuta la primera instruccin, mientras que las siguientesinstrucciones se
realizarn siempre. En la tabla 3.2 vemos unos ejemplos de las distintas formas
que puede adoptar laexpresin dentro de un
if
.
Tabla 3.2
Formas de utilizar la instruccin
if
E j e m p l o s O b s e r v a c i o n e s
if (x
.
y)if ((x
.
y) !
5
0 )Las dos expresiones son vlidas y equivalentes. Es ms frecuente la primera;
una condi-cin es verdadera si es diferente de cero.if (x)if (x !
5
0)Las dos expresiones son correctas e iguales. Es ms usual la segunda
expresin en estecurso.if (!x)if (x
55
}
sino
else
inicio
{
inst 3
inst 3
inst 4
inst 4
fin
}
Si la condicin se cumple se realizan las instrucciones 1 y 2, pero si no se cumple se
realizarn las instruc-ciones 3 y 4.
3.5.3 Anidamiento o escalonamiento si-si no-si (if-else-if)
El concepto de anidamiento es muy utilizado en la programacin y consiste
en insertar (anidar) una estruc-tura dentro de otra.La expresin si anidados se
refiere a que podemos utilizar una sentencia
si (if)
dentro de otra sentencia
si (if)
. Esto se emplea cuando se tienen que cumplir varias condiciones para poder
ejecutar una accin.Uno de los aspectos ms confusos de las sentencias
si (if)
en el lenguaje de programacin es el
si (if)
anidado. Un
si (if)
anidado es una sentencia
si (if)
que es el objeto de otro
si (if)
o
si no (else)
. La razn por laque los
si (if)
anidados son tan problemticos es que resulta confuso saber qu
else
se asocia con qu
si (if)
.
54
Captulo 3 Programacin estructurada
Diagrama de flujo Pseudocdigo Lenguaje C
#include <stdio.h> #include <conio.h>
calFVcal
.5
60ReprobadaAprobada principal ()
main()
inicio
{
real cal
float cal;
imprimir Dame la calificacin:
printf(Dame la calificacin: );
leer cal
scanf(%f,&cal);
si (cal
.5
60)
if ( cal
.5
60 )
imprimir Aprobada
printf (Aprobada);
si no
else
imprimir Reprobada
printf(Reprobada);
getch(); return 0;
fin
}
verdadera se realiza una determinada accin. Se revisa la calificacin
(cal)
, si es mayor o igual que 60, seimprime
aprobada
, de lo contrario no imprime nada el programa, es decir slo pasa por parte del
programadependiendo de una condicin. Ejemplo: si
cal
5
85
el programa imprime Aprobada, pero si
cal
5
59
, elprograma no imprime nada.
Ejercicio 2.
Segn una calificacin, imprimir si es aprobada o reprobada.
Ejemplos
A diferencia del ejercicio 1, el ejercicio 2 utiliza la selectiva doble, ya que revisa la
condicin; si sta se cum-ple (es verdadera) imprimir Aprobada, pero, si la condicin no
se cumple imprimir Reprobada, es decirel programa pasa por una u otra instruccin
pero no por ambas. Ejemplo: si
cal
5
85
el programa imprimeAprobada,perosi
cal
5
59
, el programa imprime Reprobada. La alternativa doble es ms rpida; en esteejemplo slo
evala una condicin, a diferencia de la simple, que evaluara dos.Para calcular un
promedio primero se debern sumar las
n
calificaciones y luego dividir el resultadoentre
n
; en este caso especfico son tres calificaciones, as que primero se le piden al
usuario
cal1
,
cal2
,
cal3
.Se suman las calificaciones y el resultado se divide entre tres, guardando el
resultado en la variable
promedio
,tomando en cuenta la necesidad de los
()
en la expresin para indicarle al compilador que primero se hacela suma y luego la
divisin. Luego se revisa la condicin; si promedi
.
95 se modificar el valor de
prome-dio
asignndole el valor de 100, pero si la calificacin fuera menor o igual al 95 el valor
de la variable
pro-medio
no se modifica, es decir queda almacenado el mismo resultado. La ltima
instruccin muestra elresultado del promedio.
cal1
5
80, cal2
5
90, cal3
5
100
. El programa imprimir
________________________________
paga
_____________________________________
finsi nosi
_________________
paga
horas * precio_horasi no
_________________
66
Captulo 3 Programacin estructurada
Ejercicios complementarios de la estructura de controlselectiva simple y doble en
lenguaje C
Elaborar la codificacin en Lenguaje C de los siguientes programas (realizando el
clculo e impresinrespectiva):
1. Leer una fecha (da, mes, ao) y diga si es correcta o no.2. Leer un ao e imprimir
si es bisiesto o no.3. Un millonario tena tres hijos: Juan, Luis y Rosa. Al morir dej
el siguiente legado: A Luis le dej 4/3 delo que le dej a Juan. A Juan le dej 1/3 de
su fortuna. A Rosa le dej la mitad de lo que le dej a Luis.Adems el licenciado les
cobrar por sus servicios un porcentaje de lo que reciban cada uno de herencia:si el
monto es menor a la tercera parte de la herencia cobrar 3%, en caso contrario 5%.
Imprimir cuntorecibirn cada heredero y el abogado.4. El domingo de Pascua es el
primer domingo despus de la primera luna llena posterior al equinoccio
deprimavera y se determina mediante el siguiente clculo:
a
5
ao % 19
b
5
ao % 4
c
5
ao % 7
d
5
(19 * a
1
24) % 30
e
5
(2 *b
1
4*c
1
6*d
1
5) % 7
n
5
(22
1
d
1
e)Donde
n
indica el nmero del da del mes de marzo (si
n
es igual o menor que 31), en caso contrario elmes de abril se obtiene como (
d
1
e
2
9). Imprimir la fecha del domingo de Pascua a partir de un ao dado. 5. Leer un nmero
entero (entre 0 y 32 700) e imprimir el nmero de cifras de dicho nmero. 6. Leer
la hora de un da (0 a 23 horas y minutos, por ejemplo para las 18:30 deber leer 18
y 30), e imprimirla misma hora pero en formato de 12 horas mostrando las horas,
los minutos y el indicador de meridiano.No es posible especificar PM cuando la
hora es 0. Cuando se especifica AM tambin representa las horasantes del
medioda. Si se especifica PM representa las horas despus del medioda. Si se
especifica AM,representa la medianoche. Si se especifica PM, representa el
medioda. 12:01 es 1 minuto despus delmedioda, como 12:01 PM, mientras que
12:01 AM es 1 minuto despus de medianoche. Especificar12:01 AM es lo mismo
que 00:01 o 00:01 AM. Para las 18:30 deber imprimir 6:30 PM. 7. Leer
un nmero entero e imprimir si es:
a
) Cero, positivo o negativo;
b
) Par o impar (cuando sea positi- vo);
c
) Mltiplo de 7 o no mltiplo de 7 (cuando sea impar). Para el nmero 35,
imprimir: Es un nmeropositivo, es impar y es mltiplo de 7. 8. Leer 5 nmeros
e imprimir el menor y el mayor de ellos. 9. Conversin de temperatura expresada
en grados Celsius a Fahrenheit : f
5
(9
/
5)c
1
32 y viceversa(Fahrenheit a Celsius). Permita elegir entre estas
dos opciones.10. Dados dos de los ngulos de un tringulo, calcular el tercer ngulo
y determinar si el tringulo es rectngulo(un ngulo igual a 90 grados), acutngulo
(sus tres ngulos menores a 90 grados) u obtusngulo (unngulo mayor a 90
grados).11. Leer las horas trabajadas y la paga por hora para calcular el sueldo semanal de un
empleado. Cuandolas horas de trabajo exceden de 40 se consideran horas extra; las primeras 8
se pagan al doble; si las horasextra exceden de 8 se pagan las primeras 8 al doble de lo que se
inicio
{
caso
exp_const_1: inst1
case exp_const_1 : inst1;
salir
break;
expresininst 4inst 2inst 3inst 1inst n
caso
exp_const_2 : inst2
case exp_const_2 : inst2
inst3
inst3
salir
break;
caso
exp_const_n : inst n
case exp_const_n : inst n
salir
break;
caso
contrario: inst 10
default: inst 10
fin
}
Se compara la expresin (puede ser una sola variable) con cada una de las
opciones const y en el mo-mento de encontrar una constante idntica se
ejecutan la(s) instruccin(es) correspondiente(s) a ese caso. Al
A veces puede resultar difcil ver claro donde usar un else o qu instrucciones de
las que siguen a un if deben ir entre llaves y cuales no. Generalmente la
dificultad est en el hecho de intentar teclear directamente un programa en C, en
vez de pensar en el problema que se pretende resolver.
Para ayudarnos a centrarnos en el problema, existen notaciones grficas, como
los diagramas de flujo, que nos permiten ver mejor qu se debe hacer y cuando.
En primer lugar, vamos a ver los 4 elementos bsicos de un diagrama de flujo, y
luego los aplicaremos a un caso concreto.
/*---------------------------*/
/* Ejemplo en C n 23:
*/
/* C023.C
*/
/*
*/
/* El operador condicional */
/*
*/
/* Curso de C,
*/
/*
Nacho Cabanes
*/
/*---------------------------*/
#include <stdio.h>
int main()
{
int a, b, mayor;
Un segundo ejemplo, que sume o reste dos nmeros segn la opcin que se
escoja, sera:
/*---------------------------*/
/* Ejemplo en C n 24:
*/
/* C024.C
*/
/*
*/
/* Operador condicional - 2 */
/*
*/
/* Curso de C,
*/
/*
Nacho Cabanes
*/
/*---------------------------*/
#include <stdio.h>
int main()
{
int a, b, resultado;
int operacion;
printf("Escriba un nmero: ");
scanf("%d", &a);
scanf("%d", &b);
printf("Escriba una operacin (1 = resta; otro = suma): ");
scanf("%d", &operacion);
resultado = (operacion == 1) ? a-b : a+b;
printf("El resultado es %d.\n", resultado);
return 0;
}
Ejercicios propuestos:
3.1.10. switch
Si queremos ver varios posibles valores, sera muy pesado tener que hacerlo con
muchos if seguidos o encadenados. La alternativa es la orden switch, cuya
sintaxis es
switch (expresin)
{
case valor1: sentencia1;
break;
case valor2: sentencia2;
sentencia2b;
break;
...
case valorN: sentenciaN;
break;
default:
otraSentencia;
};
Es decir, se escribe tras switch la expresin a analizar, entre parntesis.
Despus, tras varias rdenes case se indica cada uno de los valores posibles.
Los pasos (porque pueden ser varios) que se deben dar si se trata de ese valor se
indican a continuacin, terminando con break. Si hay que hacer algo en caso de
que no se cumpla ninguna de las condiciones, se detalla tras default.
Vamos con un ejemplo:
/*---------------------------*/
/* Ejemplo en C n 25:
*/
/* C025.C
*/
/*
*/
/* La orden switch
*/
/*
*/
/* Curso de C,
*/
/*
Nacho Cabanes
*/
/*---------------------------*/
#include <stdio.h>
int main()
{
char tecla;
printf("Pulse una tecla y luego Intro: ");
scanf("%c", &tecla);
switch (tecla)
{
case ' ': printf("Espacio.\n");
break;
case
case
case
case
case
case
case
case
case
'2':
'3':
'4':
'5':
'6':
'7':
'8':
'9':
'0': printf("Dgito.\n");
break;
default: printf("Ni espacio ni dgito.\n");
}
return 0;
}
Ejercicios propuestos:
Crear un programa que lea una letra tecleada por el usuario y diga si se
trata de una vocal, una cifra numrica o una consonante.
Crear un programa que lea una letra tecleada por el usuario y diga si se
trata de un signo de puntuacin, una cifra numrica o algn otro carcter.
Repetir los dos programas anteriores, empleando if en lugar de switch.