ALGORITMOS - Unidad 2 - Utilización de Estructuras Repetitivas, "Ciclos" y Subprogramas.
Procesos de Recurrencia
Juan Pablo Zapata Cuartas
&
Miguel Ángel Cano
Se conocen como procesos de recurrencia a las Estructuras de Repeticion dentro de los lenguajes de programación. De estas hay 3 en C++:
Sus usos son sumamente variados, pues son útiles para delimitar un rango específico de parámentros aceptables a la hora de pedir infomación a un usuario, delimitar un número de veces que el código será ejecutado, calcular una ecuación hasta un límite específico, entre otros usos.
Las estructuras ciclicas no pueden repetirse infinitamente, consumirian demasiada memoria. Por eso, hay que determinar el fin del bucle.
En WHILE, se aceptan condiciones cualitativas y cuantitativas para terminar el ciclo. Su sintaxis es: MIENTRAS(condicion) HAGA:
Instrucciones
FIN_MIENTRAS
Expresado en C++ de la siguiente manera:
while (condición)
{
Instrucciones
}
La variable de control que manipula a la condicion (en este caso llamada CONTADOR) para que se ejecute el bucle debe tener INICIALIZACION, EVALUACION Y TERMINACION.
Además, se diferencia esta variable cuando es un identificador y un centinela. Por ejemplo, a continuación un ejemplo de un contador usando la función while:
#include <iostream>
using namespace std; //All commands will be executed as STD files
int main() {
int numero;
numero=0;
cout<<"contemos hasta el 500. Desde donde quiere empezar?\n";
cin>>numero;
while (numero<501) {
cout<<"\n"<<numero<<"\n";
numero= numero+1;
}
return 0; //clear memory
}
ahora un ejemplo de un contador que pida las notas de los estudiantes y que cuando halle una nota menor que 3, que diga “perdio cucho”. Este no finalizara sino hasta que el usuario lo diga.
#include <iostream>
using namespace std; //All commands will be executed as STD files
int main() {
double nota;
char centinela;
centinela='y';
while (centinela=='y') {
cout<<"Indique la nota final del estudiante:\t\t";
cin>>nota;
if (nota<0||nota>5) {
cout<<"Ponga notas validas, eso no me sirve\n";}
else {
if (nota < 3) {
cout<<"El estudiante perdio";
} else { cout<<"Todo bien";
}
cout<<endl<<"Faltan estudiantes? (responda y / n)\t\t";
cin>>centinela;}
while (centinela!='y'&¢inela!='n') {
cout<<"Caracter invalido\n intente otra vez.\n\n";
cin>>centinela;}
}
return 0; //clear memory
}
Ahora, pedirle a ul usuario un numero entre el 1 y el 10, y que el que escoja le muestre la tabla de multiplicar de ese numero. ejemplo
escojo 2
y me muestra
2*1=2
2*2=4
2*3=6
y asi.
El codigo en c++ es este
#include <iostream>
using namespace std; //All commands will be executed as STD files
int main() {
int numero,contador,resultado;
contador=0;
cout<<"Con mucho gusto le muestro la tabla de multiplicacion del 1 al 10 de cualquier numero. De cual quiere que le ponga? Ojo, que sea un numero del 1 al 10 por fa\n";
cin>>numero;
while (numero<1||numero>10) {
cout<<"Te pedi que numeros fuera del rango de 1 a 10 no. Hagale otra vez por favor.\n";
cin>>numero;
}
resultado=numero*1;
cout<<"\nBueno, aqui se la pongo:\n1x"<<numero<<" ="<<resultado;
resultado=numero*2;
cout<<"\n2x"<<numero<<" ="<<resultado;
resultado=numero*3;
cout<<"\n3x"<<numero<<" ="<<resultado;
resultado=numero*4;
cout<<"\n4x"<<numero<<" ="<<resultado;
resultado=numero*5;
cout<<"\n5x"<<numero<<" ="<<resultado;
resultado=numero*6;
cout<<"\n6x"<<numero<<" ="<<resultado;
resultado=numero*7;
cout<<"\n7x"<<numero<<" ="<<resultado;
resultado=numero*8;
cout<<"\n8x"<<numero<<" ="<<resultado;
resultado=numero*9;
cout<<"\n9x"<<numero<<" ="<<resultado;
resultado=numero*10;
cout<<"\n10x"<<numero<<" ="<<resultado;
return 0; //clear memory
}
Ahora calcular la suma de 100-90+80-70+60…
#include <iostream>
using namespace std;
int main(){
//calcule la suma de 100-90+80-70...
int suma=0, contador=10;
cout<<"Empezar\n\n";
for(contador=100;contador>=0;contador-=10) {
if(contador/10%2==0) {
suma = suma+contador;
}
else {
suma = suma-contador;
}
}
cout<<suma;
return 0;
}
25/09/2024
CICLOS FOR
realiza un conjunto de operaciones determinado UN NÚMERO ESPECÍFICO DE VECES.
Usa una variable de control que se evalúa en cada iteración.
su sintaxis es:
PARA “VC” desde Punto_INICIO hasta Punto_FINAL con INCREMENTO (o DECREMENTO)
instrucciones
fin_para
for(VC=0;VC<30;i++) ESE I++ SIGNIFICA QUE SE INCREMENTARÁ DE UNO EN UNO EN CADA ITERACIÓN.
ejemplo:
PARA(i=1; i<n; i++){
cuerpo}
fin_para
un arreglo es una variable que tiene varios elementos (unidimensional = vector, bidimensional = matriz)Dos ejercicios en pseudocódigo:
Double i;
for(i=0.75;i<=5;i+=0.25) {
cout<< i;
}
o este otro:
Double n;
for(n=1;i<=0;i-=o.1) {
cout<< n;
}
para que un ciclo pueda demostrar esto: “un algoritmo que muestre los N primeros factoriales”
mira que debe haber una variable que acumule el valor de cada numero factorial que va a gregando a sí misma, y otra que sea un contador, pues se incrementa por su cuenta.
para calcular factorial = valor del contador * factorial.
#include <iostream>
using namespace std;
int main(){
long contador=1, factorial=1, valor_dado;
cout<<"Ingrese el numero que del cual desea mostrar los primeros factoriales:\n>> ";
cin>>valor_dado;
for(contador=1;contador<=valor_dado;contador++) {
factorial = contador * factorial;
cout<<endl<<contador<<"! = "<<factorial;}
return 0;
}
02/10/2024
HAGA MIENTRAS
La sentencia DO WHILE es una sentencia útil para realizar ciclos mientras que una condicion sea valida. Ella primero ejecuta el cuerpo de la sentencia y luego evalua la condicion, eso es lo que la hace diferente..
Su sintáxis es:
HAGA {
instrucción
} MIENTRAS(condición);
Por ejemplo, un programa que imprime un mensaje “continúa programa” hasta que se le ingrese un carácter de terminación 0.
#include <iostream>
using namespace std; //All commands will be executed as STD files
int main() {
char centinela='6';
do {
cout<<"\nContinuar Programa? Indique '0' para detener la impresion y cualquier otra tecla para continuar\n";
cin>>centinela;
} while(centinela!='0');
return 0; //clear memory
}
Este comando evita el uso excesivo de “if” statements.
Ahora un ejercicio de Acceso (a qué? a lo que quiera.) Hay una contraseña, y el usuario debe ingresar una contraseña PERO NO SE PUEDE EQUIVOCAR MÁS DE TRES VECES.
contraseña es: AF01IUPB, y al equivocarse la tercera vez, el programa imprimirá “error”
#include <iostream>
using namespace std; //All commands will be executed as STD files
int main() {
string contrasena="AG01IUPB",clave;
int cont_error=0;
do {
cout<<"\nIngrese la contrasena para acceder.\n>>";
cin>>clave;
if (clave!=contrasena) {
cout<<"Contrasena incorrecta, intentelo de nuevo";
cont_error = cont_error + 1;
}
else {
cout<<"\nbienvenido al sistema.";
}
if (cont_error>=3) {
while (cont_error>=3) {
cout<<"error";
}
}
} while(contrasena!=clave);
return 0; //clear memory
}
ahora otro ejercicio:
#include <iostream>
#include <bitset>
using namespace std; //All commands will be executed as STD files
int main() {
//Escriba un algoritmo que muestre en binario un numero entre 0 y 255
int decimal;
string binario="";
cout<<"\nIngrese un numero entre 0 y 255 para decirle el equivalente binario.\n\t>> ";
cin>>decimal;
while(decimal<=0 || decimal>=255) {
cout<<"Ese numero no es valido. Ingrese otro, por favor.\n\t>> ";
cin>>decimal;
}
do {
if (decimal%2==0) {
binario="0"+binario;}
else if (decimal%2==1){
binario="1"+binario;}
decimal/=2;
} while(decimal>=1);
cout<<binario;
/*int n1,n2,n3,n4,n5,n6,n7,n8;
n1=decimal%2;
decimal/=2;
n2=decimal%2;
decimal/=2;
n3=decimal%2;
decimal/=2;
n4=decimal%2;
decimal/=2;
n5=decimal%2;
decimal/=2;
n6=decimal%2;
decimal/=2;
n7=decimal%2;
decimal/=2;
n8=decimal%2;
cout<<n8<<n7<<n6<<n5<<n4<<n3<<n2<<n1;*/
return 0; //clear memory
}
Subprogramas
16-10-2024
Un subproblema es un módulo
Una cabecera de la función.}
que es una función: un programa que siempre tiene un parámetro de salida.
Tipo Nombre(lista de parámetros) {
declaraciones
instrucciones
return Valor} -> solo podrá devolver UN parámetro de toda la lista.
“trabajar por referencia” qué es?, quien sabe.
#include <string>
#include <iostream>
using namespace std;
//un programa que deje anotar varios estudiantes con su nombre y su nota. Y que al final muestre la mayor nota y el nombre del estudiante que la tuvo.
string nombre() {
string NAME;
cout<<"Ingrese el nombre del Estudiante.\n>";
cin.ignore()
getline (cin, NAME);
return NAME;
}
float nota() {
float GRADE;
cout<<"Ingrese la nota que saco el estudiante.\n>";
cin>>GRADE;
return GRADE;
}
int main() {
string N, MayorNombre, TotalEstudiantes;
float G, MayorNota = 0, TotalNotas;
cout<<"El Mejor estudiante del año.\nIngrese los siguientes datos:\n\n";
N=nombre();
G=nota();
TotalNotas +=G;
TotalEstudiantes +=N;
if (G > MayorNota) {
MayorNota = G;
MayorNombre = N;
}
}
30/10/2024
#include <iostream>
#include <string>
using namespace std;
/* Numero de empleados N, Valor INPUT,: Nombre, HorasTrabajadas, ValorHora, Salario (y este tiene condición:
Si el salario >
necesitamos funciones que: 1 Acumulen, 2 Calculo de Salarios,
empleado que mas gano en el mes, con cedula y todo.
*/
double Acumulador(double Acu, double Valor) {
Acu+=Valor;
return Acu;
}
double MayorGanador(double salariomayor, double salario, string &nombremayor, string nombre){
if(salario>salariomayor){//Asi tomara al primer valor en caso de que haya dos iguales. Para que tome al ultimo, pongale un = despues de mayorque
salariomayor=salario;
nombremayor=nombre;
}
return salariomayor;
}
double CalculoSalario(double HorasTrabajadas, double ValorHora, double &Impuestos, double &EPS){
double res, bono;
res=HorasTrabajadas*ValorHora;
if(res>=800000){
EPS=res*0.025;
Impuestos=res*0.045;
bono=0;
}
else{
EPS=res*0.02;
Impuestos=0;
bono=60000;
}
res=res-EPS-Impuestos+bono;
return res;
}
int main(){
double HorasTrabajadas, ValorHora, Impuestos, EPS, TotalEPS=0, TotalImpuestos=0, TotalSalario=0; //acumuladores =0
double salario, salariomayor=0;
string nombre, nombremayor="Cero, nanay";
int i,N;
cout<<"******Calculo de salarios empresa generica******\nIngrese el numero de empleados:\n> ";
cin>>N;
for (i=1;i<=N;i++){
EPS=0;//inicializar las variablas cada vez que se haga el proceso. Así no se combinan empleados distintos
Impuestos=0;
cout<<"\n\nIngrese el nombre del empleado:\n> ";
cin>>nombre;
cout<<"Ingrese la cantidad de horas trabajadas:\n> ";
cin>>HorasTrabajadas;
cout<<"Ingrese el valor monetario de cada hora:\n> ";
cin>>ValorHora;
//hora de llamar funciones
salario=CalculoSalario(HorasTrabajadas, ValorHora, Impuestos, EPS);
cout<<endl<<nombre<<" obtuvo un salario de $"<<salario<<"\nImpuestos cobrados: $"<<Impuestos<<"\nSeguridad Social: $"<<EPS<<endl;
//usa printf("%.2f\n", VARIABLE!) para imprimir con exactitud todos los digitos, evitando el e10*6.
TotalEPS=Acumulador(TotalEPS,EPS);
TotalImpuestos=Acumulador(TotalImpuestos,Impuestos);
TotalSalario=Acumulador(TotalSalario,salario);
salariomayor=MayorGanador(salariomayor,salario,nombremayor,nombre);
}
cout<<endl<<endl<<"*****/////*****/////*****"<<endl<<"Total Pagado en Salarios: $"<<TotalSalario<<endl<<"Total Recaudado en Impuestos: $"<<TotalImpuestos<<endl<<"Total Enviado a Seguridad Social: $"<<TotalEPS<<endl<<endl;
cout<<"Mayor salario registrado: "<<nombremayor<<"Con un impresionante total de $"<<salariomayor;
return 0;
}
Bibliografía:
González, J. D. M. (2018, March 20). Ciclos o Bucles. https://www.programarya.com/Cursos/C++/Ciclos#google_vignette
Equipo editorial de IONOS. (2023, July 28). Sencilla explicación de C++ for loop. IONOS Digital Guide. https://www.ionos.com/es-us/digitalguide/paginas-web/desarrollo-web/c-for-loop/
Programación ATS. (2016, March 30). 21. Programación en C++ || Ciclos o Bucles|| La sentencia for [Video]. YouTube. https://www.youtube.com/watch?v=_6AdtcVn4xs
Taller Final: Algoritmo con ciclos y Subfunciones.
Donde se expresa el siguiente algoritmo y su funcionamiento:
A lo largo del programa hay varios ciclos. Sus objetivos varían entre validar que las entradas sean correctas y permitir la repetición indefinida del ciclo. Aquí se encuentra el centinela que permite la continuación o termina al algoritmo.
MAPA MENTAL
En conclusión. el desarrollo de algoritmos y programas usando ciclos y funciones demuestra lograr características no solo más eficientes sino más efectivas a la hora de realizar determinadas funciones en situaciones que las requieran. Los ciclos no son simplemente para contar de dos en dos hasta cien, y los subprogramas son mucho más que código que no se carga de manera global.
Comentarios
Publicar un comentario