Documentos de Académico
Documentos de Profesional
Documentos de Cultura
Objetivo
Sincronizar los elementos mentales de una solución de un problema, con las características
funcionales de un computador y obtener así un algoritmo.
Dentro de los pasos de solución de problemas está la descripción del problema, el cual tiene que
ser entendible y claro, y se determina que un problema a solucionar se lo entiende perfectamente,
cuando se da un ejemplo de una solución.
Elaborar un ejemplo, significa que se conoce todos los conceptos para su solución.
De lo anterior podemos concluir que, una solución a un problema por computador es posible, si y
solo si mentalmente se puede dar un ejemplo de una solución, esto significaría que se conocen
todos los conceptos necesarios para el planteamiento de una solución.
Proceso, acciones que transforman datos para obtener los resultados esperados. En este proceso
pueden aparecer nuevos datos y se incluyen todas las expresiones aritméticas y lógicas que se
pueden presentar
Salida. Se refiere a los resultados que se obtienen durante el proceso, generalmente son los
resultados de transformar datos de entrada.
Conceptos claros.
Area = Base*altura
2
Con este concepto claro se plantea el ejemplo
Para resolver este ejercicio, se necesita tener la base y la altura del triángulo, el ejemplo planteado
es el siguiente:
Base 5
Altura 6
Area = 5*6 = 15
2
Area = 15
Este ejemplo plantea que si se puede llegar a la solución del problema y se ha avanzado en la
descripción de todos los elementos que intervienen en la solución mental.
Con este ejemplo se llega al segundo paso que es el análisis del problema, en donde se deben
identificar todos los elementos y sus relaciones.
El ejemplo anterior ya ha avanzado bastante en este aspecto, lo que se debe hacer ahora, es
agregarle a los elementos participantes las características computacionales para que se conviertan
en elementos computacionales, ya que la solución es para el computador.
Conceptos que se deben tener bien claro para ampliar los presentes en el modelo solución mental:
Para agregarle las características computacionales al ejercicio mental se debe tener los conceptos
de:
Instrucción de entrada
Esta acción permite que lleguen datos del exterior a la memoria principal del computador. La
instrucción representativa es leer y su formato es:
La acción de leer se la debe tomar desde la posición del computador y asocia por defecto el
teclado.
Con esta instrucción, el computador lee lo que el usuario le ha digitado en el teclado y lo almacena
en los campos de memoria especificados en la lista de variables.
Ejemplos
Leer A
Se entiende:
- El computador espera que el usuario digite un valor en el teclado
- El dato digitado es leído por el computador y lo almacena en el campo de memoria con
nombre A.
Leer A,B,C
Se entiende
- Se espera que se digiten tres valores.
- Cada valor digitado se almacena en los campos de memoria A,B y C respectivamente.
Leer A
Leer B
Leer C
cin >>A;
cin >>B;
Y lo que ocurre internamente es que el dispositivo de entrada (teclado por defecto), transforma en
ceros y unos el dato tecleado, el cual es leído y llevado a las direcciones de memoria
correspondientes a las variables A , B y C respectivamente.
Instrucción de Salida
Ejemplo
Elementos
A es una variable y lo que hace es, traer el valor almacenado (ceros y unos) y mostrarlo en pantalla
en formato normal (traducido. Realizado por los dispositivos de salida) .
Valor de variable A es 20
Lo que está entre comillas dobles aparece tal cual y lo que no está entre comillas, se considera
como variable y muestra su valor, en este caso 20
La instrucción de salida también puede tener solo constantes alfanuméricas y sirven para mostrar
mensajes, que combinados con una acción de entrada se puede tener lo siguiente
Esto puede orientar una entrada cuando se trabaja con materiales educativos computacionales
como PsInt
Instrucción de Asignación
Permite modificar el valor de una variable con el resultado de una expresión que puede ser
numérica, alfanumérica o lógica.
Esta instrucción tiene mucha importancia, ya que es la única que permite que los valores de una
variable cambien y por tanto se obtenga una información.
El formato es el siguiente
Variable Expresión
Donde es el operador de asignación
Ejemplos
A 20
A B
A B+50
C true
Nombre “Carlos”
Lo anterior muestra que Expresión puede ser una constante, una variable o el resultado de una
expresión.
Importante
La instrucción de asignación tiene dos tiempos, determinados estos por el operador de asignación.
Tiempo 1: Derecha del operador correspondiente a la Expresión. Esta debe ejecutarse primero.
Tiempo 2: Izquierda del operado Correspondiente a la variable. La variable recibe el resultado
de la expresión.
El operador es el que determina que el resultado de la expresión se lleve a la variable del lado
izquierdo.
Los dos tiempos de la asignación, permite tener instrucciones como las siguientes, que son
situaciones muy utilizadas en la programación.
AA+1
AA+C
Donde A aparece en los dos lados de la instrucción de asignación, en donde, primero se hace lo de
la derecha. El valor de A aparece en ambos lados y al final cambia.
- Toda variable que aparezca a la derecha de un enunciado de asignación debe estar definido
- En un enunciado de asignación la variable de la izquierda es la única que cambia de valor
- Las variables que están a la derecha de la asignación conservan su valor después de ejecutarse
la instrucción.
- Si la variable del lado izquierdo se encuentra también en el lado derecho esta al final cambia
de valor
Ejercicio secuenciales 1
Hallar el área de un triángulo
Variables y constantes
Entradas
Asignaciones
Salidas
Modelo mental
Datos de entrada
Base 5
Altura 6
Area = 5*6 = 15
2
Resultado Area = 15
Recordemos las reglas que se van definiendo acerca de los datos en el computador:
- Todo dato para poder ser procesado debe estar en la memoria principal.
- Todo dato en la memoria debe estar como variable o como constante.
- Si esta como variable, debe tener un único nombre y un tipo de dato asociado.
Area = 5*6 = 15
2
Area = 15
En el ejemplo se tienen los datos 5,6,2 y 15 , los cuales todos deben aparecer en la memoria.
Campos variables 5,6 y 15
Campo constante 2
Nombres de variables:
inicio
int B,A;
float Area;
B
Base 5 cin >>B;
A
Altura 6 cin>>A;
Area
Area = B*A = 15 Area=(B*A)/2;
2
Area
“Area =” 15 cout<<”Area = “<<Area;
Fin
Importante, En todo modelo mental, ningún dato debe quedar sin nombre, excepto las constantes
numéricas y alfanuméricas, en el ejemplo el número 2 y “Area = “
Para esta determinación se tiene en cuenta que, todo valor de una variable aparece por dos
formas, por una acción de entrada (leer ) o por resultados de una acción de asignación ().
Para determinar si un dato es constante o una variable, se debe entender muy bien la definición
del problema, en el ejemplo el programa puede ser para cualquier triángulo, por lo que la base y la
altura puede ser cualquier valor y el 2 es una constante.
Valores a variables por entrada:
ByA
Las acciones serían:
Leer B
Leer A
O
Leer B,A
La acción sería:
Area B*A/2
Acciones de Salida.
Area = 15
El siguiente paso es establecer las acciones de acuerdo al orden que tiene el modelo mental, y se
lo toma de arriba hacia abajo y de izquierda a derecha, teniendo en cuenta si es entrada o
asignación.
Todas las acciones conforman el algoritmo y se demarca con un inicio y con un fin.
Inicio
Leer B
Leer A
Area B*A/2
Escribir “Area = ”,Area
Fin
#include <iostream>
using namespace std;
int main(){
int a,b;
float area;
cout<<”Digitar base -> ”;
cin>>b;
cout<<”Digitar altura -> ”;
cin>>a;
area=(float)a/b; // se coloca (float) para que se tenga en cuenta los decimales
cout <<”Area = “<<area;
return 0;
}
Ejemplo secuenciales 2
Realizar un algoritmo para las operaciones aritméticas de suma, resta, multiplicación y división de
dos números.
número
suma, resta, multiplicación y división
Ejemplo solución
Datos numéricos
10 y 5
Operaciones básicas
Resultados
Suma=15
Resta=5
Multiplicación= 50
División=2
Numéricos
Variables
10,5,15,5,50 y 2
Nombres de variables
Numero 1 N1 10
Numero 2 N2 5
Suma SUM 15
Resta RES 5
Multiplicación MUL 50
División DIV 2
Datos numéricos
10 y 5
Operaciones básicas
Suma 10+5 = 15
Resta 10-5 = 5
Multiplicación 10*5 =50
División 10/5 =2
Resultados
Suma=15
Resta=5
Multiplicación= 50
División=2
Definición de datos - Toda variable para poder ser procesada debe estar definida.
Una variable antes de ser utilizada debe tener un dato almacenado.
Instrucción de definición
Formato
Tipo_dato lista_de_variables=valor;
int,short,byte,long,float,double,char
int N1,N2;
N1 N2
10 5 cin>> N1; cin>>N2;
N1 + N2 = SUM
Suma 10 + 5 = 15 Variable = Expresión SUM=N1+N2;
N1 N2 = RES
Resta 10 - 5 = 5
N1 N2 = MUL MUL=N1*N2;
Multiplicación 10 * 5 = 50
N1 N2 = DIV
División 10 / 5 = 2
Por entradas
N1 N2
10 5
Acciones
Leer N1
Leer N2
Por asignación
SUM RES MUL DIV
15 5 50 2
Acciones
SUM N1+N2
RES N1-N2
MUL N1*N2
DIV N1/N2
Determinación de salidas o resultados
Se utiliza la acción escribir, teniendo en cuenta que lo siguiente es lo que va a mostrar
SUM
“Suma= “,15
RES
“Resta= “,5
MUL
“Multiplicación= ”, 50
DIV
“División=”, 2
Algoritmo resultante
El siguiente paso es establecer las acciones de acuerdo al orden que tiene el modelo mental, y se
lo toma de arriba hacia abajo y de izquierda a derecha, teniendo en cuenta si es entrada,
asignación o salida.
Todas las acciones conforman el algoritmo y se demarca con un inicio y con un fin.
Algoritmo
Inicio
Definir N1,N2,SUM,MUL,RES como entero
Definir DIV como real
Leer N1
Leer N2
SUM N1+N2
RES N1-N2
MUL N1*N2
DIV N1/N2
Escribir “Suma = “
Escribir “Resta= “,RES
Escribir “Multiplicación= ”, MUL
Escribir “División= ”, DIV
Fin
#include <iostream>
using namespace std;
int main(){
int n1,n2,sum,res,mul;
float divi;
return 0;
}
Ejemplo secuenciales 3
La importancia del modelo mental radica en que se obliga al estudiante a dar un ejemplo de la
solución con datos reales, para ser utilizado como base para la construcción del algoritmo.
Tres valores
Datos de entrada 5, 7 y 12
El promedio es
SUM
5+7+12 = 24 /3 = 8
3
Sum=n1+n2+n2
Resultado Promedio = 8
int n1,n2,n3;
float prom;
n1 n2 n3
Datos de entrada 5, 7 y 12 cin>>n1; cin>>n2; cin>>n3;
El promedios es
n1 n2 n3 prom
5 + 7 + 12 = 8 prom=(n1+n2+n3)/3
3
prom
Resultado “Promedio =” , 8 cout <<”Promedio = “<<prom;
Los nombres que están en cada valor numérico indica el nombre de las variables y el valor es lo
que almacenaría en un momento específico como el ejemplo.
El siguiente punto es establecer como llega el valor a la variable, el cual puede ser por entrada o
por asignación.
Según lo anterior los valores 5,7 y 12 son por entrada y el 8 por asignación.
Leer n1
Leer n2
Leer n3
Leer n1,n2,n3
Cuando un dato es por asignación se debe establecer cual es la expresión que lo modifica. En este
caso es:
Prom(n1+n2+n3)/3
El siguiente paso es establecer las acciones de acuerdo al orden que tiene el modelo mental, y se
lo toma de arriba hacia abajo y de izquierda a derecha, teniendo en cuenta si es entrada,
asignación o salida.
Todas las acciones conforman el algoritmo y se demarca con un inicio y con un fin.
#include <iostream>
using namespace std;
int main(){
int n1,n2,n3;
float prom;
prom=(float)(n1+n2+n3)/3;
cout<<”Promedio = “<<prom;
return 0;
}
Ejercicios propuestos.
Ejemplo
int nh,vh,st;
float des,sn;
nh
Numero de horas 20 cin >>nh;
vh
Valor hora 15000 cin>>vh;
Nh vh st
Sueldo total 20*15000= 300000 st=nh*vh;
St des
Descuento 300000*10/100=30000 des=st*10/100;
St des sn
Sueldo Neto 300000-30000 = 270000 sn=st-des;
sn
Sueldo Neto = 270000 cout<<”Sueldo neto = “<<sn;
Identificar variables
NH //entrada
Numero de horas 20
VH // entrada
Valor hora 15000
NH VH ST // asignación STNH*VH
Sueldo total 20 * 15000= 300000
SN // salida
“Sueldo Neto = “, 270000
Inicio
Definir NH,VH,ST como entero
Definir DES,SN como real
Leer NH
Leer VH
STNH*VH
DESST*10/100
SN ST-DES
Escribir “Sueldo Neto =”,SN
Fin
#include <iostream>
using namespace std;
int main(){
int nh,vh,st;
float desc,sn;
return 0;
}
La instrucción de decisión lógica es utilizada para seleccionar la ruta que debe tomar la ejecución
cuando se presentan tomas de decisiones.
Una acción de decisión en un modelo mental solución, se presenta cuando dentro de los pasos hay
preguntas que indagan acerca de la situación de uno o varios campos de memoria, con el
propósito de realizar acciones específicas de acuerdo al resultado.
Dentro de un ejercicio se pueden encontrar diferentes tipos de indagación como las siguientes.
Comparación de valores.
Si o No
Estas condiciones que involucran un solo operador relacional, se denominan condiciones simples y
su resultado puede ser verdadero o falso.
La instrucción de decisión se complementa con las acciones a realizar por uno de dos caminos
(camino por verdadero y camino por falso).
Ejemplo
Instrucción de decisión
Mentalmente cuando hay una pregunta, en el algoritmo hay una instrucción de decisión la cual va
a tener el siguiente formato:
if (condición) [ { ]
acciones por verdadero
[}]
[else [{]
Acciones por falso
[}]
Lo que esta entre corchetes ( [ ] ) es opcional, lo que indica que los llaves van o no van.
Las llaves ({ , }) son obligatorias si las acciones por verdadero o por falso son más de una.
Las llaves siempre van a agrupar un conjunto de instrucciones.
Sino y else también están entre corchetes, lo que indica que es opcional que la acción vaya.
Si edad > 60
Entonces
Escribir “ Es viejo”
Sino
Escribir “ Es joven “
Fin si
En lenguaje C++
if (edad>60) {
cout<<”Es viejo “;
}
else {
cout <<”Es joven”;
}
Condición. Es un expresión lógica (su resultado es verdadero o falso) y puede ser simple o
compuesta.
ej: A>B
C >= D
Condición compuesta. La expresión lógica, incluye al menos un operador lógico (and, or):
En lenguaje C++
Acciones por falso se ejecutan si la condición es falsa, si es más de una acción, en lenguaje C++
obliga a la colocación de las llaves, para indicar que es un bloque de acciones.
Ejercicio decisión 1
Realizar un algoritmo que permita comparar dos valores y mostrar su resultado
Este ejercicio debe dar la posibilidad de los tres casos, lo que implica lo siguiente:
Modelo mental
Números dados 17 y 10
¿ 17 > 10 ?
Si
Respuesta 17, “ mayor que”, 10
Datos 5 y 5
¿5 > 5?
No
¿5=5?
Si
Respuesta 5 es igual a 5
Datos 2 y 5
¿2 > 5?
No
¿2=5?
No
Respuesta 2 es menor que 5
Variables 17 y 10
Nombres n1 y n2
n1 n2
Números dados 17 y 10
n1 n2
¿ 17 > 10 ?
Si
n1 n2
Respuesta 17, “ mayor que”, 10
El modelo mental anterior tan solo me da una posibilidad de 3, entonces, se debe establecer en
los datos las posibilidades que se pueden presentar para especificar los caminos.
Determinación de valores
17 y 10 son por entrada
Decisión
Algoritmo
Inicio
Leer n1,n2
Si (n1>n2)
Entonces
// Estrictamente n1 es mayor que n2
Escribir n1, “Mayor que ”, n2
Sino
// pudo haber ocurrido falso por dos posibilidades, que n1= n2 o n1<n2 por lo tanto
// se debe condicionar para esto, así:
Si ( n1 < n2)
Entonces
// Por la historia n1 es estrictamente menor que n2
Escribir n1, “Menor que “, n2
Sino
// Esto significa que n1 no es mayor que n2 y que n1 no es menor
Escribir n1, “ igual a “, n2
Fin si
Fin si
Fin
#include <iostream>
using namespace std;
int main() {
int n1,n2;
//Entrada de datos
cout<<”Digitar valor 1 -> “;
cin>>n1;
cout<<”Digitar valor 2 -> ”;
if (n1>n2) {
cout<<n1<<” es mayor que “<<n2;
}
else {
//hay dos posibildades
If (n1<n2)
cout<<n1<<” es mayor que “<<n2;
else
cout<<n1<<” es mayor que “<<n2;
}
return 0;
}
El siguiente algoritmo compara los valores n1 y n2 iniciando con la comparación con el operador
<=, lo cual da una lógica de solución diferente.
Inicio
Leer n1,n2
Si (n1<=n2)
Entonces
// Se presenta que n1 puede ser menor o igual n2, hay dos posibilidades
Si ( n1 < n2)
Entonces
// n1 es estrictamente menor que n2
Escribir n1, “Menor que “, n2
Sino
// n1 igual a n2
Escribir n1, “ igual a “, n2
Fin si
Sino
// Estrictamente n1 es mayor que n2
Escribir n1, “Mayor que ”, n2
Fin si
Fin
//Entrada de datos
cout<<”Digitar valor 1 -> “;
cin>>n1;
cout<<”Digitar valor 2 -> ”;
cin>>n2;
if (n1<=n2)
if (n1<n2)
//n1 es estrictamente menor que n2
cout<<n1<<” es menor que “<<n2;
else
cout<<n1<<” es igual a “<<n2;
else
//n1 es estrictamente mayor que n2
cout<<n1<<” es mayor que “<<n2;
return 0;
}
Decisiones anidadas
Una decisión anidada se presenta cuando por las acciones de una instrucción de decisión ya sea
por falso o verdadero hay otra instrucción de decisión.
Ejercicio decisiones 3
Ejemplo
Valores 5 8 3
Modelo más detallado. Utilizando condiciones simples ( Solo dos datos a la vez)
Datos 5 8 3
¿5>8?
Si
No
¿8>3?
Si
Mayor 8
no
Variables a,b,c
a b c
Datos 5 8 3
a b
¿ > ?
Si
¿a>c?
Si
Mayor es a
No
Mayor es c
No
b c
¿ > ?
Si
b
Mayor
No
Mayor c
Determinar valores
5 8 3 son por entrada
Esto es lo que se hace mentalmente para un caso específico, pero cuando hay decisiones, se
deben evaluar todas las posibilidades.
El modelo mental me da un camino, pero deja planteado otros caminos que hay que completar,
teniendo en cuenta que toda acción de decisión tiene verdadero y falso. Aquí se dejan planteado
dos preguntas y las dos deben completarse.
Algoritmo en seudocódigo
inicio
Leer a,b,c
Si (a>b) Entonces
Si (a>c) Entonces
Escribir ' mayor = ',a
SiNo
Escribir ' mayor = ',c
FinSi
SiNo
Si (b>c) Entonces
Escribir ' mayor = ',b
SiNo
Escribir ' mayor = ',c
FinSi
FinSi
Fin
#include <iostream>
using namespace std;
int main(){
int a,b,c;
//Entrada de datos
cout<<”Digitar valor 1 -> “;
cin>>a;
cout<<”Digitar valor 2 -> ”;
cin>>b;
cout<<”Digitar valor 3 -> “;
cin>>c;
if (a>b)
if (a>c)
cout<<a<< “ es el mayor “;
else
cout<<c<< “ es el mayor “;
else
if (b>c)
cout<<b<< “ es el mayor “;
else
cout<<c<< “ es el mayor “;
return 0;
}
Ejercicio decisiones 4
Hallar el mayor de cuatro datos
Ejemplo
Datos 5 8 3 15
Para llegar a este resultado se debe realizar varias comparaciones como las siguientes. Las
preguntas son condiciones simples, esto es, que solo puede comparar dos datos a la vez.
¿5>8?
No
¿8>3?
Si
¿8>15?
No
Mayor 15
a b c d // entrada
Datos 5 8 3 15
a b
¿ 5 > 8 ? // decisión
No
b c
¿ 8 > 3 ? // decisión
Si
b d
¿8>15? // decisión
No
d
Mayor 15 // salida
a b c d // entrada
Datos
a b
¿ > ? // decisión
Si
¿a>c?
Si
No
No
b c
¿ 8 > 3 ? // decisión
Si
b d
¿8>15? // decisión
No
d
Mayor 15 // salida
La acción asociada es
Leer a,b,c,d
Esto es lo que se hace mentalmente para un caso específico, pero cuando hay decisiones, se
deben evaluar todas las posibilidades.
Al igual que el ejercicio anterior, el modelo mental me da un camino, pero deja planteado otros
caminos que hay que completar, teniendo en cuenta que toda acción de decisión tiene verdadero
y falso. Aquí se dejan planteado tres preguntas y las tres deben completarse, teniendo en cuenta
que al contestarlas pueden aparecer otras preguntas.
La dinámica de las decisiones anidadas exige que por cada camino que se vaya se debe tener en
cuenta la historia, para no repetir preguntas que van a ser innecesarias
Algoritmo
Seudocódigo
Inicio
Leer a,b,c,d
Si (a>b) Entonces
Si (a>c) Entonces
Si (a>d) Entonces
Escribir " Mayor ",a
SiNo
Escribir " Mayor ",d
FinSi
SiNo
si (c>d) Entonces
Escribir " Mayor ",c
SiNo
Escribir " Mayor ",d
FinSi
FinSi
SiNo
Si (b>c) Entonces
Si (b>d) Entonces
Escribir " Mayor ",b
SiNo
Escribir " Mayor ",d
FinSi
SiNo
si (c>d) Entonces
Escribir " Mayor ",c
SiNo
Escribir " Mayor ",d
FinSi
FinSi
FinSi
Fin
#include <iostream>
using namespace std;
int main() {
int a,b,c,d;
//Entrada de datos
cout<<”Digitar valor 1 -> “;
cin>>a;
cout<<”Digitar valor 2 -> ”;
cin>>b;
cout<<”Digitar valor 3 -> “;
cin>>c;
cout<<”Digitar valor 4 -> “;
cin>>d;
if (a>b)
if (a>c)
if (a>d)
cout<< " Mayor "<<a;
else
cout<< " Mayor "<<d;
else
if (c>d)
cout<< " Mayor " <<c;
else
cout<< " Mayor "<<d;
else
if (b>c)
if (b>d)
cout<< " Mayor "<<b;
else
cout<<" Mayor "<<d;
else
if (c>d)
cout<< " Mayor "<<c;
else
cout<<” Mayor “<<d;
return 0;
}
Ejercicio decisión 5
Realizar un algoritmo donde se tienen tres valores numéricos, mostrarlos en orden ascendente (de
menor a mayor). Utilizar solo decisiones con condiciones simples.
Valores
7 9 2
Resultado
2 7 9
Esto demuestra que se tiene claro que es lo que se pide con un solo caso. Según los números que
entren, puede haber muchas posibilidades
Como se llega a 2 7 9
Un camino
¿7<9?
Si // indica que es 7 está antes que el 9, ahora se va a compara el 9 con el 2
¿9<2?
No // 2 está antes que el 9, pero no se sabe si el 2 está antes del 7 se debe comparar con este
¿2<7?
Si // por historia ya se tiene la salida para este
Salida 2 7 9
Identificación de variables
a b c
Datos 7 9 2 // entrada
a b
¿7 < 9? // decisión
Si // indica que es 7 está antes que el 9, ahora se va a compara el 9 con el 2
b c
¿9 < 2?
No // 2 está antes que el 9, pero no se sabe si el 2 está antes del 7 se debe comparar con este
c a
¿2 < 7?
Si // por historia ya se tiene la salida para este
c a b
Salida 2 7 9
¿a < b?
Si // indica que es a está antes que el b, ahora se va a compara el b con el c
¿b < c?
Si salida a, b, c
No // c está antes que el b, pero no se sabe si c está antes que a se los debe comparar
¿c < a?
Si // por historia ya se tiene la salida para este
Salida c a b
No
Salida a c b
Al dejar solo variables el ejercicio se generaliza y lo que se debe hacer ahora es, completar los
caminos de Si y No de cada condición o pregunta que no ha sido tratado con el modelo mental.
Seudocódigo
inicio
Leer a,b,c
Si (a<b) Entonces
Si (b<c) Entonces
Escribir ' ',a, " ", b, " ", c
SiNo
Si (c<a ) Entonces
Escribir ' ',c, " ", a, " ", b
SiNo
Escribir ' ',a, " ", c, " ", b
FinSi
FinSi
SiNo
Si (a<c) Entonces
Escribir ' ',b, " ", a, " ", c
SiNo
si (c<b) Entonces
Escribir ' ',c, " ", b, " ", a
SiNo
Escribir ' ',b, " ", c, " ", a
FinSi
FinSi
FinSi
Fin
#include <iostream>
using namespace std;
int main( ) {
int a,b,c;
cout<< " Digitar valor 1 -> ";
cin >>a;
cout <<" \n Digitar valor 2 -> ";
cin>>b;
cout <<" \n Digitar valor 2 -> ";
cin>>c;
if (a<b)
if (b<c)
cout<<a<<" "<<b<<" "<<c;
else
if (c<a)
cout<<c<<" "<<a<<" "<<b;
else
cout<<a<<" "<<c<<" "<<b;
else
if (a<c)
cout<<b<<" "<<a<<" "<<c;
else
if (c<b)
cout<<c<<" "<<b<<" "<<a;
else
cout<<b<<" "<<c<<" "<<a;
return 0;
}
Completar las decisiones faltantes, se logra llevando la dinámica de cada una de éstas, que lo
obliga a tener en cuenta las acciones de verdadero o falso faltantes, para lo cual se debe tener
muy en cuenta la historia de ese momento.
Ejercicio decisión 6
Realizar un algoritmo que permita calcular el sueldo de dos empleados que tiene:
Numero de horas trabajas, valor de la hora y se realiza un descuento así:
Si el sueldo total es mayor que 200.000 se hace un descuento del 10% y si es menor o igual
200.000 el 5%
Ejemplo
Empleado 1
Numero de horas 15
Valor hora 20000
Empleado 2
Numero de horas 10
Valor hora 15000
Descuento ¿300000>200000?
Si
Descuento 300000*10/100=30000
Determinación de variables y nombres y de donde viene su valor por entrada o por asignación.
Empleado 1
NH1 // entrada
Número de horas 15
VH1 // entrada
Valor hora 20000
Empleado 2
NH2 // entrada
Número de horas 10
VH2 // entrada
Valor hora 15000
Descuento
NH1 VH1 ST1 // asignación
Sueldo total empleado 1 15 * 20000 = 300000
ST1
Descuento ¿300000>200000? // decisión
Si
ST1 DES1 // asignación
Descuento 300000*10/100=30000
El modelo mental anterior, describe en la parte superior las variables, aquellos valores que no
tienen nombres son constantes, las cuales son:
Por Asignación
ST1, ST2,DES1,DES2,SN1,SN2
El ejercicio anterior muestra con los comentarios (// comentario ) la acción especifica a realizar.
Las acciones a realizar ya no deben involucrar valores excepto las constantes (200000, 0,1 y 0,05)
El orden de las acciones de arriba hacia a bajo da un orden lógico y se puede construir el
algoritmo.
Seudocódigo
Inicio
Leer NH1
Leer VH1
Leer NH2
Leer VH2
ST1 <- NH1*VH1
SI (ST1>200000)
Entonces // si es verdadero descuento del 10%
DES1 <- ST1*10/100
Sino // Es falso descuento del 5%
DES1 <- ST1*5/100
Fin si
SI (ST2>200000)
Entonces // si es verdadero descuento del 10%
DES2 <- ST2*10/100
Sino // Es falso descuento del 5%
DES2 <- ST2*5/100
Fin si
#include <iostream>
using namespace std;
int main(){
int nh1,vh1,nh2,vh2;
float des1,des2,sn1,sn2;
return 0;
}
Ejercicio planteado
Realizar un algoritmo donde se tienen 3 valores numéricos correspondientes a tres lados de un
triángulo, determinar que tipo de triángulo es de acuerdo a sus lados.
Operador residuo ( mod o % ). Este operador es un operador aritmético que entrega el residuo de
una división
Ejemplo
Porque 7 / 2 = 3 y el residuo es 1
En una división hay
Dividendo que es 7
Divisor que es 2
Cociente que es 3
Residuo que es 1
Este operador es muy útil dentro de la programación y sirve para especificar si un número dado es
múltiplo de otro.
21 mod 3 = 0
21 % 3 = 0
En toda división si el residuo es cero y el cociente es mayor o igual que 1 se dice que el divisor es
múltiplo del dividendo.
Ejercicio decisión 7
Determinar si un número dado es par o es impar.
Concepto
Un número es par si y solo si es múltiplo de 2 de lo contrario es impar
Ejemplo
Modelo mental
Número dado 7
¿7 es par?
1
¿7 % 2 = 0?
No
7 es impar
0
¿8 % 2 = 0?
Si
8 es par
Algoritmo
Inicio
Leer NRO
Si (NRO mod 2 = 0)
Entonces
Escribir NRO, “ Es par “
Sino
Escribir NRO, “ Es impar “
Fin si
Fin
#include <iostream>
using namespace std;
int main(){
int nro;
if (nro % 2 == 0)
cout <<nro<<” Es numero par “;
else
cout <<nro<<” Es numero impar “;
return 0;
Para múltiplos de 5
Inicio
Leer NRO
Si ( NRO mod 5 = 0)
Entonces
Escribir NRO, “ Es múltiplo de 5 “
Sino
Escribir NRO, “ no es múltiplo de 5 “
Fin si
Fin
#include <iostream>
using namespace std;
int main(){
int nro;
if (nro % 5 == 0)
cout <<nro<<” Es multiplo de 5 “;
else
cout <<nro<<” no es múltiplo de 5 “;
return 0;
Ejercicio
Se leen dos números, determinar si un número es múltiplo de otro se tiene el siguiente algoritmo.
Inicio
Leer NRO1,NRO2
Si ( NRO1 mod NRO2 = 0)
Entonces
Escribir NRO1, " MULTIPLO DE ",NRO2
Sino
Escribir NRO1, " NO ES MULTIPLO DE ",NRO2
Fin si
Fin
Programa en C++
#include <iostream>
using namespace std;
int main(){
int nro1,nro2;
if (nro1 % nro2 == 0)
cout <<nro1<<” Es multiplo de “<<nro2;
else
cout <<nro1<<” no es múltiplo de <<nro2 “;
return 0;
Los siguientes ejercicios permiten analizar donde se presenta un contador y un acumulador, para
llegar a definirlas a partir de su funcionamiento identificado en el análisis.
Ejercicio decisiones 8
Modelo mental
Valores dados 6 7 8 10
Esto demuestra que si se entiende lo que nos piden. Pero este modelo no representa todo lo que
mente hace, para determinar estos pasos se adiciona una nueva regla.
Trabajar con un dato a la vez y mirar que hace la mente y el dato se lo toma de izquierda a
derecha.
Primero con el 6
Pregunta si el 6 es par, si es par, lo cuenta en la mente ( va 1)
Segundo con el 7
Pregunta si el 7 es par, no es par, no hace nada
Tercero con el 8
Pregunta si el 8 es par, si lo es, por lo tanto lo cuenta en la mente (van 2)
Cuarto con el 10
Pregunta si el 10 es par, si lo es, por lo tanto lo cuenta en la mente(van 3)
Que es lo que había almacenado en la mente a medida que llegaban los números pares, y su
variación durante el ejercicio fue 1, 2 y 3
Es importante entender de donde sale el 3, el cual representa la cantidad de pares que se fue
incrementando cada vez que se encontraba un par
Valores dados 6 7 8 10
¿6 es par?
Si
Va 1 = 0 +1
7 es par?
No
8 es par?
Si
Van 2 = 1+1
10 es par?
Si
Van 3 = 2+1
Este modelo mental ya es más claro y sobre este se sigue el proceso para construir el modelo
computacional
A B C D
Valores 6 7 8 10 // Entrada
A
¿6 es par? // Decisión
Si
CP
Va 1 // Asignación
B
7 es par? // Decisión
No
C
8 es par? // Decisión
Si
CP // Asignación
Van 2
D
10 es par? // Decisión
Si
CP // Asignación
Van 3
CP
Respuesta Cantidad de pares 3
Después de colocar los nombres a las variables se tiene la variable CP es la que lleva la cuenta de
los pares, en donde su variación no es explicita, pero su funcionamiento si lo es, porque cada vez
que identifica un numero par se incrementa en 1.
Obtener la variación de CP
32 + 1
Con los nombres de variables se encuentra que el 3 es CP, el 2 también es CP pero en el tiempo
anterior, y el 1 es una constante que indica en que valor cambio CP. Entonces colocando los
nombres se tiene
CP = CP + 1
3 2 + 1
Entonces el patrón de variación de CP es:
CP CP +1
Esta variación debe cumplirse en todos los momentos, por lo que en el primer momento cuando
CP vale 1 se tendría
CP CP + 1
1 0 +1
3 1 7 1
Para las preguntas que se realizan para averiguar si un número es par, se utiliza el operador
residuo ( % ) de tal forma que la pregunta
A
¿6 es par?
Se transforma en la condición
A
¿6 % 2 = 0?
¿A % 2 = 0 ?
A B C D
Valores 6 7 8 10 // Entrada
CP
0
A
¿6 % 2 = 0? // Decisión
Si
CP CP +1
Va 1 0 + 1 // Asignación
B
7 % 2 = 0? // Decisión
No
C
8 % 2 = 0? // Decisión
CP CP +1 // Asignación
Van 2 1 + 1
D
10 % 2 = 0? // Decisión
Si
CP CP +1 // Asignación
Van 3 2 + 1
CP
Respuesta “Cantidad de pares”, 3
Algoritmo resultante
Seudocódigo
Inicio
Leer A,B,C,D
CP <- 0
Si ( A mod 2 = 0)
Entonces
CP <- CP +1
Fin si
Si ( B mod 2 = 0)
Entonces
CP <- CP +1
Fin si
Si ( C mod 2 = 0)
Entonces
CP <- CP +1
Fin si
Si ( D mod 2 = 0)
Entonces
CP <- CP +1
Fin si
Escribir “Cantidad de pares “, CP
Fin
#include <iostream>
using namespace std;
int main(){
int a,b,c,d,cp;
return 0;
}
Ejercicio decisión 9
Realizar un algoritmo donde se tienen 4 valores numéricos, que determine la suma de los pares y
los impares
Modelo mental
Valores 5 7 4 9
Este es el primer modelo solución del problema que se presenta, y demuestra que si cumple con el
objetivo. Pero no es un modelo computacional.
SUI=0
SUP=0
A
¿5 es par? //decisión
Si
SUP=SUP+A
No // entonces es impar
SUI = SUI +A
5 = 0 + 5
B
¿7 es par?
No
SUI = SUI + B
12 = 5 + 7
C
¿4 es par?
Si
SUP = SUP + C
4 = 0 +4
D
¿9 es par?
No
SUI = SUI + D
21 = 12 +9
Respuesta
Suma de Impares = 21
Suma de pares = 4
Mentalmente se toma cada valor y por cada valor se toma decisiones por pares y por impares, y
en la memoria según la condición, se van llevando dos sumas una para los impares y otra para los
pares, para llegar al 21 y el 4 respectivamente.
A B C D
Valores 5 7 4 9 // entrada
SUI
0
SUP
0
A
¿5 es par? // decisión
No
SUI // asignación
5 <- 0 +5
B
¿7 es par? // decisión
No
SUI // asignación
12
C
¿4 es par? // decisión
Si
SUP // asignación
4
D
¿9 es par? // decisión
No
SUI <- SUI + D // asignación
21 <- 12 + 9
Respuesta
SUI // salida
Suma de Impares = 21
SUP // salida
Suma de pares = 4
Definición de variables
Los valores de SUI y SUP están definidos por una acción de asignación y en el modelo no es clara
su variación, pero si se sabe que llevan sumas mentalmente. Del modelo mental salen las
variaciones de cada variable.
21 12 + 9
SUI SUI + D
21 12 + 9
El hecho de que SUI aparezca en el lado derecho y en el lado izquierdo, hace que se vayan
acumulando los valores y se lo interpreta asi:
Es importante anotar que pasa con el primer valor que se suma en los impares que es 5 y que
corresponde al valor A. Debe cumplirse lo mismo que se definió como variación para SUI, es decir
SUI SUI + A
5 0 + 5
Esto determina que SUI inicialmente debe tener un valor de 0,
Es decir
SUI 0
Y lo mismo para SUP. Se toma el valor de 4 correspondiente a C y se determina que los valores que
definen el según la variación anterior sería:
SUP SUP + C
4 0 +4
Según esto SUI y SUP deben iniciar en 0 antes de comenzar a evaluar las condiciones de si es par o
es impar
Dentro de la lógica tiene razón, que tanto SUI como SUP inicien en 0, antes de iniciar a evaluar los
números, porque si ningún número es impar SUI debe ser 0 y de igual forma con los pares.
Entonces el modelo mental se lo determina de la siguiente forma:
A B C D
Valores 5 7 4 9 // entrada
SUI
0
SUP
0
A
¿5 es par? // decisión
No
SUI <- SUI + A // asignación
5 <- 0 + 5
B
¿7 es par? // decisión
No
SUI <- SUI + B // asignación
12 <- 5 + 7
C
¿4 es par? // decisión
Si
SUP <- SUP + C // asignación
4 <- 0 + 4
D
¿9 es par? // decisión
No
SUI <- SUI + D // asignación
21 <- 12 + 9
Respuesta
SUI // salida
Suma de Impares = 21
SUP // salida
Suma de pares = 4
Instrucción de decisión
¿A es par?
Computacionalmente se convierte en
¿A mod 2 = 0?
Y como es una pregunta entonces hay una decisión y A puede ser Par o Impar, por lo que la
decisión genérica con su verdadero (Entonces) y falso (sino ) queda:
Si ( A % 2= 0)
Entonces
SUP SUP + A
Sino
SUI SUI + A
Fin si
Algoritmo Resultante:
Seudocódigo
Inicio
Leer A,B, C, D
SUI <- 0
SUP <- 0
Si ( A mod 2= 0)
Entonces
SUP <- SUP + A
Sino
SUI <- SUI + A
Fin si
Si ( B mod 2= 0)
Entonces
SUP <- SUP + B
Sino
SUI <- SUI + B
Fin si
Si ( C mod 2= 0)
Entonces
SUP <- SUP + C
Sino
SUI <- SUI + C
Fin si
Si ( D mod 2= 0)
Entonces
SUP <- SUP + D
Sino
SUI <- SUI + D
Fin si
Escribir “ Suma Impares = “, SUI
Escribir “ Suma pares = “, SUP
Fin
#include <iostream>
using namespace std;
int main(){
int a,b,c,d,sp,si;
if (b%2==0)
sp=sp+b;
else
si=si+b;
if (c%2==0)
sp=sp+c;
else
si=si+c;
if (d%2==0)
sp=sp+d;
else
si=si+d;
return 0;
}
En los dos ejercicios anteriores se encontraron las variables CP, SUI Y SUP las cuales realizaban lo
siguiente
CP Contador de pares
SUI Sumador de Impares
SUP Sumador de Pares
CP CP + 1
SUI SUI + Variable
SUP SUP + Variable
5 12 21
Para SUP
4
Estos dos tipos de variables según su variación se convierten en contador (CP ) y sumador (SUI y
SUP), muy utilizadas dentro de la computación, las cuales se definen de la siguiente forma:
Variable Contador
Es una variable cuya variación permite generar secuencias de valores con variaciones constantes.
Estas secuencias generan números como:
1 2 3 4 5 6...
2 4 6 8 ...
20 18 16 14 . . .
Formato general
cp=cp+1;
Ejemplo
CP CP + 1
CP = CP + 1;
C5 C5 + 5
C5 = C5 + 5
5 10 15 20 25
CON CON - 3
CON = CON - 3
30 27 24 21 . . .
Las variaciones pueden generar secuencia de 1 en 1 para CP, iniciando desde 0, de 5 en 5 para C5,
iniciando desde 0 y para CON una secuencia con variación de -3 iniciando desde 30.
Es un campo de memoria cuya variación permite llevar una suma de varios valores durante la
ejecución de un programa.
Formato
Ejemplo
PR=PR*variable
Para el ejemplo planteado se tiene que SUI lleva la suma de todos los valores impares y SUP la
suma de todos los valores pares
Este tipo de variable es muy utilizado dentro de la computación, sobre todo en aquellos
problemas que exigen totales.
Tanto la variable contador como sumador deben tener un valor inicial el cual generalmente
pueden ser 0 como en los ejercicios planteados, pero pueden haber situaciones donde un
contador puede iniciar en otro valor y decrementarse.
Ejemplo
CON 22
22 20 18 16 . . .
Estos dos tipos de variables según su funcionamiento son muy utilizados en computación y es muy
importante conocer su manejo.
Ejercicio decisión 10
Se tienen 4 valores numéricos determinar la cantidad números pares, utilizando para la entrada
de datos un solo campo.
Este ejercicio se lo planteó y se lo desarrollo en ele ejercicio 8, donde se tenían los cuatro datos en
la memoria, en las variables A, B, C, D y su solución se hizo de la siguiente forma:
Algoritmo resultante
Inicio
Leer A,B,C,D
CP 0
Si ( A mod 2 = 0)
Entonces
CP CP +1
Fin si
Si ( B mod 2 = 0)
Entonces
CP CP +1
Fin si
Si ( C mod 2 = 0)
Entonces
CP CP +1
Fin si
Si ( D mod 2 = 0)
Entonces
CP CP +1
Fin si
La solución del ejercicio anterior, exige que los datos se almacenen en los campos A, B, C, D, ahora
solo se va a tener un campo para la entrada.
Ejemplo
Valores 6 7 8 10
El modelo mental es igual al anterior, pero, teniendo en cuenta que los datos van a entrar uno a
uno, no los cuatro a la vez, por lo tanto, el modelo mental general es el siguiente:
Datos de entrada 6, 7, 8, 10
Estos datos van a entrar a un solo campo que se va a denominar NUM, según esto el modelo
queda
NUM // entrada
Valor 6
NUM
¿6 es par? // Decisión
Si
CP
Va 1 // Asignación
NUM // entrada
Valor 7
NUM
7 es par? // Decisión
No
NUM // entrada
Valor 8
NUM
8 es par? // Decisión
CP // Asignación
Van 2
NUM // entrada
Valor 10
NUM
10 es par? // Decisión
Si
CP // Asignación
Van 3
Inicio
CP <- 0
Leer NUM
Si ( NUM mod 2 = 0)
Entonces
CP <- CP +1
Fin si
Leer NUM
Si ( NUM mod 2 = 0)
Entonces
CP <- CP +1
Fin si
Leer NUM
Si ( NUM mod 2 = 0)
Entonces
CP <- CP +1
Fin si
Leer NUM
Si ( NUM mod 2 = 0)
Entonces
CP <- CP +1
Fin si
Programa en lenguaje C.
#include <iostream>
using namespace std;
int main(){
int a,b,c,d,cp,num;
cp=0;
return 0;
}
Cuando se tiene un solo campo para la entrada, el dato que entra remplaza al anterior, lo cual
indica que solo se va a tener un dato a la vez. No hay historia de los anteriores.
El utilizar un solo campo para la entrada de datos, abre el espacio para procesar gran cantidad de
valores como en este caso.
En el ejercicio planteado se podría trabajar cualquier cantidad de números sin necesidad de crear
varios campos de memoria, por ejemplo 100 números, lo que implicaría tener 100 bloques de
instrucciones como el anterior, aspecto que no es recomendable. Para evitar esto, en la
programación existe las instrucciones de repetición, que permiten controlar las veces en que se
puede repetir un bloque de instrucciones como el anterior, aspecto que se va a mirar a
continuación.
La utilización de los ciclos en la programación son de gran utilidad, ya que van a permitir procesar
grandes cantidades de datos utilizando un solo grupo de acciones que se van repetir varias veces,
dependiendo estas de una condición de control.
Mentalmente la acción de ciclo no está implementado, pero, si se puede obtener los elementos
necesarios para implementar un ciclo, lo que debemos conocer es que elementos se deben buscar
en el ejemplo. Para poder identificar elementos, debemos conocer los tipos diferentes de ciclos y
sus elementos.
Tipos de Ciclos
Ciclo Mientras
Ciclo Para
Ciclo hacer Mientras
Ciclo while
Ciclo for
Ciclo do – while
Ciclo Mientras: Ejecuta un conjunto de instrucciones en forma repetitiva, mientras una condición
sea verdadera.
Formato
Seudocódigo
Acciones a repetir
Fin mientras
while (condición) {
Acciones a repetir
}
do{
acciones a repetir
}while(condición);
Características
- Las acciones a repetir se van a ejecutar mientras (while) la condición sea verdadera.
- Cuando se plantea un ciclo mientras (while), lo primero que se ejecuta es la evaluación de la
condición. Esto indica que si la condición es falsa la primera vez, las acciones a repetir no se
ejecutarían ni una sola vez, ya que saltaría el control a las instrucciones después del fin
mientras.
- Dentro de las instrucciones debe haber una acción o acciones que permitan que la condición
que controla el ciclo se vuelva falsa, de lo contrario el ciclo se vuelve infinito porque siempre
sería verdadero.
- Siempre que se alcance el Fin Mientras ( } ) el control de ejecución, regresa a evaluar la
condición, si es verdadera continua dentro del ciclo, pero si es falso el control de ejecución
salta a la instrucción siguiente al fin mientras.
- En el diagrama del PseInt no se encuentra fin mientras, este se presenta cuando la condición
es falsa, entonces el flujo continúa como lo especifica el diagrama.
Ejercicio ciclo 1
Se tienen 4 valores numéricos determinar la cantidad números pares. Realizarlo con ciclo.
Retomamos el ejercicio anterior y sobre este se analiza la condición que va a controlar el ciclo.
Para poder realizar este ejercicio, se necesita que los datos entren uno a la vez, por lo que se
utiliza una sola variable.
El siguiente algoritmo muestra esta característica. En donde se puede apreciar que un bloque de
acciones se repite 4 veces
Inicio
CP 0
Leer NUM // primer dato
Si ( NUM mod 2 = 0)
Entonces
CP CP +1
Fin si
Este es el algoritmo sin ciclo, con ciclo se tendría algo parecido a lo siguiente:
Inicio
CP 0
Repetir 4 veces
Leer NUM
Si ( NUM mod 2 = 0)
Entonces
CP CP +1
Fin si
Pero Repetir 4 veces no es una acción valida dentro de la computación, para eso se necesita
aplicar una instrucción ciclo, como mientras.
- Para esto se tiene en cuenta, que cada vez que la definición del problema plantea que se
tienen cierta cantidad de datos, normalmente se utiliza un contador que controla la cantidad
de esos datos, y este contador se lo utiliza para controlar el ciclo.
Para el ejemplo se están planteando 4 datos numéricos por lo que la mente espera recibir
únicamente 4 datos y trabajarlos como se planteó, uno a la vez
Modelo mental
Datos de entrada
4 6 9 8
Estos datos entran uno a uno hasta completar y la mente controla está entrada, es decir, no va a
permitir que entre un quinto dato.
El siguiente modelo muestra un comportamiento de los cuatro tiempos y las acciones mentales
que se hacen en cada uno.
En la mente se presenta como está especificado aquí, en donde aparece una secuencia de 1 hasta
4, in
dicando que son solo 4 datos los que van a ser procesados
CP
Cantidad de pares = 3 // Salida
CD está soportado en la memoria, por que la definición indica cuatro datos que van a llegar, y cada
vez que llega uno a la mente, esta lo cuenta. Si no ha llegado ninguno la mente no lo cuenta y la
cuenta ira en 0. Según lo anterior, entonces CD toma los valores de 0 1 2 3 4, el 5 no porque solo
indica 4 valores
CD CD +1
CP CP + 1
Se debe considerar aquí, que al ser contadores deben tener un inicio, en este caso son en 0 (cero )
Entonces
CD 0
CP 0
Y deben ir antes de empezar a leer los datos.
CP
Cantidad de pares = 3 // Salida
El ejercicio se lo va a desarrollar con un ciclo mientras, por lo que se debe buscar en el modelo
mental los siguientes elementos
Condición de control de ciclo
Bloque de instrucciones a repetir
Acciones para que el ciclo no se vuelva infinito que deben estar dentro de las acciones a
repetir
Condición de control está fundamentada en la definición de problema que solo son 4 datos y la
variable que lleva este valor es CD por tanto la condición será:
¿CD<4?
CD CD + 1
Leer NUM
Si ( NUM mod 2 = 0)
Entonces
CP CP +1
Fin si
Donde se tiene incluida la instrucción
CD CD + 1
que garantiza que el ciclo no se vuelva infinito
cd=0;
cp=0;
while( cd<4) {
cd=cd+1;
cout<<”Digitar numero “;
cin>>num;
if (num%2==0)
cp=cp+1;
}
cd=1;
cp=0;
while( cd<=cn) {
cout<<”Digitar numero “;
cin>>num;
if (num%2==0)
cp=cp+1;
cd=cd+1;
}
Cuando se trabaja con un ciclo se complementa indicando las condiciones iniciales antes del ciclo y
las acciones después del ciclo, que están especificadas en el modelo mental. Entonces el algoritmo
queda
Inicio
CD<- 0 // valor inicial del CD
CP<- 0 // valor inicial de CP
Mientras ( CD < 4 ) hacer
CD<- CD + 1
Leer NUM
Si ( NUM mod 2 = 0)
Entonces
CP <- CP +1
Fin si
Fin mientras
Escribir “Cantidad de pares = “,CP
Fin
#include <iostream>
using namespace std;
int main(){
int num,cp,cd;
cp=0;
cd=0; // va a controlar la cantidad de datos
while (cd<4 ) {
cd=cd+1;
cout <<”Digitar numero -> ”;
cin>>num;
if (num%2==0)
cp=cp+1;
}
cout <<”Cantidad de números pares “<<cp;
return 0;
}
#include <iostream>
using namespace std;
int main(){
int num,cp,cd;
cp=0;
cd=1; // va a controlar la cantidad de datos
while (cd<=4 ) {
return 0;
}
#include <iostream>
using namespace std;
int main(){
int num,cp,cd,cn;
cp=0;
cd=1; // va a controlar la cantidad de datos
while (cd<=cn ) {
return 0;
}
Un ciclo controlado por un contador hacer parte de el esquema cuantitativo para controlar un
ciclo, el contador es el resultado de una expresión aritmética.
El ejercicio anterior especifica claramente, como un ciclo puede ser controlado por un contador,
esto se presenta mucho dentro de la programación y sobre todo cuando se conoce un número
especifico de casos, como en el ejemplo, que planteaba para 4 datos.
Cuando se tiene un ciclo controlado por un contador se debe tener presente lo siguiente:
- El inicio del contador, esto depende de la descripción del problema y el análisis que se le haga
al mismo. Generalmente este contador inicia en 0 o en 1, depende del análisis que se haga.
- La variación. En el contador la variación es constante, generalmente es de 1 en 1, el cual va
aumentando hasta alcanzar el valor tope, pero, hay problemas que exige otras variaciones, en
donde pueden ser hasta negativas.
- El valor tope o valor frontera. Indica hasta donde va a llegar el contador. Esta frontera según
la definición del problema puede ser constante o variable, lo más general es que sea variable.
El ejercicio planteado es solo para un valor constante de 4, si fuera variable sería para
cualquier cantidad de datos.
Contador<=valorTope?
Ejercicio ciclo 2
Se tiene una cantidad dada de datos numéricos, determinar la cantidad de números pares que se
presentan.
Este ejercicio tiene las mismas características del que se acaba de resolver. La variación está en
que los datos ya no van a ser 4, sino, una cantidad dinámica de datos, depende de una variable, la
cual indica el valor, al cual debe llegar el contador.
Para el modelo mental lo primero que va a hacer es solicitar la cantidad de datos que se van a
procesar y este va a ser el limite.
Ejemplo
Cantidad de datos 6
Según esto en el modelo mental hay un nuevo dato 6, el cual indica la cantidad de datos a entrar y
debe ser variable, el modelo anterior se complementa con:
CNE // entrada
Cantidad de datos 6
Leer CNE
CD Y CP funcionan igual
CD<CNE?
CD<=CNE?
Inicio
Leer CNE // Entrada de la cantidad de números
CD 0 // valor inicial del CD
CP 0 // valor inicial de CP
Mientras ( CD < CNE ) hacer
CD CD + 1
Leer NUM
Si ( NUM mod 2 = 0)
Entonces
CP CP +1
Fin si
Fin mientras
Escribir “Cantidad de pares = “,CP
Fin
#include <iostream>
using namespace std;
int main(){
int nro,cp,cd,cne;
cp=0;
cd=0; // va a controlar la cantidad de datos
while (cd<cne ) {
cd=cd+1;
cout <<”Digitar numero -> ”;
cin>>nro;
if (a%2==0)
cp=cp+1;
}
cout <<”Cantidad de números pares “<<cp;
return 0;
}
Este programa funciona para cualquier cantidad de datos, es decir queda genérico.
Ejercicio para reforzar los conceptos de contador, acumulador y ciclo mientras controlado por un
contador.
Ejercicio ciclo 3
Se tiene una cantidad dada de datos numéricos, hallar el promedio de los números que sean
múltiplos de 5.
Modelo mental
Cantidad de datos 6
Datos 3 10 12 20 5 15
El objetivo del ejercicio es llegar a 12,5 y para esto, se debe buscar el 50 que es un sumador o
acumulador y el 4 que es un contador.
Regla Trabajar un dato a la vez y determinar que es lo que hace la mente con ese dato de
acuerdo a la solución
Numero de datos 6
DATO 1 2 3 4 5 6
3 10 12 20 5 15
10 30 50
1 2 35 4
3
CDN
Numero de datos 6
CN CN CN CN CN CN
1 2 3 4 5 6
NUM NUM NUM NUM NUM NUM
3 10 12 20 5 15
NUM NUM NUM NUM NUM NUM
3 mul de 5? 10 mul de 5? 12 mul de 5? 20 mul de 5? 5 es mul de 15 mul de 5?
5?
No Si No Si Si Si
S5 S5 S5 S5
10 30 35 50
C5 C5 C5 C5
1 2 3 4
S5 C5 PROM5
Promedio múltiplo de 5 = 50 / 4 = 12,25
PROM5
“Promedio múltiplo de 5 =”, 12,5
Definición variables
CDN // entrada
Numero de datos 6
Asignació ¿0<6? ¿1<6? Asignación Asignación Asignación Asignación
n Asignación Asignación CN CN CN CN
CN CN CN 3 4 5 6
0 1 2
Entrada Entrada Entrada Entrada Entrada Entrada
NUM NUM NUM NUM NUM NUM
3 10 12 20 5 15
Decisión Decisión Decisión Decisión Decisión Decisión
NUM NUM NUM NUM NUM NUM
¿3 mul de 5? ¿10 mul de 5? ¿12 mul de ¿20 mul de ¿5 es mul de ¿15 mul de 5?
5? 5? 5?
No Si Si
No Si Si
Asignació Asignación Asignación
S5 Asignación Asignación S5
n
10 S5 S5 50
S5
30 35
0
Asignació Asignación Asignación
C5 Asignación Asignación C5
n
1 C5 C5 4
C5
2 3
0
Asignación
S5 C5 PROM5
Promedio múltiplo de 5 = 50 / 4 = 12,25
Algoritmo promedio5
Definir CDN,CN,C5,S5 Como Entero
Definir PROM5 Como Real
FinAlgoritmo
int main(){
int cdn,cn,c5,s5,num;
float prom5;
cn=0;
c5=0;
s5=0;
while (cn<cdn ) {
cn=cn+1;
cout <<”Digitar numero -> ”;
cin>>num;
if (num%5==0){
s5=s5 + num;
c5=c5+1;
}
}
prom5=(float)s5/c5;
cout <<”Promedio de múltiplos de 5 “<<prom5;
return 0;
}
En computación es muy importante tener presente que la operación de división por cero es
indefinida.
Si en un programa se presenta división por cero este cancelará, por lo que se debe incluir en la
programación, instrucciones de validación de esta situación.
En el ejemplo que acabamos de especificar puede darse el hecho de que ningún dato numérico
sea múltiplo de 5, entonces según la lógica S5 y C5 quedan con el valor de cero (0) y al calcular el
promedio se presenta
Si ( C5 > 0 )
Entonces // Significa que por lo menos hay un múltiplo de 5
PROM5 <- S5 / C5
Escribir “ Promedio de 5 = “, PROM5
Sino
Escribir “ No hay múltiplos de 5 “
Fin si
Algoritmo Promedio5
Definir CDN,CN,C5,S5,Num Como Entero
Definir PROM5 Como Real
FinAlgoritmo
#include <iostream>
using namespace std;
int main(){
int cdn,cn,c5,s5,num;
float prom5;
cn=0;
c5=0;
s5=0;
while (cn<cdn ) {
cn=cn+1;
cout <<”Digitar numero -> ”;
cin>>num;
if (num%5==0){
s5=s5 + num;
c5=c5+1;
}
}
if (c5>0) {
prom5=(float)s5/c5;
cout <<”Promedio de múltiplos de 5 “<<prom5;
}
else
cout<<”No hay múltiplos de 5”;
return 0;
}
Con los elementos planteados hasta el momento para los ciclo se presentan los siguientes
ejercicios, todos realizando los respectivos modelos mentales, teniendo en cuenta las reglas que
se han establecido.
Ejercicio ciclo 4
Sumar los números desde el 0 hasta un número dado
Solución
Este ejercicio tiene un solo dato de entrada que es el límite hasta donde se deben sumar los datos.
Número dado 5
Suma 1+2+3+4+5 = 15
Respuesta Suma = 15
Esto demuestra que se entiende el objetivo pero no tiene características computacionales.
Modelo
Numero dado 5
1 3 6 10<-6+4 15<-10+5
Suma = 15
Observe que los datos son una secuencia de datos con variación de 1 en 1 y que esos datos se van
sumando
Pasos genéricos
Entrar un número
Generar los números desde 1 hasta el número dado
Por cada dato generado sumarlo
Mostrar el resultado de la suma
Nro // Entrada
Numero dado 5
SUM // salida
Suma = 15
Definición de variables
Nro : Número límite tipo numérico entero
CON : Contador tipo numérico, genera la secuencia de 1 en 1 hasta Nro. Tipo numérico entero
SUM : Sumador o Acumulador, lleva la suma de los valores generados en CON. Tipo numérico
entero
Asignaciones:
Ahora CON y SUM tienen un valor inicial de Cero (0), antes de que lleguen los números, y se lo
establece con asignación y van antes del proceso de los números que se lo hace con un ciclo.
CON 0
SUM 0
Leer Nro
5
Las instrucciones
CON CON + 1
SUM SUM + 1
Se repiten 5 veces, por lo que se va a utilizar un ciclo controlado por un contador, el contador es el
mismo que genera los números del 1 hasta el 5, es decir CON. Según esto la condición que
controla el ciclo es
Algoritmo sumarNumerosSerie
FinAlgoritmo
#include <iostream>
using namespace std;
int main(){
int nro,con,sum,s5,num;
cn=0;
sum=0;
while (con<nro ) {
con=con+1;
sum=sum+con;
}
cout <<”Suma de números = “<<sum;
return 0;
}
El ejercicio anterior es importante, porque se sumaron varios números que no fueron entrados, se
generaron internamente con la variable CON que a su vez sirvió para controlar el ciclo.
Hay muchos ejercicios que tienen esta característica, con el análisis se los reconoce.
Ejercicio ciclo 6
Sumar los números pares desde el 0 hasta un número dado
Solución 1. Esta solución tiene tendencia a aplicar los conceptos que se conocen. En este caso se
tiene el concepto de número par y se lo quiere asociar a la solución.
Modelo mental
Numero dado 13
2+4+6+8+10+12 = 42
0 1 2 3 4
0 es par? 1 es par? ¿2 es par? ¿3 es par? ¿4 es par?
Si no Si
2 6
Algoritmo sumarNumerosSerie
Fin Mientras
Escribir "Suma pares = ", SUMP
FinAlgoritmo
#include <iostream>
using namespace std;
int main(){
int nro,con,sum,s5,num;
con=0;
sump=0;
while (con<nro ) {
con=con+1;
if (con%2==0)
sump=sump+con;
}
cout <<”Suma de números pares = “<<sump;
return 0;
}
Segunda solución.
Si el dato es 13
2+4+6+8+10+12 = 42
Para esta solución, no se necesita generar los números de 1 en 1 y preguntar si es par, tan solo se
genera el número con un contador de incremento 2 y se lo suma
Numero dado 13
2 4 6 8 10 12
2 6 12 20 30 42
Modelo general
NRO
Numero dado 13
NRO SUMP
Suma de pares menores que 13 = 42
Determinación de los valores de variables (entrada, asignación).
Variables
Nro : Valor numérico dado
PAR : Contador de pares
SUMP : Acumulador de pares
Como hay bloques de acciones que se repiten, se lo trabaja con un ciclo controlado por un
contador que es PAR.
Condición de control del ciclo PAR < Nro
Algoritmo resultante
Inicio
Leer Nro
PAR <- 0
SUMP <- 0
Mientras (PAR <= Nro ) hacer
PAR <- PAR +2
SUMP <- SUMP + PAR
Fin Mientras
Escribir "Suma pares = ", SUMP
Fin
Se debe evaluar siempre la frontera para determinar que pasa con los últimos valores.
La evaluación de la frontera es determinar que pasa con el último dato. Muchas veces ocurre que trabaja uno más o uno
menos, por lo que hay que ajustar la condición.
El algoritmo queda
inicio
Leer Nro
PAR <- 0
SUMP <- 0
Mientras (PAR <= Nro-2 ) hacer
PAR <- PAR +2
SUMP <- SUMP + PAR
Fin Mientras
Escribir "Suma pares = ", SUMP
Fin
#include <iostream>
using namespace std;
int main(){
int nro,par,sump;
par=0;
sump=0;
while (con<=nro-2 ) {
par=par+2;
sump=sump+par;
}
cout <<”Suma de números pares “<<”menores o iguales que “<< nro << “ = “ << sump;
return 0;
}
Con el manejo del contador PAR iniciando en 2 se tiene un mejor manejo en la frontera del dato
Inicio
Leer Nro
PAR <- 2
SUMP <- 0
Mientras (PAR <= Nro ) hacer
#include <iostream>
using namespace std;
int main(){
int nro,par,sump;
cout <<”Leer numero límite “;
cin >>nro; //Especifica cuantos números van a entrar
par=2;
sump=0;
while (con<=nro ) {
sump=sump+par;
par=par+2;
}
cout <<”Suma de números mul de cinco “<<”menores o iguales que “<< nro << “ = “ <<
sump;
return 0;
}
Esta solución permite ver que el contador perfectamente puede iniciar su valor en un valor diferente de 0. En este caso
el valor inicia e 2 y la ultima instrucción es el incremento del contador.
Ejercicio
Numero dado 37
5 + 10 + 15 + 20 + 25 + 30 + 35 = 140
Algoritmo múltiplos5
Definir Nro,CIN,SUMC como entero
Leer Nro
CIN <- 5
SUMC <- 0
Mientras (CIN <= Nro ) hacer
FinAlgoritmo
#include <iostream>
using namespace std;
int main(){
int nro,cin,sumc;
cout <<”Leer numero límite “;
cin >>nro; //Especifica cuantos números van a entrar
cin=2;
sumc=0;
while (cin<=nro ) {
sumc=sumc+cin;
par=par+2;
}
cout <<”Suma de números pares = “<<”menores que “<< nro << “ = “ << sump;
return 0;
}
Los siguientes ejercicios van a recibir una cantidad dada de números, que van a ser trabajados con
una sola variable, como se trabajo en anteriores ejercicios.
Se tiene una serie de números enteros determinados por una cantidad dada, determinar:
1. La cantidad de números mayores que 10
2. La cantidad de números mayores que un numero dado
3. El promedio de los números que están entre los valores 20 y 50
4. El promedio de los números que están entre dos valores dados
5. El promedio de los números pares que están entre dos valores dados
6. El número mayor
7. El número menor
8. El numero mayor y menor
Ejercicio
Se tiene una cantidad dada de números y se solicita,
El promedio de los números pares que están entre dos valores dados
Se tiene una serie de números enteros determinados por una cantidad dada, determinar el
promedio de los números pares que están entre dos valores dados
Ejemplo
Valores dados
R1 R2
25 12
Validar R1>R2?
R1 R2 aux
12 25
cn
Cantidad de números 6
c c c
1 2 3
Nro Nro Nro
15 7 14 26 12 20
Sump promp
14 + 12 + 20 = 46/3 = 15,3
Cp
3
Pasos genéricos
Definir variables
Leer rango
Validar rango e intercambiar
Leer cantidad de datos
Leer los datos hasta la cantidad de datos
Por cada dato
Determinar si es par
Si es par determinar si está dentro del rango
Si esta dentro del rango sumarlo y contarlo
Después de los datos hallar el promedio con la suma y la cuenta
Mostrar promedio
Algoritmo RangoPares
Definir r1,r2,cd,Sp,Cp,C,Nro,aux como entero
Definir promp como real
Leer r1,r2 // para que el algoritmo funciones r2 tiene que ser >= que r1
// para garantizar valores en el rango se intercambia los valores
Si r1>r2 Entonces
aux<-r1
r1<-r2
r2 <-aux
FinSi
Leer cd
C<-1
Sp <-0
Cp<-0
Mientras C<=cd hacer
Leer Nro
Si Nro mod 2= 0 Entonces
Si Nro >= r1 y Nro<=r2 Entonces
Sp<- Sp+Nro
Cp<-Cp+1
Finsi
Finsi
C<-C+1
FinMientras
// controlar la división por cero
Si Cp > 0 Entonces
Promp<- Sp/Cp
Escribir " Promedio de pares en el rango ",promp
Sino
Escribir " No hay números pares en el rango "
Finsi
FinAlgoritmo
#include <iostream>
using namespace std;
int main(){
int r1,r2,cd,sp,cp,c,nro,aux;
float promp;
cout <<”Leer límite uno “;
cin >>r1; //Especifica cuantos números van a entrar
cout <<”Lee límite dos “;
cin >>r2; //Especifica cuantos números van a entrar
//validar rango
if ( r1>r2) {
aux=r1;
r1=r2;
r2 =aux;
}
cout <<”\nCantidad de datos “;
cin >>cd;
c=1;
sp=0;
cp=0;
while (c <=cd){
cout <<”\nDigitar dato “;
cin >>nro;
if (nro%2==0){
if(nro>=r1 && nro<=r2){
sp=sp+nro;
cp=cp+1;
}
}
c=c+1;
}
if ( cp > 0) {
promp=(float) sp/cp;
cout <<”Promedio de pares en el rango = “<<promp;
}
else
cout <<”No hay números pares en el rango “;
return 0;
}
Los siguientes ejercicio se los trabaja con ciclos y presentan otra forma de definir
1. Determinar si un número dado es múltiplo de 5 sin utilizar el operador residuo (mod)
2. Determinar si un número dado es múltiplo de otro sin utilizar el operador residuo (mod)
3. Hallar la multiplicación de dos números con sumas
4. Determinar para un número dado la cantidad de números que lo dividen exactamente
5. Determinar si un número dado es o no primo
Ejercicio ciclo 7
El siguiente ejercicio permite aplicar el operador residuo para determinar la cantidad de divisores
exactos que tiene un número dado.
Definición
Determinar para un número dado, la cantidad de números que lo dividen exactamente.
Modelo mental
Numero dado 6
Mentalmente podríamos decir que los números que lo dividen exactamente son
1, 2, 3 y 6
O sea son 4.
Para el número 10 se tienen
1 2 5 10
Un dato a la vez
Número dado 6
6 mod 1 = 0? si 1
6 mod 2 = 0? si 2
6 mod 3 = 0? si 3
6 mod 4 = 0? no
6 mod 5 = 0? no
6 mod 6 = 0? Si 4
6 % 1 = 0? si 1
6 % 2 = 0? si 2
6 % 3 = 0? si 3
6 % 4 = 0? no
6 % 5 = 0? no
6 % 6 = 0? Si 4
NRO
Número dado 6
NRO CN CD
6 mod 1 = 0? si 1
CN CD
6 mod 2 = 0? si 2
CN CD
6 mod 3 = 0? si 3
CN
6 mod 4= 0? no
CN
6 mod 5 = 0? no
CN CD
6 mod 6 = 0? Si 4
CD
Respuesta Cantidad de divisores = 4
Definición de variables
Este ejercicio se lo va a realizar con un ciclo controlado por un contador en donde, por cada
variación del contador CN se va a realizar lo siguiente:
Leer Nro
6
CN CN CN CN CN CN
1 2 3 4 5 6
NRO CN NRO CN NRO CN NRO CN NRO CN NRO CN
¿6 MOD 1 = 0? ¿6 MOD 2 = 0? ¿6 MOD 3 = 0? ¿6 MOD 4 = 0? ¿6 MOD 5 = 0? ¿6 MOD 6 = 0?
SI SI SI NO No SI
CD CD CD CD
1 2 3 4
Leer Nro
6
Inicio
Definir NRO,CN,CD como entero
Leer NRO
CN <- 0
CD <- 0
Mientras (CN < NRO ) Hacer
CN <-CN + 1
Si ( NRO MOD CN = 0)
Entonces
CD <- CD + 1
Fin si
Fin mientras
Escribir “Cantidad de divisores exactos =”, CD
Fin
#include <iostream>
using namespace std;
int main(){
int nro,cn,cd;
cn=0;
cd=0;
while (cn <nro){
cn=cn+1;
if (nro%cn==0)
cd=cd+1;
}
cout <<”cantidad de números “<<cd;
return 0;
}
Con el contador que controla el ciclo iniciando en 1 se tendría lo siguiente:
#include <iostream>
using namespace std;
int main(){
int nro,cn,cd;
cn=1;
cd=0;
while (cn <=nro){
if (nro%cn==0)
cd=cd+1;
cn=cn+1;
}
cout <<”No hay números pares en el rango “;
return 0;
}
Ejercicio ciclo 8
El ejercicio anterior permite establecer si un número determinado es o no primo.
Determinar si un número dado es primo.
Con estos conceptos más los conceptos de las acciones, se puede dar un ejemplo
Número dado 7
El 5 es primo
1 5
Numero dado 6
Al 6 lo divide exactamente el 1, 2, 3 y 6 por lo tanto no es primo.
Mentalmente se puede hacer este análisis para números pequeños y establecemos la respuesta
directamente, pero computacionalmente debemos decirle al detalle que es lo que hace la mente.
El 7 se tiene que dividir por todos los números del 1 al 7 para ver, si lo dividen exactamente
Número dado 7
7 mod 1 = 0? si 1
7 mod 2 = 0? no
7 mod 3 = 0? no
7 mod 4 = 0? no
7 mod 5 = 0? no
7 mod 6 = 0? no
7 mod 7 = 0? Si 2
Número dado 6
6 mod 1 = 0? si 1
6 mod 2 = 0? si 2
6 mod 3 = 0? si 3
6 mod 4 = 0? no
6 mod 5 = 0? no
6 mod 6 = 0? Si 4
Pasos genéricos
Entonces todo el análisis realizado para el ejercicio anterior sirve para determinar si es primo
Leer Nro
6
Si ( CD = 2)
Entonces
Escribir NRO, “ Es primo “
Sino
Escribir NRO, “ No es primo “
Fin si
Después del ciclo se evalúa si el contador de divisores exactos es menor o igual a 2 ( CD <=2 ), si es
así, significa que el numero evaluado ( NRO ), si es primo, de lo contrario no los es.
Algoritmo.
Inicio
Definir NRO,CN,CD como entero
Leer NRO
CN 0
CD 0
Mientras (CN < NRO ) Hacer
CN CN + 1
Si ( NRO MOD CN = 0)
Entonces
CD CD + 1
Fin si
Fin mientras
Si ( CD = 2)
Entonces
Escribir NRO, “ Es primo “
Sino
Escribir NRO, “ No es primo “
Fin si
Fin
Se resalta la parte que se adiciona al ejercicio anterior para evaluar el contador de divisores, que
permite determinar si es o no primo.
#include <iostream>
using namespace std;
int main(){
int nro,cn,cd;
cn=1;
cd=0;
while (cn <=nro){
if (nro%cn==0)
cd=cd+1;
cn=cn+1;
}
If (cd==2)
cout <<nro<< ” es numero primo “;
else
cout <<nro<< ” no es numero primo “;
return 0;
}
Ejercicios
Determinar de una cantidad de números dada el promedio de los números primos - ciclos
anidados
Determinar de una cantidad de números dada, el número mayor.
Determinar de una cantidad de números, el número menor
Determinar el mayor y el menor de una cantidad dada de números
Determinar de una cantidad de números dada el primo mayor
Determinar de una cantidad de números dada el primo mayor y el primo menor
Determinar de una cantidad de números dada el factorial del primo mayor
Estos dos ejercicios son muy útiles, para identificar las características de un conjunto de datos que
es muy importante analizarlos.
Ejercicio ciclo 9
Determinar de una cantidad de números dada, el número mayor.
Solución 1
Cantidad de datos 5
Datos 7 20 30 15 10
Con este ejemplo se tiene claro lo que se busca, pero no es un modelo con características
computacionales.
Para que sea computacional se trabaja un dato a la vez y por cada dato se analiza lo que hace la
mente.
Cantidad de datos 5
Dato 1 7
que hace la mente?
Se guarda como el mayor. Esto porque es el primero.
Dato 2 20
Cuando llega el 20 se compara con el valor mayor que se lleva
¿20>7?
Si
Ahora el mayor es 20
Dato 3 30
¿30>20?
Si
Ahora el mayor es 30
Dato 4 15
¿15 > 30?
No
No hace nada
Dato 5 10
¿10>30?
No
No hace nada
Cantidad de datos 5
1 2 3 4 5
7 20 30 10 15
Mayor 30
A partir del segundo, todo dato se compara con el mayor que lleve.
Esto indica que si se va a trabajar con un ciclo controlado por un contador, el primer dato no debe
estar dentro del ciclo porque su acción es diferente a las demás.
CD // Entrada
Cantidad de datos 5
Mayor 30
Definición de Variables
Leer CD
Leer NRO Leer NRO Leer NRO Leer NRO Leer NRO
De lo anterior se determina que lo que debe ir en el ciclo controlado por el contador CON son las
acciones a partir del segundo dato. El algoritmo resultante es el siguiente:
Inicio
Leer CD
CON <- 1
Leer NRO
MAYOR <- NRO
Mientras ( CON < CD) Hacer
CON <- CON + 1
Leer NRO
SI ( NRO > MAYOR )
Entonces
MAYOR <- NRO
Fin si
Fin mientras
Escribir “ Mayor = “, MAYOR
Fin
#include <iostream>
using namespace std;
int main(){
int cd,nro,mayor,con;
mayor=nro;
con=1;
Ejercicio ciclo 11
Determinar de una cantidad de números, el número menor
Para obtener el menor de los datos, el análisis es el mismo y lo que cambia es la variable MAYOR
por MENOR y la decisión es la siguiente:
Que indica si el nuevo número que se lee es menor que el menor que se lleva, se lo cambia
Inicio
Leer CD
CON 1
Leer NRO
MENOR NRO
Mientras ( CON < CD) Hacer
CON CON + 1
Leer NRO
SI ( NRO < MENOR )
Entonces
MENOR NRO
Fin si
Fin mientras
Escribir “ Menor = “, MENOR
Fin
#include <iostream>
using namespace std;
int main(){
int cd,nro,menor,con;
menor=nro;
con=1;
return 0;
}
El método anterior lee un dato por fuera del ciclo y lo establece como MAYOR o como MENOR,
esto se hace con el propósito de tener un dato válido para realizar las comparaciones con los
demás datos.
Ejercicio ciclo 12
Sacar el mayor y el menor de una cantidad de datos numéricos dada
Con el método anterior se tendría como resultado la combinación de los dos primeros en donde
cambiaría la condición.
Inicio
Leer CD
CON 1
Leer NRO
MENOR NRO
MAYOR NRO
Mientras ( CON < CD) Hacer
CON CON + 1
Leer NRO
SI ( NRO > MAYOR )
Entonces
MAYOR NRO
Sino
Si ( NRO < MENOR )
Entonces
MENOR NRO
Fin si
Fin si
Fin mientras
Escribir “ Mayor = “, MAYOR
Escribir “ Menor = “, MENOR
Fin
#include <iostream>
using namespace std;
int main(){
int cd,nro,mayor,menor,con;
mayor=nro;
menor=nro;
con=1;
return 0;
}
Inicio
Leer CD
CON <- 1
Leer NRO
MENOR <- NRO
MAYOR <- NRO
Mientras ( CON < CD) Hacer
CON <- CON + 1
Leer NRO
SI ( NRO > MAYOR )
Entonces
MAYOR <- NRO
Fin si
Ejercicio ciclo 13
Determinar de una cantidad de números dada, el número mayor. Utilizando otro método
En el siguiente ejercicio va determinar el mayor de los datos, con otro método que incluye la
lectura de todos los datos dentro del ciclo.
Cuando se busca el mayor y el menor de una cantidad de datos, la mente reserva un espacio de
memoria para ir llevando el mayor o el menor, sabiendo que el primer dato, por ser el primero
será el mayor y el menor, a partir del segundo ya se puede comparar porque al menos hay un dato
en la memoria.
El método anterior lee un dato por fuera y este, lo vuelve mayor y menor, y durante el ciclo los
compara con los demás datos.
Ahora el método que se propone es leerlos todos dentro del ciclo, por lo que dentro de las
instrucciones del ciclo, debe haber alguna señal que controle que el dato tratado es el primero.
Muchos ejercicios van a necesitar de este tratamiento, por lo que es muy importante tenerlo
presente.
Modelo mental
Cantidad de datos 5
1 2 3 4 5
7 20 30 10 15
Mayor 30
CD
Cantidad de datos 5
Mayor 30
Este ejercicio se realiza con un ciclo controlado por el contador CON, donde la condición de
control es, CON < CD .
Para determinar si es el primero se lo hace preguntado si CON vale 1. Solo para el primer dato
CON vale 1, para los demás es diferente de 1 por lo tanto, para los demás datos la condición ya no
va a ser verdadera y pasa por el falso a comparar con el valor leído en NRO
Algoritmo
Inicio
Leer CD
CON <- 0
Mientras ( CON < CD ) Hacer
CON <- CON + 1
Leer NRO
SI ( CON = 1 )
Entonces // si es verdadero es porque es el primero
MAYOR <- NRO // el primer dato lo vuelve mayor
Sino // ya no es el primero entra a comparar
Si ( NRO > MAYOR )
Entonces
MAYOR <- NRO
Fin si
Fin si
Fin mientras
Escribir “ Mayor = “, MAYOR
Fin
#include <iostream>
using namespace std;
int main(){
int cd,nro,mayor,con;
Inicio
Leer CD
CON <- 0
Mientras ( CON < CD ) Hacer
CON <- CON + 1
Leer NRO
SI ( CON = 1 )
Entonces // si es verdadero es porque es el primero
MAYOR <- NRO // el primer dato lo vuelve mayor
MENOR <- NRO
Sino // ya no es el primero entra a comparar
Si ( NRO > MAYOR )
Entonces
MAYOR <- NRO
Fin si
Si ( NRO < MENOR )
Entonces
MENOR <- NRO
Fin si
Fin si
Fin mientras
Escribir " Mayor = ", MAYOR
Escribir " Menro = ", MENOR
fin
#include <iostream>
using namespace std;
int main(){
int cd,nro,mayor,menor,con;
con=0;
return 0;
}
Ejercicio ciclo 14
Determinar de una cantidad de números dada, el número mayor. Método 3
Existe un tercer método para obtener el mayor y el menor que es muy utilizado, y es
estrictamente computacional.
Para hallar el mayor o el menor, se parte del hecho de que se debe tener en una variable MAYOR o
MENOR un dato para comparar, y esto no se lo tiene, sino se ha leído el primer dato, para evitar
esto, por fuera del ciclo se inicializa MAYOR con el valor más pequeño y para MENOR con el valor
más alto del tipo de dato.
Ejemplo
Inicio
Leer CD
CON <- 0
MAYOR <- 0 // se inicializa en 0 para que en la primera comparación cambie
Mientras ( CON < CD ) Hacer
CON <- CON + 1
Leer NRO
Si ( NRO > MAYOR )
Entonces
MAYOR <- NRO
Fin si
Fin mientras
Fin
Ciclo controlado por un contador decreciente
Hasta ahora los ciclos han sido controlados por contadores que van en forma creciente a alcanzar
un número dado. Ahora, depende del análisis del ejercicio el que determina que tipo de contador
es.
Ejercicio ciclo 15
Determinar el factorial de un número dado.
El factorial de un número se lo define de la siguiente forma:
5!
Es 5*4*3*2*1 = 120
1*2*3*4*5 = 120
El factorial de 5 es 120
Ejemplo
Modelo mental inicial
Dato dado 5
5! = 5*4*3*2*1 = 120
Con un dato a la vez se obtiene el siguiente modelo, esto es que pasa con cada valor decreciente.
Número dado 5
Factorial de 5 = 120
NRO
5
FAC
Factorial de 5 = 120
El algoritmo queda:
Inicio
Leer NRO
CON <- NRO
FAC <- 1
Mientras ( CON >= 1) Hacer
#include <iostream>
using namespace std;
int main(){
int con,nro, fac;
con=nro;
fac=1;
while (con >=1) {
fac=fac*con;
con=con-1;
}
cout <<”Factorial de “<<nro <<” = “<<fac;
return 0;
}
Ejercicio ciclo 16
Determinara el factorial de un número dado. Método 2
Algoritmo
Inicio
Leer NRO
CON <- 1
FAC <- 1
Mientras ( CON <=NRO) Hacer
FAC <- FAC * CON
CON <- CON +1
Fin mientras
Escribir “Factorial de “, NRO , “ = “, FAC
Fin
#include <iostream>
using namespace std;
int main(){
int con,nro, fac;
con=1;
fac=1;
while (con <=nro) {
fac=fac*con;
con=con+1;
}
cout <<”Factorial de “<<nro <<” = “<<fac;
return 0;
}
Ciclos anidados
Se habla de ciclos anidados cuando dentro de las instrucciones a repetir de un ciclo, una o varias
de ellas son también ciclos.
Formato general
Esta situación planteada muestra que hay 3 ciclos mientras anidados con sus respectivas acciones
genéricas.
Características
- Cuando se tiene ciclos anidados, el ciclo más interno se acaba primero
- El orden del fin mientras (}) de cada ciclo, está especificado desde el más interno hasta el más
externo. Por eso es que se acaba primero.
- Cada ciclo interno tiene sus condiciones antes del ciclo y después del ciclo, que se deben
manejar muy bien, para evitar errores.
Ejercicios ciclo 17
Se tiene una cantidad de números dada, determinar el promedio de los números primos que están
en esos números.
Cantidad de números 6
Números 8 7 2 4 13 17
Cantidad de Números 6
1 2 3 4 5 6
8 7 2 4 13 17
CNUM // Entrada
Cantidad de Números 6
La pregunta
NRO
¿8 es primo?
No
Exige que se ejecuten las acciones para determinar si NRO es primo, entonces esta pregunta se
transforma en:
CN 0
CD 0
Mientras (CN < NRO ) Hacer
CN CN + 1
Si ( NRO MOD CN = 0)
Entonces
CD CD + 1
Fin si
Fin mientras
Si ( CD = 2)
Entonces // el número si es primo
SUMP SUMP + NRO
CONP CONP + 1
Fin si
Las acciones a repetirse entonces son las siguientes:
Leer NRO
CN 0
CD 0
Mientras (CN < NRO ) Hacer
CN CN + 1
Si ( NRO MOD CN = 0)
Entonces
CD CD + 1
Fin si
Fin mientras
Si ( CD = 2)
Entonces // el número si es primo
SUMP SUMP + NRO
CONP CONP + 1
Fin si
Definición de variables
CNUM : Cantidad de Números a evaluar
CON : Contador de Números a entrar
NRO : variable que recibe todos los números
SUMP : Variable acumulador de números primos
CONP : Variable contador de números primos
CN : Contador utilizado para determinar un número primo
CD : Contador de divisores exactos para determinar si es primo
PROMP : Promedio de primos
Algoritmo
Algoritmo PromedioPrimos
Definir CNUM,CON,NRO,SUMP,CONP,CN,CD Como Entero
Definir PROMP Como Real
Leer CNUM
CON <- 0
SUMP <- 0
CONP<- 0
Mientras ( CON < CNUM ) hacer // ciclo para controlar la entrada de datos
CON <- CON + 1
Leer NRO
CN <- 0
CD <- 0
Mientras (CN < NRO ) Hacer // ciclo para determinar divisores exactos
CN <-CN + 1
Si ( NRO MOD CN = 0)
Entonces
CD <- CD + 1
Fin si
Fin mientras
Si ( CD = 2)
Entonces // el número si es primo
SUMP <- SUMP + NRO
CONP <- CONP + 1
Fin si
Fin mientras
Si ( CONP > 0 ) // Valida si hay al menos un número primo
Entonces
PROMP <- SUMP/CONP
Escribir " Promedio de Primos = ",PROMP
Sino
Escribir " No hay números primos "
Fin si
FinAlgoritmo
El algoritmo muestra en otro color que implica establecer si un dato es o no primo, el cual necesita
de un ciclo para determinar la cantidad de divisores exactos.
#include <iostream>
using namespace std;
int main(){
int cnum,con,nro,sump,conp,cn,cd;
float promp;
con=0;
sump=0;
conp=0;
while (con<cnum) {
con=con+1;
cout<<"Digitar numero";
cin>>nro;
cn=0;
cd=0;
while(cn<nro) {
cn=cn+1;
if(nro%cn==0)
cd=cd+1;
}
if (cd==2){
sump=sump+nro;
conp=conp+1;
}
}
if( conp>0){
promp=(float)sump/conp;
cout<<"Promedio de números primos "<<promp;
}
else
cout<<"No hay números primos";
Ejercicio ciclo
Generar la serie de Fibonacci para n términos.
Esta serie se genera con un ciclo donde por cada repetición o iteración del ciclo se genera un
término.
Modelo mental
Numero de Términos 10
A B T T T T T
1 2 3 4 5 6 7 8 9 10
0 1 1 2 3 5 8 13 21 34
A B
A B
A B
A B
A B
T<-A+B
A<-B
B<-T
Donde los dos primeros números por definición ya se los tiene generados, faltan los otros 8 los
cuales se los realiza de la siguiente forma
Lo que se conoce es
1 2 3 4 5 6 7 8 9 10
C C C C C C C C C C
1 2 3 4 5 6 7 8 9 10
A B T T T T T T T T
0 1 1 2 3 5 8 13 21 34
Para que el nuevo termino se genere, se debe tener en cada tiempo los dos valores anteriores. En
el modelo mental se tiene que valores debe estar en las variables A y B, que siempre van a ser los
dos anteriores para obtener el proximo que es T
T<- A+B
Esto significa que antes de generar el termino T los valores de A y B deben haber cambiado y lo
hacen como en el ejemplo. Eso significa que
A <- B
B <- T
Ahora cada vez que se genera un numero de la serie se lo muestra. Entonces el modelo es el
siguiente
NT
Numero de términos 10
C C C<-C+1 C<-C+1 C<-C+1 C<-C+1 C<-C+1 C<-C+1 C<-C+1 C<-C+1
1 2 3 4 5 6 7 8 9 10
A B T<- A+B T<-A+B T<-A+B T<-A+B T<-A+B T<- A+B T<- A+B T<-A+B
0 1 1<- 0+1 2<-1+1 3<-1+2 5<-2+3 8<-3+5 13<-5+8 21<-8+13 34<-13+21
Sale A T T T T T T T T
Sale B Sale 1 Sale 2 Sale 3 Sale 5 Sale 8 Sale 13 Sale 21 Sale 34
A<-B A<-B A<-B A<-B A<-B A<-B A<-B A<-B
B<-T B<-T B<-T B<-T B<-T B<-T B<-T B<-T
Donde A<-B y B<-T dejan preparado los valores para generar el próximo numero fibonacci, el
cual se hace en el siguiente tiempo.
El algoritmo queda
Inicio
Leer NT
A<-0
B<-1
Escribir A
Escribir B
C<-2
Mientras ( C<NT ) Hacer
C<-C+1
T<-A+B
Escribir T
A<-B
B<-T
Fin mientras
Fin
int main(){
int nt,c,a,b,t;
cout <<"Cantidad de términos => ";
cin>>nt;
a=0;
b=1;
cout << "Termino fibonacci 1 = "<<a;
cout << "\nTermino fibonacci 2 = "<<b;
c=2;
while (c<nt) {
c=c+1;
t=a+b;
cout<<"\nTermino fibonacci "<<c<<" = "<<t;
a=b;
b=t;
}
return 0;
}
Ejercicio ciclo
Determinar si un valor dado pertenece a la serie de fibonacci
O determinar si un numero dado es fibonacci
Ejemplo
nro
Número dado 30
Para saber si pertenece a la serie, se debe conocer la serie, por lo que se debería generarla y mirar
si el número está o no en la serie. Para este número se tendría:
A B T T
0 1 1 2 3 5 8 13 21 34
¿T<NRO?
Con esto se concluye que el 30, no es un número de Fibonacci, porque no está en la serie donde
debería estar, que es entre el 21 y el 34, los demás valores que siguen, por la característica de la
serie serán mayores que el 30, y no tendría sentido seguir generando la serie.
Para el 30 se genera
0 1 1 2 3 5 8 13 21 34
Para el 21
0 1 1 2 3 5 8 13 21
Pasos
Leer el Numero
Generar la serie hasta el número evaluado
Preguntar si el último número generado es igual al número evaluado
Si es igual es Fibonacci
Sino es igual no es Fibonacci
NRO
Para el 21
A B T ...
A B T T T T T T T
0 1 1 2 3 5 8 13 21
¿T<NRO?
Después del ciclo se pregunta
NRO = T
¿21 = 21?
Si
NRO es Fibonacci
Inicio
Leer NRO
A<-0
B<-1
T<-0 // T debe valer 0 para que también tome el 0 que si es fibonacci
Mientras ( T < NRO ) Hacer
T<-A+B
A<-B
B<-T
Fin mientras
Si ( NRO = T ) Entonces
Escribir NRO, " ES FIBONACCI "
Sino
Escribir NRO, " NO ES FIBONACCI "
Fin si
Fin
int main(){
int a,b,t,nro;
cout <<"Digitar numero => ";
cin>>nro;
a=0;
b=1;
t=0;
Los ejercicios realizados hasta el momento, utilizaron ciclos controlados por contadores o por
variables que tenían variaciones con resultados aritméticos, estos ciclos tienen un esquema
cuantitativo y generalmente se los utiliza cuando se conoce el número de veces que se va a repetir
el conjunto de acciones.
Ejercicios
Ejercicio
Se tienen una cantidad de números dado, determinar el promedio de los números que son
fibonacci.
En los números pueden haber fibonacci y no fibonacci.
Cantidad de números 4
Datos numéricos 4 5 11 34
4 es fib?
(5+34)/2 = 19.5
Un dato a la vez
Elementos claros
Entrada de varios datos
Sumador
Contador
Determinar si es fibonacci
Promedio
CDN : Cantidad de datos
CON : Contador de los datos que van a entrar
NRO : Variable donde van a entrar todos los datos
SUMF : sumador de los numeros fibonacci
CONF : Contador de los números fibonacci
A : para generar serie fibonacci
B : para generar serie fibonacci
T : para generar serie fibonacci
PROMF : promedio de fibonacci
Inicio
// leer cantidad de datos
Leer CDN
CON <- 0
SUMF<-0
CONF<-0
// Ciclo para la entrada de datos y evaluación
Mientras ( CON < CDN ) hacer
CON <- CON+1
Leer NRO
A<-0
B<-1
T<-0
Mientras ( T < NRO ) Hacer
T<-A+B
A<-B
B<-T
Fin Mientras
Si ( T= NRO) Entonces
SUMF <- SUMF+NRO
CONF<- CONF + 1
Fin si
Fin mientras
Si (CONF>0) Entonces
PROMF<-SUMF/CONF
Escribir “ Promedio = “,PROMF
Sino
Escribir “ No hay fibonacci”
Fin si
Fin
#include <iostream>
using namespace std;
int main(){
int con,sumf,conf,a,b,t,nro,cdn;
float promf;
Ejercicio ciclo
Se tiene una cantidad de numeros dada, determinar el primo menor de estos.
Ejemplo
Cantidad de numeros 6
Numeros dados 4 8 7 5 13 9
El primo menor es 5
El primero se lo puede controlar con un contador de primos, de tal forma que cuando se
encuentre un primo se incremente en 1, y cuando este valga 1, significa que es el primer primo,
por lo tanto se lo determina como el menor, si hay más primos el contador se va a incrementar y
ya no va a ser 1 ahora vale 2 o más, indicando con esto, que ya no es el primero, por lo que cada
primo nuevo, se debería comparar con el menor que se lleve.
Con estas anotaciones planteamos el modelo mental siguindo la regla de un dato a la vez.
Cantidad de numeros 6
1 2 3 4 5 6
4 8 7 3 13 9
NRO // decisión NRO // decisión NRO // decisión NRO // decisión NRO // decisión NRO // decisión
¿4 es primo? ¿8 es primo? ¿7 es primo? ¿3 es primo? ¿13 es primo? ¿9 es primo?
No No Si Si Si No
¿7 es el primero? ¿3 es el ¿13 es el primero?
Si primero? NRO Menor
Menor NRO Menor No ¿13 < 3?
7 No ¿ 3 < 7? No
Si
Menor
3
Resultado
Menor
Primo menor = 3
Para la pregunta
¿NRO es primo?
Sabemos que no es computacional, esto implica que para determinar si NRO es primo, como se
dijo en el ejercicio anterior, se debe realizar varias intrucciones con las cuales se va a hallar la
cantidad de divisores exactos, para evaluarlo y determinar si es primo. El siguiente codigo
determina este proceso:
C<-0
CD<-0
Mientras ( C<NRO ) Hacer
C<-C+1
Si ( NRO mod C = 0) Entonces
CD <- CD+1
Fin si
Fin mientras
Si (CD = 2) Entonces // si es verdadero, es primo
CP<-CP+1
¿NRO es el primero?
Si
Menor
7
CP <- CP+1
Si ( CP = 1 ) Entonces // Indica que es el primero
Menor <- NRO
Sino // indica que ya no es el primero y lo debe comparar como lo muestra en el algoritmo
Algoritmo:
Inicio
Leer CDN
CP<-0
CN<-0
Mientras (CN<CDN) Hacer
CN<-CN+1
Leer NRO
C<-0
CD<-0
Mientras ( C<NRO ) Hacer
C<-C+1
Si ( NRO mod C = 0) Entonces
CD <- CD+1
Fin si
Fin mientras
Si (CD = 2) Entonces
CP <- CP + 1
Si ( CP = 1 ) Entonces
Menor<-NRO
Sino
Si (NRO<Menor) Entonces
Menor <- NRO
Fin si
Fin si
Fin si
Fin mientras
Escribir “ Primo menor “,Menor
Fin
#include <iostream>
using namespace std;
int main(){
int cn, nro,cdn,c,cd,cp,menor;
cout<<"Cantidad de numeros";
cin>>cdn;
cp=0;
cn=0;
while (cn<cdn){
cn=cn+1;
cout<<"Digitar numero => ";
cin >>nro;
c=0;
cd=0;
while (c<nro){
c=c+1;
if (nro%c==0){
cd=cd+1;
}
}
if (cd==2){
cp=cp+1;
if (cp==1)
menor=nro;
else{
if (nro<menor)
menor=nro;
}
}
}
cout<<"primo menor ="<<menor;
}
Ejercicio
Determinar el primo mayor y menor de una cantidad de números dada
Para este ejercicio se utiliza el mismo concepto de controlar el primero, ya que, todos los números
no son primos.
Inicio
Leer CDN
CP<-0
CN<-0
Mientras (CN<CDN) Hacer
CN<-CN+1
Leer NRO
C<-0
CD<-0
Mientras ( C<NRO ) Hacer
C<-C+1
Si ( NRO mod C = 0) Entonces
CD <- CD+1
Fin si
Fin mientras
Si (CD = 2) Entonces
CP <- CP + 1
Si ( CP = 1 ) Entonces
Menor<-NRO
Mayor<-NRO
Sino
Si (NRO<Menor) Entonces
Menor <- NRO
Fin si
SI (NRO>Mayor) Entonces
Mayor<-NRO
FinSi
Fin si
Fin si
Fin mientras
Escribir " Primo menor ",Menor
Escribir " Primo mayor ",Mayor
Fin
#include <iostream>
using namespace std;
int main(){
int cn, nro,cdn,c,cdcp,menor,mayor;
cout<<”Cantidad de numeros”;
cin>>cdn;
cp=0;
cn=0;
while (cn<cdn){
con=con+1;
cout<<”Digitar numero => “;
cin >>nro;
c=0;
cd=0;
while (c<nro){
c=c+1;
if (nro%c==0){
cd=cd+1;
}
}
if (cd==2){
cp=cp+1;
if (cp==1) {
menor=nro;
mayor=nro;
}
else{
if (nro>mayor)
mayor=nro;
else
if (nro<menor)
menor=nro;
}
}
}
cout<<”primo menor =”<<menor;
cout<<”primo mayor =”<<mayor;
return 0;
}
Ahora se va a optimizar el manejo anterior en donde se utiliza un contador (cp) para determinar
situaciones específicas, introduciendo el concepto de variable bandera o switche.
Ejercicio
Se tiene una cantidad dada de números, determinar el primo menor de ellos.
Para este ejercicio se planteó la solución anterior, donde se controló el primer primo con un
contador CP, donde el valor de 1 indicaba que era el primero.
Esta parte del algoritmo se lo puede modificar utilizando una bandera o switche, el cual va a tener
dos comportamientos B=0 para indicar que es el primero y B=1 para indicar que ya pasó por el
primero. El resto del algoritmo permanece igual.
Entonces la pregunta
¿NRO es el primero?
Si
Menor
7
CP <- CP+1
Si ( CP = 1 ) Entonces // Indica que es el primero
Menor <- NRO
Sino // indica que ya no es el primero y lo debe comparar como lo muestra en el algoritmo
Inicio
Leer CDN
B<-0 // variable bandera, inicia en 0 para indicar que es el primero
CN<-0
Mientras (CN<CDN) Hacer
CN<-CN+1
Leer NRO
C<-0
CD<-0
Mientras ( C<NRO ) Hacer
C<-C+1
Si ( NRO mod C = 0) Entonces
CD <- CD+1
Fin si
Fin mientras
Si (CD = 2) Entonces
Si ( B = 0 ) Entonces
Menor<-NRO
B<-1 // Con esto se garantiza que no vuelva a pasar por estas acciones
Sino
Si (NRO<Menor) Entonces
Menor <- NRO
Fin si
Fin si
Fin si
Fin mientras
Escribir “ Primo menor “,Menor
Fin
#include <iostream>
using namespace std;
int main(){
int cn, nro,cdn,c,cd,b,menor;
cout<<”Cantidad de numeros”;
cin>>cdn;
b=0;
cn=0;
while (cn<cdn){
cn=cn+1;
cout<<”Digitar numero => “;
cin >>nro;
c=0;
cd=0;
while (c<nro){
c=c+1;
if (nro%c==0){
cd=cd+1;
}
}
if (cd==2){
if (b==0){
menor=nro;
b=1;
}
else{
if (nro<menor)
menor=nro;
}
}
}
cout<<”primo menor =”<<menor;
return 0;
}
El 7 se tiene que dividir por todos los números del 1 al 7 para ver, si lo dividen exactamente
Número dado 7
7 mod 1 = 0? si 1
7 mod 2 = 0? no
7 mod 3 = 0? no
7 mod 4 = 0? no
7 mod 5 = 0? no
7 mod 6 = 0? no
7 mod 7 = 0? Si 2
Inicio
Leer NRO
CN 0
CD 0
Mientras (CN < NRO ) Hacer
CN CN + 1
Si ( NRO MOD CN = 0)
Entonces
CD CD + 1
Fin si
Fin mientras
Si ( CD = 2)
Entonces
Escribir NRO, “ Es primo “
Sino
Escribir NRO, “ No es primo “
Fin si
Fin
Se lee un valor
Se va a tomar una variable bandera B que va a tomar el valor de 0
Realizar un ciclo controlado por un contador entre 2 y el número menos 1 (Se descarta el 1 y el
número mismo porque todo número es divisible exactamente por estos valores).
Dentro del ciclo, se aplica la operación residuo entre el numero y contador, y si hay un numero,
que lo divida exactamente cambia el valor de la bandera a 1.
Despues del ciclo se evalúa la bandera. Si B es 0, el número es primo, si es 1, el número no es
primo.
Análisis
El 7 se tiene que dividir por todos los números del 1 al 7 para ver, si lo dividen exactamente
Número dado 7
B=0
7 mod 2 = 0? no
7 mod 3 = 0? no
7 mod 4 = 0? no
7 mod 5 = 0? no
7 mod 6 = 0? no
B = 0?
Si 7 es primo
Número dado 6
B <- 0
6 mod 2 = 0? si B<-1
6 mod 3 = 0? si B<-1
6 mod 4 = 0? no
6 mod 5 = 0? no
B=0?
No
6 no es primo.
Inicio
Leer NRO
CN<- 1
B <- 0 // inicia la bandera en 0
Mientras (CN < NRO-1 ) Hacer
CN CN + 1
Si ( NRO MOD CN = 0)
Entonces
B <-1 // cambia la bandera
Fin si
Fin mientras
Si ( B=0)
Entonces
Escribir NRO, “ Es primo “
Sino
Escribir NRO, “ No es primo “
Fin si
Fin
int main(){
int cn, nro,b;
Cuando se utiliza una variable bandera, para optimizar más el programa, en el ciclo que controla el
proceso repetitivo, se introduce en la condición de control del ciclo la evaluación de la variable
bandera, generando condiciones compuestas controlando el ciclo.
cn=1;
b=0;
while (cn <nro-1 && b==0)
Donde CN < NRO-1 and B=0 (cn <nro-1 && b==0) es una condición compuesta.
Esto significa que, que entra a realizar el ciclo si la condición es verdadera por lo que CN < NRO-1 y
B=0 deben ser verdaderas y dejará de ejercutarse cuando CN<NRO-1 o B=0 se vuelva falso.
- El ciclo puede terminar si CN<NRO-1 se vuelve falso, esto ocurrirá cuando un número es
primo, lo cual indica que la bandera B no cambia su valor de 0, porque ningún número entre 2
y el número evaluado-1, lo dividió exactamente.
- El ciclo puede terminar si B=0 se vuelve falso. Esto ocurrirá cuando hay un número que lo
divide exactamente, lo que hace que la bandera cambie a 1 (B<-1 o b=1).
En la primera situación el ciclo realiza todas las iteraciones. En la segunda el ciclo no realiza todas
las iteraciones, en el momento en que haya un valor que lo divida exactamente, la bandera cambia
a 1 (B<-1 o b=1) lo cual va a indicar que B=0 o b==0 se vuelve falsa y toda la condición compuesta
se vuelva falsa.
Ahora, si hay una condición compuesta, en ejecución no se va a saber por que termina el ciclo, una
de las dos, fue la que se volvió falsa, por lo que se debe programar, para que después del ciclo se
determine el porque de la salida. Si se trabaja con bandera, generalmente se evalúa la bandera,
porque el propósito del ciclo es determinar si es primo o no.
Si la bandera cambia, no es primo.
Si la bandera no cambia es primo.
El algoritmo es el siguiente:
Inicio
Leer NRO
CN<- 1
B <- 0 // inicia la bandera en 0
Mientras (CN < NRO-1 and B= 0) Hacer
CN CN + 1
Si ( NRO MOD CN = 0)
Entonces
B <-1 // cambia la bandera
Fin si
Fin mientras
Si ( B=0)
Entonces
Escribir NRO, “ Es primo “
Sino
Escribir NRO, “ No es primo “
Fin si
Fin
También se pudo haber realizado lo siguiente después del ciclo. Preguntar si la que se volvió falsa
es la otra condición simple. Esto quedaría así:
Si ( CN=NRO-1)
Entonces
Escribir NRO, “ Es primo “
Sino
Escribir NRO, “ No es primo “
Fin si
#include <iostream>
using namespace std;
int main(){
int cn, nro,b;
Dentro de la programación hay muchos procesos que necesitan estár conmutando entre 2 grupos
de acciones o más. Cuando se presenta esto, se utiliza una bandera para que controle esta
conmutación. La conmutación se realiza dentro de un ciclo, donde los grupos de acciones se
ejecutan alternadamente, durante un conjunto determinado de veces.
Ejercicio bandera
Generar una cantidad dada de términos de la siguiente serie:
4 9 7 12 10 15 13 18 16 21 19 24 22 27 25
Entonces se tiene:
4 (+5) 9 (-2) 7(+5) 12(-2) 10(+5) 15(-2) 13(+5) 18
El ejercicio plantea que sumar 5 y restar 2 se realiza en forma alterna, lo cual indica que si se
ejecutó la suma de 5 la siguiente vez se debe restar 2 y luego sumar 5 y después restar 2. Esto lo
coordina la bandera de la siguiente forma:
Entonces,
1 2 3 4 5 7 8 9
0 sw=0? sw=0? sw=0? sw=0? sw=0? sw=0? sw=0?
4 si no si no si no si
9 7 12 10 15 13 18
CT
Cantidad de términos 9
NT NT NT NT NT NT NT NT
1 2 3 4 5 7 8 9
SW SW=0? SW=0? SW=0? SW=1? SW=0? SW=0? SW=0?
0 Si no si no si no si
T T T T T T T T
4 9<-4+5 7<-9-2 12 10 15 13 18
SW SW SW SW SW SW SW
1 0 1 0 1 0 1
CT
Cantidad de términos 9
Algoritmo
Inicio
Leer CT
NT<-1
SW<-0
T<-4
Escribir T
Mientras ( NT < CT ) Hacer
NT <- NT + 1
Si (SW= 0) Entonces
T<-T+5
Escribir T
SW <- 1 // Garantiza que la proxima vez va a restar 2
Sino
T<-T-2
Escribir T
SW <- 0 // Garantiza que la proxima vez va a sumar 5
Fin si
Fin mientras
Fin
Lo que está en otro color determina como se maneja la variable bandera SW para que alterne
acciones.
Es importante tener bien claro el comportamiento de un ciclo, porque muchas veces se realizan
acciones para que se tengan en cuenta en la próxima iteración o repetición del ciclo, como fue el
caso de los números de fibonacci, donde se dejaban listos los valores de A y B para la siguiente
repetición. En este ejercicio ocurre lo mismo el SW queda listo para que en la siguiente iteración el
flujo de ejecución se vaya por el bloque de acciones que le corresponde.
#include <iostream>
using namespace std;
int main(){
int ct,nt, sw,t;
Ejercicios
4 9 7 12 10 15 13 18
cdn
Cantidad de numeros 6
num
6 4 3 8 5 13
cp
P1
Primo 1 3
P2
Primo 2 5
sum
3+5 = 8
sum
8 es fibonacci?
si
Respuesta la suma de los dos primeros primos si es un número de fibonacci
Pasos genéricos
Definir variables
Determinar cantidad de datos
Leer dato por dato y realizar por cada dato
Determinar si es primo
Si es primo
Determinar si es el primero
Si es el primero marcarlo como primero
Sino es el primero
Determinar si es el segundo
Si es el segundo marcarlo como segundo
Sumar primo1 con primo2
Determinar si la suma es fibonacci
Este ejercicio para determinar el primer y el segundo primo utiliza un contador de primos, el cual
se va a incrementar cada vez que uno de los datos sea primo.
Cuando el contador de primos sea uno se puede obtener el primer primo en la variable p1, cuando
este sea 2 se obtiene el segundo primo en la variable p2, y para que no siga con el proceso se
utiliza una bandera para que termine el ciclo, igual que se hizo con los primos.
Inicio
Leer cdn
Cn <- 0
Cp <- 0
B1 <- 0
Mientras ( Cn < cdn & B1 = 0 ) hacer // controla la entrada de numeros
Cn<-Cn+1
Leer Num
c <- 1
b2 <- 0
Mientras (c < Num-1 & b2=0) hacer // Para determinar si es primo
c <- c+1
Si (Num mod c = 0) Entonces
b2 <- 1
Fin si
Fin mientras
Si ( b2=0) Entonces // El numero es primo
cp<-cp+1
Si (cp = 1) Entonces
p1<-Num // Se obtiene el primer primo
sino
si ( cp= 2) Entonces
p2<-Num // Se obtiene el segundo primo
B1 <- 1
fin si
fin si
fin si
Fin mientras
Sum <- p1+p2
A<-0
B<-1
T<-0
Mientras ( T < Sum ) Hacer // Genera serie de fibonacci hasta sum
T<-A+B
A<- B
B <- T
Fin mientras
Si ( T = Sum ) Entonces // Evalua si es fibonacci
Escribir “La suma ”, Sum, “ es fibonacci ”
Sino
Escribir “La suma ”, Sum, “ no es fibonacci ”
Fin si
Fin
#include <iostream>
using namespace std;
int main(){
int cdn,cn,nro,c,cp,b1,b2,p1,p2,sum,a,b,t;
cout<<”Cantidad de numeros -> ”;
cin>>cdn;
cn=0;
b1=0;
cp=0;
while (cn<cdn && b1==0){
cn=cn+1;
cout<<”Digitar numero “<<cn<<” -> “;
cin>>nro;
c=1;
b2=0;
//determina si el nro es primo
while (c<nro-1&&b2==0){
c=c+1;
if (nro%c==0)
b2=1;
}
if (b2==0){
cp=cp+1;
//determina si es el primer primo
If (cp==1)
p1=nro;
else
// determina si es el segundo primo
if (cp==2)
p2=nro;
b1=1; //cambia la bandera para terminar búsqueda
}
}
sum=p1+p2;
// determina si la suma de los primos es un número fibonacci
a=0;
b=1;
t=0;
while (t<sum){
t=a+b;
a=b;
b=t;
}
if (t==sum)
cout<<”la suma de los primos “<<sum<<” es un numero fibonacci “;
else
cout<<”la suma de los primos “<<sum<<” no es un numero fibonacci “;
return 0;
}
int main(){
int cdn,cn,nro,c,cp,b1,b2,p1,p2,sum,a,b,t;
Ejercicio de aplicación
Realizar un programa para el manejo de los pagos de los empleados de una empresa X, que tiene
la siguiente información:
Cantidad de empleados
Código empleado
Número de horas trabajadas
Valor de la hora
Porcentaje de descuento
Resultados
Por cada empleado
Codigo y sueldo Neto a pagar
Numero de empleados 2
_________________________________________________
Número empleado 1
Codigo1 1
Numero de Horas 20
Valor de hora 30000
Descuento 10%
Codigo2 2
Numero de Horas 30
Valor hora 50000
Descuento 15%
Este ejemplo tiene solo dos empleados, pero el modelo sirve para cualquier cantidad de
empleados.
Ejemplo
NEMP
Numero de empleados 2
_______________________________________________________
CE
Numero empleado 1
CODE
Codigo1 1
NHT
Numero de Horas 20
VALH
Valor de hora 300000
DES
Descuento 10%
NHT VALH SUELT
Total sueldo 20 * 30000 = 600000
SUELT PDESC DESCUENTO
Descuento 6000000 * 10 / 100 = 60000
SUELT DESCUENTO SUELN
Sueldo Neto 6000000 - 60000 = 540000
CODE SUELN
Resultado Codigo E001 Sueldo Neto 540000
SUMS
Suma neto 540000
SUMD
Suma Descuento 60000
__________________________________________________________
CE
Numero empleado 2
CODE
Codigo2 2
NHT
Numero de Horas 30
VALH
Valor hora 50000
PDESC
Descuento 15%
_________________________________________________________________
SUMS
Resultado Total sueldo empleados 1775000
SUMD
Total descuentos 285000
Definición de variables
NUME : Número de empleados numérico entero
CE : Contador de empleados numérico entero
CODE : Codigo del Empleado tipo alfanumérico
NHT : Número de horas trabajadas numerico entero
VALH : Valor hora numerico real
PDESC : Porcentaje descuento numerico entero
SUELT : Suedo total empleado numérico real
DESCUENTO : Descuento empleado numerico real
SUELN : Sueldo Neto empleado numerico real
SUMS : Acumulador sueldos netos numérico real
SUMD : Acumulador descuentos numérico real
Determinación de acciones
Algoritmo completo
Inicio
Leer NUME
SUMS <- 0
SUMD <- 0
CE <- 0
Mientras ( CE < NUME) Hacer
CE<-CE + 1
Leer CODE
Leer NHT
Leer VALH
Leer DESC
SUELT <- NHT * VALH
DESCUENTO <- SUELT * DESC/100
SUELN <- SUELT – DESCUENTO
Escribir “ Código Empleado “, CODE, “ Sueldo Neto “, SUELN
SUMS <- SUMS + SUELN
SUMD <- SUMD + DESCUENTO
Fin mientras
Escribir “ TOTAL SUELDO EMPLEADOS “, SUMS
Escribir “ TOTAL DESCUENTOS “, SUMD
Fin
Ejercicio anterior con diseño de entrada de información. Las modificaciones se limitan a establecer
un mensaje manejado con instrucciones de escribir, que detallan la información que se debe
digitar.
Esto hace parte del diseño, por lo que toma gran importancia cuando se selecciona el lenguaje de
programación en la fase de compilación
Si se tiene un material educativo computacional como el PseInt, se puede realizar aspectos que
tienen que ver con diseño, como en el siguiente caso:
Inicio
Escribir " CANTIDAD DE EMPLEADOS "
Leer NUME
SUMS <- 0
SUMD <- 0
CE <- 0
Mientras ( CE < NUME) Hacer
CE<-CE + 1
Escribir " CODIGO EMPLEADO "
Leer CODE
Escribir " HORAS TRABAJADAS "
Leer NHT
Escribir " VALOR HORA "
Leer VALH
Escribir " DESCUENTO "
Leer DESC
SUELT <- NHT * VALH
DESCUENTO <- SUELT * DESC/100
SUELN <- SUELT - DESCUENTO
Escribir " Código Empleado ", CODE, " Sueldo Neto ", SUELN
SUMS <- SUMS + SUELN
SUMD <- SUMD + DESCUENTO
Fin mientras
Escribir " "
Escribir " TOTAL SUELDO EMPLEADOS ", SUMS
Escribir " TOTAL DESCUENTOS ", SUMD
fin
#include <iostream>
using namespace std;
int main(){
// definición de variables
int nume,ce,code,nht,valh,pdesc,suelt;
float descuento,sueln,sums,sumd;
Para una empresa X se requiere realizar un programa que haga el calculo del valor a pagar a cada
uno de sus empleados, para lo cual se tiene la siguiente información:
Cantidad de empleados
Por cada empleado se tiene:
Código empleado
Número de Horas Trabajadas
Valor de la Hora
Para cada empleado se realiza un descuento de la siguiente forma:
Si el sueldo total está entre 0 – 200000 descuento del 5%
Si sueldo total está entre 200001 – 500000 descuento del 10%
Si Sueldo total es mayor que 500000 descuento del 12%
Resultados
Para este ejercicio se deben tener bien claro los siguientes conceptos.
Entrada de varios datos controlados por ciclos, para la entrada de cada uno de los empleados.
Control de un ciclo con contador
Calculos con acciones de asignación
Acciones de decisión para controlar los descuentos
Obtener el mayor y el menor de varios datos
Sumar varios datos, para la suma total de los sueldos y descuentos
Contador para el cálculo de promedios
Con todos los ejercicios anteriores se tiene ya se tiene la destreza para solucionar este problema.
Modelo mental
Modelo computacional
Algoritmo
Todos los ejercicios anteriores trabajados con ciclos, fueron controlados por contadores o por
condiciones que eran el resultado de operaciones aritméticas, como en el caso de los números
fibonacci, donde el T estaba en función de la suma de A y de B. En esencia estos ciclos que erán
controlados de esta forma, se denomina control de ciclos con un esquema cuantitativo.
Ahora y como complemento a lo anterior se tiene, que un ciclo también puede ser controlado con
un esquema cualitativo, el cual se describe a continuación.
Registro.
Conjunto de campos de memoria agrupados, con el objeto de manejar información relacionada y
que hace referencia a una situación, objeto, individuo etc.
Ejemplo
Registro empleado. Puede tener los siguientes campos
Código Empleado
Cédula
Nombres
Apellidos
Cargo
Fecha Ingreso
Fecha de Nacimiento
Hasta el momento en algunos ejercicios que se han realizado se ha trabajado con registros y en
especial con información de empleados para el cálculo del sueldo neto.
Dentro de la temática del manejo de ciclos con esquema cualitativo se trabaja mucho con el
concepto de registro y se tienen los siguientes conceptos:
Campo Centinela. Del grupo de campos de un registro, se determina un campo que va a llevar la
marca de fin de registros, generalmente es un código que identifica el registro, en el empleado
puede ser código del empleado o la cédula, y su valor debe ser del mismo tipo pero no debe estar
en el rango de los datos validos de procesamiento.
Dentro de la asignación de los códigos de una empresa se debe tener claro que el código 9999 no
debe ser asignado a ningún empleado, y va a servir para procesar información en diferentes
aplicativos que se relacionen con registros de empleados.
Para entrar información de varios registros que no se tiene la cantidad de registros, pero se sabe
que el último registro viene con un valor centinela se realiza lo siguiente.
Por cada empleado van a llegar varios registros o ninguno por lo que cabe la posibilidad de que
solo haya el registro centinela.
Cuando se trabaja con registros centinela, la lectura del registro no se lo hace en su totalidad, se
lee primero el campo centinela, y si este es de un registro válido, dentro del ciclo se lee el resto de
los campos, de la siguiente forma:
Leer CodigoEmpleado
Mientras ( CodigoEmpleado <> 9999) Hacer
Leer otros campos del registro
Leer CodigoEmpleado
Fin mientras
Leer CODE
Mientras ( CODE <> 9999) Hacer
Leer NHT,VHT,DES
Leer CODE
Fin mientras
Código empleado
Numero de horas trabajadas
Valor de la hora
Porcentaje de descuento
Resultados
Código Empleado
Ejemplo
Codigo1 E001
Numero de Horas 20
Valor de hora 30000
Descuento 10%
Codigo2 E002
Numero de Horas 30
Valor hora 50000
Descuento 15%
Este ejemplo tiene solo dos empleados, el último registro tiene en el código de empleado 9999 por
lo tanto indica que no hay más.
Ejemplo
_______________________________________________________
CODE
Codigo1 E001
NHT
Numero de Horas 20
VALH
Valor de hora 300000
DES
Descuento 10%
NHT VALH SUELT
Total sueldo 20 * 30000 = 600000
SUELT PDESC DESCUENTO
Descuento 6000000 * 10 / 100 = 60000
SUELT DESCUENTO SUELN
Sueldo Neto 6000000 - 60000 = 540000
CODE SUELN
Salida Codigo E001 Sueldo Neto 540000
SUMS
Suma neto 540000
SUMD
Suma Descuento 60000
__________________________________________________________
CODE
Codigo2 E002
NHT
Numero de Horas 30
VALH
Valor hora 50000
PDESC
Descuento 15%
_________________________________________________________________
__________________________________________________________________
SUMS
Resultado Total sueldo empleados 1775000
SUMD
Total descuentos 285000
El ejemplo anterior tiene 3 registros, los dos primeros con valores válidos, y el tercero con valores
de fin de archivo, el cual solo tiene valor en el campo centinela CODE cuyo valor es 9999. En los
demás campos no hay valores validos, por eso no hay que leerlos.
Definición de variables
Determinación de acciones
Por cada empleado, se utilizan las mismas variables, esto permite trabajar con ciclos y servirá para
cualquier cantidad de empleados.
Leer CODE
Mientras ( CODE <> 9999) Hacer
Leer NHT
Leer VALH
Leer DESC
SUELT <- NHT * VALH
DESCUENTO <- SUELT * DESC/100
SUELN <- SUELT – DESCUENTO
Escribir “ Código Empleado “, CODE, “ Sueldo Neto “, SUELN
SUMS <- SUMS + SUELN
SUMD <- SUMD + DESCUENTO
Leer CODE
Fin mientras
Según el enfoque cualitativo, primero se lee el código ( Leer CODE) antes de ciclo, si el registro es
válido, entra al ciclo y lee los demás campos del registro (NHT,VALH, DESC ).
La última instrucción del ciclo es leer nuevamente el codigo del empleado unicamente (Leer
CODE), así, para el ultimo registro que es 9999, solo se leería este campo, y cuando se evalue en la
condición el ciclo va a terminar.
Algoritmo completo
Inicio
SUMS <- 0
SUMD <- 0
Leer CODE
Mientras ( CODE <> 9999) Hacer
Leer NHT
Leer VALH
Leer DESC
SUELT <- NHT * VALH
DESCUENTO <- SUELT * DESC/100
SUELN <- SUELT – DESCUENTO
Escribir “ Código Empleado “, CODE, “ Sueldo Neto “, SUELN
SUMS <- SUMS + SUELN
SUMD <- SUMD + DESCUENTO
Leer CODE
Fin mientras
Escribir “ TOTAL SUELDO EMPLEADOS “, SUMS
Escribir “ TOTAL DESCUENTOS “, SUMD
Fin
Según lo anterior:
CODE es el campo centinela y 9999 es el valor centinela, esto indica que al llegar este valor el ciclo
termina y por lo tanto la llegada de más datos de empleados.
#include <iostream>
using namespace std;
int main(){
// definición de variables
int code,nht,valh,pdesc,suelt;
float descuento,sueln,sums,sumd;
sums=0;
sumd=0;
cout<<”\n Codigo empleado -> ”;
cin>>code;
while(code!=9999) {
cout<<”\n Horas trabajadas -> ”;
cin>>nht;
cout<<”\n Valor hora -> ”;
cin>>valh;
cout<<”\nPorcentaje de descuento -> ”;
cin>>pdesc;
suelt=nht*valh;
descuento=suelt*pdesc/100;
sueln=suelt-descuento;
//muestra información de un empleado
cout<<”Codigo empleado “<<code<<” Sueldo neto ”<<sueln;
sums=sums+sueln;
sumd=sumd+descuento;
cout<<”\n Codigo empleado -> ”;
cin>>code;
}
//Resultados totales
cout<<”Total sueldos pagado “<<sums;
cout<<”\nTotal descuentos “<<sumd;
}
El anterior ejercicio, no me plantea la cantidad de datos, pero si me establece que los números son
positivos, por lo que se puede tener la condición del ciclo de entrada de datos, mientras el
número de entrada sea positivo.
Esto quiere decir que los datos van a llegar hasta que el dato de entrada sea negativo.
Numeros de entrada 3 8 5 10 30 7 -5
El modelo anterior presenta la pregunta ¿NRO>0?, lo que se entiende que por cada iteración se
hace la pregunta
Definición de variables
NRO :Campo numérico para la entrada de todos los datos. Entero
SP :Acumulador de los números pares. Entero
CP :Contador de números pares. Entero
PROMP :Promedio de los números pares. Real
Inicio
SP <- 0
CP <- 0
Leer NRO
Mientras ( NRO > 0 ) Hacer
Si ( NRO mod 2 = 0) Entonces
SP <- SP+NRO
CP <- CP + 1
Fin si
Leer NRO
Fin mientras
Si ( CP > 0 ) Entonces
PROMP <- SP/CP
Escribir “Promedio Pares = “, PROMP
Sino
Escribir “No hay numeros pares “
Fin si
Fin
#include <iostream>
using namespace std;
int main(){
// definición de variables
int nro,sp,cp;
float promp;
sp=0;
cp=0;
cout<<”\n Digitar numero -> ”;
cin>>nro;
while (nro>0){
if (nro%2==0){
sp=sp+nro;
cp=cp+1;
}
cout<<”\n Digitar numero -> ”;
cin>>nro;
}
if (cp>0){
promp=(float)sp/cp;
cout<<”Promedio de números pares -> “<<promp;
}
else
cout<<”No hay números pares “;
return 0;
}
Rompimiento de control
Uno de los conceptos que tienen gran aplicabilidad dentro de la computación, es el agrupamiento
de información y la toma de decisiones por cada grupo de datos. Esto obliga a que la información
esté agrupada por uno o varios campos.
Ejemplo 1
Un ejemplo claro es un directorio telefónico que está agrupado por apellido y dentro de apellido,
por nombres.
En el directorio vamos a encontrar que por un mismo apellido hay varias repeticiones y dentro de
estos apellidos van a existir varios usuarios con nombres repetidos, este orden facilita el buscar un
número telefónico.
Ejemplo. 2
En una empresa X se puede tener varios departamentos (contabilidad, informática, producción,
ventas, entre otros), identificados por un codigoDepartamento, y en cada departamento varios
empleados. Si la información de los empleados está agrupada por departamentos, se podría
determinar que pasa con cada departamento.
- Cuantos empleados tiene cada departamento
- Que departamento es el que más pagó por nómina
- Que departamento es el que más gasta.
Entre otros.
Ejemplo
La siguiente cantidad de números viene agrupada de la siguiente forma.
3 3 3 3 3 5 5 5 7 7 7 7-5
Aquí se presentan tres rompimientos de control, cuando se termina los 3 y comienza el 5., y
cuando termina el 5 y comienza el 7 y cuando termina el 7 y llega el fin de datos que es -5
El rompimiento de control puede tener diferentes niveles, la siguiente explicación muestra como
se debe trabajar el rompimiento de control de un nivel.
Ciclo externo . Controla la entrada de los datos y lo hace con registro centinela
Ciclo interno. Controla el rompimiento de control
Los dos ciclos van a trabajar con un campo centinela, como se había trabajado anteriormente.
Para el ciclo interno, se debe trabajar con un Campo Centinela auxiliar que va a controlar el valor
a repetir dentro del grupo. Esto se especifica en forma genérica de la siguiente forma:
Leer CampoCentinela
Mientras ( CampoCentinela <> ValorCentinela) Hacer
CentinelaAux <- CampoCentinela
Mientras ( CampoCentinela = CentinelaAux ) Hacer
Leer Siguientes campos del registro
Trabajar con el registro
Leer CampoCentinela
Fin mientras
Acciones a realizar con el grupo
Fin mientras
Ejercicio
Se tiene una cantidad de datos numéricos con valores repetidos y agrupados, determinar cual es el
dato que se repite y las veces que lo hace. Los datos son positivos y termina con -5
Ejemplo
3 3 3 7 7 7 7 13 13 13 -5
Resultado 3 3 veces
7 4 veces
13 3 veces
Modelo con nombres
Ejemplo
Nro Nro Nro Nro Nro Nro
3 3 3 7 7 7 7 13 13 13 -5
Aux Aux Aux
1 2 3 1 2 3 4 1 2 3
Aux CG
Resultado 3 3 veces
Aux CG
7 4 veces
Aux CG
13 3 veces
De lo anterior se puede concluir que cada vez que termine un grupo se debe mostrar los
resultados con ese grupo, en este caso mostrar el contador de grupo
Definicion de variables
Algoritmo
Inicio
Leer Nro
SF<-0
Mientras (Nro > 0) Hacer
Aux <- Nro // En Aux se guarda el representante del grupo
CG <- 0
Mientras ( Nro = Aux ) Hacer // recorre el grupo
CG <- CG + 1
Leer Nro
Fin mientras
Escribir “ Grupo “, Aux, “ “, CG, “ Veces “
Fin Mientras
Fin
#include <iostream>
using namespace std;
int main(){
// definición de variables
int nro,aux,cg;
cout<<”\n Digitar numero -> ”;
cin>>nro;
while (nro>0){
aux=nro; // determina el representante del grupo que va a iniciar
cg=0;
while (nro==aux){
cg=cg+1;
cout<<”\n Digitar numero -> ”;
cin>>nro;
}
//cuando se sale del ciclo, termina un grupo
cout<<”\n Grupo -> ”<<aux<<” “<<cg<<” veces”;
}
return 0;
}
Se debe tener en cuenta que los datos deben entrar agrupados, de lo contrario, no se puede
manejar el rompimiento de control.
Cuando se maneje el concepto de arreglo de datos, ya se los puede agrupar dentro de la memoria
y se puede aplicar el rompimiento de control.
Ejemplo
3 3 3 7 7 7 7 13 13 13 -5
Resultado 3 3 veces
7 4 veces
13 3 veces
Resultado
Grupo de mayor repetidos 7 Cantidad de repetidos 4
Ejemplo
Nro
3 3 3 7 7 7 7 13 13 13 -5
Aux CG
Resultado 3 3 veces
Aux CG
7 4 veces
Aux CG
13 3 veces
Resultado DMY GMY
Grupo de mayor repetidos 7 Cantidad de repetidos 4
El comportamiento es el mismo anterior pero tiene una variación, despues de contar los
elementos de cada grupo y mostrarlo, hace la comparación de que grupo es el mayor. Para esto
utilizamos dos variables.
GMY lo iniciamos en 0, para que cambien con el contador del primer grupo que llegue
DMY lo iniciamos en -5, que es el valor centinela.
GMY DMY
Grupo de mayor repetidos 7 Cantidad de repetidos 4
El resultado que va después del ciclo se lo realiza una vez termina el ciclo externo.
Entonces el algoritmo queda:
Definicion de variables
Inicio
GMY <- 0 // Para garantizar que la primera vez cambie
DMY <- -5
Leer Nro
Mientras (Nro <> -5) Hacer
Aux <- Nro // En Aux se guarda el representante del grupo
CG <- 0
Mientras ( Nro = Aux ) Hacer // recorre el grupo
CG <- CG + 1
Leer Nro
Fin mientras
Escribir “ Grupo “, Aux, “ “, CG, “ Veces “
Si ( CG> GMY) Entonces
GMY <- CG
DMY <- Aux
Fin si
Fin Mientras
Si GMY > 0 Entonces
Escribir " Grupo con mas datos repetidos ", DMY
Escribir " Cantidad de veces que se repite ", GMY
SiNo
Escribir " no hay grupos"
FinSi
Fin
Programa en lenguaje C++
#include <iostream>
using namespace std;
int main(){
// definición de variables
int nro,aux,cg,gmy,day;
cout<<”\n Digitar numero -> ”;
cin>>nro;
gmy=0; //se lo inicializa en 0 que representaría cuando no hay grupos
dmy=-5; // es el valor centinela, puede ser cualquier otro valor
while (nro!=-5){
aux=nro; // determina el representante del grupo que va a iniciar
cg=0;
while (nro==aux){
cg=cg+1;
cout<<”\n Digitar numero -> ”;
cin>>nro;
}
//cuando se sale del ciclo, termina un grupo
Para esto se maneja un campo de memoria de tipo carácter o alfanumérico que va a recibir una
respuesta que puede ser ‘S’o ‘N’ y dependiendo de esta respuesta, se ejecuta o nó las acciones del
ciclo.
Este método es muy utilizado , si se quiere dejar la decisión de terminar al usuario, dependiendo
de una respuesta.
El siguiente grupo de instrucciones, es una propuesta genérica de lo que sería un ciclo controlado
por pregunta y respuesta.
Modelo mental
Definición de variables
Resp
A
B
C
Sino
Escribir “Triangulo no valido”
finsi
Escribir " Desea procesar más triangulos (S/N) "
Leer resp
FinMientras
FinAlgoritmo
#include <iostream>
using namespace std;
int main(){
int a,b,c;
char resp;
Ejercicio
Modelo mental
23 mod 5 = 3
23
No es múltiplo de 5
Solución moverse en todos los múltiplos de 5 hasta llegar al número evaluado y preguntar si el
último número generado es el buscado.
5 10 15 20 25
¿23 = 25?
No
El 23 no es múltiplo de 5
5 10 15 20 25 30
Al final se pregunta
¿30=30?
Si
30 es múltiplo de 5
Pasos genéricos
Leer número
Generar la secuencia de 5 mientras sea menor que número
Si el número es igual al último generado
Entonces el número es múltiplo de 5
Sino el número no es múltiplo de 5
Num
Numero dado 23
C5 C5 C5 C5 C5
5 10 15 20 25
Num C5
¿23 = 25?
No
23 no es múltiplo de 5
Definición de variables
Num // entrada
Numero dado 23
Asignación
C5 C5 + 5
C5 0
Decisión
Si ( Num = C5 ) Entonces
Escribir Num, “ es múltiplo de 5”
Sino
Escribir Num, “ No es múltiplo de 5”
Fin si
Algoritmo
Inicio
Leer Num
C5<-0
Mientras ( C5 < Num ) hacer
C5 <- C5 +5
FinMientras
Si ( Num = C5) Entonces
Escribir Num, " Es multiplo de 5"
SiNo
Escribir Num, " No es multiplo de 5"
FinSi
Fin
Generar una secuencia con variaciones de -5 hasta llegar a 0, si se llega a 0 es múltiplo de 5 sino,
no lo es.
¿C5 = 0?
Si es múltiplo de 5
No No es múltiplo de 5
C5 C5 – 5
Antes de ciclo
C5 Num
Algoritmo
Inicio
Leer Num
C5<-Num
Mientras ( C5 > 0 ) hacer
C5 <- C5 -5
FinMientras
Si ( C5 = 0) Entonces
Escribir Num, " Es multiplo de 5"
SiNo
Escribir Num, " No es multiplo de 5"
FinSi
Fin
El anterior ejercicio determina un método para averiguar si un número determinado pertenece o
no a una serie que tiene unas características determinadas.
En el ejemplo la serie es la secuencia de 5, en donde se generó la serie hasta el número dado y se
averiguó que pasaba en esa frontera.
Algoritmo
Inicio
Leer Nro
SF<-0
Mientras (Nro > 0) Hacer
Aux <- Nro // En Aux se guarda el representante del grupo
CG <- 0
Mientras ( Nro = Aux ) Hacer // recorre el grupo
CG <- CG + 1
Leer Nro
Fin mientras
//Si DeterminarFibonacci(CG) = 0 Entonces
// SF<-SF+DeterminarFactorial(CG)
A<-0
B<-1
T<-0
Mientras T<CG hacer
T<-A+B
A<-B
B<-T
Fin Mientras
Si T=CG entonces
// Determinar factorial de CG