RISOLTO [C++] Macchinetta distributore bibite

Tidusquall

Nuovo Utente
11
4
Ciao a tutti, ragazzi!
Il professore ci ha assegnato un compito a casa e sto avendo delle difficoltà, non tanto perché non mi ci metto con la testa, ma perché è suo solito assegnare esercizi senza spiegarci la teoria.
L'esercizio (l'ho allegato alla discussione) prevede l'utilizzo di struct e liste, che non abbiamo mai fatto.
Io chiedo solamente una mano su come impostare l'esercizio e poi sicuramente riuscirò a svolgerlo ?

Per il momento ho fatto questo...può andare?
C++:
#include <iostream>
#include <string>
#include <list>

using namespace std;


struct Prodotto {
    string nome;
    float prezzo;
};

struct Fila {
    int indice;
    int quantita;
};


int main() {
   

    Fila M[3][3];
    struct Prodotto CocaCola;
    struct Prodotto Fanta;

    CocaCola.nome = "CocaCola";
    CocaCola.prezzo = 0.85;
    Fanta.nome = "Fanta";
    Fanta.prezzo = 0.75;
   

}

Per il resto dell'esercizio, come creo una lista L di N elementi di tipo Prodotto?

Chiedo scusa a tutti ma non sono cose che purtroppo abbiamo fatto, non capisco perché proprio a fine anno ci mettano ste cose senza spiegare la teoria...(ci danno pure il voto)..
 

Allegati

  • Compito_macchinetta.pdf
    365.5 KB · Visualizzazioni: 67
Ultima modifica da un moderatore:

Andretti60

Utente Èlite
6,440
5,091
Nel testo del compito a me pare che per “lista” si intenda un “vettore”. Che è la cosa più semplice da implementare quando si ha a che fare con un numero assegnato di elementi.
 

bigendian

Utente Attivo
749
432
OS
Linux
puoi usare un semplice array di strutture, statico controllandone dimensione / fine, o dinamico, oppure le STL, che sono parte del c++, dunque std::vector o std::list.
 
  • Mi piace
Reazioni: Andretti60

Tidusquall

Nuovo Utente
11
4
Nel testo del compito a me pare che per “lista” si intenda un “vettore”. Che è la cosa più semplice da implementare quando si ha a che fare con un numero assegnato di elementi.
Purtroppo sono sempre al punto di partenza, poiché nel programma scolastico siamo arrivati agli array bidimensionali, ma i vettori le liste e le strutture mai fatte. Calcola che abbiamo fatto settimana scorsa gli enumeratori, e nemmeno li ha spiegati...ha detto "andate su internet a documentarvi"..
 

DispatchCode

Moderatore
Staff Forum
Utente Èlite
2,223
1,854
CPU
Intel I9-10900KF 3.75GHz 10x 125W
Dissipatore
Gigabyte Aorus Waterforce X360 ARGB
Scheda Madre
Asus 1200 TUF Z590-Plus Gaming ATX DDR4
HDD
1TB NVMe PCI 3.0 x4, 1TB 7200rpm 64MB SATA3
RAM
DDR4 32GB 3600MHz CL18 ARGB
GPU
Nvidia RTX 3080 10GB DDR6
Audio
Integrata 7.1 HD audio
Monitor
LG 34GN850
PSU
Gigabyte P850PM
Case
Phanteks Enthoo Evolv X ARGB
Periferiche
MSI Vigor GK30, mouse Logitech
Net
FTTH Aruba, 1Gb (effettivi: ~950Mb / ~480Mb)
OS
Windows 10 64bit / OpenSUSE Tumbleweed
Da una parte il suo approccio non è sbagliato, almeno entrate subito nella modalità corretta: cercare in autonomia e studiare per conto proprio ciò che serve. Per contro visto che siete a scuola due parole potrebbe anche spenderle...

