7/22/2019 captulo 2 condicionales y ciclos
1/42
G G G
Programacin Estructurada y Orientada a Objetos. Un acercamiento interdisciplinario. 1
Captulo 2. El paradigma de la programacin estructurada
En el captulo 1 se introdujo el primer ejemplo del cdigo y la forma general detrabajo.. En este captulo abordaremos las reglas que debe cubrir la codificacin.
Por qu estamos trabajando en la forma descrita? En algunos sentidos,
codificar se asemeja a jugar un deporte. Se deben conocer las reglas que rigen el
juego. No obstante, eso sera insuficiente sino hubiera estrategias para ganar el
partido y jugadas prefabricadas. La sintaxis son las reglas; la lgica de
programacin conforma la estrategia. Por eso es primordial que el estudiante logre
desarrollar y aplicar los conceptos de condicionales y ciclos, incluyendo la pruebadel algoritmo.
Prosiguiendo con esta analoga, prcticamente nadie esperara poder jugar
bien un deporte sin practicar cotidianamente. No obstante, un gran nmero de
estudiantes aspira a aprender a programar estudiando dos das antes del examen.
Adentrmonos, pues, en la lgica de la programacin.
21.
. G ,
,
.
. D
, .
,
.
,
7/22/2019 captulo 2 condicionales y ciclos
2/42
G G G
Programacin Estructurada y Orientada a Objetos. Un acercamiento interdisciplinario. 2
,
. E
.
El desarrollo de software tiene poco ms de seis dcadas, tomando como
referencia el nacimiento de la ENIAC, en 1946. Se trata de un rea joven si la
comparamos con ciencias como la fsica, qumica o matemticas, que adquirieron
una madurez desde hace siglos.
En sus primeros aos, la programacin se basaba en instrucciones muy
cercanas al cdigo mquina y necesitaba un conocimiento del hardware sobre elcual se trabajaba. Realizar una multiplicacin o alguna instruccin de complejidad
similar- requera de al menos una docena de instrucciones. Era la poca del
lenguaje ensamblador, que hoy se sigue empleando en microprocesadores y
cdigo embebido.
Posteriormente se agruparon instrucciones y se inventaron programas que
traducan estos comandos a lenguaje ensamblador. Nacieron de esta forma
Fortran en 1957 (para aplicaciones cientficas), COBOL en 1959 (paraaplicaciones administrativas) y BASIC en 1964, como lenguaje de uso general.
Sin embargo, el estilo de programar en estos lenguajes presentaba un
problema: el salto incondicional, representado sobre todo por la instruccin goto
de BASIC, la cual permita ir directamente a cualquier lnea de cdigo. El empleo
continuo del salto incondicional se convirti en un gran dolor de cabeza para dar
mantenimiento a los programas.
Para solucionar ese problema naci la programacin estructurada, cuyos
representantes ms notorios fueron Pascal y C. La programacin estructurada
propugnaba porque todos los programas se basaran en tres estructuras bsicas:
7/22/2019 captulo 2 condicionales y ciclos
3/42
G G G
Programacin Estructurada y Orientada a Objetos. Un acercamiento interdisciplinario. 3
a) Secuencia.- el cdigo se ejecutaba de arriba hacia abajo. La secuencia
queda implcita a la hora de leer, compilar y ejecutar los programas.
b) Condicionales- elementos de decisin que permitan realizar un bloque de
instruccin si se cumpla una condicin y, opcionalmente, llevar a cabo otro
conjunto de comandos si no se cumpla.
c) Ciclos.- repetir una secuencia de instrucciones mientra se cumpliera una
condicin.
Aunque conservaban el salto incondicional hacan hincapi en que ste no se
empleara.
El avance natural en esta lnea fue el nacimiento de la Programacin Orientadaa Objetos (POO), cuyo representante ms famoso es Java. La POO retoma los
tipos de datos y las rutinas de la programacin estructurada y crea con ellos una
estructura de mayor potencia: las clases.
Este breve recorrido intenta contextualizar a la programacin estructurada,
aunque resulta demasiado simplificado y deja fuera de manera injusta a lenguajes
de propsito especfico como el ya mencionado COBOL y a otros paradigmas,
entre ellos los dedicados al campo de Inteligencia Artificial. Tampoco describe losucedido con lenguajes para modo grfico como Visual Basic (basado en la
programacin estructurada), que posteriormente se transformara en Visual .NET
(basado en la Programacin Orienta a Objetos - POO).
En cuanto a la programacin WEB, sta se basa parcialmente en la
programacin estructurada (ASP clsico, PHP, JavaScript, etc.) y en la
Programacin Orientada a Objetos (J2EE, tecnologa .NET, etc).
En sntesis, la programacin estructurada sigue siendo vigente en dos sentidos:varios lenguajes todava la aplican y su conocimiento es base para el aprendizaje
de la Programacin Orientada a Objetos.
7/22/2019 captulo 2 condicionales y ciclos
4/42
G G G
Programacin Estructurada y Orientada a Objetos. Un acercamiento interdisciplinario. 4
2.1. Qu es un algoritmo?
Como ya se mencion, los ciclos y las condicionales son las estructuras
bsicas de la programacin estructurada y sobre stas deben fincarse la creacin
de algoritmos bsicos.
Un algoritmo es un conjunto de pasos debidamente ordenados y sin
ambigedades, que en un tiempo finito dan la solucin a un problema claramente
planteado.
Un algoritmo puede plantearse de diversas formas, desde la palabra escrita
hasta mecanismos formales. Entre los ms conocidos estn:
Pseudocdigo: se escriben en el idioma nativo (el espaol, en nuestro caso)palabras cercanas a las instrucciones de un lenguaje de programacin. Es muy
recomendable como paso intermedio entre el problema y la codificacin de la
solucin en un lenguaje de programacin (Pascal, C, Java, etc.).
Diagrama de flujo: establece de manera grfica la solucin del problema,
utilizando conos para cada estructura de programacin (ciclos, decisiones, etc.).
Sumamente utilizado para aspectos didcticos.
UML (Unified Modeling Languaje): la forma de diagramacin utilizada para
programacin orientada a objetos. Su conjunto de smbolos se aplica para todas
etapas del proceso de desarrollo de software.
Elementos bsicos para expresar el algoritmo en pseudocdigo
La gran ventaja y, al mismo tiempo, la gran desventaja del pseudocdigo es
que no existen reglas formales para escribirlo. Cada persona puede establecer suspropios criterios. Ciertamente, esto puede dar lugar a ambigedades. Para
evitarlo, deber orientarse al alumno hacia las estructuras bsicas de control y
establecer claramente los pasos a seguir.
Sugerimos al inicio limitar el pseudocdigo a las siguientes convenciones.
7/22/2019 captulo 2 condicionales y ciclos
5/42
G G G
Programacin Estructurada y Orientada a Objetos. Un acercamiento interdisciplinario. 5
Variables. Una variable es un lugar de memoria que puede guardar un valor, el
cual puede cambiar a lo largo del programa, considerando siempre que cuando se
asigna un nuevo valor, el valor anterior se pierde. Debe ser identificado por un
nombre determinado, el cual slo se utilizar para esa variable. Todas lasvariables a utilizar deben ser declaradas al inicio del programa.
Nombres de identificadores. Los identificadores son nombres que ubican a
los diferentes elementos de los programas: el nombre del propio, programa, las
variables, etc.
Reglas de prioridad. La ejecucin de los operadores aritmticos se realiza con
las mismas reglas de lgebra. Primero se harn las multiplicaciones y divisiones, y
posteriormente las sumas y restas. De esta forma 8 + 3 * 4 ser igual a 20. Se
pueden utilizar parntesis al igual que en matemticas para forzar a que en primer
lugar se haga lo que est dentro de ellos. Cabe aclarar que en programacin slo
se usan los parntesis circulares.
Leerse utilizar para recibir un dato del teclado. Por ejemplo: leer xsignificar
que se recibir el valor de la variable x del teclado.
Desplegar se manejar para mostrar un mensaje textual o el valor de una
variable en la pantalla.
Condicionales. Indican una decisin.
Ciclos. Indica que una accin se realizar mientras se cumpla la instruccin
sealada.
A manera de ejemplo, suponga el ejercicio que fue presentado en el captulo 2:
Hacer un programa que reciba el precio normal de un producto y su
correspondiente descuento. Como salida, entregue el precio final (con el
descuento incluido).
7/22/2019 captulo 2 condicionales y ciclos
6/42
G G G
Programacin Estructurada y Orientada a Objetos. Un acercamiento interdisciplinario. 6
El algoritmo que lo soluciona, expresado en pseudocdigo, queda como sigue:
,
"B"
"E "
" "
" "
= ( * / 100)
"E "
Elementos bsicos para expresar el diagrama de flujo
Como ya se coment, el pseudocdigo no es la nica forma de representar los
algoritmos. Los diagramas de flujo son una forma ms didctica y ampliamente
recomendable al iniciar un curso de programacin estructurada, aunque no seaplican mucho en la programacin a nivel profesional por el tiempo que consumen.
En los libros de texto suelen haber variaciones entre la forma de
representacin, aunque todos guardan el propsito general de forma coherente.
Nosotro utilizaremos la versin que se muestra en la figura 2-1.
.
E D
( )
E
F 21. E
7/22/2019 captulo 2 condicionales y ciclos
7/42
G G G
Programacin Estructurada y Orientada a Objetos. Un acercamiento interdisciplinario. 7
2.2. Elementos bsicos de programacin: condicionales y ciclos
Condicionales
Las condicionales establecen una decisin con la estructura siguiente: ( )
1
()
2
La condicin puede llevar inmersa ms de una condicin que al final se evala
en su conjunto. El caso calificacin >= 6 y calificacin =9). En diagrama de flujo se
identificara como lo muestra la figura 2-2.:
()
F 22.
En prcticamente todos los lenguajes de programacin el si se identifica con
un ify en caso contrario con un else. El si (condicin)es obligatorio, mientras
7/22/2019 captulo 2 condicionales y ciclos
8/42
G G G
Programacin Estructurada y Orientada a Objetos. Un acercamiento interdisciplinario. 8
en caso contrario (bloque 2 de instrucciones) es opcional. Existen diversas
formas para indicar sin ambigedades hasta donde abarca cada bloque de
instrucciones: llaves en lenguaje C, begin-enden Pascal, endifen SQL, etc.
A manera de ejemplo, suponga que se desea recibir tres calificaciones,
desplegar el promedio e indicar si la calificacin es o no es aprobatoria. La
calificacin mnima aprobatoria es 8. El algoritmo en diagrama de flujo se muestra
en la figura 2-3 y a continuacin se proporciona el pseudocdigo:
, ,
,
,
= ( + + ) / 3
E
>= 8
ABAD
EBAD
F 23. A 3
declara a, b, c y promedio como decimales
leer a, b y c
promedio = (a + b + c) / 3
desplegar promedio
promedio >= 8
desplegar "aprobado" desplegar "reprobado"
7/22/2019 captulo 2 condicionales y ciclos
9/42
G G G
Programacin Estructurada y Orientada a Objetos. Un acercamiento interdisciplinario. 9
Ciclos
Los ciclos Indican que una accin se realizar mientras se cumpla la
instruccin sealada. Tienen la estructura mostrada en la figura 2-4:
()
F 24.
Hay que hacer hincapi que la condicin significa mientras que. Por lo tanto,
una condicin que siempre se cumpla generara un ciclo infinito. Por el contrario,
una condicin que nunca se cumpla implicara que no se ejecutaran las
instrucciones del cuerpo del ciclo ni una sola vez.
Un error muy frecuente es no identificar claramente aqullo que es repetitivo (va
a ir dentro del ciclo) con lo que debe hacerse una sola vez antes o despus del
ciclo (debe ir fuera del ciclo). El resultado de este error suele dar resultadosequivocados o generar ciclos infinitos.
La condicin mientras que se identifica con la palabra whileen casi todos los
lenguajes.
7/22/2019 captulo 2 condicionales y ciclos
10/42
G G G
Programacin Estructurada y Orientada a Objetos. Un acercamiento interdisciplinario. 10
Al igual que en condicionales, existen diversas formas para indicar sin
ambigedades hasta donde abarca cada bloque de instrucciones: llaves, begin-
end, endWhile, etc., segn el lenguaje de programacin.
Aparte del ciclo mencionado existen otras variantes, cuya conceptualizacin
vara un poco segn el lenguaje de programacin. En lenguaje C y Java se
manejan tres posibilidades: while, for y do-while.
A manera de ejemplo, suponga el mismo ejemplo ya planteado pero con ms
calificaciones: se desea recibir ocho calificaciones y desplegar el promedio.
Obviamente, podramos declarar 8 variables, pero es ms fcil hacerlo a travs de
ciclos. El algoritmo expresado en diagrama de flujo se encuentra en la figura 2-5:
F 25. A 8
declarar dato, suma y promedio como decimales
declarar a como entero
suma = 0, a = 0
leer dato
desplegar "Por favor, teclee sus ocho calificaciones"
suma = suma + datoa = a + 1
a < 8 ?
desplegar "El promedio es"
promedio = suma / 8
s
7/22/2019 captulo 2 condicionales y ciclos
11/42
G G G
Programacin Estructurada y Orientada a Objetos. Un acercamiento interdisciplinario. 11
,
= 0
,
( < 8)
= +
= / 8
E
2.3. Prueba de escritorio
La prueba de escritorio consiste en tratar de seguir paso a paso lo que hace
el algoritmo. En otras palabras, tratar de actuar como si uno fuera el equipo de
cmputo. Hay que hacer hincapi en ello: no debe pensarse lgicamente ni como
se supone que debe ser; es menester desprenderse de la condicin humana y
"tratar de actuar como mquina", siguiendo instruccin por instruccin lo que
sucede en el cdigo.
No hay una representacin formal de la prueba de escritorio. Sugerimos poner
una casilla por cada variable e ir anotando su valor. En el caso de ciclos, realizar
un cuadrado y utilizar una columna por cada iteracin.
Para ejemplificar, suponga que se tiene la siguiente definicin del problema:
o Realizar un programa que lea un nmero y despliegue su factorial. El
factorial de un nmero n est dada por la siguiente serie: 1 * 2 * 3 * * (n-
1) * n. El factorial de 0 es 1 y no existen factoriales de nmeros negativo.
Este programa obtendr el factorial de un nmero.Teclee el nmero, por favor5Su sumatoria es 120
El lote de pruebas es el siguiente:
7/22/2019 captulo 2 condicionales y ciclos
12/42
G G G
Programacin Estructurada y Orientada a Objetos. Un acercamiento interdisciplinario. 12
?
5 120
0 1
3
E . : , ,
B
E .
,
< 0
= 1
= 1
7/22/2019 captulo 2 condicionales y ciclos
13/42
G G G
Programacin Estructurada y Orientada a Objetos. Un acercamiento interdisciplinario. 13
2.4. Ejercicios de construccin de lgica a partir del problema
22.
A :
?. C
, ,
.
? C
? E
.
Con las descripciones vistas hasta este punto tenemos los elementos
suficientes para iniciar ejercicios de construccin de lgica.
Un primer bloque de ejercicios puede partir de una descripcin general de un
requerimiento que debe ser llevado a detalle. En este bloque pueden incorporarse
todas las sugerencias de los estudiantes que sean viables con la aplicacin desecuencias y ciclos.
La estrategia sugerida es formar tres equipos de trabajo, conformados por un
"usuario final", un "programador" y un "tester". El "usuario final" deber recibir del
profesor la especificacin de requerimientos y realizar un ejemplo de clculo con
datos reales, as como el lote de pruebas que debe pasar su sistema (pudiera
darse la pantalla desde un inicio o que el mismo usuario la definiera). El
"programador" realizar el algoritmo expresado en pseudocdigo y/o diagrama deflujo, nicamente partiendo de los elementos vistos (se omitir por el momento el
uso de arreglos, archivos y subrutinas). Finalmente, el "tester" har la prueba de
escritorio. La prueba definitiva se har en el captulo relativo a la codificacin de
condicionales y ciclos
7/22/2019 captulo 2 condicionales y ciclos
14/42
G G G
Programacin Estructurada y Orientada a Objetos. Un acercamiento interdisciplinario. 14
La siguiente es una lista de ejercicios propuestos, con los dos primeros
elementos: especificacin de requerimientos del usuario y diseo preliminar de la
pantalla. Por razones de espacio, se omiti en la pantalla las palabras de
bienvenida y despedida, que s deberan estar en el programa definitivo.
o Una librera ofrece descuentos por volumen: 3% a partir de tres libros; 5% si
son ms de 3 libros y 10% si son ms de 10. Los descuentos no se
acumulan. Realice un programa que reciba el costo del libro, el nmero de
libros y despliegue el total a pagar.
Seale el costo unitario del libro: 120Indique el nmero de libros: 3El total a pagar es 349.20
o Realice un programa que calcule el promedio de varias calificaciones. Al
inicio se le preguntar al usuario cuantos nmeros va a capturar (suponga
que el usuario capturar los datos adecuadamente).
Cuntas calificaciones se van a capturar? 3Captrelas: 7 6 4El promedio es 5.7
o Realice un programa que calcule el promedio de varios nmeros. El usuario
capturar datos y al final pondr un -1 para sealar que ya no existen ms
datos (suponga que el usuario capturar los datos adecuadamente).
Capture las calificaciones (indique un -1 para finalizar):7 6 4 -1El promedio es 5.7
o Un trabajador tiene un salario por hora (el salario diario supone 8 horas
laboradas). Si que trabaja ms de 8 horas recibe pago por horas extras. De
la novena a la undcima percibe el doble; de la dcimo segunda en adelante
es el triple. Las horas pueden ser fraccionadas. Realice un programa que
7/22/2019 captulo 2 condicionales y ciclos
15/42
G G G
Programacin Estructurada y Orientada a Objetos. Un acercamiento interdisciplinario. 15
reciba el salario diario y las horas trabajadas; a partir de esos datos seale
el monto a recibir por el salario normal, las horas extras y el total.
Indique el sueldo diario: 200
Indique las horas trabajadas: 9.5Sus percepciones en el da son: 275.00
A continuacin se varios ejercicios sencillos en donde los estudiantes tienen
que iniciar el trabajo desde la elaboracin de las pantallas.
o Capturar los tres lados de un tringulo y desplegar si es issceles, escaleno
o equiltero.
o Capturar 3 nmeros y desplegar el mayor de ellos.
o Realizar un programa que lea la altura del agua, el dimetro y la longitud de
un tanque cilndrico completamente horizontal. A partir de esos datos se
desea saber el volumen de agua que tiene en litros1.
Enseguida se sealan varios ejercicios para realizar la prueba de escritorio. La
intencin es que el estudiante visualice que un problema puede solucionarse de
diferentes formas y que existen errores clsicos escondidos, independientemente
del procedimiento utilizado.
o Dado el siguiente cdigo:
=
( > ) ( > )
=
( > ) ( > )
=
"E :
Indique el resultado de la tradas sealadas a continuacin, tal y como estescrito.
1La solucin a este ejercicio tiene que ver ms con elementos bsicos de trigonometra y lgebra. Y ese es,justamente, el motivo de ponerlo aqu: que el estudiante viva situaciones en que el clculo es lo ms difcil.Dejamos al docente la valoracin si hacerlo opcional u obligatorio.
7/22/2019 captulo 2 condicionales y ciclos
16/42
G G G
Programacin Estructurada y Orientada a Objetos. Un acercamiento interdisciplinario. 16
D
7 8 9
8 9 8
8 9 9
9 8 7
o Qu mensaje desplegar el siguiente pseudocdigo tal y como est escrito
suponiendo que el usuario responde 5.5 cuando se le pide el dato?
=
( > 5)
D
( < 6)
D
o El siguiente pseudocdigo est en orden alfabtico. Acomdelo para obtener el
promedio de 3 nmeros adecuadamente.
,
E
,
= 0
= + 1
( < 3)
= / 3
= 0
= +
o Qu desplegar en pantalla el siguiente pseudocdigo tal y como est
escrito? Suponga que el usuario teclea: 5 6 7 8
7/22/2019 captulo 2 condicionales y ciclos
17/42
G G G
Programacin Estructurada y Orientada a Objetos. Un acercamiento interdisciplinario. 17
= 0
= 4
= 1
7/22/2019 captulo 2 condicionales y ciclos
18/42
G G G
Programacin Estructurada y Orientada a Objetos. Un acercamiento interdisciplinario. 18
Todas las condiciones preguntan acerca de una condicin (if). Una respuesta
afirmativa provocar que se realice el bloque de instrucciones indicada; en caso
contrario se ejecuta un segundo bloque de instrucciones (else). El ifes obligatorio,
mientras el else es opcional. Para indicar el inicio y final de cada bloque se
emplean llaves, aunque pueden omitirse si el bloque est compuesto por una sola
instruccin.
La condicional en pseudocdigo se expresa de la siguiente forma:
() 1
2
A nivel cdigo la instruccin quedara como la siguiente:
if (calificacion >= 6)printf("aprobado);
elseprintf("reprobado");
Tcnicamente, una condicin verdadera "devuelve" el valor de 1; una condicin
falsa retorna el valor de 0. Por eso, la instruccin z = (a > b)es perfectamente
vlida: z valdr 1 si a es mayor que b, o valdr 0 si la condicin no se cumple.
El operador ? es una forma abreviada de if-else, que se emplea cuando se
trata de una asignacin con base en un if. La instruccin
z = (a > b) ? a : b;
es equivalente a
if (a > b)z = a;
elsez = b;
7/22/2019 captulo 2 condicionales y ciclos
19/42
G G G
Programacin Estructurada y Orientada a Objetos. Un acercamiento interdisciplinario. 19
23. C
A
:
) . : ( >= 6)
( > 5)
, .
) C :
.
) D "" . E
:
if (calificacion >= 6)
printf("aprobado);
if (calificacion < 6)
printf("reprobado");
.
8,
.
24.
E
. : ,
(. 30 ).
7/22/2019 captulo 2 condicionales y ciclos
20/42
G G G
Programacin Estructurada y Orientada a Objetos. Un acercamiento interdisciplinario. 20
A continuacin, un ejemplo para determinar el rea de un tringulo (programa
2-1). Observe que la condicional se utiliz para validar que el tringulo s puede
ser construido.
Requerimiento:
Hacer un programa que reciba los tres lados de un tringulo y devuelva su rea. El
rea queda determinada bajo la siguiente frmula:
s = (a + b + c) / 2____________________
rea = s * (s a) * (s b) * (s-c) , donde a, b y c son las longitudes de loslados.Ejemplo: si los lados valieran 6, 8 y 10, s valdra 16 y el rea valdra 24.
Cdigo:
// Programa 2-1 recibe los 3 lados de un tringulo y devuelve su rea.#include #include #include int main() {
float a, b, c, s, area;printf("Bienvenido.\n\n");printf("Este programa obtiene el rea de un tringulo.\n");printf("Teclee el valor de los lados separados por un espacio.\n\n");scanf("%f %f %f", &a, &b, &c);// previamente se validar que sea posible construir el tringuloif ( (a > b + c) || (b > a + c) || (c > a + b))printf("No puede formarse un triangulo de esas dimensiones.\n");else {s = (a + b + c ) / 2;area = sqrt( s * (s - a) * (s - b) * (s - c));printf("\n");printf("El area del tringulo es: %4.1f \n", area);
}printf("\n\n Oprima cualquier tecla para terminar...");getch();
}
7/22/2019 captulo 2 condicionales y ciclos
21/42
G G G
Programacin Estructurada y Orientada a Objetos. Un acercamiento interdisciplinario. 21
Pruebas aplicadas:
D
6 8 10 E 24.0.
3 5 9 .
Pantalla final:
Aspectos a cuidar en el uso de condicionales
Las condicionales pueden anidarse. Las condicionales se pueden escribir de
manera anidada, como en el programa 2-2 (hay que tener especial cuidado con la
anidacin):
// Programa 2-2:// promedio de 3 calificacines con condicionales anidadas#include #include
int main(void){
int a, b, c;float promedio;printf("Por favor, teclee sus tres calificaciones: ");scanf("%d %d %d", &a, &b, &c);promedio = (a + b + c) / 3;printf("El promedio es: %6.1f", promedio);if (promedio == 10)
printf(" EXCELENTE");else
if (promedio >= 8) {printf(" MUY BIEN. ");
printf("FELICITACIONES.");}else
printf(" REPROBADO");
printf("\nOprime cualquier tecla..");getch();
}
7/22/2019 captulo 2 condicionales y ciclos
22/42
G G G
Programacin Estructurada y Orientada a Objetos. Un acercamiento interdisciplinario. 22
Cuidar el alcance de los bloques. En todo momento se debe tener presente
que los bloques quedan delimitados por las llaves. Si stas no se colocan se
asume el bloque abarca una sola instruccin. Como ejemplo, observe el cdigo del
programa 2.3:
// Programa 2-3: condicionales con mal manejo de llaves#include #include int main () {
int x;x = 8;if (x >= 6)
printf("Aprobado.\n");else
printf("Reprobado.\n");printf("A estudiar ms.\n");
printf("\nOprime cualquier tecla para continuar...");getch();
}
La frase A estudiar msse desplegar siempre. El programa asume a falta
de llaves- que el else abarca slo a una instruccin. La correccin sera como
sigue:else {
printf("Reprobado.\n");printf("A estudiar ms.\n");
}
No utilizar el operador de asignacin (=) en lugar del de comparacin (==).
Es muy comn que en las condiciones se requiera comparar una variable o una
operacin con un valor determinado, Por ejemplo: si x es igual a 8. En este caso
hay que recordar que el operador de comparacin es ==. Observe el cdigo del
programa 2-4.
7/22/2019 captulo 2 condicionales y ciclos
23/42
G G G
Programacin Estructurada y Orientada a Objetos. Un acercamiento interdisciplinario. 23
// Programa 2-4: condicionales con comparacin mal aplicada#include #include int main () {
int opcion;
printf("Bienvenido al cine.\n\n");printf("1) Amores Perros\n");printf("2) Babel\n");printf("\nElija una opcin: ");scanf("%d", &opcion);if (opcion = 1)
printf("\nUsted desea ver Amores Perros");else
printf("\nUsted desea ver Babel");
printf("\n\nOprima cualquier tecla para continuar...");getch();
}
En este programa siempre aparecer el letrero Usted desea ver Amores
Perros. La razn es la siguiente: la instruccin if (opcion = 1) indica que se
asigne un 1 a la variable opcin, si esto es posible (lo cual es obvio en este caso),
se desplegar Usted desea ver Amores Perros. La instruccin en realidad se
debi haber manejado como if (opcion == 1)2.
Este error es tan comn y tan difcil de rastrear que el lenguaje Java (basado
en la sintaxis de C) ya no permite la instruccin if (opcion = 1).
Problemas propuestos para decisiones sencillas
Los siguientes problemas -extrados de problemas reales- pueden resolverse
con decisiones sencillas. Son ejercicios que a esta altura el estudiante debe poder
resolver.
o Realizar un programa que lea tres calificaciones, despliegue el promedio final ydiga si el alumno aprob o no. La calificacin final ser el promedio ponderado
de las 3 calificaciones, las cuales valen 20%, 30% y 50%, respectivamente. La
calificacin mnima aprobatoria es 8.
2Cabe aclarar que ZinjaI hace una advertencia (warning) cuando se compila el cdigo.
7/22/2019 captulo 2 condicionales y ciclos
24/42
G G G
Programacin Estructurada y Orientada a Objetos. Un acercamiento interdisciplinario. 24
o Realice un programa que obtenga el promedio entero de 3 calificaciones. Se
redondea al entero ms cercano si el promedio es cuando menos de 6. En
caso contrario, la calificacin bajar al entero inferior.
o Realice un programa que reciba 3 calificaciones de tipo entero e indique cual
fue la calificacin ms alta. Por ejemplo: si el usuario captura los datos 8 9 10,
el programa desplegar que el dato ms grande es 10.
o Simulemos un volado en la computadora. La computadora solicita la apuesta y
genera al azar la suya. Si coincide, el usuario gana; en caso contrario, pierde.
Qu crees que salga (S=sol; A=aguila)? SLa moneda cay guila. Usted perdi!Gracias por participar!
o Realice un programa que reciba los coeficientes de una ecuacin cuadrtica y
despliegue sus races.
o Realice un programa que reciba dos datos para realizar una divisin y
despliegue el resultado a dos decimales. Por ejemplo: si el usuario captura 9 y
4, el programa indicar como resultado 4.25. Nota importante: debe validarse
que el programa no intente realizar una divisin entre cero.
o Realice un programa que reciba los 3 lados de un tringulo e indique si esequiltero (tres lados iguales), issceles (dos lados iguales) o escaleno (tres
lados diferentes).
o Dado el siguiente cdigo:
1 mayor = b;2 if ((b > a) && (b > c))3 mayor = b;4 if ((c > a) && (c > b))5 mayor = c;6 printf("El resultado es: %d\n", mayor);
a) Asuma que el programa va a correr tal y como est escrito. Cul serael resultado bajo las condiciones siguientes?
D
7/22/2019 captulo 2 condicionales y ciclos
25/42
G G G
Programacin Estructurada y Orientada a Objetos. Un acercamiento interdisciplinario. 25
7 8 9
8 9 88 9 9
9 8 7
b) Coloque los parntesis que hagan falta para que el programa puedaejecutarse correctamente (slo hay errores en algunas lneas):
. C
2.7. Casos de decisin mltiple
Es muy comn que en diversas ocasiones se tenga que seleccionar alguna
opcin con base en un valor determinado. Por ejemplo, desplegar el nombre del
mes. Esto podra realizarse a travs de condicionales mltiples, como en el
programa 2-5, que despliega el nmero de das transcurridos del 1 de enero del
ao 2000 a la fecha capturada.
En este caso, dejaremos que el estudiante "descifre" el programa con base en
los siguientes puntos clave:
o se suman los aos completos multiplicndolos por 365
o se suman los das que corresponden a los meses completos del ao en
curso. Por ejemplo: si estamos en febrero, ya transcurri enero en su
totalidad, es decir, hay 31 das por meses completos transcurridos.
o se suman los das que corresponden por aos bisiestos: 29 de febrero
de 2004, 29 de febrero de 2004, etc. Se suma un da por cada cuatro
aos. Cuando es un ao bisiesto, se tiene cuidado en contar el da
bisiesto slo si se est marzo o mes posterior.
o finalmente, se suman los das del mes en curso.
7/22/2019 captulo 2 condicionales y ciclos
26/42
G G G
Programacin Estructurada y Orientada a Objetos. Un acercamiento interdisciplinario. 26
25. E E
. E 1. 1900 . E
. ,
1//2000.
,
.
:
.
// Programa 2-5: das transcurridos del 01/01/2000 a la fecha indicada#include #include int main(void){
int anio, mes, dia, suma;
printf("Por favor, indique una fecha posterior al ao 2000");printf(" (dd mm aaaa).\n");scanf("%d", &dia);scanf("%d", &mes);scanf("%d", &anio);suma = (anio - 2000 ) * 365; // das por aos completos
// das por meses completos del ao en cursoswitch (mes) {case 1: suma += 0; break;case 2: suma += 31; break;case 3: suma += 59; break;case 4: suma += 90; break;case 5: suma += 120; break;case 6: suma += 151; break;case 7: suma += 181; break;case 8: suma += 212; break;case 9: suma += 243; break;case 10: suma += 273; break;case 11: suma += 304; break;case 12: suma += 334; break;
}
7/22/2019 captulo 2 condicionales y ciclos
27/42
G G G
Programacin Estructurada y Orientada a Objetos. Un acercamiento interdisciplinario. 27
suma += (anio - 2000) / 4 + 1; // das por aos bisiestosif ((anio % 4 == 0) && (mes < 3))suma--;
suma += dia; // das del mes en cursoprintf("\nEl resultado es: %d", suma);
printf("\n\nOprime cualquier tecla..");getch();
}
Al final se obtendr una pantalla como la siguiente:
Como se puede observar, los das del mes dependen del valor de la variable
mes. Este el caso en que se aplica una instruccin switch: diferentes acciones en
razn del valor de una variables. Su estructura general es la siguiente:
switch (variable)case valor: {bloque de instrucciones}
break; // el break es opcional/* pueden repetirse tantos case como se deseen */default: {bloque de instrucciones}
El breakindica que ya no siga explorando los siguientes casos. En la mayora
de las situaciones se desea un breakpara cada opcin, pero en otras ocasiones
es deseable que adems de lo realizado en el caso anterior- se lleven a cabo
otras instrucciones, en cuyo caso no se coloca ningn breaken la opcin que est
finalizando. Finalmente, si ninguna de las opciones se cumpli, se ejecutar el
bloque de comandos sealado por default.
Problemas propuestos para decisiones mltiples
Una tienda comercializadora maneja un nivel de descuentos con base en elmonto total de la compra, segn la siguiente tabla:
7/22/2019 captulo 2 condicionales y ciclos
28/42
G G G
Programacin Estructurada y Orientada a Objetos. Un acercamiento interdisciplinario. 28
Monto de compra % dedescuento
$ 2,990.00 3%$ 7, 490.00 5%
$ 13,990.00 7%$ 54,990.00 10%
Elabore un programa que reciba el monto de compra original. En razn de ese
dato, localice el porcentaje de descuento y lo aplique. Finalmente, desplegar
el monto final a pagar.
o Realice un programa que "juegue" piedra, papel o tijera. El usuario elige una
opcin de las tres y la computadora genera al azar una de ellas.
Posteriormente, el resultado se dar bajo las siguientes reglas; la piedra legana a la tijera; la tijera le gana al papel; el papel le gana a la piedra;si ambos
casos son iguales, resulta un empate3
o Realice un programa que reciba dos datos enteros: el da y el mes. Con base
en ellos despliegue el da y el mes. Por ejemplo: si recibe como datos 19 12,
desplegar 19 de diciembre.
2.8. Uso de ciclos
En lenguaje C todos los ciclos indican que un determinado bloque de
instrucciones se repita mientras se cumpla determinada condicin. Existen tres
tipos, como se sintetiza en el cuadro 2-1.
Cuadro 2-1. Los ciclos en lenguaje C y Java
while Mientras que, se valida al inicio por lo cual el bloque de instrucciones
puede no ejecutarse ni una sola vez.
3Existe una versin menos conocida, pero un poco ms divertida, con base en conejo, flecha y muro.
7/22/2019 captulo 2 condicionales y ciclos
29/42
G G G
Programacin Estructurada y Orientada a Objetos. Un acercamiento interdisciplinario. 29
do-while Mientras que, se valida al final por lo cual el bloque de instrucciones
se ejecuta al menos una vez.
for Por lo general se aplica cuando se conoce de antemano las vecesque se repetir un conjunto de instrucciones. Aunque en lenguaje C
tiene la misma potencialidad que el while: la condicin se coloca al
principio y se ejecuta el bloque de instrucciones mientras se cumpla
la condicin.
El ciclo while
En el while se repite un bloque de instrucciones mientras se cumple una
determinada condicin. La condicin se verifica al inicio, como lo muestra la figura
2-7.
F 27.
En resumen:
mientras (condicin)bloque de instrucciones
termina mientras
Hay que hacer hincapi que la condicin significa mientras que. Una condicin
que siempre se cumpla generara un ciclo infinito; por el contrario, una condicin
7/22/2019 captulo 2 condicionales y ciclos
30/42
G G G
Programacin Estructurada y Orientada a Objetos. Un acercamiento interdisciplinario. 30
que nunca se cumpla implicara que no se ejecutaran las instrucciones del cuerpo
del ciclo ni una sola vez.
Un error muy frecuente es no identificar claramente aquello que es repetitivo (va
a ir dentro del ciclo) con lo que debe hacerse una sola vez antes o despus del
ciclo (debe ir fuera del ciclo). El resultado de este error suele dar resultados
equivocados o generar ciclos infinitos.
A manera de ejemplo, suponga que desea obtener el promedio de varios
nmeros proporcionados por el usuario. La pantalla que desea es similar a la
siguiente.
Este programa obtiene el promedio de calificaciones.
Cuntas calificaciones se van a introducir?3Capture las calificaciones, por favor.8910El promedio es 9.00
Oprima cualquier tecla para terminar...
Qu debe ir dentro del ciclo (color amarillo)? Resulta obvio que la lectura de
las calificaciones. Como el valor de una variable se pierde al recibir un segundovalor, entonces se requiere ir sumando las calificaciones en otra variable. Lasdems partes del programa irn fuera del ciclo. El cdigo finalmente quedaracomo lo indica el programa 2-6 y en la figura 2-8 se muestra el diagrama de flujocorrespondiente producido automticamente por ZinjaI a travs del men deHerramientas.
// Programa 2-6: promedio de calificaciones con while#include #include int main() {
int i, n;
float suma = 0.0, promedio, dato;printf ("Este programa obtiene el promedio de
calificaciones.\n");printf ("Cuntas calificaciones se van a introducir?\n");scanf("%d",&n);if (n > 0) {printf("Capture las calificaciones, por favor.\n");i = 1;
7/22/2019 captulo 2 condicionales y ciclos
31/42
G G G
Programacin Estructurada y Orientada a Objetos. Un acercamiento interdisciplinario. 31
while (i
7/22/2019 captulo 2 condicionales y ciclos
32/42
G G G
Programacin Estructurada y Orientada a Objetos. Un acercamiento interdisciplinario. 32
El ciclo for
En lenguaje C, en realidad el ciclo for es otra forma de expresar la misma
funcionalidad que el ciclo while, por lo cual su diagrama es el mismo. Sin
embargo, en otros lenguajes su sintaxis les permite nicamente hacer un ciclo
cuando ya se conoce exactamente el nmero de veces que se repetir algo. Su
sintaxis es la siguiente:
for (sentencias antes del ciclo; condicin; ltimas sentencias a repetir)
Cabe aclarar que cualquiera de las tres partes que constituyen el for puede
omitirse. En un caso exagerado, un ciclo podra expresarse como for (;;). Como
recomendacin general, hay que evitar este tipo de instrucciones poco
entendibles.
Como ejemplo de un for bien aplicado, el programa 2-7 despliega cuatro veces
hola:
// Programa 2-7: despliegue de hola con ciclo for#include #include int main() {
int i;printf(Este programa ejemplifica un for desplegando 4 veces
hola);for (i=0; i
7/22/2019 captulo 2 condicionales y ciclos
33/42
G G G
Programacin Estructurada y Orientada a Objetos. Un acercamiento interdisciplinario. 33
scanf("%d",&n);if (n > 0) {printf("Capture las calificaciones, por favor.\n");for (i=1; i
7/22/2019 captulo 2 condicionales y ciclos
34/42
G G G
Programacin Estructurada y Orientada a Objetos. Un acercamiento interdisciplinario. 34
F 29. E
// Programa 2-9: promedio de calificaciones con do-while#include #include int main() {
int i, n;float suma = 0.0, promedio, dato;printf ("Este programa obtiene el promedio de calificaciones.\n");printf ("Cuntas calificaciones se van a introducir?\n");scanf("%d",&n);if (n > 0) {printf("Capture las calificaciones, por favor.\n");i=1;do {
scanf("%f", &dato);suma += dato;i++;
} while (i
7/22/2019 captulo 2 condicionales y ciclos
35/42
G G G
Programacin Estructurada y Orientada a Objetos. Un acercamiento interdisciplinario. 35
Cuando usar cada tipo de ciclo
En muchas ocasiones un problema puede resolverse por cualquiera de los tres
ciclos existentes. Sin embargo, conviene recalcar algunos puntos para facilitar su
seleccin:
o En todos los lenguajes, el while puede hacer lo que realice el for y el do-
while.
o Especficamente en lenguaje C y Java, el for tiene la funcionalidad de un
while.
o Aunque el fores tan potente como el while, se recomienda usarlo solamente
cuando se conoce exactamente el nmero de veces que se va a repetir unbloque de instrucciones. Aplicarlo a otras situaciones traer como
consecuencia cdigos confusos.
o En el do-while, el bloque de instrucciones al menos se ejecuta una vez.
El ejemplo anterior se prestaba, de una u otra manera, para todos los tipos de
ciclos. Ahora suponga que el requerimiento cambia al siguiente:
Este programa obtiene el promedio de calificaciones.
Capture las calificaciones. Digite -1 para terminar.8910-1El promedio es 9.00
Oprima cualquier tecla para terminar...
El cdigo utilizando un whilequeda como lo muestra el programa 2-10:
// Programa 2-10: promedio de datos con while#include #include int main() {
int i;float suma = 0.0, promedio, dato;printf ("Este programa obtiene el promedio de
calificaciones.\n");
7/22/2019 captulo 2 condicionales y ciclos
36/42
G G G
Programacin Estructurada y Orientada a Objetos. Un acercamiento interdisciplinario. 36
printf ("Capture las calificaciones. Digite -1 paraterminar.\n");
i = 0;scanf ("%f", &dato);while (dato >= 0) {
suma+=dato;i++;scanf("%f",&dato);
}if (i > 0) {promedio = suma / i;printf("El promedio es: %5.2f\n", promedio);}elseprintf("No es posible obtener el promedio si no teclea ningn
nmero.");printf("\n\nOprima cualquier tecla para terminar...\n");getch();
}
Como ya mencion, se puede realizar ese mismo programa con un for, pero el
cdigo pierde claridad, independientemente de cmo quede. El programa 2-11
muestra una de las distintas posibilidades:
// Programa 2-11: promedio de datos con un for nada claro#include #include int main() {
float suma = 0.0, promedio, dato;int i;printf("Este programa obtiene el promedio de calificaciones. ");printf( "Capture -1 para terminar.\n");i = 0;for ( ; dato >= 0 ; ) {scanf("%f", &dato);if (dato >= 0) {
suma += dato;i++;
}}if (i > 0) {promedio = suma / i;
printf("El promedio es: %5.2f\n", promedio);}elseprintf ("No se proporcion ninguna calificacin.\n");
printf ("\nOprima cualquier tecla para terminar...\n");getch();
}
7/22/2019 captulo 2 condicionales y ciclos
37/42
G G G
Programacin Estructurada y Orientada a Objetos. Un acercamiento interdisciplinario. 37
2.9. Ejercicios sobre ciclos a nivel cdigo
A continuacin se enlistan diversos ejercicios. Algunos de ellos estn en el
contexto de un programa con una finalidad orientada hacia el usuario final; otros
pretenden nicamente que el estudiante practique la codificacin a travs de la
correcta aplicacin de ciclos.
o Realice un programa que despliegue 4 veces hola utilizando: a) while; b) for; c)
do-while.
Cmo obtendra el siguiente despliegue?
Cuntas veces deseas desplegar hola? 3hola hola hola
o Cmo obtendra el siguiente despliegue?
hola hola holaa todos a todos a todos
o Cmo obtendra el siguiente despliegue?
holaa todos
a todosa todoshola
a todosa todosa todos
o Cmo obtendra el siguiente despliegue?
Cuntas veces deseas desplegar hola? 3Cuntas veces deseas a todos? 2hola
a todosa todos
holaa todosa todos
holaa todosa todos
7/22/2019 captulo 2 condicionales y ciclos
38/42
G G G
Programacin Estructurada y Orientada a Objetos. Un acercamiento interdisciplinario. 38
Transforme el siguiente cdigo a un for
i = 0;while (i
7/22/2019 captulo 2 condicionales y ciclos
39/42
G G G
Programacin Estructurada y Orientada a Objetos. Un acercamiento interdisciplinario. 39
scanf("%f", & dato);suma += dato;i++;promedio = suma / numDatos;printf("El promedio es: %6.1f\n", promedio);
}printf("\n\nOprima cualquier tecla para continuar...");getch();
}
o Un usuario desea obtener la siguiente pantalla:
Este programa calcula el promedio de varias calificaciones:
Cuntas calificaciones va a capturar?3Teclee las calificaciones
6.67.29.9El promedio es 7.9
Oprima cualquier tecla para continuar...
Elija las siguientes instrucciones en el orden correcto para llegar al
resultado deseado. Las instrucciones pueden utilizarse ms de una vez,
sobran algunas y usted debe darles la sangra adecuada. Hay ms de una
solucin correcta.
i++;while (i < n){float i, n;i = 0;getch();printf(Oprima cualquier tecla para continuar...);i = 1;}while (i
7/22/2019 captulo 2 condicionales y ciclos
40/42
G G G
Programacin Estructurada y Orientada a Objetos. Un acercamiento interdisciplinario. 40
#include printf(Este programa calcula...);float dato;printf(Teclea las calificaciones);suma = suma + dato;suma += dato;scanf(%f%, &dato);printf(Cuntas calificaciones va a capturar);printf(El promedio es %5.1f, promedio);
o Realice el programa que responda al siguiente requerimiento.
Voy a contar las calificaciones aprobadas.Teclea las calificaciones (termina con -1)748
10-1Obtuviste 3 calificacin(es) aprobatoria(s) y 1 calificacin(es)reprobatoria(s).Tu promedio fue: 7.25
El siguiente programa debe obtener la multiplicacin de x * n. Codifique la
parte que haga falta para obtener el resultado sin emplear la multiplicacin, es
decir, con base en sumas sucesivas:
int main() {
float x, resultado;int n, i;scanf(%f, x);scanf(%d, n);
/* poner cdigo */
printf(Resultado=%f, resultado);}
o Realice un programa que calcule el factorial de un nmero indicado por
el usuario. No existen factoriales de nmeros negativos; el factorial de 0es uno. Para guardar el factorial se requiere de un tipo de dato que
guarde rango de valores mayores que el int. La pantalla ser similar a la
siguiente:
7/22/2019 captulo 2 condicionales y ciclos
41/42
G G G
Programacin Estructurada y Orientada a Objetos. Un acercamiento interdisciplinario. 41
Bienvenido.Este programa calcula el factorial de un nmero.Qu nmero es?5Resultado: 1 * 2 * 3 * 4 * 5 = 120
o Realice un programa que obtenga la divisin de dos nmeros enteros sin
utilizar el operador de divisin (a travs de restas sucesivas)
o Un apostador asiduo tiene la costumbre de apostar si atina al nmero que
resulta al tirar un dado. Si lo logra gana $5.000; en caso contrario, pierde
$1.00. l comienza con $7.00 y el juego termina cuando gana $6.00 o
pierde todo su capital.
Qu nmero saldr en el dado? 5El dado arroj un 4. Acaba de perder $1.00Su saldo es $6.00
Qu nmero saldr en el dado? 5
o Juguemos a menor-mayor. Usted tiene que apostar un peso a alguna de las
siguientes opciones:
Menor 7 Mayor
2-6 7 8-12
despus tira dos dados. Si le apost a menor y la suma de los dados est
en el rango de 2 a 6 gana un peso. Algo similar sucede con el caso de
mayor. Si le apost a 7 y la suma de los dados coincide con 7, entonces
gana 5 pesos. Arranca con 5 pesos y termina su participacin cuando tiene
10 pesos o pierde todo su capital.
Partiendo del siguiente cdigo, indique cual sera el resultado si el usuario
tecla 3 para el valor de n:
#include #include
7/22/2019 captulo 2 condicionales y ciclos
42/42
G G G
#include int main() {
/* las iteraciones se declararan flotantesporque pueden exceder el rango de enteros */
float i, numiteraciones;double sumatoria=0.0, resultado;printf("Este programa obtendr un valor muy cercano a PI ");printf("aplicando la frmula\n PI = 1 / 2 * raz ");printf("cuadrada(sumatoria(1..n de 24/(i*i))).");printf("\n\nTeclee el valor de n, por favor.\n");scanf("%f", &numiteraciones);for (i = 1.0; i