Domanda Rendere lo script più funzionale.

Chronalt14

Utente Silver
12 Agosto 2022
184
39
23
87
Buonasera a tutti, condivido con voi a capo un mio progetto di c++ che reputo il migliore a mani basse fatto fino ad ora:
C++:
/*
  Una parrucchiera ci chiede un software per il suo negozio.
  Il software deve fornire il seguente menu PER OGNI cliente:
  1-Taglio
  2-Taglio e piega
  3-Colore
  4-Esci
 
  Contare quanti clienti hanno usufruito PER OGNI SERVIZIO. ES taglio 4, taglio e piega 2, colore 3.
  Inoltre per ogni cliente chiedere l'età, si prevede infatti di dare un buono sconto da spendere la volta successiva per la cliente più anziana della giornata.
  Dare quindi in output il nome e l'età della cliente che ha vinto il buono.
*/

#include <iostream>
#include <string>

using namespace std;

int main()
{
    #define rosso "\033[31m"
    #define fine "\033[0m"
    #define verde "\033[32m"
    #define giallo "\033[33m"
    #define blu "\033[34m"
    #define magenta "\033[35m"

    cout<<rosso<<"Benvenuta nel centro parrucchieria, ecco i nostri servizi:"<<endl;
    cout<<"1 Taglio."<<endl;
    cout<<"2 Taglio e piega."<<endl;
    cout<<"3 Colore."<<endl;
    cout<<"4/Esci Uscita dal programma con l'output delle statistiche."<<fine<<endl;

    int scelta_servizio=0;
    int contatore_taglio=0;
    int contatore_taglio_e_piega=0;
    int contatore_colore=0;
    int eta_vincitrice_buono=0;
    string nome_vincitrice_buono="";

    do
    {
        int eta=0;
        string nome="";

        cout<<verde<<"Inserisca l'eta' o 4 se vuole uscire e vedere l'output delle statistiche: ";
        cin>>eta;
        if(eta==4)
        {
            cout<<"Ok, e' uscita, ecco le statistiche:"<<fine<<endl;
            break;
        }
        
        cout<<giallo<<"Inserisca il nome o Esci se vuole uscire e vedere l'output delle statistiche: ";
        cin>>nome;
        if(nome=="Esci")
        {
            cout<<"Ok, e' uscita, ecco le statistiche:"<<fine<<endl;
            break;
        }

        cout<<blu<<"Scelga il servizio: ";
        cin>>scelta_servizio;
        switch(scelta_servizio)
        {
            case 1:
                    cout<<"Ok, scelta confermata."<<endl;
                        contatore_taglio++;
            break;

            case 2:
                    cout<<"Ok, scelta confermata."<<endl;
                        contatore_taglio_e_piega++;
            break;

            case 3:
                    cout<<"Ok, scelta confermata."<<endl;
                        contatore_colore++;
            break;

            case 4:
                    cout<<"Ok, e' uscito/a."<<endl;
            break;

            default:
                    cout<<"Errore nella scelta, riprovare."<<fine<<endl;
            continue;
        }

        if(eta>eta_vincitrice_buono)
        {
            eta_vincitrice_buono=eta;
            nome_vincitrice_buono=nome;
        }
    }
    while(scelta_servizio!=4);

    cout<<magenta<<"Ecco quanti clienti hanno usufruito del taglio: "<<contatore_taglio<<endl;
    cout<<"Ecco quanti clienti hanno usufruito del taglio e della piega: "<<contatore_taglio_e_piega<<endl;
    cout<<"Ecco quanti clienti hanno usufruito del colore: "<<contatore_colore<<endl;
    cout<<"Ecco il nome di chi ha vinto il buono: "<<nome_vincitrice_buono<<endl;
    cout<<"Ecco l'eta' di chi ha vinto il buono: "<<eta_vincitrice_buono<<fine<<endl;

    return 0;
}
Come da titolo volevo qualche suggerimento per renderlo più funzionale XD.
 
Un modo per migliorarlo potrebbe essere usare una struttura dati comune per i servizi, ad esempio:

C++:
typedef struct
{
    int id;
    const char* nome;
    int contatore;
} Servizio;

Servizio servizi[] =
{
    { 1, "Taglio", 0 },
    { 2, "Taglio e piega", 0 },
    { 3, "Colore", 0 }
};

In questo modo puoi stampare il menu rapidamente e invece di avere una variabile specifica e un case dello switch per ogni servizio puoi fare tutto con una variabile:

C++:
int main()
{
    int scelta;
    // ...
    while (1)
    {
        for (Servizio& s : servizi)
            cout << s.id << " " << s.nome << endl;

        cout << "4 Esci" << endl;

        // inserimento nome/età...
       
        cout << "Scelga il servizio: ";
        cin >> scelta;

        if (scelta == 4)
            break;

        int ok = 0;
        for (Servizio& s : servizi)
        {
            if (s.id == scelta)
            {
                cout << "Ok, scelta confermata" << endl;
                s.contatore++;
                ok = 1;
                break;
            }
        }
        if (!ok)
            cout << "Errore nella scelta, riprovare" << endl;
    }
    for (Servizio& s : servizi)
        cout << "Ecco quanti clienti hanno usufruito del " << s.nome << ": " << s.contatore << endl;
   
    // età buono...
    return 0;
}