Anche io per "lista" immagino intenda un array. Spero voglia farvi usare almeno la STL; al posto tuo utilizzerei std::vector, visto che non ha dato linee quida da seguire. Puoi fare riferimento a questo (ti ho linkato uno delle funzioni, così vedi anche l'esempio): https://www.cplusplus.com/reference/vector/vector/push_back/

La lista nel tuo caso sarà ad esempio vector<Prodotto>. L'elenco completo delle funzioni lo vedi qui https://www.cplusplus.com/reference/vector/vector/

Chiaramente non è corretto quello che hai mostrato nel tuo codice; non serve che crei CocaCola e Fanta, deve essere dinamica, e contenere N elementi (il nome del prodotto è un attributo della struttura Prodotto).
Ti faccio anche un esempio "alla buona":

C++:
    vector<Prodotto> prodotti;
    int read = 0;
    
    do {
        cout << "Inserisci il nome del prodotto e il prezzo: \n";
        
        string nome_prodotto;
        float prezzo;
        
        cin.ignore();
        getline(cin, nome_prodotto);
        cin >> prezzo;
    
        prodotti.push_back({nome_prodotto, prezzo});
    
        cout << "Vuoi inserire altri prodotti? [0 = no, 1 = si]\n";
        cin >> read;
    
    } while(read);
 

Tidusquall

Nuovo Utente
11
4
Da una parte il suo approccio non è sbagliato, almeno entrate subito nella modalità corretta: cercare in autonomia e studiare per conto proprio ciò che serve. Per contro visto che siete a scuola due parole potrebbe anche spenderle...

Anche io per "lista" immagino intenda un array. Spero voglia farvi usare almeno la STL; al posto tuo utilizzerei std::vector, visto che non ha dato linee quida da seguire. Puoi fare riferimento a questo (ti ho linkato uno delle funzioni, così vedi anche l'esempio): https://www.cplusplus.com/reference/vector/vector/push_back/

La lista nel tuo caso sarà ad esempio vector<Prodotto>. L'elenco completo delle funzioni lo vedi qui https://www.cplusplus.com/reference/vector/vector/

Chiaramente non è corretto quello che hai mostrato nel tuo codice; non serve che crei CocaCola e Fanta, deve essere dinamica, e contenere N elementi (il nome del prodotto è un attributo della struttura Prodotto).
Ti faccio anche un esempio "alla buona":

C++:
    vector<Prodotto> prodotti;
    int read = 0;
   
    do {
        cout << "Inserisci il nome del prodotto e il prezzo: \n";
       
        string nome_prodotto;
        float prezzo;
       
        cin.ignore();
        getline(cin, nome_prodotto);
        cin >> prezzo;
   
        prodotti.push_back({nome_prodotto, prezzo});
   
        cout << "Vuoi inserire altri prodotti? [0 = no, 1 = si]\n";
        cin >> read;
   
    } while(read);
Ti ringrazio molto, vado immediatamente a documentarmi sui link che hai postato!
 
  • Mi piace
Reazioni: DispatchCode

Andretti60

Utente Èlite
6,440
5,091
Scusa sai, ma il tuo approccio allo studio è completamente sbagliato, te ne parlo perché sono stato da entrambe le parti della cattedra (sia alle superiori che all’uni).

Un insegnante deve spiegare la teoria, eventualmente fare degli esempi. Ma ovviamente non puoi insegnare tutta la teoria, solo le nozioni di base (che sono le più importanti) e non può fare esercizi e esempi che che comprendano tutti i casi possibili. Ho visto troppi studenti lamentarsi di compiti in classe perché “non ci aveva mai spiegato questo”: certo che no, ma avevo spiegato tutta la teoria per capire “come” un esercizio del genere che davo andava poi eseguito. La scuola non serve a fornire “pappagalli” che ripetono solo quello che sentono, serve a educare professionisti che sanno usare il cervello basandosi sulle nozioni di base che vengono insegnate. Perché poi, ti assicuro, quando andrai a lavorare nel settore che hai scelto (informatica) non ti troverai mai la pappa pronta, dovrai usare il cervello, esaminare il problema, cercare una soluzione, eventualmente trovare la soluzione migliore.

Specialmente il settore informatico che è enormemente vasto. La scuola ti insegna i concetti base, ma poi non ti può andare a spiegare uno ad uno tutte le funzioni di una libreria. L’insegnante ti potrà dire che in un certo linguaggio esiste una libreria per eseguire certe operazioni, l’esempio che altri ti hanno già citato qui in C++ esiste la std::vector, che è vasta, spetta a te informarti, andare a leggere il suo manuale, vedere che metodi offra, e quali siano i più adatti da applicare al tuo caso. Il nostro lavoro è ben diverso da quello di un idraulico e un conduttore di autobus, lo dico senza togliere niente a loro, mio padre era manovale e so cosa voglia dire. E mio padre faticava (è mancato anni fa) a capire cosa facevo, continuava a dire “ma hai studiato così tanto, perché adesso che lavori devi continuare a studiare”? In due mesi sono 62 anni sotto il mio groppone, e continuo a studiare cose nuove, come viene richiesto dalla mia professione, e non ho nessun insegnante di cui lamentarmi “perché non me li avesse insegnati”.

Per favore, leggi questo come una critica costruttiva. È quello che mi dicevano anche i buoni insegnanti che avevo alle superiori. Quello che si richiede agli studenti è vedere se abbiano capito la teoria e vedere se la sappiano applicare, e più importante, vedere se dimostrano passione in quello che studiano. Il buon studente non è quello che sa ripetere tutto come un pappagallo.
 

Tidusquall

Nuovo Utente
11
4
Scusa sai, ma il tuo approccio allo studio è completamente sbagliato, te ne parlo perché sono stato da entrambe le parti della cattedra (sia alle superiori che all’uni).

Un insegnante deve spiegare la teoria, eventualmente fare degli esempi. Ma ovviamente non puoi insegnare tutta la teoria, solo le nozioni di base (che sono le più importanti) e non può fare esercizi e esempi che che comprendano tutti i casi possibili. Ho visto troppi studenti lamentarsi di compiti in classe perché “non ci aveva mai spiegato questo”: certo che no, ma avevo spiegato tutta la teoria per capire “come” un esercizio del genere che davo andava poi eseguito. La scuola non serve a fornire “pappagalli” che ripetono solo quello che sentono, serve a educare professionisti che sanno usare il cervello basandosi sulle nozioni di base che vengono insegnate. Perché poi, ti assicuro, quando andrai a lavorare nel settore che hai scelto (informatica) non ti troverai mai la pappa pronta, dovrai usare il cervello, esaminare il problema, cercare una soluzione, eventualmente trovare la soluzione migliore.

Specialmente il settore informatico che è enormemente vasto. La scuola ti insegna i concetti base, ma poi non ti può andare a spiegare uno ad uno tutte le funzioni di una libreria. L’insegnante ti potrà dire che in un certo linguaggio esiste una libreria per eseguire certe operazioni, l’esempio che altri ti hanno già citato qui in C++ esiste la std::vector, che è vasta, spetta a te informarti, andare a leggere il suo manuale, vedere che metodi offra, e quali siano i più adatti da applicare al tuo caso. Il nostro lavoro è ben diverso da quello di un idraulico e un conduttore di autobus, lo dico senza togliere niente a loro, mio padre era manovale e so cosa voglia dire. E mio padre faticava (è mancato anni fa) a capire cosa facevo, continuava a dire “ma hai studiato così tanto, perché adesso che lavori devi continuare a studiare”? In due mesi sono 62 anni sotto il mio groppone, e continuo a studiare cose nuove, come viene richiesto dalla mia professione, e non ho nessun insegnante di cui lamentarmi “perché non me li avesse insegnati”.

Per favore, leggi questo come una critica costruttiva. È quello che mi dicevano anche i buoni insegnanti che avevo alle superiori. Quello che si richiede agli studenti è vedere se abbiano capito la teoria e vedere se la sappiano applicare, e più importante, vedere se dimostrano passione in quello che studiano. Il buon studente non è quello che sa ripetere tutto come un pappagallo.
Io comprendo benissimo ciò che dici, ma non trovo che il mio approccio allo studio sia sbagliato.
Non riesco a tollerare un professore che ci da un PDF di 3 pagine e dice "fatelo entro il 26 e cercate online gli argomenti che non abbiamo trattato". Io i manuali me li leggo pure, tant'è che l'esercizio chiede l'utilizzo delle Liste e me le sono andate a guardare, poi qui mi dite che non c'entrano nulla, e allora vedi che manca la spiegazione della teoria? Che faccio, mi invento i concetti?

Probabilmente il mio approccio sarà anche sbagliato e me ne scuso profondamente, non voglio in alcun modo risultare lo studente che vuole la pappa pronta, anzi. Ma almeno due dritte prima di dire "cercate online se non sapete farlo" senza una minima infarinatura della teoria su argomenti mai trattati, anche no.
 

DispatchCode

Moderatore
Staff Forum
Utente Èlite
2,223
1,854
CPU
Intel I9-10900KF 3.75GHz 10x 125W
Dissipatore
Gigabyte Aorus Waterforce X360 ARGB
Scheda Madre
Asus 1200 TUF Z590-Plus Gaming ATX DDR4
HDD
1TB NVMe PCI 3.0 x4, 1TB 7200rpm 64MB SATA3
RAM
DDR4 32GB 3600MHz CL18 ARGB
GPU
Nvidia RTX 3080 10GB DDR6
Audio
Integrata 7.1 HD audio
Monitor
LG 34GN850
PSU
Gigabyte P850PM
Case
Phanteks Enthoo Evolv X ARGB
Periferiche
MSI Vigor GK30, mouse Logitech
Net
FTTH Aruba, 1Gb (effettivi: ~950Mb / ~480Mb)
OS
Windows 10 64bit / OpenSUSE Tumbleweed
Io comprendo benissimo ciò che dici, ma non trovo che il mio approccio allo studio sia sbagliato.
Non riesco a tollerare un professore che ci da un PDF di 3 pagine e dice "fatelo entro il 26 e cercate online gli argomenti che non abbiamo trattato". Io i manuali me li leggo pure, tant'è che l'esercizio chiede l'utilizzo delle Liste e me le sono andate a guardare, poi qui mi dite che non c'entrano nulla, e allora vedi che manca la spiegazione della teoria? Che faccio, mi invento i concetti?

Probabilmente il mio approccio sarà anche sbagliato e me ne scuso profondamente, non voglio in alcun modo risultare lo studente che vuole la pappa pronta, anzi. Ma almeno due dritte prima di dire "cercate online se non sapete farlo" senza una minima infarinatura della teoria su argomenti mai trattati, anche no.

Puoi usare anche una lista se preferisci, oppure puoi chiedere al docente di chiarire quella parte... così ti levi il dubbio.

Comunque in C++ utilizzi vector o list più o meno allo stesso modo, almeno nell'inserimento degli elementi. Cambia il funzionamento interno delle due strutture dati; manipolare un vector è sicuramente più comodo, in quanto puoi accedere usando gli indici (come un normale array), cosa che in una list non puoi fare (dovresti utilizzare advance()).

Per questo sono propenso a pensare si tratti di un vector (che è un array allocato dinamicamente, espanso in automatico quando aumentano gli elementi che inserisci), e credo che Andretti e bigendian abbiano supposto la medesima cosa: è più semplice e se non avete trattato come si deve i puntatori e un minimo di strutture dati, non penso vi faccia usare una lista.

Ad ogni modo, prova a scrivere un pò di codice, poi pubblica pure qui, vediamo di darti qualche dritta per farti proseguire, quando avrai difficoltà o dubbi da chiarire.
 

Tidusquall

Nuovo Utente
11
4
Puoi usare anche una lista se preferisci, oppure puoi chiedere al docente di chiarire quella parte... così ti levi il dubbio.

Comunque in C++ utilizzi vector o list più o meno allo stesso modo, almeno nell'inserimento degli elementi. Cambia il funzionamento interno delle due strutture dati; manipolare un vector è sicuramente più comodo, in quanto puoi accedere usando gli indici (come un normale array), cosa che in una list non puoi fare (dovresti utilizzare advance()).

Per questo sono propenso a pensare si tratti di un vector (che è un array allocato dinamicamente, espanso in automatico quando aumentano gli elementi che inserisci), e credo che Andretti e bigendian abbiano supposto la medesima cosa: è più semplice e se non avete trattato come si deve i puntatori e un minimo di strutture dati, non penso vi faccia usare una lista.

Ad ogni modo, prova a scrivere un pò di codice, poi pubblica pure qui, vediamo di darti qualche dritta per farti proseguire, quando avrai difficoltà o dubbi da chiarire.
Il codice che ho scritto è un po' lungo, vorrei evitare spam inutile, ma comunque mi funziona abbastanza bene.
Ringrazio ancora tutti per i consigli.
 

DispatchCode

Moderatore
Staff Forum
Utente Èlite
2,223
1,854
CPU
Intel I9-10900KF 3.75GHz 10x 125W
Dissipatore
Gigabyte Aorus Waterforce X360 ARGB
Scheda Madre
Asus 1200 TUF Z590-Plus Gaming ATX DDR4
HDD
1TB NVMe PCI 3.0 x4, 1TB 7200rpm 64MB SATA3
RAM
DDR4 32GB 3600MHz CL18 ARGB
GPU
Nvidia RTX 3080 10GB DDR6
Audio
Integrata 7.1 HD audio
Monitor
LG 34GN850
PSU
Gigabyte P850PM
Case
Phanteks Enthoo Evolv X ARGB
Periferiche
MSI Vigor GK30, mouse Logitech
Net
FTTH Aruba, 1Gb (effettivi: ~950Mb / ~480Mb)
OS
Windows 10 64bit / OpenSUSE Tumbleweed
Il codice che ho scritto è un po' lungo, vorrei evitare spam inutile, ma comunque mi funziona abbastanza bene.
Ringrazio ancora tutti per i consigli.

Se pubblichi con il tag CODE non ci sono problemi. Non serve nemmeno metterlo sotto spoiler. Poi al limite interveniamo noi (staff).
Comunque, visti gli hint che ti abbiamo dato, sarei curioso di vedere il risultato ?
 
  • Mi piace
Reazioni: Tidusquall

Tidusquall

Nuovo Utente
11
4
Se pubblichi con il tag CODE non ci sono problemi. Non serve nemmeno metterlo sotto spoiler. Poi al limite interveniamo noi (staff).
Comunque, visti gli hint che ti abbiamo dato, sarei curioso di vedere il risultato ?
Ecco il codice che ho scritto.
Non riuscivo a fare il select della bevanda da console perché avrei dovuto modificare per l'ennesima volta la funzione preposta, ma nel main() posso decidere quale bevanda comprare, qui ad esempio ho preso "Fanta".

C++:
#include <iostream>

#define R 3 // Righe matrice
#define C 3 // Colonne matrice

#define N 2 // Numero prodotti

using namespace std;

// Struttura del singolo prodotto
typedef struct Prodotto
{
    string nome;
    float prezzo;
  
    /*
        Il costruttore vuoto serve per poter inizializzare
        la lista (si veda sotto) 
    */
    Prodotto()
    {
        nome = "";
        prezzo = 0;
    }
  
    /*
        Utilizzo il costruttore parametrizzato quando voglio
        aggiungere dei prodotti alla lista
    */
    Prodotto(string _nome, float _prezzo)
    {
        nome = _nome;
        prezzo = _prezzo;
    }
  
} Prodotto;

/*
    Uso typedef per creare un "alias" per un array di prodotti.
    Ora, ogni volta che dichiarerò una Lista non farò altro che
    dichiarare implicitamente un array di prodotti di dimensione
    pari a N 
*/
typedef Prodotto Lista[N];

// Struttura che costituisce una singola fila della mia matrice (macchinetta)
typedef struct Fila
{
    int indice;
    int quantita;
  
    /*
        Sfrutto il costruttore a zero parametri per far si che ogni fila
        non riempita manualmente risulti vuota, quindi con indice -1
        e quantità pari a 0
    */
    Fila()
    {
        indice = -1;
        quantita = 0;
    }
  
    /*
        Sfrutto il costruttore parametrizzato per poter riempire una fila
    */
    Fila(int _indice, int _quantita)
    {
        indice = _indice;
        quantita = _quantita; 
    }
          
} Fila;

/*
    Uso typedef per creare un "alias" per una matrice di Fila.
    Ora, ogni volta che dichiarerò una Matrice non farò altro che
    dichiarare implicitamente una matrice di Fila di dimensione
    pari a RxC
  
    Ho fatto la stessa cosa poco sopra per Prodotto/Lista
*/
typedef Fila Matrice[R][C];

/*
    Funzione di stampa. Utilizzo la keyword const perchè dentro a questa funzione
    mi interessa solamente stampare i dati (quindi averci accesso in sola lettura)
    senza modificarli.
  
    N.B utilizzo la keyword const anche in altre funzioni per lo stesso motivo
*/
void stampa(const Matrice M, const Lista L)
{
    cout << "Contenuto di M:" << endl << endl;
  
    // Itero sulla matrice
    for(int r=0; r<R; r++)
    {
        for(int c=0; c<C; c++)
        {         
            cout << "[" << r << "," << c << "] : " << M[r][c].indice << ", " << M[r][c].quantita << endl;     
        }
    }
  
    cout << endl << "Prodotti in L:" << endl << endl;
  
    //itero sulla lista
    for(int i=0; i<N; i++)
    {
        cout << L[i].nome << " (" << L[i].prezzo << ")" << endl << endl;
    }
}

/*
    Passo la matrice per riferimento. Così facendo,
    modificando la matrice M della funzione, modificherò
    anche la matrice M del main (passata come argomento)
*/
void compra(Matrice &M, const int r, const int c)
{
    /*
        Se la riga o la colonna non sono valide
        (o perchè più grandi di C o R o perchè negative)
        esco dalla funzione (non modifico quindi la matrice
        in quanto i parametri passati non sono validi)
    */
    if(r >= R || c >= C || r < 0 && c < C)
    return;
  
    /*
        Se il prodotto che voglio modificare ha quantità > 0
        lo modifico
    */
    if(M[r][c].quantita > 0)
    {
        /*
            se la quantità è uguale a 1, allora
            sostituisco direttamente quella fila con una vuota.
            Se invece la fila ha più di un elemento, semplicemente
            sottraggo 1 alla quantità totale
        */
        if(M[r][c].quantita == 1)
        M[r][c] = Fila(-1,0);
        else
        M[r][c].quantita--;
    }
}

int funzione1(const Matrice M, const int r, const int c)
{
    /*
        Se la riga o la colonna non sono valide
        (o perchè più grandi di C o R o perchè negative)
        esco dalla funzione (non modifico quindi la matrice
        in quanto i parametri passati non sono validi)
    */
    if(r >= R || c >= C || r < 0 && c < C)
    {
        cout << 0 << endl;
        return 0;
    }
  
    //leggo la quanità del prodotto specificato in quella posizione
    cout << "Quantità: " << M[r][c].quantita << endl;
    return M[r][c].quantita;     
}


Prodotto funzione2(const Matrice M, const Lista L, const int r, const int c)
{
    /*
        Se la riga o la colonna non sono valide
        (o perchè più grandi di C o R o perchè negative)
        ritorno un prodotto vuoto (non modifico quindi la matrice
        in quanto i parametri passati non sono validi)
    */
    if(r >= R || c >= C || r < 0 && c < C)
    return Prodotto(); 
  
    /*
        Se l'indice del prodotto in quella posizione non è
        valido, ritorno un prodotto vuoto
    */
    if(M[r][c].indice >= N || M[r][c].indice < 0)
    return Prodotto();
  
    /*
        ritorno il prodotto della lista che ha indice pari a quello
        presente nell'elemento specificato
    */
    cout << L[M[r][c].indice].nome << " (" << L[M[r][c].indice].prezzo << ")" << endl << endl;
    return L[M[r][c].indice];
}

int funzione3(const Matrice M, const Lista L, const int X)
{
    /*
        Se l'indice del prodotto in quella posizione non è
        valido, ritorno 0
    */
    if(X >= N || X < 0)
    {
        cout << 0 << endl;
        return 0;
    }
  
    int quantita = 0;
  
    // Itero sulla matrice
    for(int r=0; r<R; r++)
    {
        for(int c=0; c<C; c++)
        {         
            /*
                Iterando sulla matrice, se mi accorgo di iterare
                sulla fila che ha indice della lista L pari a quello
                specificato da X, allora leggo la quantità e la sommo
                a quella totale
            */
            if(M[r][c].indice == X)
            quantita = quantita + M[r][c].quantita; 
        }
    }
  
    cout << "Quantità totale: " << quantita << endl;
    return quantita;
}

bool funzione4(const Matrice M, const Lista L, const int X)
{
    /*
        Converto il risultato della funzione precedente in booleano.
        Dunque, se quantità > 1 -> true, se quantità = 0 -> false
    */
    bool res = funzione3(M,L,X);
  
    if(res)
    cout << "Sono ancora presenti unità per questo prodotto" << endl;
    else
    cout << "Non sono piu presenti unità per questo prodotto" << endl;
  
    return res;
}

bool funzione5(const Lista L, string X)
{
    // Itero sulla lista
    for(int i=0; i<N; i++)
    {
        /*
            Se trovo il prodotto il cui nome è
            uguale a quello che sto cercando (definito da X)
            allora ritorno true
        */
        if(L[i].nome == X)
        {
            cout << "Il prodotto è nella lista" << endl;
            return true;
        }
    }
  
    //se arrivo qui vuol dire che non ho trovato il prodotto cercato
    cout << "Il prodotto non è nella lista" << endl;
    return false;
}

int main()
{
    Lista L;
    Matrice M;
  
    //inserisco i prodotti nella lista
    L[0] = Prodotto("Coca Cola",0.85);
    L[1] = Prodotto("Fanta",0.75);
  
    //inserisco i prodotti nella matrice
    M[0][1] = Fila(0,10);
    M[1][1] = Fila(1,0);
    M[2][1] = Fila(1,4);
    M[1][2] = Fila(0,5);
  
    stampa(M,L);
    compra(M,0,1);
  
    //implementazione funzioni
    funzione1(M,0,1);
    funzione2(M,L,0,1);
    funzione3(M,L,1);
    funzione4(M,L,1);
    funzione5(L,"Fanta");
}
 
  • Mi piace
Reazioni: Andretti60

DispatchCode

Moderatore
Staff Forum
Utente Èlite
2,223
1,854
CPU
Intel I9-10900KF 3.75GHz 10x 125W
Dissipatore
Gigabyte Aorus Waterforce X360 ARGB
Scheda Madre
Asus 1200 TUF Z590-Plus Gaming ATX DDR4
HDD
1TB NVMe PCI 3.0 x4, 1TB 7200rpm 64MB SATA3
RAM
DDR4 32GB 3600MHz CL18 ARGB
GPU
Nvidia RTX 3080 10GB DDR6
Audio
Integrata 7.1 HD audio
Monitor
LG 34GN850
PSU
Gigabyte P850PM
Case
Phanteks Enthoo Evolv X ARGB
Periferiche
MSI Vigor GK30, mouse Logitech
Net
FTTH Aruba, 1Gb (effettivi: ~950Mb / ~480Mb)
OS
Windows 10 64bit / OpenSUSE Tumbleweed
Bene!
Ho alcune osservazioni da fare.

1.
Generalmente non sono contrario al typedef, però in un caso come questo rende un pò più complicato capire il tipo di dato della variabile. Se guardo Lista L penso a un oggetto Lista, invece è un array contenente oggetti Lista di lunghezza N.
Dando un nome appropriato alla variabile, a mio avviso, si mitiga il "problema".

2.
I nomi delle variabili e delle funzioni: guardando il codice si deve comprendere cosa contiene quella variabile o quell'array. Inoltre per convenzione le variabili vanno in minuscolo, e le costanti in maiuscolo (quindi M e L andrebbreo in minuscolo).
Nel caso di L ad esempio, potresti chiamarla "lista", o meglio ancora "prodotti". M potrebbe essere il "distributore". X come nome della variabile non so cosa significhi, dovrei guardare il codice per capire cosa contiene. "funzione1", cosa fa? Dovrei capirlo leggendo il nome della funzione, non leggendo l'intera funzione.
Insomma, penso sia chiaro il punto. ?
A tal proposito, Andretti scrisse questo articolo/guida Come dare un nome alle variabili.

3.
Non so quanti commenti voglia il tuo docente, ma secondo me sono troppi. In un codice reale non useresti la metà di quei commenti; per fa un esempio, un commento come // Itero sulla lista è inutile: chi legge il codice sa cosa fa un ciclo for. Vale un pò il medesimo discorso sul typedef e sui costruttori.

4.
I tipi di ritorno delle funzioni. Considera che se una funzione ha un tipo di ritorno dovrebbe restituire un valore, che poi magari ha anche una certa utilità per il chiamante (il main() nel tuo caso). Tu scarti tutti i ritorni, quindi ne deduco non ti servano. Prendo come esempio "funzione1": restituisci la quantità, ma scarti di fatto il valore, non leggendolo. In più stampi su console dall'interno della funzione, cosa che sarebbe logicamente errata: vedi come una funzione che chiami come una funzione (scusa la ripetizione) che svolge un compito; il suo compito (di funzione1) è quello di darti una quantità.
Il modo in cui mostri a video questa quantità, non deve importare a "funzione1", non è il suo scopo. La cosa corretta da fare sarebbe quindi:

C++:
int funzione1(const Matrice M, const int r, const int c)
{
    if(r >= R || c >= C || r < 0 && c < C)
    {
        return 0;
    }
  
    return M[r][c].quantita;    
}


// Quando la chiami dal main()
cout << "Quantità: " << funzione1(M, 0, 1) << endl;

Colgo l'occasione per farti notare l'indentazione, ad esempio nella funzione2(). I return dovrebbero essere indentati, essendo interni all'if. Mi sembra ci sia anche un errore nella condizione di questo primo if; prova a dargli un occhio nuovamente.

Anche la funzione 2, potrebbe essere quindi riscritta così (io farei tornare null invece di un oggetto vuoto):

C++:
// Potrebbe chiamarsi getProdotto(), invece di funzione2()
Prodotto funzione2(const Matrice M, const Lista L, const int r, const int c)
{
    if(r >= R || c >= C || r < 0 && c < C)
        return Prodotto();
 
    if(M[r][c].indice >= N || M[r][c].indice < 0)
        return Prodotto();
 
    return L[M[r][c].indice];
}

E quindi la chiamerai così:

C++:
auto prodotto = funzione2(M, L, 0, 1);
cout << prodotto.nome << " (" <<prodotto.prezzo << ")" << endl << endl;

Penultima cosa: non stai usando tutta la memoria che stai allocando per la matrice. Inizializzi meno posizioni di quelle che dovresti; non è proprio corretto quello che hai fatto. Ti funziona tutto e non vedi valori strani solo perchè hai tutti gli indici "hard coded" nel codice (per dire, M[0][2] cosa contiene?).

Un'ultimissima cosa: sei certo che il prof voleva N, R e C con valori scelti da voi? Magari voleva qualcosa di dinamico, e voleva inserire valori in input.

Non mi addentro troppo in C++ nello specifico e lascio a chi lo conosce molto meglio di me, come Andretti e bigendian, l'onere di farlo (per non darti informazioni errate su come sia meglio impostare le cose).

Spero di essermi espresso bene, se hai domande chiedi pure. ?
 

bigendian

Utente Attivo
749
432
OS
Linux
ti rispsarmio inutili paternali, perche' mi sembri migliore di altri alunni che nemmeno tentano di scrivere il codice.
Cosa dire, cercare documentazione in internet e' il lavoro che farai ogni giorno, quindi non lo trovo affatto sbagliato.

I miei commenti:
1) compila ? hai usato alcuni typedef che coprono i nomi delel classi, mi aspetterei degli errori
2) toglierei i typedef, che per come li hai usati a nulla servono, e cmq non servono se non a creare _sempre e comunque_ confusione,
3) puoi fare
Codice:
Fila() : indice(-1), quantita(0) {}
al posto di
Codice:
Fila()
 {
        indice = -1;
        quantita = 0;
  }

