Questo sito utilizza cookies solo per scopi di autenticazione sul sito e nient'altro. Nessuna informazione personale viene tracciata. Leggi l'informativa sui cookies.
Username: Password: oppure
Classe MENU - menu.cpp

menu.cpp

Caricato da: AldoBaldo
Scarica il programma completo

  1. /// === CLASSE MENU ============================================================
  2. /// Versione 3.1.0 - Aldo Carpanelli, ottobre 2014/ottobre 2016
  3. /// ============================================================================
  4.  
  5.  
  6. #include "menu.h"
  7.  
  8. #define CLS system("CLS")
  9. #define DIM_BUFFER 6
  10.  
  11. // quando viene creato un menu senza indicare la
  12. // quantita' massima delle voci, la classe usa...
  13. const int MENU::kMaxVoci = 32;
  14.  
  15. // la quantita' massima dei caratteri per riga della console
  16. const int MENU::kMaxWConsole = 80;
  17.  
  18. // quando viene creato un menu senza indicarne
  19. // esplicitamente il nome, la classe usa...
  20. const char *MENU::kStrVuota = "";
  21. const char *MENU::kStrTitoloDflt = "";
  22. const char *MENU::kStrUscitaDflt = "Esci dal menu";
  23. const char *MENU::kStrRichiesta1Dflt = "Indica il numero d'una voce:";
  24. const char *MENU::kStrRichiesta2Dflt = "Scelta non valida.  Riprova:";
  25.  
  26.  
  27. MENU::MENU() {
  28.     Inizializza(
  29.         kStrTitoloDflt,
  30.         kStrUscitaDflt,
  31.         kStrRichiesta1Dflt,
  32.         kStrRichiesta2Dflt,
  33.         0, 0 );
  34. }
  35.  
  36.  
  37. MENU::MENU( MENU_STR strTitolo ) {
  38.     Inizializza(
  39.         strTitolo,
  40.         kStrUscitaDflt,
  41.         kStrRichiesta1Dflt,
  42.         kStrRichiesta2Dflt,
  43.         0, 0 );
  44. }
  45.  
  46.  
  47. MENU::MENU( MENU_STR *dati ) {
  48.     Inizializza(
  49.         kStrTitoloDflt,
  50.         kStrUscitaDflt,
  51.         kStrRichiesta1Dflt,
  52.         kStrRichiesta2Dflt,
  53.         0, 0 );
  54.  
  55.     imposta( dati );
  56. }
  57.  
  58.  
  59. MENU::~MENU() {
  60.     // niente da distruggere
  61. }
  62.  
  63.  
  64.  
  65. void MENU::imposta( MENU_STR *dati ) {
  66.     Inizializza( dati[0], usc, ric[0], ric[1], cls, rpt );
  67.  
  68.     for( short i=1; dati[i] && *dati[i]; i++ )
  69.         aggiungi_voce( dati[i] );
  70. }
  71.  
  72.  
  73. void MENU::titolo( MENU_STR strTitolo ) {
  74.     if( strTitolo )
  75.         tit = strTitolo;
  76.     else tit = kStrTitoloDflt;
  77. }
  78.  
  79.  
  80. void MENU::uscita( MENU_STR strUscita ) {
  81.     if( strUscita )
  82.         usc = strUscita;
  83.     else usc = kStrUscitaDflt;
  84. }
  85.  
  86.  
  87. bool MENU::aggiungi_voce( MENU_STR strVoce ) {
  88.     if( totVoci == kMaxVoci ) return false;
  89.  
  90.     if( strVoce )
  91.         voc[totVoci] = strVoce;
  92.     else voc[totVoci] = kStrVuota;
  93.  
  94.     totVoci++; // c'e' una voce in piu'
  95.     return true;
  96. }
  97.  
  98.  
  99. bool MENU::inserisci_voce( short posVoce, MENU_STR strVoce ) {
  100.     if( totVoci == kMaxVoci ) return false;
  101.  
  102.     if( posVoce < 1 ) posVoce = 1;
  103.  
  104.     if( posVoce<=totVoci ) {
  105.         short i;
  106.  
  107.         posVoce--;
  108.  
  109.         for( i=totVoci; i>posVoce; i-- )
  110.             voc[i] = voc[i-1];
  111.  
  112.         if( strVoce )
  113.             voc[i] = strVoce;
  114.         else voc[i] = kStrVuota;
  115.         totVoci++; // c'e' una voce in piu'
  116.     }
  117.     else {
  118.                 // se la posizione e' troppo "avanti",
  119.                 // aggiungiamo la voce in coda al menu
  120.         aggiungi_voce( strVoce );
  121.     }
  122.  
  123.     return true;
  124. }
  125.  
  126.  
  127. bool MENU::cambia_voce( short posVoce, MENU_STR strVoce ) {
  128.     if( posVoce<1 || posVoce>kMaxVoci ) return false;
  129.  
  130.     posVoce--;
  131.  
  132.     if( strVoce )
  133.         voc[posVoce] = strVoce;
  134.     else voc[posVoce] = kStrVuota;
  135.  
  136.     return true;
  137. }
  138.  
  139.  
  140. bool MENU::elimina_voce( short posVoce ) {
  141.     if( totVoci<1 || posVoce>totVoci ) return false;
  142.  
  143.     posVoce--;
  144.  
  145.     while( posVoce < totVoci ) {
  146.         voc[posVoce] = voc[posVoce+1];
  147.         posVoce++;
  148.     }
  149.  
  150.     voc[totVoci] = NULL;
  151.     totVoci--; // c'e' una voce in meno
  152.  
  153.     return true;
  154. }
  155.  
  156.  
  157. void MENU::richiesta1( MENU_STR strRichiesta ) {
  158.     if( strRichiesta )
  159.         ric[0] = strRichiesta;
  160.     else ric[0] = kStrRichiesta1Dflt;
  161. }
  162.  
  163.  
  164. void MENU::richiesta2( MENU_STR strRichiesta ) {
  165.     if( strRichiesta )
  166.         ric[1] = strRichiesta;
  167.     else ric[1] = kStrRichiesta2Dflt;
  168. }
  169.  
  170.  
  171. short MENU::chiedi( void ) {
  172.     MENU_STR aCapo[] = { kStrVuota, "\n" };
  173.     short i, scelta = -2;
  174.     char buffer[DIM_BUFFER];
  175.     MENU_STR p;
  176.  
  177.     if( cls ) CLS; // se e' il caso, svuota la console
  178.  
  179.     do {
  180.         if( cls && rpt ) CLS; // se e' il caso, svuota la console
  181.  
  182.         if( scelta == -2 || rpt ) {
  183.             // stampa il titolo del menu
  184.             if( *tit ) printf( "\n%s\n", tit );
  185.  
  186.             // sottolinea il titolo del menu
  187.             for( p=tit; *p && (p-tit)<kMaxWConsole; p++ )
  188.                 printf( "=" );
  189.  
  190.             // stampa la voce per l'uscita dal menu
  191.             printf( "\n\n %2d. %s\n", 0, usc );
  192.  
  193.             // stampa tutte le altre voci del menu
  194.             for( i=0; i<totVoci; i++ )
  195.                 printf( " %2d. %s\n", i+1, voc[i] );
  196.         }
  197.  
  198.         // legge l'input dell'utente
  199.         if( scelta == -2 )
  200.             printf( "\n%s ", ric[0] );
  201.         else printf( "%s%s ", aCapo[rpt], ric[1] );
  202.  
  203.         fgets( buffer, DIM_BUFFER, stdin );
  204.         svuota_input( buffer );
  205.         taglia_non_cifre( buffer );
  206.  
  207.         if( *buffer != '\0' )
  208.             scelta = atoi( buffer );
  209.         else scelta = -1;
  210.  
  211.         if( scelta > totVoci || scelta < 0 )
  212.             scelta = -1;
  213.     } while( scelta < 0 );
  214.  
  215.     return scelta;
  216. }
  217.  
  218.  
  219. MENU_STR MENU::voce( short posVoce ) const {
  220.     if( posVoce>0 && posVoce<=totVoci )
  221.         return voc[--posVoce];
  222.     else if( posVoce == 0 )
  223.         return usc;
  224.     else return kStrVuota;
  225. }
  226.  
  227.  
  228. /// === FUNZIONI PRIVATE =======================================================
  229.  
  230.  
  231. void  MENU::Inizializza(
  232.     MENU_STR strTitolo,
  233.     MENU_STR strUscita,
  234.     MENU_STR strRichiesta1,
  235.     MENU_STR strRichiesta2,
  236.     bool cancella,
  237.     bool ripeti ) {
  238.  
  239.     titolo( strTitolo );
  240.     uscita( strUscita );
  241.     richiesta1( strRichiesta1 );
  242.     richiesta2( strRichiesta2 );
  243.  
  244.     totVoci = 0;
  245.     cls     = cancella;
  246.     rpt     = ripeti;
  247.  
  248.     for( int i=0; i<kMaxVoci; i++ )
  249.         voc[i] = NULL;
  250. }
  251.  
  252.  
  253. void MENU::taglia_non_cifre( char *s ) {
  254.     char *p = s;
  255.  
  256.     // elimina i caratteri spuri a inizio stringa
  257.     while( (*p<'0' || *p>'9') && *p!='\0' ) p++;
  258.  
  259.     // mantiene i primi caratteri cifra (se ce ne sono)
  260.     while( (*p>='0' && *p<='9') && *p!='\0' ) {
  261.         *s = *p;
  262.         s++; p++;
  263.     }
  264.  
  265.     *s = '\0'; // termina la stringa
  266. }
  267.  
  268.  
  269. void MENU::svuota_input( char *s ) {
  270.     size_t l = strlen( s );
  271.  
  272.     if( l>0 )
  273.         if( s[--l] != '\n' )
  274.             while( getchar() != '\n' );
  275. }