6. Ejercicio Molinos de Café

6.1. ejemplo de solución

/*
 *  Germán Andrés Xander 2021  *
 */

#include <iostream>
#define capacidad 200
#define molinos 20
using namespace std;

class molino{
    public:
        char ID=0;
        static float disponible;
        float molido=0;

        void moler(float cantidad){
            if (disponible >= cantidad){
                disponible -= cantidad;
                molido+=cantidad;
                cout<<endl<<"se molieron "<<cantidad<<" kg."<<endl<<"quedan disponibles "<<disponible<<" kg en el silo"<<endl;
            }else{
                cout<<endl<<"no hay suficiente café disponible"<<endl;
            }
        }

        void recargar(float cantidad){
            if ((disponible + cantidad)<= capacidad){
                disponible += cantidad;
                cout<<endl<<"se agregaron "<<cantidad<<" kg."<<endl<<"el silo ahora tiene "<<disponible<<" kg de café"<<endl;
            }else{
                cout<<endl<<"No fue posible cargar. Se excede la capacidad del silo"<<endl;
            }
        }

        molino * proximo;
};
float molino::disponible = capacidad;  

void agregar(molino *&lista);
void reporte(molino *lista);
void operar(char id, molino *lista);
void eliminar(molino *&lista);

int main(int argc, char **argv){
    char opcion;
	molino * planta=NULL;
    
    do{
        cout<<endl<<endl<<endl<<"1 agregar molino"<<endl<<"2 reporte"<<endl<<"(a,b,c...) operar molino "<<endl<<"0 salir"<<endl;
        cin>>opcion;
        switch (opcion){
            case '1':{
                agregar(planta);
                break;
            }
            case '2': {
                reporte(planta);
                break;
            }
            case '0': {
                cout<<endl<<"saliendo";
                break;
            }
            default:{
                if (opcion < 'a' or opcion >= 'a'+ molinos){
                    cout<<endl<<"opción no valida";
                }else{
                    operar(opcion,planta);
                }
            }
        }
    }while(opcion!='0');
    
    eliminar(planta);
    return 0;
}

void agregar(molino *&lista){
    int cantidad=1;
    molino *lista2=lista;
    char id='a';
    if (!lista){    //el primero
        lista=new molino;
        lista->ID=id;
        lista->proximo=NULL;
    }else{
        while(lista2->proximo!=NULL){
            lista2=lista2->proximo;
            cantidad++;
        }
        if(cantidad < molinos){
            id=lista2->ID;
            lista2->proximo=new molino;
            lista2->proximo->ID=id+1;
            lista2->proximo->proximo=NULL;
        }else{
            cout<<endl<<"se alcanzo el limite de molinos";
        }
    }
}

void reporte(molino *lista){
    float total=0;
    cout<<endl<<endl<<"======== Reporte ==========";
    while(lista!=NULL){
        cout<<endl<<"Planta id: "<<lista->ID;
        cout<<endl<<"Molido: "<<lista->molido<<endl;
        total+=lista->molido;
        lista=lista->proximo;
    }
    cout<<endl<<"===========================";
    cout<<endl<<"Total molido: "<<total<<" kg";
    cout<<endl<<"Disponible: "<<lista->disponible<<" kg";
}
        
void operar(char id, molino *lista){
    char opcion;
    float cantidad;
    while(lista!=NULL){
        if(id==lista->ID){
            do{
                cout<<endl<<endl<<endl<<"1 Moler"<<endl<<"2 Recargar"<<endl<<"0 Volver"<<endl;
                cin>>opcion;
                switch (opcion){
                    case '1':{
                        cout<<endl<<"ingrese cantidad a moler"<<endl;
                        cin>>cantidad;
                        lista->moler(cantidad);
                        break;
                    }
                    case '2': {
                        cout<<endl<<"ingrese cantidad a recargar"<<endl;
                        cin>>cantidad;
                        lista->recargar(cantidad);
                        break;
                    }
                }
            }while(opcion!='0');
            break;
        }
        lista=lista->proximo;
    }
    cout<<endl<<"no existe el molino solicitado";
}

void eliminar(molino *&lista){
    molino *lista2;
    while(lista){
        lista2=lista;
        lista=lista->proximo;
        delete lista2;
    }
}