per il resto non mi pare male, ma ho dato un occhiata veloce
 
  • Mi piace
Reazioni: DispatchCode

Tidusquall

Nuovo Utente
11
4
1.
Generalmente non sono contrario al typedef, però in un caso come questo rende un pò più complicato capire il tipo di dato della variabile. Se guardo Lista L penso a un oggetto Lista, invece è un array contenente oggetti Lista di lunghezza N.
Dando un nome appropriato alla variabile, a mio avviso, si mitiga il "problema".
Per il typedef, dico la verità, l'ho scoperto oggi mentre appunto sfogliavo guide online, mai usato in vita mia.. pensavo di fare cosa gradita per il professore. In merito alla Lista L avrei voluto provare con un oggetto Lista, ma poi mentre mi documentavo ho pensato che in fondo non mi cambiava poi molto utilizzare gli strumenti che già conosco. Forse avrei potuto uscire un po' dalla comfort zone.

2.
I nomi delle variabili e delle funzioni: guardando il codice si deve comprendere cosa contiene quella variabile o quell'array. Inoltre per convenzione le variabili vanno in minuscolo, e le costanti in maiuscolo (quindi M e L andrebbreo in minuscolo).
Nel caso di L ad esempio, potresti chiamarla "lista", o meglio ancora "prodotti". M potrebbe essere il "distributore". X come nome della variabile non so cosa significhi, dovrei guardare il codice per capire cosa contiene. "funzione1", cosa fa? Dovrei capirlo leggendo il nome della funzione, non leggendo l'intera funzione.
Insomma, penso sia chiaro il punto. ?
A tal proposito, Andretti scrisse questo articolo/guida Come dare un nome alle variabili.
Giuro, lo faccio sempre sempre, credo sia stato lo "stress" visto che è la prima volta che ci viene assegnato un compito così lungo e complesso (per gli standard a cui siamo abituati in classe). Do subito un occhio alla guida comunque perché mi piace approfondire.

