// Name: msglm // Date: // Program Name: // Description: #include #include #include using namespace std; // Named constants /* * Not using header files for this project * So there's no reason to define below main */ /* cleans up input problems relating to invalid input * * This is of high utility * I might use this function in other projects * * I swear I will end up writing my own input/output funcs for C++ * I cannot stand input validation with cin and cout */ void fixCin() { cin.clear(); cin.ignore(1000, '\n'); cout << "===ERROR: Invalid Input!===" << endl; } /* * Main has incredibly low amounts of code repitition, thus * splitting it up into functions would be fragmented and unmaintainable code * * technically, if I wished to follow the requirements to the letter, I could write something like: * * void TakeOrder() { * all actual processing of code * ... * } * * int main() { * takeOrder() * } * * * for an incredibly low SLOC count in a function * named main, but that'd serve almost no purpose at all * and would just pollute this codebase with an unneeded function. * * An explanation like this should, in spirit, achieve the purpose of the "low SLOC in main" requirement: * showing understanding of functions and displaying an ability to use them. */ int main() { //Variable declaration bool wrongOrder = false; char satisfied; char size = 's'; float price; int items = 0; int menuNum = 1; string curItem; string curSize; //Program title and description for the user cout << "Welcome to Anonymous's Dine and Shine" << endl << endl; //User Information cout << "Menu: \n"; cout << "1 - Burger\n"; cout << "2 - Fries\n"; cout << "3 - Drink\n"; cout << "Sizes: \n"; cout << "S - Small $4.25\n"; cout << "M - Medium $5.50\n"; cout << "L - Large $7.50\n"; // User input //Order number handling do { if ( !cin ) { fixCin(); } cout << "How many items would you like to buy?: "; cin >> items; } while ( !cin ); //For the amount of items requested, offer the user the shop menu for (int itemNum = 1; itemNum <= items; itemNum++) { do { //Just so the user knows what order the program is writing about cout << "Order Number " << itemNum << endl; //User input //Menu item handling do { if ( !cin || menuNum < 1 || menuNum > 3 ) { fixCin(); } cout << "Enter the menu number for your item: \n"; cin >> menuNum; } while ( !cin || menuNum < 1 || menuNum > 3 ); //Size of item handling do { if ( !cin || !(size == 's' || size == 'S' || size == 'm' || size == 'M' || size == 'l' || size == 'L') ) { //This line is gross, there's probably a better way to do this fixCin(); } cout << "Enter the size of that item: \n"; cin >> size; } while ( !cin || !(size == 's' || size == 'S' || size == 'm' || size == 'M' || size == 'l' || size == 'L') ); //Price and String Output figuring /* * In a big project, string comparision like * shown here would not be done at all * instead, some form of ENUM could be used instead * * The only reason I went with string comparision was for * easy debugging when developing. I would never allow * code like this to ever touch any production branches. */ switch(menuNum) { case 1: curItem = "Burger"; break; case 2: curItem = "Fries"; break; case 3: curItem = "Drink"; break; default: cout << "Invalid Entry. Terminating"; return 1; } switch(size) { case 's': case 'S': curSize = "Small"; price = price + 4.25; break; case 'm': case 'M': curSize = "Medium"; price = price + 5.50; break; case 'l': case 'L': curSize = "Large"; price = price + 7.50; break; default: cout << "Invalid Entry. Terminating"; return 1; } cout << "For Order " << itemNum << " you ordered a " << curSize << " " << curItem << endl; cout << "Are you satisfied with this order? (Y/n): "; cin >> satisfied; if (satisfied == 'n' || satisfied == 'N') { wrongOrder = true; } else { wrongOrder = false; } } while(wrongOrder); wrongOrder = false; } //Output Prices cout << "Sub Total: $" << setprecision(3) << price << endl; cout << "Tax: $" << setprecision(3) << price*0.10 << endl; cout << "Total: $" << setprecision(3) << price+(price*0.10) << endl; } /*This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. * * This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. * You should have received a copy of the GNU General Public License along with this program. If not, see . */