/******************************************************************************
Taller numero 4 Curso Estructura de Datos
Desarrollado por:
Bruce Alexander Varela Catalan.
Version del compilador: OlineGDB
Fecha de entrega: 10/06/2022
Enlace a video en youtube:
*******************************************************************************/
#include <iostream>
#include "Fraccion.h"
#include "Funciones.h" //Se crean las funciones externas en un archivo aparte
#include "stdlib.h"
using namespace std;
//system("clear"); Usar para limpiar pantalla en sistemas basados en Unix
int main()
{
int menu, numerador, denominador, contarlista;
Fraccion F;
Nodo<Fraccion> *L = NULL;
cout << "Este es el desarrollo del taller numero 4 del curso Estructura de datos." << endl;
cout << "Trabajaremos con Lista Lineal Simple de objetos clase Fraccion" << endl;
do
{
cout << endl;
cout << endl;
cout << "***************************************************" << endl;
cout << "MENU: Seleccione la opcion que desee" << endl;
cout << "***************************************************" << endl;
cout << "1. Agregar un objeto a la Lista" << endl;
cout << "2. Mostrar los elementos de la Lista" << endl;
cout << "3. Contabilizar los elementos donde el numerador es menor que el denominador" << endl;
cout << "4. Ver el MAYOR elemento de la Lista" << endl;
cout << "5. Ver el PROMEDIO de los elementos con numerador primo" << endl;
cout << "6. Salir del programa" << endl;
cout << "***************************************************" << endl;
cin >> menu;
switch(menu)
{
case 1:
cout << "******************************************************" << endl;
cout << "A continuacion agregaremos una Fraccion a la lista" << endl;
agregarfraccion(L);
cout << endl << "Volviendo al menu...";
cout << endl << "Presione cualquier tecla para continuar...\n";
cin.get();
cin.get();
break;
case 2:
cout << "******************************************************" << endl;
cout << "A continuacion se muestran las fracciones de la Lista" << endl;
mostrar(L);
cout << endl << "Volviendo al menu...";
cout << endl << "Presione cualquier tecla para continuar...\n";
cin.get();
cin.get();
break;
case 3:
cout << "******************************************************" << endl;
cout << "La cantidad de elementos cuyo numerador es menor que el denominador es: " << endl;
contarlista = contarcondicion(L);
cout << contarlista << endl;
cout << "******************************************************" << endl << endl;
cout << endl << "Volviendo al menu...";
cout << endl << "Presione cualquier tecla para continuar...\n";
cin.get();
cin.get();
break;
case 4:
cout << "******************************************************" << endl;
cout << "El mayor elemento de la lista es: " << endl;
F = mayorfraccion(L);
F.ver();
cout << "******************************************************" << endl;
cout << endl << "Volviendo al menu...";
cout << endl << "Presione cualquier tecla para continuar...\n";
cin.get();
cin.get();
break;
case 5:
cout << "******************************************************" << endl;
cout << "El PROMEDIO de las fracciones de la lista (con numerador PRIMO) es de: " << endl;
cout << promediofraccion(L) << endl;
cout << "******************************************************" << endl;
cout << endl << "Volviendo al menu...";
cout << endl << "Presione cualquier tecla para continuar...\n";
cin.get();
cin.get();
break;
case 6:
cout << endl<<"Saliendo del programa...\n";
cout << "Presione cualquier tecla para continuar...\n";
cin.get();
cin.get();
break;
default:
cout << "Por favor ingrese el numero de la opcion que desea ejecutar 1, 2, 3, 4, 5 o 6" << endl;
cout << "Pesione la tecla Enter para volver a intentarlo" << endl;
cin.get();
cin.get();
break;
}
}while(menu != 6);
return 0;
}
#include "Fraccion.h"
using namespace std;
template <class T> //LLS con plantillas
struct Nodo
{
T info;
struct Nodo *link;
};
int contarcondicion(Nodo<Fraccion> *L) //Funcion vista en clases 25-05-2022
{
int c=0;
Nodo<Fraccion> *P = L;
while(P != NULL)
{
if((P->info.getNum()) < (P->info.getDen()))
{
c++;
}
P = P->link;
}
return c;
}
template <class T>
void agregarfraccion(Nodo<T> *&L) //Al trabajar con plantillas se debe trabajar como Nodo puntero ya que no usamos typedef
{
int agregar, numerador, denominador;
do
{
Nodo<T> *p = new(Nodo<T>); //Iniciamos una Lista aux que genera un nuevo nodo y lo agrega por la izquierda a L
cout << "********************************************" << endl;
cout << "Por favor ingrese el numerador de la Fraccion:" << endl;
cin >> numerador;
p->info.setNum(numerador);
cout << "Por favor ingrese el denominador de la Fraccion:" << endl;
cin >> denominador;
while(denominador == 0) //Ciclo de validacion del denominador
{
cout << "No puede ingresar un denominador igual a 0, ingrese otro numero entero: " << endl;
cin >> denominador;
}
p->info.setDen(denominador);
p->link = L;
L = p;
cout << endl << "¿Desea ingresar otra fraccion?" << endl << "1. Si" << endl << "0. No" << endl;
cin >> agregar;
while(agregar != 1 && agregar != 0)
{
cout << "Por favor ingrese una opcion valida" << endl;
cout << endl << "¿Desea ingresar otra fraccion?" << endl << "1. Si" << endl << "0. No" << endl;
cin >> agregar;
}
}while(agregar == 1);
}
template <class T>
void mostrar(Nodo<T> *L)
{
if(L == NULL)
{
cout << "*************La lista esta vacia*************" << endl;
}
while(L != NULL){
L->info.ver();
cout << endl;
L = L->link;
}
}
template <class T>
int contar(Nodo<T> *L) //Funcion vista en clases 25-05-2022
{
int c=0;
while(L != NULL){
c++;
L = L->link;
}
return c;
}
template <class T>
Fraccion mayorfraccion(Nodo<T> *L)
{
Fraccion Mayor;
float valor, valormayor = -33554431; //Un valor muy negativo en 4 byte 11111111111111111111111111111111
if(L == NULL)
{
cout << "********La lista esta vacia********" << endl;
}
while(L != NULL)
{
valor = (L->info.getNum() * 1.0)/ L->info.getDen();
if(valor >valormayor)
{
valormayor = valor;
Mayor = L->info;
}
L = L->link;
}
return Mayor;
}
int esprimo(int a) //Funcion para validar si un numero es primo
{
int divisor;
for(divisor = 2; divisor <= a/2 ; divisor++)
{
if(a%divisor == 0)
{
return 0; //Apenas encuentre un divisor retorna 0 y se acaba, el numero no es primo.
}
}
return 1;
}
template <class T>
float promediofraccion(Nodo<T> *L)
{
float prom = 0;
Fraccion TotalFrac; //Suma todas las fracciones de la lista
int contar = 0;
if(L == NULL)
{
return 0;
}
while(L != NULL)
{
if(esprimo(L->info.getNum()) == 1 && L->info.getNum() != 1 && L->info.getNum() != 0) //Solo acumula fracciones y las cuenta si el la funcion esprimo(numerador) retorna 1
{
TotalFrac.setNum((TotalFrac.getNum() * L->info.getDen()) + (L->info.getNum() * TotalFrac.getDen()));
TotalFrac.setDen(TotalFrac.getDen() * L->info.getDen());
for(int i = 2; i < 10; i++) //SIMPLIFICAMOS LA FRACCION PARA QUE NO SE ACUMULE TAN GRANDE (solo si es posible)
{
while(TotalFrac.getNum()%i == 0 && TotalFrac.getDen()%i == 0)
{
TotalFrac.setNum(TotalFrac.getNum()/i);
TotalFrac.setDen(TotalFrac.getDen()/i);
}
}
contar++;
}
L = L->link;
}
prom = ((TotalFrac.getNum()*1.0)/(TotalFrac.getDen()*1.0)) / contar; //El resultado decimal de la FRACCION final es dividido por el contador de fracciones en la lista = PROMEDIO
return prom;
}
#ifndef FRACCION_H
#define FRACCION_H
class Fraccion{
public:
Fraccion();
void ver();
void setNum(int);
void setDen(int);
int getNum();
int getDen();
Fraccion sumEsp(Fraccion);
private:
int num;
int den;
};
#endif // FRACCION_H
#include <iostream>
#include"Fraccion.h"
using namespace std;
Fraccion::Fraccion()
{
num = 0;
den = 1;
}
void Fraccion::ver()
{
cout << "Fraccion : " << num << "/" << den << endl;
}
void Fraccion::setNum(int a)
{
num = a;
}
void Fraccion::setDen(int a)
{
den = a;
}
int Fraccion::getNum()
{
return num;
}
int Fraccion::getDen()
{
return den;
}