3.
Non so quanti commenti voglia il tuo docente, ma secondo me sono troppi. In un codice reale non useresti la metà di quei commenti; per fa un esempio, un commento come // Itero sulla lista è inutile: chi legge il codice sa cosa fa un ciclo for. Vale un pò il medesimo discorso sul typedef e sui costruttori.
La consegna dice che sarebbe meglio commentare un po', ma forse ho esagerato effettivamente, correggo subito.

4.
I tipi di ritorno delle funzioni. Considera che se una funzione ha un tipo di ritorno dovrebbe restituire un valore, che poi magari ha anche una certa utilità per il chiamante (il main() nel tuo caso). Tu scarti tutti i ritorni, quindi ne deduco non ti servano. Prendo come esempio "funzione1": restituisci la quantità, ma scarti di fatto il valore, non leggendolo. In più stampi su console dall'interno della funzione, cosa che sarebbe logicamente errata: vedi come una funzione che chiami come una funzione (scusa la ripetizione) che svolge un compito; il suo compito (di funzione1) è quello di darti una quantità.
Il modo in cui mostri a video questa quantità, non deve importare a "funzione1", non è il suo scopo. La cosa corretta da fare sarebbe quindi:
Ecco qui mi sono un attimo perso, non credo di aver capito bene questo punto. Perché stampare direttamente dalla funzione è un errore logico? ?

