#include #include #include #include using namespace std; class MenuItem { public: int numberOfItems ; string name = "" ; double price ; std::string to_string_with_precision(double value, int precision) { std::ostringstream oss; oss << std::fixed << std::setprecision(precision) << value; return oss.str(); } MenuItem( string nameP, int numberOfItemsP , double priceP ) { name = nameP ; numberOfItems = numberOfItemsP ; price = priceP ; } virtual string getName() { string formatted_string = to_string_with_precision(price, 2); if ( price == 0 ) return name ; else return name + " " + formatted_string ; } virtual float getPrice() { return price ; } }; class Menu { public: vector< MenuItem* > holderOfItems ; int noOfCols ; //int noItems = 0 ; virtual ~Menu() { for( int i1=0 ; i1< holderOfItems.size() ; i1++ ) { delete holderOfItems[i1] ; } //for } void addItem( MenuItem* ptr) { holderOfItems.push_back( ptr ) ; } virtual void display () { int index = 0 ; int leftItems = holderOfItems.size() ; for ( int i1=0 ; i1 0 ) { noOfColsCurrentRow = noOfCols ; leftItems -= noOfColsCurrentRow ; } else { noOfColsCurrentRow = leftItems ; leftItems = 0 ; } i1 += noOfColsCurrentRow ; for( int k1=0 ; k1 < noOfColsCurrentRow ; k1++ ) { printf( "%-2d: %-20s ", index+1 , holderOfItems[index]->getName().c_str() ) ; // sprintf( "%2d: %10s ", index , holderOfItems[index]->getName().c_str() ) ; index++ ; } cout << endl ; } //for cout << "Enter your selection:" ; } virtual int getSelection() { int x1 ; cin >> x1 ; return x1 ; } }; class OrderMenu : public Menu { public: OrderMenu() { noOfCols = 2 ; MenuItem* ptrItem = new MenuItem("Burger", 0 , 1 ) ; addItem ( ptrItem ) ; ptrItem = new MenuItem("Fries", 0 , 2 ) ; addItem ( ptrItem ) ; ptrItem = new MenuItem("Drink", 0 , 1.50 ) ; addItem ( ptrItem ) ; ptrItem = new MenuItem("Finish Order", 0 , 0 ) ; addItem ( ptrItem ) ; } void display() { while( true ) { Menu::display() ; int input = getSelection() ; cout << "Selected: " << input << endl ; if ( input == holderOfItems.size() ) { showOrder() ; break ; } else { cout << "Enter number of items:" ; int no = 0 ; cin >> no ; if ( no != 0 ) addToOrder( input, no ) ; } } //while( true ) } //If the customer stated some number for the same item then we //increment. void addToOrder( int inputP, int noP ) { holderOfItems[inputP-1]->numberOfItems += noP ; } void showOrder() { cout << endl << endl ; cout << "Current Order Details." << endl ; float total = 0.0 ; for( int i1=0 ; i1 < holderOfItems.size()-1 ; i1++ ) { if ( holderOfItems[i1]->numberOfItems > 0 ) { cout << holderOfItems[i1]->getName() << " " << holderOfItems[i1]->numberOfItems << endl ; total += holderOfItems[i1]->numberOfItems * holderOfItems[i1]->getPrice() ; } } //for //cout << "Your total is: " << total << endl ; printf( "Your total is %.2f\n" , total ) ; } }; int main () { Menu* OrderMenuObj1 = new OrderMenu() ; OrderMenuObj1->display() ; delete OrderMenuObj1 ; cout << "End of main." << endl ; return 0; }