Documentos de Académico
Documentos de Profesional
Documentos de Cultura
GUION DE CLASE Nº 5
UNIDAD V LB
ESTRUCTURAS REPETITIVAS
Contenido
1. GENERALIDADES - ESTRUCTURAS REPETITIVAS ................................................................................................................................................... 2
2. TERMINOLOGÍA BÁSICA .......................................................................................................................................................................................... 2
3. ESTRUCTURA DE ENTRADA CONDICIONADA - ESTRUCTURA MIENTRAS .............................................................................................................. 4
4. VALIDACIÓN DE DATOS CON CICLO MIENTRAS ................................................................................................................................................... 10
5. OPERADORES ADICIONALES DEL LENGUAJE C# ................................................................................................................................................. 12
6. ESTRUCTURA CONTROLADA POR UN CONTADOR – ESTRUCTURA DESDE_HASTA ............................................................................................ 30
7. ESTRUCTURA DE ENTRADA ASEGURADA – ESTRUCTURA HASTA_QUE ............................................................................................................. 38
8. ESTRUCTURA PARA CADA ELEMENTO - ESTRUCTURA DERIVADA ...................................................................................................................... 42
9. CICLOS ANIDADOS ................................................................................................................................................................................................ 43
10. TECNICA DE CICLO CONTROLADO POR BANDERA .............................................................................................................................................. 43
11. TECNICA DE CICLO CONTROLADO POR CENTINELA ............................................................................................................................................ 51
12. TECNICA PARA DETERMINAR EL VALOR MENOR/MAYOR Y DATOS ASOCIADOS ................................................................................................ 57
13. ANEXOS ................................................................................................................................................................................................................ 58
Objetivo: Aprender a utilizar las estructuras repetitivas fundamental y derivadas en el diseño y codificación de soluciones.
INTRODUCCIÓN
En nuestra vida cotidiana nosotros podemos realizar tareas o acciones más de una vez, por ejemplo para ustedes es casi
obligatorio venir a clase todos los días, para nosotros los docentes es obligatorio venir a trabajar todos los días; así también
todos los días nos bañamos, comemos, dormimos, etc. Hay otras tareas que no son tan frecuentes pero que también se repiten:
estudiar (solo estudiamos unos 2 o 3 días antes de la evaluación), ir al cine (solo cuando tenemos plata, tiempo y exhiben la
película que nos interesa).
Realizar algunas actividades muchas veces depende de alguna condición que se nos imponga: por ejemplo: compilamos un
programa las veces que sea necesario hasta que no tenga errores; es decir, mientras tenga errores no dejamos de compilarlo.
Recordemos que para cualquier diseño de solución y su respectiva codificación disponemos únicamente de tres estructuras de
control que son: las secuenciales, las selectivas y las repetitivas; y que no importa que tan compleja sea la solución que se
necesita, dichas estructuras son suficientes para diseñarla y codificarla. Ya hemos estudiado las estructuras secuenciales y las
estructuras selectivas por lo que en esta unidad se debe hacer uso de las estructuras secuenciales y selectivas según
corresponda en combinación con las estructuras repetitivas, a fin de obtener una solución adecuada al problema planteado.
Las estructuras repetitivas son aplicables a problemas para los cuales el diseño de la solución requiere la repetición de una o
más acciones, para llevar a cabo el objetivo de la misma, dicho sea de paso las computadoras están especialmente diseñadas
para ejecutar tareas que se repiten y hacerlo con la mayor eficiencia.
En esta unidad iniciaremos estudiaremos las generalidades sobre el tema; comenzando con la terminología (conceptos básicos
que nos ayudarán a comprender mejor el uso de los ciclos), luego operadores en lenguaje C# (especialmente para uso en
ciclos) y la clasificación de las estructuras repetitivas. Otro punto importante que estudiaremos es la estructura o ciclo mientras y
sus aplicaciones en la solución de problemas como es el caso de validaciones, conteos, cálculo de sumas y promedios, entre
otros así como las distintas aplicaciones de variables de control de ciclo. Por ultimo aprenderemos ciclos derivados como el
desde hasta y hasta que con las formas en que podemos aplicarlos principalmente en cálculos de sumas y promedios, junto con
técnicas de variables de control y técnica para determinar el valor menor/mayor y datos asociados.
Página 1 de 73
1. GENERALIDADES - ESTRUCTURAS REPETITIVAS
Para repetir varias veces un proceso determinado haremos uso de los ciclos repetitivos, a los cuales se les conoce también
con el nombre de Estructuras Repetitivas, Estructuras Iterativas, Lazos, Bucles, Loops o simplemente ciclos al conjunto
de bloques y flechas que nos permite, representar en un flujograma que, una acción (o varias) se puede realizar una o
varias veces (en algunos casos especiales ninguna vez) de acuerdo a una condición. Al igual que las estructuras
secuenciales y las selectivas, estas estructuras tienen únicamente una flecha de entrada y una sola flecha de salida
dentro de un flujograma.
2. TERMINOLOGÍA BÁSICA
Para trabajar con estructuras repetitivas se hace necesario conocer ciertos conceptos, previo al estudio de cada estructura,
ya que nos servirán para comprender mejor el funcionamiento de cada una de ellas.
Estructuras de Control Repetitivas: En un programa son aquellas estructuras en las que una sentencia o grupo de
sentencias se pueden repetir una o varias veces (en algunos casos especiales ninguna vez) mientras o hasta que una
condición especifica se cumpla.
Las estructuras repetitivas las clasificamos en fundamental y derivadas como se describe a continuación:
a) Estructura Fundamental
Entrada Condicionada o estructura Mientras, se repite mientras la condición se cumpla.
b) Estructuras Derivadas
Ciclo controlado por contador o estructura Desde_hasta, se repite desde un valor inicial hasta un valor final.
Ciclo Para_cada_uno es una variante del Desde_hasta pensada especialmente para compactar la escritura de códigos
donde se realice algún tratamiento a todos los elementos de una colección, muy habitual en los lenguajes C#. Lo veremos en
detalle cuando estemos trabajando con Colecciones de datos en la siguiente Unidad.
Entrada asegurada o estructura Hasta_que, se repite al menos una vez antes que se evalúa la condición y se repite mientras
la condición se cumpla.
Para representar gráficamente una estructura repetitiva, haremos uso de los siguientes símbolos o bloques.
Cuerpo del Ciclo: Está formado por la acción o conjunto de acciones que se repite en un bucle y puede estar formado por una o
más estructuras lógicas de control:
Secuenciales (entrada de datos, asignación/proceso, salida de datos)
Selectivas (simple, doble, anidada, múltiple)
Repetitivas (entrada condicionada, entrada asegurada, controlada por contador)
Combinación de las anteriores.
Iteración: A la ejecución del cuerpo del ciclo se le conoce como iteración; dicho de otra forma, una iteración es cada una de las
ejecuciones, es decir, cada una de las veces que se repite el cuerpo del ciclo. Si el cuerpo del ciclo o acción a repetir, se realiza 5
veces, se dice que se ejecutan 5 iteraciones.
Página 2 de 73
Representación General de Estructuras Iterativas
Variable de control del ciclo: es una variable que permite controlar las veces que se ejecuta un ciclo. La variable de control puede
ser: bandera, centinela o contador. Cabe aclarar que un ciclo podría estar controlado por más de una variable. A continuación se
define cada una de las variables de control:
a. Bandera: es una variable de entrada y una variable de control de ciclo (con una sola función: continuar o detener un ciclo), y
solamente puede almacenar uno de dos valores, normalmente cero (0) o uno (1), debemos recordar que cero es el valor
numérico para falso y uno se considera el valor numérico para cierto.
Se puede hacer uso de números o letras; pero en todo caso solo existirán dos valores posibles. En el caso de usar letras se
escoge dos letras una de ellas indica cierto y la otra falso, por ejemplo 's' y 'n', una es sí (cierto) y la otra es no (falso). Se usa
con el ciclo mientras o con el ciclo hasta que.
b. Centinela: es una variable de entrada y una variable de control de ciclo (con doble función la primera recibir los datos a
procesar y la segunda función de: continuar o detener un ciclo). Una variable centinela se escoge de entre las variables de
entrada de la solución (variables tipo entero, tipo real o tipo alfanumérico de un carácter)
La variable centinela al igual que la variable de control bandera se usará cuando la cantidad de veces que debe repetirse el
ciclo es desconocida. Se usa con el ciclo mientras o con el ciclo hasta que.
c. Contador: Es una variable que controla el número de veces que se repite un ciclo y/o el número de ocurrencias de un
evento, situación o valor determinado (tiene una doble función controlar el ciclo repetitivo y contar; pero puede ser usada
únicamente para contar).Para definir correctamente una variable contador, se debe de indicar lo siguiente:
Valor inicial: representa el número a partir del cual se empieza a contar.
Valor final: representa el número hasta el que se va a contar.
Valor de cambio: Indica de cuanto en cuanto se realiza la cuenta (siempre es el mismo valor, es decir, es constante).
La forma más común de contar es de uno en uno, sobre todo si lo que se desea es saber cuántas veces se repite una acción
determinada, pero no es la única forma de contar, se puede hacer también contar de dos en dos ó de cinco en cinco ó de 100
en 100, es más también podemos contar con fracciones de 0.5 en 0.5 o de 0.01 en 0.01. Estas formas de contar se conocen
como progresivas, y el valor de cambio de la variable que controla estas cuentas siempre es positivo y se le llama
incremento, el valor inicial siempre debe de ser menor que el valor final para que la acción se pueda ejecutar.
Existen también conteos regresivos, en estas formas de contar el valor de cambio es negativo y el valor inicial es siempre
mayor que el valor final de la variable contador; así podemos contar desde 5 hasta 1 por ejemplo, el valor de cambio es -1. Es
importante recordar que independientemente del valor de cambio (positivo o negativo) de un contador, éste siempre es
constante. Como ejemplo podemos mencionar que para leer un grupo de 5 edades, se puede definir una variable contador
numEd. Dicha variable numEd, tendrá un valor inicial de 1, un valor final de 5 y un valor de cambio 1.
La variable contador se usará cuando la cantidad de veces que debe repetirse el ciclo es conocida o se puede preguntar las
veces que debe repetirse, en cuyo caso la cantidad de repeticiones es una variable de entrada más a considerar. La
variable contador se puede usar con ciclos mientras, hacer hasta que y hacer desde hasta.
Acumulador: Es una variable que “almacena” el resultado final de sumar todos los distintos valores que toma una variable, para
definirla, también es necesario indicar:
Página 3 de 73
Valor inicial: Representa el valor original o inicial del acumulador, por lo general cero
Valor final: El último valor que toma el acumulador, desconocido por lo general.
Valor de cambio: Representa cada valor de la variable que se va sumando o acumulando.
Por ejemplo para calcular el monto total a desembolsar para pagar la planilla de 20 empleados, tendríamos que sumar todos los
salarios de los empleados. Podemos hacer uso de una variable suma; para la cual definimos un valor inicial de 0.0 y un valor de
cambio que es el valor de la variable salario (contiene el salario del enésimo trabajador); el valor final es lo que pretendemos
encontrar, no está definido de antemano.
El acumulador no lo utilizaremos para controlar ciclos pero es aplicable su uso en cualquiera tipo de ciclos, con cualquier variable de
control de ciclo.
A la Estructura MIENTRAS también se le llama estructura de entrada condicionada, debemos mencionar que ésta es la
primera estructura usada para repetir porciones de un algoritmo a conveniencia, por lo tanto se le distingue como
Estructura Fundamental; de esta estructura, se diseñaron otras 3 estructuras, que se conocen como Derivadas. (Hacer
desde hasta, hacer hasta que, y una última conocida como para cada elemento)
Página 4 de 73
EJEMPLO
n=0
n != 5
Nótese que lo que está dentro de las líneas punteadas es la Estructura
Repetitiva (gráfico de la derecha), los caminos o rutas que salen del
"Adivine el rombo nunca se unen, como sucede en la Estructura Selectiva.
número:"
En este ejercicio se repite el cuerpo del ciclo cuando el usuario ingresa
el valor de 5, y como resultado se imprime "Felicidades Adivino"
n
"Felicidades Adivinó!!!"
La estructura algorítmica mientras es la estructura adecuada para utilizar en un ciclo cuando no sabemos el número de veces que éste
se ha de repetir. Dicho número depende de las proposiciones dentro del ciclo. Ejemplos en la vida cotidiana encontramos muchos. Por
ejemplo, supongamos que tenemos que obtener el total de una serie de gastos, pero no sabemos exactamente cuántos son; o cuando
tenemos que sacar el promedio de calificaciones de un examen, pero no sabemos precisamente cuántos alumnos lo aplicaron.
Tenemos que sumar las calificaciones e ir contando el número de alumnos, esto con el fin de poder obtener posteriormente el
promedio. El ciclo se repite mientras tengamos calificaciones de alumnos.
Página 5 de 73
Codificación de la Estructura Mientras en C#
La estructura iterativa de entrada condicionada necesita solamente la palabra reservada while, que justamente en español significa
mientras, los paréntesis ( ) para encerrar la condición y las { } para delimitar el cuerpo del ciclo:
Sintaxis
. . . Ejemplo
//Acciones previas . . .
cont = Proposición Inicial // cont=Vi; //Acciones previas
while(condición) // cont<=Vf;
x = 100;
{
//Cuerpo del Ciclo while ( x <= 500)
//Acción1 {
//AcciónN Console.Write("\n {0}", x);
//cont = Modificación de cont cont++ x = x + 50;
} }
//Acciones Posteriores //Acciones Posteriores
. . . . . .
…
Otro Ejemplo
. . .
//Acciones previas
n=0;
while(n !=5)
{
Console.Write("Adivine el numero:");
n = Console.ReadLine();
}
Console.Write("Felicidades Adivinó!!!");
//Acciones posteriores
. . .
Es de aclarar que si el cuerpo del ciclo está formado por solo una acción no se coloca las llaves; solo en el caso que sean dos o más
acciones, se colocarán las llaves. Observe también que la línea donde va el while no lleva. Además Un bucle while se puede terminar
cuando una instrucción break, goto, return o throw transfiere el control fuera del bucle. Para pasar el control a la siguiente iteración sin
salir del bucle, use la instrucción continue. Para uso académico de la asignatura no se aplicará ninguno de estos últimos.
Para el siguiente ejercicio se considera solamente los conceptos adquiridos hasta el momento con las estructuras selectivas y las
nociones de las estructuras repetitivas mientras. Se hará uso de la estructura selectiva para validar el dato de entrada, dado que
hasta el momento no hemos implementado la estructura mientras con este fin, lo solucionaremos de esta forma en el primer ejercicio.
En este caso la estructura repetitiva mientas la utilizaremos para dejar de repetir el cuerpo del ciclo.
Ejemplo No. 1: En la primera parte aplique la metodología para resolver problema sin módulos, con el fin de conocer la estructura
mientras. Luego aplique la metodología modular para el siguiente:
Enunciado: Diseñe un flujograma que Imprima los n primeros números enteros positivos.
Página 6 de 73
II. Análisis del Problema.
a. Variables de Salida:
Nombre Tipo Descripción
num Entero Representa cada uno de los números a imprimir
b. Datos de Entrada
Variables:
Nombre Tipo Descripción
cantNum entero Almacena la cantidad de números a imprimir
Constantes: No son necesarias.
Página 7 de 73
IV. Codificación.
/* *Programa que genera cantNum numeros enteros positivos, iniciando de 1 * */
using System;
namespace ImprimeNumerosPositivos
{
class Program
{
public static void Main(string[] args)
{
//declaracion de variables
int cantNum, num=1;
//Entrada de Datos
Console.WriteLine("Cuantos números quiere imprimir (positivo)?");
cantNum = int.Parse( Console.ReadLine() );
Otra forma de solucionar el ejemplo de los números enteros positivos utilizando modularidad es el siguiente:
Enunciado: Diseñe un flujograma que Imprima los n primeros números enteros positivos.
Página 8 de 73
ImprimeNumerosPositivos
Program
Main
ImprimirEnteros
1. Hacer num = 1
2. Escribir “Cuantos números quiere imprimir (positivo)”
3. Leer cantNum.
4. imprimirEnteros(cantNum,num)
Página 9 de 73
IV. Codificación.
/* *Programa que genera cantNum numeros enteros positivos, iniciando de 1 * */
using System;
namespace ImprimeNumerosPositivos
{
class Program
{
public static void Main(string[] args)
{
//declaracion de variables
int cantNum, num=1;
//Entrada de Datos
Console.WriteLine("Cuantos números quiere imprimir (positivo)?");
cantNum = int.Parse( Console.ReadLine() );
imprimirEnteros(cantNum, num);
return;
}
}
}
Por ejemplo, supongamos que tenemos un dato de entrada (que se llama puntos) cuya restricción es que debe ser mayor
que 5 pero menor o igual a 20, para validar este dato o sea cerciorarnos que el dato es correcto y que el algoritmo funciona
lo podemos hacer así: Expresión de estructura Selectiva o Restricción: puntos >=5 && puntos <= 20
Validar este dato, significa que Mientras la restricción no se cumpla, el dato es incorrecto y debemos volver a leer el dato;
por el funcionamiento de la estructura MIENTRAS (ejecuta la acción cuando la condición es cierta), es necesario escribir lo
contrario de la restricción o simplemente negar la expresión de la restricción, y esto nos servirá para volver a leer otro otra
vez leer puntos, y evaluar la condición nuevamente:
Condición del ciclo Mientras: puntos<5 || puntos > 20
Puede también escribirse: !(puntos >=5 && puntos <= 20)
Página 10 de 73
Observe que la flecha
regresa
Siempre a evaluar la condición,
NO ANTES NI DESPUÉS.
Muy importante: debemos distinguir entre la Restricción y la Condición de validación ó expresión lógica de validación así:
Restricción: es la condición que deben cumplir la o las variables de entrada para que la solución funcione
correctamente, es decir, la restricción indica que valores son correctos para la o las variables de entrada.
Condición de validación ó expresión lógica de validación:
En el caso del ciclo mientras: es la condición o expresión lógica que se debe de cumplir para seguir ejecutando el
bucle de lectura de la o las variables de entrada en busca de un valor o valores correctos. En otras palabras es lo
contrario de la Restricción, como podemos observar en el ejemplo anterior.
En el caso del ciclo hasta que: es la condición o expresión lógica que se debe de cumplir para dejar de ejecutar el
bucle de lectura de la o las variables de entrada en busca de un valor o valores correctos. En otras palabras es la
Restricción.
A continuación se muestra el mismo ejemplo anterior con el propósito de ilustrar el uso de la estructura mientras para
obtener un dato valido e implementando modularidad: Este ejercicio imprime n enteros positivos
IV. Codificación.
/* *Programa que genera cantNum numeros enteros positivos, iniciando de 1 * */
using System;
namespace ImprimeNumerosPositivos
{
class Program
{
public static void Main(string[] args)
{
//declaracion de variables
int cantNum, num=1;
//Entrada de Datos
Console.WriteLine("Cuantos números quiere imprimir (positivo)?");
cantNum = int.Parse( Console.ReadLine() );
imprimirEnteros(cantNum, num);
Página 11 de 73
public static void imprimirEnteros(int cantNum, int num)
{
//Lazo para validar datos, notese que se sustituye estructura selectiva Doble
while (cantNum<=0)
{
Console.WriteLine("ERROR EN DATOS, NUMERO DEBE SER ENTERO POSITIVO");
cantNum = int.Parse( Console.ReadLine() );
}
Los operadores que hemos visto los resumimos en aritméticos (+, -, *, /, %), relacionales (<, <=, >,>=, !=, ==), lógicos (&&,
||, !) , el de asignación (=) y el operador condicional (?:).
Los datos sobre los que actúan los operadores se denominan operandos. Así en la expresión: 2 + a tenemos:
un operador: ‘+’
Y dos operandos: ‘2’ y ‘a’
Si escribimos completa la expresión tenemos que agregar una variable y otro operador más: x = 2 + a; para que dicho valor
adquiera el resultado de la expresión.
En esta sección clasificaremos a los operadores de acuerdo al número de operandos que necesiten en:
Unuarios o monoarios, necesitan sólo un operando, como el signo menos de un número negativo: -a.
o Ejemplo: -15 y otros que veremos más adelante.
Binarios que necesitan 2 operandos como 2+a.
o Ejemplo: a%2 x=5 etc.
Terciarios que necesitan 3 operandos, como el condicional que considera cada expresión como operando, por
ejemplo, el operador condicional ?.
o Ejemplo: (a+3>7)? b=a: b=2; Donde (a+3>7) es el primer operando, b=a segundo operando y b=2 tercer
operando.
C# es un lenguaje rico en operadores, además de los que ya estudiamos, conoceremos también otros operadores:
Asignación (binarios)
Incremento-decremento (monarios)
Página 12 de 73
Además del operador de Asignación =, lenguaje C# proporciona cinco operadores de asignación adicionales que actúan
como una nota abreviada para expresiones utilizadas con frecuencia, y que también son operadores binarios:
Con estos nuevos operadores la adición de 3 a una variable num la podemos escribir de las siguientes formas:
num = num + 3; Equivale a num+= 3;
Líneas que suman 1 a la variable n Sentencias que restan 1 al valor que tiene la variable n
++n; --n;
n += 1; n -= 1;
n = n +1; n = n – 1;
Estos operadores tienen la propiedad de que pueden utilizarse como prefijo (antes del operando) o como sufijo (después
del operando), el resultado de la expresión puede ser distinto, dependiendo del contexto.
Si los operadores ++ y - - se usan como prefijo, la operación de incremento o decremento se efectúa antes que la
operación de asignación; si los operadores ++ y - - están como sufijos, la asignación se efectúa en primer lugar y el
incremento o decremento después.
Ejemplos: Si i es una variable entera cuyo valor es 3, las variables y e i toman los valores sucesivos que se indican en las
sentencias siguientes:
Sentencia Descripción
++i; // incrementa i a 4
--i; // decrementa i en 1, i = 3
i++; // incrementa i a 4
i--; // decrementa i en 1, i =3
y = i++; // asigna el valor de i que es 3 a y , e incrementa 1 a i (i = 4)
y = ++i; // incrementa 1 a i (i = 5) y asigna el valor de i que es 5 a y
y = i--; // asigna el valor de i que es 5 a y , y decrementa 1 a i (i=4)
y = --i; // decrementa i en 1 (i =3), y asigna el valor de i que es 3 a y
A continuación se muestra el mismo ejemplo anterior con el propósito de ilustrar el uso de operadores de Incremento: Este
ejercicio imprime n enteros positivos
Página 13 de 73
/* *Programa que genera cantNum numeros enteros positivos, iniciando de 1 * */
using System;
namespace ImprimeNumerosPositivos
{
class Program
{
public static void Main(string[] args)
{
//declaracion de variables
int cantNum, num=1;
//Entrada de Datos
Console.WriteLine("Cuantos números quiere imprimir (positivo)?");
cantNum = int.Parse( Console.ReadLine() );
imprimirEnteros(cantNum, num);
Página 14 de 73
Ejemplo No. 2
En la empresa “XXX” se requiere clasificar los diferentes productos que ofrecen. Para ello mantienen tres diferentes
clases de calidad: OPTIMA, NORMAL, y DEFICIENTE. Diseñe un programa, utilizando la metodología completa, que dé a
conocer el número de productos de cada clase, si se conoce la calidad de cada uno de los 100 existentes en bodega.
Página 15 de 73
2.2 Diseño Jerárquico Modular
Main, Realiza la clasificación de los productos guardando cada tipo de producto respectivos dependiendo del
tipo recibido al invocar el método ValidarClase() y realiza la impresión enviándole los tipos e invocando al
método ImprimirClase().
ValidarClase, recibe el número de producto a analizados para ser impreso (prod), además debe pedir el tipo
de producto (clase) y validar el valor ingresada se encuentre entre 1 y 3, y retorna el valor de tipo de producto.
ImprimirClase, Muestra en pantalla del total de cada clasificación de productos como optima, normal,
deficiente (opt, nor, def) son variables de tipo entero, y deben ir incrementando según corresponda.
ClasificarProductos
Program
Main
ValidarClase ImprimirClase
{ opt representa el número de productos con calidad óptima, nor contiene el número de productos con calidad normal,
def representa el número de productos con calidad deficiente, clase representa el valor ingresado código numérico
que indica la clase que tiene un producto, prod cuenta el número de productos analizados }
{opt, nor, def son acumuladores de cada clase son variables de tipo entero, y prod es variable de proceso que
representa el contador de clase, de tipo entero }
Página 16 de 73
Método: ValidarClase Acceso: Público Estático: Sí
{ Debe pedir la clase y validar que la clase ingresada se encuentre entre el rango 1, 2, 3 }
{ clase es una variable selector de tipo entero, y deben ser positivo }
1. Escribir "Digite la clase del producto (debe ser 1.Optimo ,2.Normal ,3.Deficiente): "
2. Leer clase
3. Mientras (clase < 1 || clase > 3) Repetir
Escribir "clase no existe intente de nuevo 1.Optimo, 2.Normal, 3.Deficiente: "
Leer clase
4. {Fin del ciclo paso 3}
5. Retornar clase
IV. Codificación
/** Programa para clasificar los productos **/
using System;
namespace ClasificarProductos
{
class Program
{
public static void Main(string[] args)
{
//declaracion de variables e inicializadas
int prod=1;
int opt=0, nor=0, def=0;
int clase;
//Entrada de Datos
Console.WriteLine("CLASIFICACION DE PRODUCTOS SEGUN SU CALIDAD");
Console.WriteLine("1. Clase de Calidad Óptima"); // No están en el flujograma pero,
Console.WriteLine("2. Clase de Calidad Normal"); //ayudan a la entrada de datos
Console.WriteLine("3. Clase de Calidad Deficiente");
Console.WriteLine();// líneas en blanco
//Lazo para validar datos, nótese que se sustituye la estructura selectiva Doble
while (prod <=10)
{
clase = ValidarClase( ); //llamada a método lectura
switch (clase)
{
case 1: opt++;
break;
case 2: nor++;
break;
case 3: def++;
break;
}
prod ++;
}
Página 17 de 73
public static int ValidarClase()
{
int clase;
Los anidamientos de estructuras no solo se dan entre las selectivas, en este ejemplo tenemos dos estructuras mientras anidadas y
dentro de la primera (while (prod<=100)), una de selección múltiple. El único cuidado que se debe de tener es cerrar cada estructura
como tiene que ser y nunca cruzar dos o más de ellas.
Ejemplo No. 3
Diseñe un programa C# que, dados como datos 25 números enteros, obtenga la suma de los números impares y el promedio de los
números pares.
Página 18 de 73
i=1 //cuenta número de datos, valor inicial 1
to_imp=0 //acumulada impares, valor inicial=0
to_par=0 //acumula pares, vi:=0
n_par=0 //cuenta pares, vi=0
SumarImparesPromediar
Pares
Program
Main
ValidarNumEntero ImpParesImpares
Página 19 de 73
III. Análisis / Diseño Jerárquico Modular Diseño de la Solución
Pseudocódigo (Flujograma ver ANEXO 3)
Método: Main Acceso: Público Estático: Si
{ inicializara el valor de números de datos leídos y procesados ( i ), además aumentar las variables que
llevan control de números pares y números impares (toImp, toPar) realizar la invocación ValidarNumEntero
y ImpParesImpares }
{toImp, numEntero, i=1 son variables de tipo entero, y deben ser positivo, topar, nPar, i=1 es variable de
proceso de tipo entero }
1. Hacer nPar=0, toPar=0, toImp=0, i=1.
2. Mientras i <= 25 Repetir
Hacer numEntero = ValidarNumEntero( i )
2.1 Si numEntero %2 == 0
Entonces
Hacer nPar++
Hacer toPar += numEntero
Sino
Hacer toImp += numEntero
2.2 {Fin del condicional del paso 2.1}
Hacer i++
3. {Fin del condicional del paso 2}
4. Hacer ImpParesImpares(toPar, nPar, toImp)
{ Encargado de recibir el contador i y leer cada uno de los números enteros ( numEntero ) y validar su valor
sea entero positivo y retorna este valor }
1. Recibir i
2. Escribir "Digite el dato", i
3. Leer numEntero
4. Mientras numEntero < 0
Entonces
Escribir "Digite el dato nuevamente", i
Leer numEntero
5. {Fin del ciclol del paso 3}
6. Retornar numEntero.
{recibe suma de numeros pares (toPar), el número de datos pares (nPar), el número de números impares
(toImp) y será el encargado de realizar el promedio de pares (pPares ) y realiza las impresiones de suma
de impares (toImp) y promedio de pares (pPares) }
{toImp, son variables de tipo entera y deben ser positivos, pPares , variable de tipo real, toPar, nPar son
variable de procesos }
Página 20 de 73
IV. Codificación.
using System;
namespace SumarImparesPromediarPares
{
class Program
{
static void Main(string[] args)
{
int toImp, numEntero, toPar, nPar, i;
toImp = 0;
toPar = 0;
nPar = 0;
i = 1;
//Entrada de Datos
Console.WriteLine("SUMA DE NUMEROS ENTEROS PARES Y PROMEDIO DE IMPARES");
return numEntero;
}
float pPares;
pPares = toPar / nPar;
Console.WriteLine("Suma de impares = {0}", toImp);
Console.WriteLine("Promedio de pares = {0}", pPares);
return;
}
}
}
Página 21 de 73
Ejemplo No. 4
Diseñe un programa en C# que, lea un número entero y positivo N para que calcule el resultado de la siguiente serie:
1+1/2+1/3+1/4+1/5+……+1/N
Página 22 de 73
ProgramaParaCalcularSerie
Program
Main
ValidarN GenerarSerie
{ leer numEntero y valida el valor, numEntero indica el número de términos de la serie y retorna
numEntero }
{ numEntero variables de tipo, entero deben ser positivo }
{Recibe numEntero como punto de fin para generar la serie, será retornada la serie y k que es un numero
para división de la serie}
{ numEntero variables de tipo, entero deben ser positivo y serie ,k son variable de proceso de tipo real }
1. Recibe numEntero, k
2. Mientras k <= numEntero Repetir
Hacer ter = 1/k
Hacer serie += ter
Hacer k++
3. { Fin del ciclo del paso 2 }
4. Retornar serie
Página 23 de 73
IV. Codificación
using System;
namespace ProgramaParaCalcularSerie
{
class Program
{
static void Main(string[] args)
{
int numEntero;
double serie;
serie = 0.0;
double k = 1.0; //k debe ser real para que el resultado de la division sea real
return serie;
}
}
}
Página 24 de 73
Ejemplo No. 5
Un profesor de IAI115 tiene en su grupo 80 alumnos inscritos, los cuales realizaron 5 evaluaciones en todo el ciclo. El docente
necesita entregar a la coordinación un informe que contenga la siguiente información: Nombre y la nota final de cada estudiante, Nota
promedio de todos, Número de hombres aprobados y Número de mujeres reprobadas.
c. Restricciones:
nota>=0 && nota<=10
sexo==1 || sexo==2
d. Proceso:
Los contadores y acumuladores deben iniciarse con valor cero.
Para la nota final de cada estudiante uno se suman (o acumulan las 5 notas) y luego se divide entre 5.
Por lo tanto, se debe leer cada nota, validarla y después acumularla; proceso que se realiza 5 veces por alumno y, al
final de las cinco veces se divide entre 5. El acumulador debe iniciarse con cero para cada alumno. (Esto se realiza 80
veces).
Para el promedio de todos se suman o acumulan las notas finales de cada alumno (se hace 80 veces) y se divide entre
80.
Para calcular la cantidad de hombres aprobados y mujeres reprobadas se va a comparar la nota final de cada estudiante
con 6.0 y se incrementa en 1 el contador que corresponda, según el sexo del alumno, el sexo se debe leer y validar para
cada alumno. Se repite 80 veces también:
Página 25 de 73
a=1 // Contador de alumnos.
hApro=0 // Contador de hombres aprobados.
mRep=0 // Contador de mujeres reprobadas.
suma=0 // Acumulador de notas finales.
Nota_Promedio
Program
Main
Página 26 de 73
III. Análisis / Diseño Jerárquico Modular Diseño de la Solución
Pseudocódigo (Flujograma ver ANEXO 5)
Método: Main Acceso: Público Estático: Si
{ Crear un programa para la asignatura IAI115 que tiene en un grupo 100 alumnos inscritos, los cuales
realizaran 5 evaluaciones en todo el ciclo. Se necesita entregar a la coordinación un informe que contenga
la siguiente información: nombre y la nota final de cada estudiante, nota promedio de todos, número de
hombres aprobados, número de mujeres reprobadas }
{ nFin, prom, son variables de tipo real, deben ser positivo. hApro, mRep son variables de tipo, entero
deben ser positivo, a, e son variables de proceso de tipo entero y representan contadores que deberán ser
de tipo entera, su! Y suma son variable de proceso de tipo real y son acumuladores }
1. Hacer a=1
2. Hacer suma = 0
3. Hacer e=0
4. Hacer hApro=0, mRep=0
5. Mientras a <= 100 Repetir
Hacer su1 = 0
Hacer e =1
Escribir “Digite el nombre del estudiante”
Leer nom
5.1 Mientras e <= 5 Repetir
Hacer nota = ValidarNota();
Hacer su1 = su1 + nota
Hacer e++
5.2 {Fin de ciclo del paso 5.1}
Hacer nFin= su1/5
Hacer suma += nFin
Hacer sexo = ValidarSexo();
5.3 Si sexo == 1 entonces
5.3.1 Si nFin entonces
Hacer hApro++
5.3.2 {Fin del ciclo paso 5.3.1 }
Sino
5.3.3 Si nFin < 6.0 entonces
Hacer mRep++
5.4 {Fin del ciclo paso 5.3}
Escribir A, nom, nFin
Hacer A++
6. {Fin del ciclo del paso 2}
7. ImprimirResultado()
{ obtiene las diferentes notas de los alumnos y valida que se encuentre en el rango 1 y 10 }
{ nota, es variable de tipo real, deben ser positivo }
Página 27 de 73
Método: ValidarSexo Acceso: Público Estático: Si
{ obtiene los tipos de sexo de los alumnos y valida que se encuentre en el rango 1 y 2 }
{ sexo, e, es variable de tipo entera, deben ser positivo }
1. Recibe e
2. Escribir “Sexo 1 masc. y 2 feme.”
3. Leer sexo
4. Mientras sexo !=1 && sexo!=2 Repetir
Escribir “Sexo 1 masc. y 2 feme.”
Leer sexo
5. {Fin del ciclo del paso 3}
6. Retornar sexo
{ realiza el promedio del total de estudiantes y además imprime los resultados como promedio, hombres
aprobados, mujeres reprobados }
{ prom,suma son variables de tipo real, deben ser positivo, hApro, mRep son variables de tipo entera y
deben ser positivas }
IV. Codificación.
using System;
namespace Nota_Promedio
{
class Program
{
static void Main(string[] args)
{
int a;
float suma;
int e;
int hApro, mRep, sexo;
String nom;
float nota, su1, nFin;
a= 1;
suma = 0;
hApro = 0;
mRep = 0;
Página 28 de 73
while (e <= 5)
{
//llamada al metodo para ingresar nota
nota = ValidarNota(e);
su1 = su1 + nota;
e++;
}
nFin = su1 / 5;
suma += nFin;
//llamada al metodo para ingresar sexo
sexo = ValidarSexo();
if (sexo == 1)
{
if (nFin >= 6.0)
hApro++;
} else
Página 29 de 73
6. ESTRUCTURA CONTROLADA POR UN CONTADOR – ESTRUCTURA DESDE_HASTA
Esta estructura se conoce como Desde - Hasta o ciclo FOR, se utiliza cuando conocemos por anticipado el número exacto de veces
que se va a ejecutar una determinada operación, acción o tarea. Al igual que el ciclo MIENTRAS, la realización del cuerpo del ciclo
depende de una condición, que siempre está relacionada con el valor final del contador.
Al ejecutarse el ciclo por primera vez, el valor inicial se le asigna a una variable de control (o contador), se verifica si el valor de la
variable de control es menor o igual (o mayor, en el caso de decremento) que el valor final, y a continuación se ejecuta el proceso del
interior del ciclo; cuando se termina el cuerpo del ciclo se cambia el valor de la variable contador (según su valor de cambio); si la
variable de control, es mayor (o menor en caso de cuentas regresivas) que el valor final, entonces se sale del bucle y continua con la
siguiente estructura del algoritmo.
Página 30 de 73
6. La variable de control o contador solo se le debe cambiar su valor, después de realizado el cuerpo del ciclo y por el valor de
cambio indicado, nunca por una asignación extra.
En esta estructura el valor de cambio siempre es un valor entero (al igual que el valor inicial y el final y; por lo tanto la variable
contador debe ser también tipo entero). No podemos tener un valor de cambio de 0.5. Entonces, si nuestra variable contador debe ser
de tipo real, se debe de diseñar la solución con una estructura mientras y no con una desde – hasta.
Sintaxis
. . .
//Acciones previas
for (Inicializar; condición; iterador) //for (cont=Vi; cont<=Vf; cont++)
{
//Cuerpo del Ciclo
//Acción1
//AcciónN
}
//Acciones posteriores
. . .
Otra forma de representarlo
. . .
for (Expresion1; Expresion2; Expresion3)
{
Cuerpo del ciclo;
}
En donde: . . .
Expresion1: Es la expresión que asigna el valor inicial a la variable contador.
Expresion2: Es una expresión lógica (condición) que verifica que el valor actual del contador se encuentre entre
los permitidos (vi –vf).
Expresion3: Es una expresión de asignación que cambia el valor del contador.
Ejemplo
. . .
for ( x = 100; x <= 500; x = x + 50 )
{
Console.Write("\n {0}", x);
}
. . .
Página 31 de 73
Ejemplo No. 6
Diseñe un programa que imprima la suma de los números enteros comprendidos entre 15 y 25.
I. Planteamiento General del problema
En este caso se han considerado los límites del rango de números a sumar (15 y 25) como variables, para tener la flexibilidad de
cambiarlos a necesidad del usuario, perfectamente se puede también diseñar una solución solamente para esos 2 valores.
Constantes: No se utilizan
c. Restricciones: li < ls, los límites pueden ser positivos o negativos
d. Proceso:
Leer li y ls // Validar
sum = 0 // Inicialización del acumulador
sum = sum + j //se repite desde j = li hasta j <= ls
SumatoriaNumerosEntre2límites
Program
Main
ImprimirSuma
Página 32 de 73
III. Análisis / Diseño Jerárquico Modular Diseño de la Solución
Pseudocódigo (Flujograma ver ANEXO 6)
Método: Main Acceso: Público Estático:Si
1. Recibir li, ls
2. Hacer suma = 0
3. Repetir con 1 desde i=li hasta 1 ls
Hacer suma = suma + j
4. { Fin del ciclo del paso 3 }
5. Escribir "La suma de los entero es ", suma
IV. Codificación
/* Programa que calcula la sumatoria de los números que se encuentra entre 2 límites*/
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace SumatoriaNumerosEntre2límites
{
class Program
{
static void Main(string[] args)
{
int li, ls;
String[] tokens;
// lectura de los limites del rango de números(uno seguido del otro)
Console.WriteLine("Digite primero el limite inferior y luego el limite superior ");
tokens = Console.ReadLine().Split();
// Parse element 0
li = int.Parse(tokens[0]);
// Parse element 1
ls = int.Parse(tokens[1]);
Página 33 de 73
while (li > ls) /* validacion de datos */
{
Console.WriteLine("El primer limite a ingresar debe ser menor");
tokens = Console.ReadLine().Split();
// Parse element 0
li = int.Parse(tokens[0]);
// Parse element 1
ls = int.Parse(tokens[1]);
}
//llamada a metodo para realizar el ciclo FOR
ImprimirSuma(li, ls);
/* Impresión del resultado */
Ejemplo No. 7
Un profesor calificó 25 exámenes de sus alumnos y requiere calcular la nota promedio de todos ellos, la nota más alta y cuántos
aprobaron y reprobaron el examen. Además se deberá imprimir el nombre y la nota de cada estudiante.
I. Planteamiento General del problema
Página 34 de 73
c. Restricciones: nota >= 0 && nota <= 10
d. Proceso:
Program
Main
ValidarNota Imprimir
Página 35 de 73
Método: Main Acceso: Público Estático: Si
{Un profesor calificó 25 exámenes de sus alumnos y requiere calcular la nota promedio de todos ellos, la nota más alta y
cuántos aprobaron y reprobaron el examen. Además se deberá imprimir el nombre y la nota de cada estudiante}
{ apr, rep son variables de tipo entero, deben ser positivos y representan el numero aprobados y reprobados
respectivamente, nom es del tipo alfanuméricos y representa el nombre del estudiante, nota del tipo real, suma es del tipo
real es variable de proceso y representa la suma de las 25 notas, i es un entero que representa un contador y es variable de
proceso}
{recibe los valores de suma, mayor, apr, rep los cuales utiliza para realiza el cálculo del promedio y además imprime los
demás valores}
{prom, mayor son variables de tipo real, deben ser positivos, apr, rep son variables de tipo entero, deben ser positivos y
representan el numero aprobados y reprobados respectivamente}
Página 36 de 73
V. Codificación.
/* Programa que calcula el numero de aprobados y reprobados*/
using System;
namespace calculaAprobadosReprobados
{
class Program
{
static void Main(string[] args)
{
int apr = 0, rep = 0, i;
float nota, suma = 0, mayor = -1;
string nom;
Página 37 de 73
7. ESTRUCTURA DE ENTRADA ASEGURADA – ESTRUCTURA HASTA_QUE
Esta estructura se conoce como Hasta_Que o ciclo do-while, se utiliza cuando desconocemos el número exacto de veces que se va
a ejecutar el ciclo. Al igual que el ciclo MIENTRAS, la realización del cuerpo del ciclo depende de una condición, con la única
diferencia que esta estructura ejecuta (al menos una vez) el cuerpo del ciclo antes de que evalúe la condición.
Esta estructura, permite repetir el cuerpo del ciclo (proceso, acciones o tareas) al menos una vez, es decir que el número de
iteraciones puede ser 1, 2 o varias veces. Antes de ejecutar por primera vez el cuerpo del ciclo se asigna el valor inicial de la variable
de control, una vez completado el cuerpo del ciclo se verifica si el valor de la variable de control se cumple y al terminar la estructura,
cambia la variable de control y regresa a evaluar la condición de nuevo, si el resultado es falso, el cuerpo del ciclo no se ejecuta más
y continua con la estructura del algoritmo. Dentro del cuerpo del ciclo debe existir alguna estructura que modifique el resultado
lógico (de verdadero a falso) de la condición.
inicializa
Representación Gráfica – Diseño de la Solución
Para la representación gráfica de esta estructura se utiliza solamente el símbolo de repetición,
como se muestra adyacentemente, en donde:
En otras palabras la estructura Hasta_Que funciona como una estructura mientras con la única
diferencia que primero realiza el cuerpo de ciclo y luego evalúa la condición.
Página 38 de 73
Codificación de la Estructura Hasta_Que en C#
La estructura iterativa de entrada asegurada necesita solamente la palabra reservada do while, que justamente en español significa
Hasta que, los paréntesis ( ) para encerrar la condición y las { } para delimitar el cuerpo del ciclo.
La instrucción do ejecuta una instrucción o un bloque de instrucciones repetidamente hasta que una determinada expresión se evalúa
como false. El cuerpo del bucle se debe incluir entre llaves, {}, a menos que esté compuesto por una sola instrucción. En ese caso,
las llaves son opcionales.
Sintaxis
. . . Ejemplo
//Acciones previas . . .
cont = Proposición Inicial // cont=Vi; //Acciones previas
do
x = 100;
{ do
//Cuerpo del Ciclo
{
//Acción1
//AcciónN Console.Write("\n {0}", x);
//cont = Modificación de cont cont++ x = x + 50;
} while(condición) // cont<=Vf; } while ( x < 500);
//Acciones Posteriores //Acciones Posteriores
. . . . . .
En C# la estructura do-while puede salir del bucle utilizando la instrucción break en cualquier punto del bloque. Puede pasar
directamente a la instrucción de evaluación de expresión while utilizando la instrucción continue. Si la expresión while se evalúa
como true, la ejecución continúa en la primera instrucción tras el bucle. Si la expresión se evalúa como false, la ejecución continúa en
la primera instrucción detrás del bucle do-while. En nuestro caso y con fines académicos no aplicaremos estas últimas técnicas para
salir de la estructura sino como se indicó al principio de esta unidad se utilizaran llaves para delimitar el fin de la estructura.
Ejemplo No. 8: Mismo ejercicio anterior solamente pero ahora con la estructura asegurada
Un profesor calificó 25 exámenes de sus alumnos y requiere calcular la nota promedio de todos ellos, la nota más alta y cuántos
aprobaron y reprobaron el examen. Además se deberá imprimir el nombre y la nota de cada estudiante.
Página 39 de 73
Método: Main Acceso: Público Estático: Si
{ Un profesor calificó 25 exámenes de sus alumnos y requiere calcular la nota promedio de todos ellos, la nota más
alta y cuántos aprobaron y reprobaron el examen. Además se deberá imprimir el nombre y la nota de cada
estudiante }
{ apr, rep son variables de tipo entero, deben ser positivos y representan el numero aprobados y reprobados
respectivamente, nom es del tipo alfanuméricos y representa el nombre del estudiante, nota del tipo real, suma es
del tipo real es variable de proceso y representa la suma de las 25 notas, i es un entero que representa un
contador y es variable de proceso }
{recibe los valores de suma, mayor, apr, rep los cuales utiliza para realiza el cálculo del promedio y además
imprime los demás valores}
{prom, mayor son variables de tipo real, deben ser positivos, apr, rep son variables de tipo entero, deben ser
positivos y representan el numero aprobados y reprobados respectivamente}
Página 40 de 73
VI. Codificación.
using System;
namespace calculaAprobadosReprobados
{
class Program
{
static void Main(string[] args)
{
int apr = 0, rep = 0, i;
float nota, suma = 0, mayor = -1;
string nom;
i = 1;
do // inicia el ciclo DO WHILE entrada asegurada
{
Console.WriteLine("Digite el nombre del alumno:");
nom = Console.ReadLine();
//realiza llamado al metodo y retorna nota
nota = ValidarNota();
suma += nota;
return;
}
}
}
Página 41 de 73
8. ESTRUCTURA PARA CADA ELEMENTO - ESTRUCTURA DERIVADA
La estructura para cada elemento es una variante del ciclo Desde_Hasta. Se conoce por la instrucción foreach derivada de la
estructura for pensada especialmente para compactar la escritura de códigos donde se realice algún tratamiento a todos los
elementos de una colección, que suele tener un uso muy habitual de for en los lenguajes de programación que lo incluyen con C#. La
sintaxis que se sigue a la hora de escribir esta instrucción foreach es:
foreach (<tipoElemento> <elemento> in <colección>)
<Instrucciones>
En tanto que una tabla se considera que es una colección, el siguiente código muestra cómo usar for para compactar aún más el
código de la clase HolaMundoFor anterior:
using System;
namespace ParaCadaElemento
{
class HolaMundoFoeach
{
static void Main(string[] args)
{
if(args.Length>0)
foreach(String arg in args)
Console.WriteLine("¡Hola {0}!", arg);
else
Console.WriteLine("¡Hola mundo!");
}
}
}
En general, se considera que una colección es todo aquel objeto que implemente la interfaz
System.Collections.IEnumerable. Esta interfaz está definida en la BCL. Por el momento solo conoceremos el
funcionamiento básico de la estructura, los detalles lo veremos en detalle en la unidad 6.
Página 42 de 73
9. CICLOS ANIDADOS
El cuerpo de un ciclo puede contener cualquier tipo de sentencias: secuenciales, selectivas y repetitivas. Cuando un ciclo
está contenido en el cuerpo de otro ciclo, se denominan ciclos anidados. Se pueden anidar cualquier tipo de estructura
estudiada anteriormente, ya sea con un mismo tipo de estructuras o con una combinación de varias de ellas.
Por ejemplo, los ciclos Hacer mientras y desde hasta pueden estar anidados, entre sí, o bien ciclos Hacer mientras con
hasta que o viceversa; como se muestra a continuación:
. . .
//Dos ciclos mientras anidados:
Mientras (Condición 1) repetir
. . .
Mientras (Condición 2) repetir
Bloque de instrucciones
Fin del ciclo mientras
. . .
Fin del ciclo mientras
. . .
. . .
//Ciclo mientras dentro de un desde - hasta
Repetir con var=vi desde Vi hasta Vf
. . .
Mientras (Condición 2) Repetir
Bloque de instrucciones
Fin del ciclo mientras
. . .
Fin del ciclo desde - hasta
. . .
Bandera: es una técnica que utiliza una variable de control que puede almacenar uno de dos posibles valores resultado de evaluar
una condición) y puede representar el continuar o finalizar de repetir el ciclo. Ejemplo “cierto” o “falso”, 1 o 0, continuar o finalizar, yes
o no, si o no, etc.
Una bandera sirve entre otras cosas para controlar las repeticiones de un ciclo, tomando en cuenta que para esta técnica solamente
se puede implementar cuando se desconoce las veces que se repite el ciclo y con la estructura mientras y hasta_que. El
Programador es quien decide que estructura será la más idónea y los valores a usar como valor cierto y valor falso; la variable
bandera puede ser de tipo alfanumérico, entero o real (aunque el lenguaje lo permite no utilizaremos las variables de tipo string); pero
en todo caso habrá un valor para “cierto” y un valor para “falso”. Véase ejemplos de valores usando diferentes tipos, en la tabla
siguiente:
Página 43 de 73
Anteriormente, hemos practicado el uso de ciclo controlado por contador, el cual se emplea cuando se sabe o se puede preguntar la
cantidad de repeticiones. En el presente contenido estudiaremos el uso de bandera para controlar ciclos. Como ya hemos aclarado las
variables bandera se utilizan cuando no se sabe la cantidad de repeticiones que se deben realizar.
Cabe señalar que en un programa se puede combinar diferentes técnicas de control de ciclos. Por ejemplo se puede usar bandera en
el primer ciclo cuando no se sabe la cantidad de repeticiones, combinando con un contador para determinar la cantidad de
repeticiones. Al finalizar el ciclo controlado por la bandera el contador contiene la cantidad de repeticiones, por lo que si fuera
necesario ejecutar alguna operación con los mismos datos se puede usar contador, lo anterior es útil principalmente cuando se
emplea arreglos o matrices.
La bandera es una variable que posee restricción y que se lee por teclado, por lo que igual que las variables de entrada tendrán que
ser validada. Para la cual se empleará el ciclo mientras, también llamado ciclo con entrada condicionada para validar.
Ejemplo No. 9
Dada la estatura de un grupo (la cantidad es totalmente desconocida) de personas adultas y su género, la estatura debe estar entre 1
mts y 2.5 mts ambos inclusive. Se pide, determinar la cantidad de personas del género femenino por arriba de 1.50 mts y la cantidad
de personas del género masculino por arriba de 1.65 mts. También se necesita conocer la estatura promedio de todo el grupo sin
importar el género de las personas de las personas. Además debe determinar la estatura y el género ‘f’ o ‘m’ de la persona más alta y
de la persona más baja respectivamente.
Página 44 de 73
I. Planteamiento General del problema
Entrada de datos Salida de datos
II. Estatura de cada persona Cantidad de personas femenino arriba de 1.5 mts
Genero de cada persona Cantidad de personas masculino arriba de 1.65
Variable de control bandera mts
Promedio general de estaturas
Estatura y género de la persona más alta
Estatura y género de la persona más baja
contPer++
Cada vez que se repite el ciclo principal se incrimenta contPer y se acumula est
sumaEst += estatura
Ejemplo9
Program
Main
Página 46 de 73
Método: main Acceso: Público Estático: Sí
{Invoca el modulo LeerGenero y LeerEstatura , donde Lee edad y estatura de personas adultas junto con su género,
la estatura debe estar entre 1 mts y 2.5 mts género femenino por arriba de 1.50 mts y la cantidad de personas del
género masculino por arriba de 1.65 mts.}
Página 47 de 73
Método: LeerGenero Acceso: Público Estático: Sí
{ Debe recibir los parámetros enviados desde el modulo principal, para imprimir resultados y mensaje }
IV. Codificación.
using System;
namespace Ejemplo9
{
class Program
{
static void Main(string[] args)
{
//Definicion de variables de entrada
double estatura;
char genero;
//Definicion de variables de salida
int cantF_150, cantM_165;
char mayorGen, menorGen;
double mayorEst, menorEst, promEst;
//Variables de proceso
int contPer, bandera;
double sumaEst;
//Inicializacion de variables
contPer = 0; cantF_150 = 0; cantM_165 = 0; sumaEst = 0;
Página 48 de 73
mayorEst = 1.0; //para determinar el mayor se inicia la variable con el valor menor posible
menorEst = 2.5; //para determinar el menor se inicia la variable con el valor mayor posible
menorGen = ' '; mayorGen = ' ';
bandera = 1;
while (bandera == 1)
{
estatura = LeerEstatura();
genero = LeerGenero();
//calculo de promedio
promEst = sumaEst / contPer;
Console.Clear();
//Impresiones de variable de salida
Imprimir("\nCantidad de femenino > 1.50 mts: {0} ", cantF_150);
Imprimir("\nCantidad de masculino > 1.65 mts: {0} ", cantM_165);
Imprimir("\nPromedio de estatura en mts: {0} ", promEst);
Imprimir("\nEstatura mayor mts: {0} ", mayorEst);
Imprimir("\n Genero de estatura mayor : {0} ", mayorGen);
Imprimir("\n Estatura menor mts: {0} ", menorEst);
Imprimir("\n Genero de estura menor: {0} ", menorGen);
Console.ReadLine();
}
Página 49 de 73
private static double LeerEstatura()
{
double est;
//lectura de la estatura de la persona
Console.WriteLine("Ingrese la estatura de la persona \n");
est = double.Parse(Console.ReadLine());
//validacion de la estatura
while (!(est >= 1 && est <= 2.5))
{
Console.WriteLine("\n Error estatura debe ser mayor a 1 y menor que 2.5");
Console.WriteLine("\n Ingrese la estatura de la persona \n");
est = double.Parse(Console.ReadLine());
}
return est;
}
Página 50 de 73
11. TECNICA DE CICLO CONTROLADO POR CENTINELA
Centinela: es una técnica que utiliza una variable de control que es además de una variable de entrada (con datos validos) una
variable de control de ciclo. Es decir que la variable tiene una doble función la primera recibir los datos a procesar y la segunda
función de: continuar o detener un ciclo).
Una variable centinela se escoge de entre las variables de entrada de la solución (variables tipo entero, tipo real o tipo alfanumérico de
un carácter) que al igual que la bandera no utilizaremos variable tipo cadena de carácter por fines prácticos.
La variable centinela al igual que la variable de control bandera se usará cuando la cantidad de veces que debe repetirse el ciclo es
desconocida, generalmente con la estructura mientras, pero algunas programadores gustan de la estructura de control hasta que.
La variable centinela es una variable que posee restricción y que se lee por teclado, por lo que igual que las variables de entrada
tendrán que ser validada. Al igual que como lo hace la bandera empleando el ciclo mientras.
Pseudocódigo
…
//acciones previas al ciclo principal, como inicializar acumuladores, contadores y otros
Hacer edad = 1 // cualquier valor diferente del centinela y que sea valido
Mientras (edad != -1) repetir //la condición debe ser la variable centinela diferente del valor centinela
Hacer edad = 0 //asignar variable centinela cualquier valor del centinela que no sea valido
Mientras (!((edad >0) || (edad == -1)) repetir //validación del centinela (que sea dato valido o centinela)
Escribir "Digite la edad o -1. para detener " //mensaje de datos validos o valor para detener
Leer edad //lectura del dato centinela
{ Fin del Ciclo validación variable centinela}
Si edad != -1 //entrará todo aquel valor que sea válido y diferente del valor centinela
entonces
{ Repetir el Cuerpo del Ciclo} // validar entradas, Acciones, procesos y salidas iterativas
{ Fin de la Condicional de Evaluación datos validos }
{ Fin del Ciclo Principal}
//Acciones Posteriores al ciclo principal como impresiones sumarizadas
…
Ejemplo No. 10. El mismo ejemplo 9 solo que aplicando centinela
I. Planteamiento General del problema
Entrada de datos Salida de datos
II. Estatura de cada persona Cantidad de personas femenino arriba de 1.5 mts
Genero de cada persona y Variable de Cantidad de personas masculino arriba de 1.65
control centinela con valor z. detener mts
Promedio general de estaturas
Estatura y género de la persona más alta
Estatura y género de la persona más baja
Página 51 de 73
II. Análisis / Diseño Jerárquico Modular
2.1 Análisis del Problema
a. Definición de variables de salida.
genero = 'f'
Mientras (genero != 'z') repetir
genero = 'w'
Mientras (!(genero == 'f'|| genero == 'm'|| genero == 'z')) repetir
Validar genero
¿Si genero != 'z'?
Si: Validar edad
¿Si genero es:?
‘f’ : ¿Es (estatura > 1.50)?
Si: cantF_150++
‘m’: ¿Es (estatura > 1.65)?
Si: cantM_165++
¿Es estatura > mayorEst?
Si: mayorEst=estatura
mayorGen=genero
No: menorEst=estatura
menorGen=genero
contPer++
sumaEst += est
promEst=sumEst/contPer
Imprimir cantF_150 , cantM_165, promEst, mayores, mayorGen, menorEst, menorGen
Página 52 de 73
e. Definición de Variables de Proceso:
Nombre Tipo Descripción
contPer entero Contador de personas vi=0 vf=? vc=1
sumaEst Real Suma de las estaturas de las personas vi=0 vf=? vc=estatura
Ejemplo10
Program
Main
LeerEstatura Imprimir
{Invoca el modulo LeerGenero y LeerEstatura , donde Lee edad y estatura de personas adultas junto con su género,
la estatura debe estar entre 1 mts y 2.5 mts género femenino por arriba de 1.50 mts y la cantidad de personas del
género masculino por arriba de 1.65 mts.}
Página 53 de 73
4.2 Si genero != 'z'
entonces
' Hacer estatura = LeerEstatura()
4.2.1. Si (genero) igual
'f': Si (estatura > 1.5) entonces
Hacer cantF_150++
'm': (estatura > 1.65) entonces
Hacer cantM_165++
{ Fin del condicional paso 4.2.1 }
4.2.2 Si (estatura > mayorEst) entonces
Hacer mayorEst=estatura
Hacer mayorGen=genero
Sino
Hacer menorEst=estatura
Hacer menorGen=genero
{ Fin del condicional paso 4.2.2 }
Hacer contPer++
Hacer sumaEst += estatura
{ Fin de Condicional paso 4.2 }
5. { Fin del Ciclo paso 4 }
6. Hacer promEst = sumaEst / contPer
7. Imprimir("Cantidad de femenino > 1.50 mts: ", cantF_150)
8. Imprimir("Cantidad de masculino > 1.65 mts: ", cantM_165);
9. Imprimir("Promedio de estatura en mts:", promEst);
10. Imprimir("Estatura mayor mts:", mayorEst);
11. Imprimir("Genero de estatura mayor : ", mayorGen);
12. Imprimir("\Estatura menor mts: ", menorEst);
13. Imprimir("\Genero de estura menor: ", menorGen);
{ Debe recibir los parámetros enviados desde el modulo principal, para imprimir resultados y mensaje }
IV. Codificación.
Página 54 de 73
using System;
namespace Ejemplo10
{
class Program
{
static void Main(string[] args)
{
//Definicion de variables de entrada
double estatura;
char genero;
//Definicion de variables de salida
int cantF_150, cantM_165;
char mayorGen, menorGen;
double mayorEst, menorEst, promEst;
//Variables de proceso
int contPer;
double sumaEst;
//Inicializacion de variables
contPer = 0; cantF_150 = 0; cantM_165 = 0; sumaEst = 0;
mayorEst = 1.0; //para determinar el mayor se inicia la variable con el valor menor posible
menorEst = 2.5; //para determinar el menor se inicia la variable con el valor mayor posible
menorGen = ' '; mayorGen = ' ';
genero = 'f';
while (genero != 'z')
{
genero = 'w';
while (!(genero == 'f'|| genero == 'm'|| genero == 'z'))//validación de centinela
{
Console.WriteLine("Digite genero f. femenino, m. masculino o z. para detener \n");
gen = char.Parse(Console.ReadLine());
}
if (genero != 'z')
{
estatura = LeerEstatura();
Página 55 de 73
//calculo de promedio
promEst = sumaEst / contPer;
Console.Clear();
//Impresiones de variable de salida
Imprimir("\nCantidad de femenino > 1.50 mts: {0} ", cantF_150);
Imprimir("\nCantidad de masculino > 1.65 mts: {0} ", cantM_165);
Imprimir("\nPromedio de estatura en mts: {0} ", promEst);
Imprimir("\nEstatura mayor mts: {0} ", mayorEst);
Imprimir("\n Genero de estatura mayor : {0} ", mayorGen);
Imprimir("\n Estatura menor mts: {0} ", menorEst);
Imprimir("\n Genero de estura menor: {0} ", menorGen);
Console.ReadLine();
}
double est;
//lectura de la estatura de la persona
Console.WriteLine("Ingrese la estatura de la persona \n");
est = double.Parse(Console.ReadLine());
//validacion de la estatura
while (!(est >= 1 && est <= 2.5))
{
Console.WriteLine("\n Error estatura debe ser mayor a 1 y menor que 2.5");
Console.WriteLine("\n Ingrese la estatura de la persona \n");
est = double.Parse(Console.ReadLine());
}
return est;
}
Página 56 de 73
12. TECNICA PARA DETERMINAR EL VALOR MENOR/MAYOR Y DATOS ASOCIADOS
Mayor: es una variable que durante la ejecución de un ciclo almacena el valor mayor que se haya ingresado; el nombre de
la variable debe reflejar su contenido. El valor inicial para menor será el menor valor posible.
Menor: es una variable que durante la ejecución de un ciclo almacena el valor menor que se haya ingresado; el nombre de
la variable debe reflejar su contenido. El valor inicial para menor será el mayor valor posible.
Datos asociados: son datos que están relacionados a los valores ,mayor y/o menor de la serie de datos de entrada, en
otras palabras en una lectura iterativa, se leen en conjunto una serie de datos, como por ejemplo salario y categoría, como
variables de entrada y restricciones salaria >0 y categoría >=1 && categoría <=4,podría requerirse la categoría con mayor
salario, en dicho caso se busca el mayor salario y cuando se encuentra se almacena no solo el salario sino que también la
categoría a la cual pertenece dicho salario. Por todo lo anterior además de las variables para guardar menor y mayor se
necesitan de una o más variables para guardar datos asociados, para el caso del ejemplo se requieren usar
mayor_categoria para guardar dicho valor. IMPORTANTE: Cabe mencionar que en los ejercicios 8, 9 y 10, se aplica una
técnica para conocer cada uno de estos, pero que no es la única para determinar el mayor y menor y datos relacionados,
ya que existen otras variantes, las cuales no se cubren en esta guía.
Página 57 de 73
13. ANEXOS
Anexos 1 – A Anexos 1 - B
Flujograma Ejemplo 1 (sin modularidad) Flujograma Ejemplo 1 (con modularidad)
Inicio Inicio
num = 1
Cua tos ú e os
uie e i p i i
Cua tos ú e os
uie e i p i i
n
cantNum
No n>0 Si
num = 1
imprimirEnteros(cantNum , num)
E o e
dato Nu e o E te o
Positivo. ,n
Fin
Inicio imprimirEnteros(cantNum ,
num)
num <= n
No cantNum > 0 Si
Si
Nu e o E te o
num E o e Positivo. ,cnrNum
dato
num = num + 1
no num <= n
Fin
Si
num
num = num + 1
Fin imprimirEnteros(cantNum ,
Retornar num
num)
Página 58 de 73
Anexo 2
Flujograma Ejemplo 2 (con modularidad)
Calidad No al
nor
clase
Caldiad
defi ie te def
clase <1 || clase > 3 NO
SI
Retornarnor, def)
Fin imprimir(opt,
Esa lase o
existe, intente de
uevo
clase
Retornar
Fin Retornarclase
clase
Página 59 de 73
Anexo 3
Digite el dato
toPar = 0 pPares = toPar/nPar
toImp = 0
“u a de i pa es
numEntero
= ,toImp
i=1
i <= 25
SI
Iniciar
Retornar
impPareImpares(nPar,
numEntero = Digite el dato toPar, toImp)
validarEntero( i ) ueva e te
NO num%2 == 0 SI
numEntero
toImp+=num nPar++
No
toPar+=num
FinRetornar
RetornarnumEntero
numEntero
i ++
impPareImpares(nPar,
toPar, toImp)
Fin
Página 60 de 73
Anexo 4
Flujograma Ejemplo 4 (con modularidad)
Inicio Inicia
Inicia validarEntero()
generarSerie(numEntero, k)
serio = 0
¿Cuá tos
Mientras
terminos?
(k<=n)
k=1
ter = 1/k
numEntero
numEntero = validarN()
serie += ter
Mientras
(n<=0)
k ++
serie = generarSerie(numeroEntero , k)
De e se u u e o
positivo
Retornar serie
El esultado de la Fin retorna serie
serie es: ,serie
numEntero
Fin
Retornar
Fin retorn numEntero
numEntero
Página 61 de 73
Anexo 5
Flujograma Ejemplo 5 (con modularidad)
Inicio
Inicio
validarSexo()
a =1
suma=0
Sexo 1 masc. y
hApro=0 2 feme
mRep=0
sexo
a <= 8
Mientras
sexo !=1 && sexo != 2
su1 = 0
Sexo 1 masc. y
e =1
2 feme
nom
sexo
Mientras
(e<=5)
nota = validarNota()
Retornar sexo
su1 = su1 + nota
e++
Inicio
validarNota()
nFin=su1/5
Digite la ota
Suma += nfin del estudia te
sexo = validarSexo()
nom
NO sexo == 1
SI
Mientras
nota < 0 || nota > 10
Nota del
estudia te
A, nom, nFin
nota
a++
Retornar nota
sexo = validarSexo()
Página 62 de 73
Anexo 6
Flujograma Ejemplo 6 (con modularidad)
Inicio Iniciar
ImprimirSuma(li,ls)
NO sum = sum +j
li > ls
SI
La su a de e te os
El p i e li ite de e se
es: su
e o
Retornar
Fin
ImprimirSuma(li,ls)
li, ls
ImprimirSuma(li,ls)
Fin
Página 63 de 73
Anexo 7
Flujograma Ejemplo 7 (con modularidad)
Inicio
Iniciar ValidarNota()
mayor = 0
apr = 0
nota
suma = 0
Mientras
Nota < 0 || nota > 10
La ota de e esta
entre 0 y 10
i = 1, 25, 1
nota
Digite el o e
del alu o
Imprimir(suma,mayor,apr,rep)
Retornar nota
nom
Fin
Iniciar
Imprimir(suma,mayor,a
nota=ValidarNota() pr,rep)
Mayor = nota
Fin
Retornar
Imprimir(suma,mayor,a
pr,rep)
Página 64 de 73
Anexo 8
Flujograma Ejemplo 8 (con modularidad) - Do WHILE
Inicio
Iniciar ValidarNota()
mayor = 0
reo =0
I t oduz a la ota
apr = 0
suma = 0 nota
i=1 Mientras
Nota < 0 || nota > 10
La ota de e esta
Digite el o e entre 0 y 10
del alu o
nota
nom
nota=ValidarNota()
Retornar nota
Nota >= 6
prom = suma/25
Mayor = nota
Nu e o de
ap o ados , apr
i++
Nu e o de
ep o ados ,rep
Verdadero i <= 25
Falso
Fin
Imprimir(suma,mayor,apr,rep) Imprimir(suma,mayor,a
pr,rep)
Fin
Página 65 de 73
Anexo 9
Estas acciones pueden ser asignación
Flujograma Bandera - Mientras de valores iníciales para contadores,
acumuladores, mayores y menores
Leer la variable
Si la restricción de la variable
bandera no se cumple, se repite
el proceso de mensaje de error,
entrada y la lectura
Página 66 de 73
Anexo 10
Flujograma Bandera - valor mayor y menor
Observe: como se
hace uso de la Cuerpo del ciclo, incluye las
estructura selectiva lecturas, validaciones, cálculos,
simple para procesos, decisiones y salidas
iterativas
determinar el valor
menor/mayor y
Determina el mayor y asociado
asociados
Determina el menor y
asociado
Página 67 de 73
Anexo 11
Ejemplo No.11(sin modularidad)
Se tiene un grupo de números enteros positivos, pero se desconoce cuántos son, diseñe un algoritmo que imprima:
a) Cuántos números forman el grupo de datos.
b) El promedio de los números pares.
c) Cuántos son los impares.
d) Cuántas veces se repite el número cinco.
El primer dato debe ser 10.
Constantes: No se utilizan.
c. Restricciones: num > 0 y se utilizará como centinela o condición de fin de datos
d. Proceso:
Vamos a leer los datos uno a uno y los vamos a ir contando, para saber cuántos leímos en total; vamos a parar
de leer cuando tengamos un dato negativo
Con cada dato leído se verificará si es par, y en tal caso se acumulará (sum_p) con todos los pares que aparezcan,
para después calcular el promedio de pares (prom_p),
En caso de que el dato leído es impar y se lleva un conteo de ellos (imp). Además, si el dato verificaremos que sea
igual a 5 para contarlos.
Para calcular el número de pares, se debe restar el número de impares del total de datos leídos.
Página 68 de 73
e. Definición de Variables de Proceso:
Nombre Tipo Descripción
sum_p Entero Acumula los datos pares: vi=0 vc=num vf=?
pares Entero Cuenta la cantidad de datos pares vi=0 vc=1 vf=?
Página 69 de 73
Página 70 de 73
Anexo 12
Ejemplo No. 12 (sin modularidad)
Diseñe un programa en C que imprima los valores de la función f(x)= x3, a partir de un valor real inicial de x, hasta un límite final, con
incrementos de 0.25. El programa debe de imprimir tanto el valor de x como el de f(x).
I. Planteamiento General del problema
Página 71 de 73
III. Diseño de la solución
Pseudocódigo
{ El programa debe imprir los valores de la función f(x)= x3, a partir de un valor real inicial de x, hasta un límite final, con
incrementos de 0.25. El programa debe de imprimir tanto el valor de x como el de f(x).}
{x, y son variables del tipo real, deben ser positivo }
Página 72 de 73
IV. Codificación de la Solución.
/*Programa que calcula f(x) */
using System;
namespace CalculaF_x_
{
class Program
{
static void Main(string[] args)
{
float vi, vf;
double x,y;
String[] tokens;
Página 73 de 73