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++:

WHILE (mientras)
FOR (para)
DO-WHILE (Hacer mientras).


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'&&centinela!='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.




https://youtu.be/7I9fKAI2QEA

Se asignó un ejercicio cuyo objetivo era utilizar todo lo aprendido en esta segunda unidad. Entonces, se realizó lo anterior.
Donde se expresa el siguiente algoritmo y su funcionamiento:
Una empresa extranjera de aviación fumiga cosechas contra una gran variedad de plagas. Los valores cobrados a los granjeros dependen de lo que éste desea fumigar y de cuántas hectáreas se fumigan, de acuerdo a la siguiente distribución:
        Tipo 1: fumigación contra malas hierbas, 10 dólares por hectárea.
        Tipo 2.- fumigación contra langostas, 15 dólares por hectárea.
        Tipo 3: fumigación contra gusanos, 20 dólares por hectárea.
        Tipo 4: fumigación contra todo lo anterior, 30 dólares por hectárea.
Si el área a fumigar es mayor de 1.000 hectáreas, el granjero goza de un 5% de descuento.
Además, cualquier granjero cuya cuenta sobrepase los 3.000 dólares se le descuenta un 10% sobre la cantidad que exceda dicho precio. Si se aplican ambos conceptos, el correspondiente a la superficie se considera primero. Por cada pedido se tiene la siguiente información:
nombre del granjero, tipo de fumigación solicitada (1, 2, 3,4) y el número de hectáreas a fumigar.



#include <string>
#include <iostream>
using namespace std;


A continuación se observan varios subprogramas cuyas funciones se explican como comentarios dentro del código:

//Subprograma pa' coger el nombre
string DameNombre(){
string nombre;
cout<<"\n\nPor favor, indique su nombre para comenzar.\n>>";
cin.ignore();
    getline (cin, nombre);
    
    return nombre;
}

//Subprograma pa' coger hectareas
float DameHectareas(){
float hectareas;
cout<<"\n\nPara cotizar el valor de su fumigacion primero debera indicar el numero de hectareas que requieren del servicio. Por favor escribalo.\n>> ";
    cin>>hectareas;
    
    while (hectareas<=0) {
    cout<<"\nArea no valida. Por favor ingrese nuevamente el numero de hectareas.\n>> ";
    cin>>hectareas;
}
return hectareas;
}

//Subprograma pa' seleccionar el tipo de plaga y calcular el valor total
int DamePlaga(){
int plaga;
cout<<"\nAhora por favor ingrese el tipo de fumigacion que desea:\n(1) HERBICIDA \t\t= \t$10/hectarea\n(2) ANTILANGOSTAS \t= \t$15/hectarea\n(3) ANTIGUSANOS \t= \t$20/hectarea\n(4) TODO EN UNO \t= \t$30/hectarea\n\nTipo de fumigacion seleccionado:\n>> ";
cin>>plaga;
while (plaga<=0 || plaga>4) {
cout<<"\nEsa opcion no esta listada en nuestro catalogo. Intentelo de nuevo.\nTipo de fumigacion seleccionado:\n>> ";
cin>>plaga;}
return plaga;}
// void multi (int coste_neto)

void calcular_costo (double hectareas, double &desc_hectarea, double coste_neto, double &desc_3000, double &total)
{
    if (hectareas > 1000) {
desc_hectarea = coste_neto * 0.05;
total = coste_neto - desc_hectarea;
if (coste_neto > 3000) { //DESCUENTO DE $3000. PEGAR DESPUES
desc_3000 = 0.1 * (total - 3000);
total = total - desc_3000; }
else {
total = coste_neto;
desc_3000 = 0;}}
else {
desc_hectarea = 0;
if (coste_neto > 3000) {
desc_3000 = (coste_neto - 3000) / 10;
total = coste_neto - desc_3000; }
else {
total = coste_neto;
desc_3000 = 0;}}
}

Cada subprograma tiene un objetivo distinto, pero su funcionamiento es relativamente el mismo: Realizar una operación sin estar permanentemente cargados en el programa global, ahorrando así recursos, y retornando un estado específico cuando son llamados.
//Que suene !
int main(){
string nombre, fumigacion;
    double hectareas, total, coste_neto, desc_hectarea, desc_3000;
    int plaga, multiplicador;
    char cliente;

//Inicia loop del algoritmo.
    cout<<"**** EMPRESA DE FUMIGACION GENERICA ****\n\n  Juan Zapata Cuartas y Miguel Angel Cano\n\n***";
    do{
   
//Seleccionador del nombre del cliente.
    nombre = DameNombre();
//Entrada de datos de hectareas (y si son validas o no) y el tipo de fumigación (y si es valida o no)
hectareas = DameHectareas();
plaga = DamePlaga();

//Asignación del multiplicador del descuento en base a la plaga seleccionada y calculo del precio neto de la fumigación.
switch(plaga) {
case 1: multiplicador = 10;
fumigacion = "HERBICIDA";
break;
case 2: multiplicador = 15;
fumigacion = "ANTILANGOSTAS";
break;
case 3: multiplicador = 20;
fumigacion = "ANTIGUSANOS";
break;
case 4: multiplicador = 30;
fumigacion = "TODO EN UNO";
break;
default: multiplicador = 1;
break;}
coste_neto = hectareas * multiplicador;
//Calculo de descuentos y totales en base a la información suminstrada.
calcular_costo (hectareas, desc_hectarea,coste_neto, desc_3000, total);
//Impresion de los resultados
cout<<"\n\n*\t\t*\t\t\n\n";
cout<<"Estimado cliente "<<nombre<<", usted solicito el servicio de fumigacion de "<<fumigacion<<", para aplicarse en "<<hectareas<<" hectareas.\nPrecios calculados para el servicio:\n";
cout<<"\nValor Neto \t\t\t\t\t\t\t\t=\t $"<<coste_neto<<"\nDescuento de 5% del total por mas de 1000 hectareas aplicado \t\t=\t $"<<desc_hectarea<<"\nDescuento por monto superior a $3000 de 10% del excedente aplicado \t=\t $"<<desc_3000<<"\n\nPrecio Total \t\t\t\t\t\t\t\t=\t $"<<total;
cout<<"\n\n***\t\t***\t\t\n\n";

//repeticion o terminacion del loop
cout<<"Si no hay ningun otro cliente que desee usar el servicio, por favor responda [n].\n>> ";
cin>>cliente;
} while (cliente!='n');

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. 

    return 0;
}


Y a continuación se muestra un mapa mental explicando cómo se realizó el 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

Entradas más populares de este blog

ALGORITMOS - Unidad 1 - Ingenieria de Desarrollo de Software - 2024-2