//Commesso: commesso.cpp #include <iostream.h> #include <strstream.h> #include <iomanip.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 cout << "Nessun capo scelto" << endl; // Dice che non ce ne sono cout << "Premi <a capo> per continuare"; // Pausa... cin.ignore (10,'\n'); // Arriva fino all' 'a capo' } void Commesso::ListaDisponibili () { if (scelti) // Se ci sono capi in lista scelti -> show (1); // Li mostra else // Altrimenti cout << "Nessun capo disponibile" << endl; // Dice che non ce ne sono cout << "Premi <a capo> per continuare"; // Pausa... cin.ignore (10,'\n'); // Arriva fino all' 'a capo' } 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 () { int i;Capo *c; if (scelti) // Se esiste una lista di scelti { cout << "Scegli un capo: "; // Stampa il prompt cin >> i; // Legge la scelta cin.ignore (10,'\n'); // Arriva fino all' 'a capo' c = (*scelti) [i]; // Ottiene l'elemento scelto if (c) // Se l'ha trovato { c -> remove (scelti); // Lo elimena dalla lista degli scelti *c += comprati; // Somma i comprati all'elemento comprati = c; // E mette l'elemento come primo dei comprati cout << "Capo spostato" << endl; } } else cout << "Nessun capo disponibile" << endl; } void Commesso::ToDisponibili () { int i;Capo *c; if (comprati) // Se esiste una lista di comprati { cout << "Capo da scartare: "; // Stampa il prompt // scanf ("%d\n",&i); cin >> i; // Legge la scelta cin.ignore (10,'\n'); // Arriva fino all' 'a capo' c = (*comprati) [i]; // Individua l'elemento if (c) // Se l'ha individuato { c -> remove (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 cout << "Capo spostato" << endl; } } else cout << "Nessun capo scelto" << endl; } 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; } cout << "Introduci " << nome << " :"; // Stampa il prompt cin.width (len); cin >> buf; // Legge il dato, rispettando la lunghezza if (t == AttrList::taglia) // Se ho letto una taglia { int i; istrstream istr(buf,4); // Crea un 'istrstream' con la nostra stringa istr >> i; // Estrae dalla stringa l'inero buf [0] = 0; // Tronca la stringa ostrstream ostr (buf,4); // Costruisce un 'ostrstream' con la stringa, lungo 4 ostr << setw (3) << setfill ('0') << i % 999; // Formatta il numero a tre cifre con gli zeri } 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); }