home *** CD-ROM | disk | FTP | other *** search
/ The C Users' Group Library 1994 August / wc-cdrom-cusersgrouplibrary-1994-08.iso / listings / v_08_11 / 8n11136a < prev    next >
Text File  |  1990-11-09  |  7KB  |  245 lines

  1. //-----------------------------------------------------------------
  2. // Partial implementation of cash-register meal pricing program
  3.  
  4. #include <malloc.h>
  5. #include <stream.h>
  6. #include <string.h>
  7.  
  8. #define FI_START_TEXT "Item"
  9. #define TAPE_FORMAT   "%-12s %6.2f\n"
  10.  
  11. //-----------------------------------------------------------------
  12. //  Food_item class -- one needed for each type of item sold
  13. //                     ( salad, steak, pie, ... )
  14.  
  15. class Food_item {
  16.   public:
  17.       Food_item()
  18.                { full_price = 0.0 ;
  19.                  factor = 1.0 ;
  20.                  text = malloc( 1 + strlen( FI_START_TEXT ) ) ;
  21.                  (void) strcpy( text, FI_START_TEXT ) ;
  22.                }
  23.       ~Food_item()               { (void) free( text ) ; }
  24.       double price()             { return( full_price * factor ) ; }
  25.       double get_full_price()    { return full_price ; }
  26.       double get_factor()        { return factor ; }
  27.       char   *get_text()         { return text ; }
  28.       int    set_full_price( double new_full_price ) ;
  29.       int    set_factor( double new_factor ) ;
  30.       int    set_text( char *new_text ) ;
  31.   private:
  32.       double full_price ;  // >= 0
  33.       double factor ;      // 0 (free) to 1 (full price)
  34.       char   *text ;       // never empty
  35. } ;
  36.  
  37.  
  38. int Food_item::set_full_price( double new_full_price )
  39. {
  40.     if ( new_full_price < 0.0 ) return( 1 ) ;
  41.     full_price = new_full_price ;
  42.     return( 0 ) ;
  43. }
  44.  
  45.  
  46. int Food_item::set_factor( double new_factor )
  47. {
  48.     if (   new_factor < 0.0
  49.         || new_factor > 1.0 ) return( 1 ) ;
  50.     factor = new_factor ;
  51.     return( 0 ) ;
  52. }
  53.  
  54.  
  55. int Food_item::set_text( char *new_text )
  56. {
  57.     if ( !new_text ) return( 1 ) ;
  58.     (void) free( text ) ;
  59.     text = malloc( 1 + strlen( new_text ) ) ;
  60.     (void) strcpy( text, new_text ) ;
  61.     return( 0 ) ;
  62. }
  63.  
  64.  
  65. //-----------------------------------------------------------------
  66. //  Food_list_elem class -- container for Food_item pointers
  67.  
  68. class Food_list_elem {
  69.   public:
  70.       Food_list_elem(  Food_item         *item_to_add
  71.                      , Food_list_elem    *next_list_elem
  72.                     )
  73.                            { item = item_to_add ;
  74.                              next = next_list_elem ;
  75.                            }
  76.       ~Food_list_elem()    { if ( next ) delete( next ) ; }
  77.       Food_item         *item ;
  78.       Food_list_elem    *next ;
  79. } ;
  80.  
  81. //-----------------------------------------------------------------
  82. //  Food_list class -- for grouping Food_list_elem
  83.  
  84. class Food_list {
  85.   public:
  86.       Food_list()        { list_start = (Food_list_elem *)0 ; }
  87.       ~Food_list()       { if ( list_start ) delete( list_start ) ; }
  88.       int add_item( Food_item *new_item )
  89.                          { return( add( new_item, 0 ) ) ; }
  90.       int add_item_once( Food_item *new_item )
  91.                          { return( add( new_item, 1 ) ) ; }
  92.       Food_item *find_item_by_name( char *name ) ;
  93.       void tally() ;
  94.   private:
  95.       Food_list_elem    *list_start ;
  96.       int               add( Food_item *new_item, int only_once ) ;
  97. } ;
  98.  
  99.  
  100. int Food_list::add(  Food_item *new_item
  101.                    , int       only_once )
  102. {
  103.     Food_list_elem    *entry ;
  104.  
  105.     if ( !new_item ) return( 1 ) ;
  106.  
  107.     if ( only_once ) {
  108.         entry = list_start ;
  109.         while ( entry ) {
  110.             if ( entry->item == new_item ) return( 1 ) ;
  111.             entry = entry->next ;
  112.         }
  113.     }
  114.  
  115.     list_start = new Food_list_elem( new_item, list_start ) ;
  116.     return( 0 ) ;
  117. }
  118.  
  119.  
  120. Food_item* Food_list::find_item_by_name( char *name )
  121. {
  122.     Food_list_elem    *entry ;
  123.  
  124.     entry = list_start ;
  125.     while ( entry ) {
  126.         if ( !strcmp( name, entry->item->get_text() ) )
  127.             return( entry->item ) ;
  128.         entry = entry->next ;
  129.     }
  130.     return( (Food_item *)0 ) ;
  131. }
  132.  
  133.  
  134. void Food_list::tally()
  135. {
  136.     Food_list_elem    *entry ;
  137.     double            total_price = 0.0 ;
  138.    
  139.     entry = list_start ;
  140.     while ( entry ) {
  141.         total_price += entry->item->price() ;
  142.         cout << form( TAPE_FORMAT
  143.                      , entry->item->get_text()
  144.                      , entry->item->price()
  145.                     ) ;
  146.         entry = entry->next ;
  147.     }
  148.     cout << form( TAPE_FORMAT, "Total", total_price ) ;
  149.     cout << "\n\n" ;
  150. }
  151.  
  152. //-----------------------------------------------------------------
  153. //  Main program:  Create food items; add to menu; process orders
  154.  
  155. main()
  156. {
  157.     Food_item    *new_item ;
  158.     Food_list    menu ;
  159.     Food_list    *order ;
  160.  
  161.     new_item = new Food_item ;
  162.     (void) new_item->set_text( "Steak" ) ;
  163.     (void) new_item->set_full_price( 7.50 ) ;
  164.     menu.add_item_once( new_item ) ;
  165.  
  166.     new_item = new Food_item ;
  167.     (void) new_item->set_text( "Fish" ) ;
  168.     (void) new_item->set_full_price( 4.00 ) ;
  169.     menu.add_item_once( new_item ) ;
  170.  
  171.     new_item = new Food_item ;
  172.     (void) new_item->set_text( "Soup" ) ;
  173.     (void) new_item->set_full_price( 1.75 ) ;
  174.     menu.add_item_once( new_item ) ;
  175.  
  176.     new_item = new Food_item ;
  177.     (void) new_item->set_text( "Salad" ) ;
  178.     (void) new_item->set_full_price( 2.25 ) ;
  179.     menu.add_item_once( new_item ) ;
  180.  
  181.     new_item = new Food_item ;
  182.     (void) new_item->set_text( "Pie" ) ;
  183.     (void) new_item->set_full_price( 1.50 ) ;
  184.     menu.add_item_once( new_item ) ;
  185.  
  186.     new_item = new Food_item ;
  187.     (void) new_item->set_text( "Cake" ) ;
  188.     (void) new_item->set_full_price( 1.00 ) ;
  189.     (void) new_item->set_factor( 0.75 ) ;
  190.     menu.add_item_once( new_item ) ;
  191.  
  192.     new_item = new Food_item ;
  193.     (void) new_item->set_text( "Coffee" ) ;
  194.     (void) new_item->set_full_price( 0.50 ) ;
  195.     menu.add_item_once( new_item ) ;
  196.  
  197.     //---------------------------------------
  198.     //  First order
  199.  
  200.     order = new Food_list ;
  201.     order->add_item( menu.find_item_by_name( "Salad" ) ) ;
  202.     order->add_item( menu.find_item_by_name( "Steak" ) ) ;
  203.     order->add_item( menu.find_item_by_name( "Pie" ) ) ;
  204.     order->tally() ;
  205.     delete( order ) ;
  206.  
  207.     //---------------------------------------
  208.     //  Second order
  209.  
  210.     order = new Food_list ;
  211.     order->add_item( menu.find_item_by_name( "Soup" ) ) ;
  212.     order->add_item( menu.find_item_by_name( "Fish" ) ) ;
  213.     order->tally() ;
  214.     delete( order ) ;
  215.  
  216.     //---------------------------------------
  217.     //  Third order
  218.  
  219.     order = new Food_list ;
  220.     order->add_item( menu.find_item_by_name( "Cake" ) ) ;
  221.     order->add_item( menu.find_item_by_name( "Coffee" ) ) ;
  222.     order->tally() ;
  223.     delete( order ) ;
  224.  
  225. }
  226.  
  227. //-----------------------------------------------------------------
  228. //  Sample output below
  229.  
  230. Pie            1.50
  231. Steak          7.50
  232. Salad          2.25
  233. Total         11.25
  234.  
  235.  
  236. Fish           4.00
  237. Soup           1.75
  238. Total          5.75
  239.  
  240.  
  241. Coffee         0.50
  242. Cake           0.75
  243. Total          1.25
  244.  
  245.