//Commesso: commesso.cpp #include <stdio.h> #include <stdlib.h> #include "commesso.h" /******************************************************/ /* Classe Commesso */ /******************************************************/ void Commesso::Scegli (CapoScelto scelto) { int HaTaglia = 0; // Nessuna taglia int HaColore = 0; // Nessun colore int i; menu *m = 0; // Il menu' che ci serve switch (scelto) { case Maglione : HaTaglia = -1; // Maglione ha taglia HaColore = -1; // Maglione ha colore new AttrList (&criteri,AttrList::eq,AttrList::genere,"Maglione"); break; case Camicia : HaTaglia = -1; // Camicia ha taglia HaColore = -1; // Camicia ha colore new AttrList (&criteri,AttrList::eq,AttrList::genere,"Camicia"); break; case Pantaloni : HaTaglia = -1; // Pantaloni hanno taglia HaColore = -1; // Pantaloni hanno colore new AttrList (&criteri,AttrList::eq,AttrList::genere,"Pantaloni"); break; case Cintura : HaTaglia = -1; // Cintura ha taglia new AttrList (&criteri,AttrList::eq,AttrList::genere,"Cintura"); break; case Cravatta : new AttrList (&criteri,AttrList::eq,AttrList::genere,"Cravatta"); break; } // Adesso crea il menu per i dati aggiuntivi del capo (se ne voglio) new MenuModello (&m, "Modello"); // Sicuramente un modello if (HaTaglia) // Se il capo ha la taglia, introduce i tre confronti { new MenuTagliaPiu (&m, "Taglia maggiore o uguale a"); new MenuTagliaMeno (&m, "Taglia minore o uguale a"); new MenuTaglia (&m, "Taglia uguale a"); } if (HaColore) // Se il capo ha un colore, menu per inserire il colore new MenuColore (&m, "Colore"); new MenuCerca (&m, "Cerca"); // Menu' 'cerca', che avvia la ricerca // Loop di esecuzione del menu', finche' non si sceglie 'Cerca' (voce 1) do { i = m->print (1); m->doaction (i,this); } while (i != 1); delete m; // Elimina il menu della scelta // Menu per la scelta tra i capi estratti dal magazzino m = 0; // Inizializza a 0 il puntatore, per creare un altro menu new MenuVediScelti (&m, "Guarda Scelti"); new MenuVediDisponibili (&m, "Guarda Disponibili"); new MenuScegli (&m, "Scegli Capo"); new MenuScarta (&m, "Scarta Capo"); new MenuCompra (&m, "Compra"); // Loop che esegue il menu' fintantoche non si sceglie la voce 'Compra' (1) do { i = m->print (1); m->doaction (i,this); } while (i != 1); delete m; // Elimina il menu' della scelta } void Commesso::Cerca () { scelti = mag -> Select (criteri); // Dati i criteri, controlla il magazzino } void Commesso::ListaScelti () { if (comprati) // Se ci sono capi in lista comprati -> show (1); // Li mostra else // Altrimenti printf ("Nessun capo scelto\n"); // Dice che non ce ne sono printf ("Premi <a capo> per continuare"); // Pausa... getchar (); } void Commesso::ListaDisponibili () { if (scelti) // Se ci sono capi in lista scelti -> show (1); // Li mostra else // Altrimenti printf ("Nessun capo disponibile\n"); // Dice che non ce ne sono printf ("Premi <a capo> per continuare"); // Pausa... getchar (); } void Commesso::Compra () { if (scelti) // Se ci sono capi non comprati mag -> Add (scelti); // Li rimette in magazzino if (comprati) // Se ci sono capi comprati delete comprati; // Li 'depenna' } void Commesso::ToScelti () { char str [10]; int i;Capo *c; if (scelti) // Se esiste una lista di scelti { printf ("Capo da scegliere: "); // Stampa il prompt // scanf ("%d\n",&i); fgets (str,9,stdin); // Legge la scelta i = strtol (str,0,0L); // La trasforma in numero c = (Capo*) scelti -> index (i,1); // Ottiene l'elemento scelto if (c) // Se l'ha trovato { c -> remove ((list **) &scelti); // Lo elimena dalla lista degli scelti *c += comprati; // Somma i comprati all'elemento comprati = c; // E mette l'elemento come primo dei comprati printf ("Capo spostato\n"); } } else printf ("Nessun capo disponibile\n"); } void Commesso::ToDisponibili () { char str [10]; int i;Capo *c; if (comprati) // Se esiste una lista di comprati { printf ("Capo da scartare: "); // Stampa il prompt // scanf ("%d\n",&i); fgets (str,9,stdin); // Legge la risposta i = strtol (str,0,0L); // Trasforma in numero c = (Capo*) comprati -> index (i,1); // Individua l'elemento if (c) // Se l'ha individuato { c -> remove ((list **) &comprati); // Lo rimuove dalla lista dei comprati *c += scelti; // Aggiunge la lista degli scelti dopo l'elemento scelti = c; // E rende l'elemento il primo degli scelti printf ("Capo spostato\n"); } } else printf ("Nessun capo scelto\n"); } void Commesso::AddCriterio (AttrList::modo m, AttrList::tipo_t t) { char buf [30]; char *nome; int len; switch (t) { case AttrList::taglia : // Se deve aggiungere una 'taglia' nome = "taglia"; // Il prompt e' 'taglia' len=4; // Deve leggere max 4 caratteri break; case AttrList::colore : // Se deve leggere un 'colore' nome = "colore"; // Il prompt e' 'colore' len=19; // E sara' lungo 19 caratteri al massimo break; case AttrList::modello : // Se invece deve leggere il modello nome = "modello"; // Il prompt sara' 'modello' len=29; // E potra' essere lungo al massimo 29 caratteri break; } printf ("Introduci %s :",nome); // Stampa il prompt fgets (buf,len,stdin); // Legge il dato, rispettando la lunghezza buf [len] = 0; // Tronca la stgringa if (t == AttrList::taglia) // Se ho letto una taglia { int i; i = strtol (buf,0,0L); // Converto il valore in intero sprintf (buf,"%03d",i); // E lometto in una stringa di tre cifre } new AttrList (&criteri,m,t,buf); // Creo il nuovo attributo, con il tipo ed il valore dato } /******************************************************/ /* Classe MenuCommesso */ /******************************************************/ void MenuCommesso::action (void *par) { Commesso c ((Magazzino *)par); menu *mc = 0; int i; new MenuAMaglione (&mc,"Maglione"); new MenuACamicia (&mc,"Camicia"); new MenuAPantaloni (&mc,"Pantaloni"); new MenuACintura (&mc,"Cintura"); new MenuACravatta (&mc,"Cravatta"); i = mc->print (1); mc->doaction (i,&c); delete mc; // Elimina il menu } /******************************************************/ /* Classe MenuCamicia */ /******************************************************/ void MenuACamicia::action (void *par) { ((Commesso *) par) -> Scegli (Commesso::Camicia); } /******************************************************/ /* Classe MenuAMaglione */ /******************************************************/ void MenuAMaglione::action (void *par) { ((Commesso *) par) -> Scegli (Commesso::Maglione); } /******************************************************/ /* Classe MenuAPantaloni */ /******************************************************/ void MenuAPantaloni::action (void *par) { ((Commesso *) par) -> Scegli (Commesso::Pantaloni); } /******************************************************/ /* Classe MenuACintura */ /******************************************************/ void MenuACintura::action (void *par) { ((Commesso *) par) -> Scegli (Commesso::Cintura); } /******************************************************/ /* Classe MenuACravatta */ /******************************************************/ void MenuACravatta::action (void *par) { ((Commesso *) par) -> Scegli (Commesso::Cravatta); } /******************************************************/ /* Classe MenuScegli */ /******************************************************/ void MenuScegli::action (void *par) { ((Commesso *) par) -> ToScelti (); } /******************************************************/ /* Classe MenuVediScelti */ /******************************************************/ void MenuVediScelti::action (void *par) { ((Commesso *) par) -> ListaScelti (); } /******************************************************/ /* Classe MenuVediDisponibili */ /******************************************************/ void MenuVediDisponibili::action (void *par) { ((Commesso *) par) -> ListaDisponibili (); } /******************************************************/ /* Classe MenuVediDisponibili */ /******************************************************/ void MenuScarta::action (void *par) { ((Commesso *) par) -> ToDisponibili (); } /******************************************************/ /* Classe MenuCompra */ /******************************************************/ void MenuCompra::action (void *par) { ((Commesso *) par) -> Compra (); } /******************************************************/ /* Classe MenuCerca */ /******************************************************/ void MenuCerca::action (void *par) { ((Commesso *) par) -> Cerca (); } /******************************************************/ /* Classe MenuModello */ /******************************************************/ void MenuModello::action (void *par) { ((Commesso *) par) -> AddCriterio (AttrList::eq, AttrList::modello); } /******************************************************/ /* Classe MenuTagliaPiu */ /******************************************************/ void MenuTagliaPiu::action (void *par) { ((Commesso *) par) -> AddCriterio (AttrList::ge, AttrList::taglia); } /******************************************************/ /* Classe MenuTagliaMeno */ /******************************************************/ void MenuTagliaMeno::action (void *par) { ((Commesso *) par) -> AddCriterio (AttrList::le, AttrList::taglia); } /******************************************************/ /* Classe MenuTaglia */ /******************************************************/ void MenuTaglia::action (void *par) { ((Commesso *) par) -> AddCriterio (AttrList::eq, AttrList::taglia); } /******************************************************/ /* Classe MenuColore */ /******************************************************/ void MenuColore::action (void *par) { ((Commesso *) par) -> AddCriterio (AttrList::eq, AttrList::colore); }