Penultima cosa: non stai usando tutta la memoria che stai allocando per la matrice. Inizializzi meno posizioni di quelle che dovresti; non è proprio corretto quello che hai fatto. Ti funziona tutto e non vedi valori strani solo perchè hai tutti gli indici "hard coded" nel codice (per dire, M[0][2] cosa contiene?).
Non abbiamo ancora affrontato questi argomenti a scuola, puoi linkarmi qualche guida in merito a ciò di cui parli?

Un'ultimissima cosa: sei certo che il prof voleva N, R e C con valori scelti da voi? Magari voleva qualcosa di dinamico, e voleva inserire valori in input.
Ha detto che potevamo tranquillamente utilizzare staticamente i valori che ci ha "consigliato" nella consegna dell'esercizio, dunque ho usato il #define senza problemi.

Spero di essermi espresso bene, se hai domande chiedi pure. ?
Sei stato super gentile, oro colato per me! ?
Post unito automaticamente:

1) compila ? hai usato alcuni typedef che coprono i nomi delel classi, mi aspetterei degli errori
Compila senza problemi.

toglierei i typedef, che per come li hai usati a nulla servono, e cmq non servono se non a creare _sempre e comunque_ confusione
Ho voluto strafare io, correggo il codice, grazie mille!

per il resto non mi pare male, ma ho dato un occhiata veloce
Grazie mille, apprezzo molto! Calcola che sono uno studente di seconda superiore, dunque se il codice è un po' "immaturo" è anche perché non è che abbiamo affrontato chissà quali argomenti.. Per il resto cerco di documentarmi online.
 

Entra

oppure Accedi utilizzando
Discord Ufficiale Entra ora!