// ENGR 131 Monday 3:30 Recitation (Amanda Rohn) // HW 4 - The Obsessive Student's Calculator // Solution #include #include #include #include using std::cout; using std::cin; using std::endl; using std::setprecision; using std::fixed; using std::showpoint; int GetInteger(const char* prompt, int min, int max); double GetDouble(const char* prompt, double min, double max); char GetChar(const char* prompt); int QPoints(char grade); int main() { cout << "Welcome to the Obsessive Student's Calculator" << endl; int choice; double gpa; double top_terms, bottom_terms; int cred_hrs; char lgrade; //letter grade int pts; //points for letter grade: A=4, B=3, etc. int desired_percent; int points_needed, total_points, current_points; int system; //1 for point, 2 for percent int percent_needed, current_percent, exam_percent; double gpa_earned, gpa_needed; int current_credits, earned_credits; for(;;) { bottom_terms = top_terms = 0; cout << "\nWhat do you need to know?\n" << "1. What's my GPA?\n" << "2. How well do I have to do on the final to get my grade?\n" << "3. How well do I have to do this semester to keep my scholarship?\n" << "4. I already know too much. Let me out of here.\n"; choice = GetInteger("Enter your choice", 1, 4); switch(choice) { case 1: cout << "\nFor each class, enter your letter grade and the credit hours.\n" << "(Enter 'Q' as a letter grade to quit entering)\n"; for(;;) { for(;;) //get letter grade from user { lgrade = toupper(GetChar("\nLetter Grade")); if(lgrade != 'A' && lgrade != 'B' && lgrade != 'C' && lgrade != 'D' && lgrade != 'F' && lgrade != 'Q') cout << "\nLetter grades are A, B, C, D, or F (Q to quit). Try again."; else break; } if(lgrade == 'Q') break; pts = QPoints(lgrade); cred_hrs = GetInteger("Credit hours", 0, 4); //get credit hours from user top_terms += (cred_hrs * pts); bottom_terms += cred_hrs; } if(lgrade == 'Q' && bottom_terms == 0) break; gpa = top_terms / bottom_terms; cout << "\nYour GPA is " << fixed << showpoint << setprecision(3) << gpa << endl; break; case 2: system = GetInteger("\nIs your class's grading based on the point system (1) or percentage system (2)?", 1, 2); if(system == 1) //point system { total_points = GetInteger("\nHow many points are possible in the course?", 0, 10000); current_points = GetInteger("How many points do you have now?", 0, total_points); desired_percent = GetInteger("What percentage grade do you want to end up with?", 0, 100); points_needed = desired_percent * .01 * total_points - current_points; cout << "\nYou need " << points_needed << " points on the exam to get a " << desired_percent << "% in the course." << endl << endl; } else if(system == 2) //percentage system { current_percent = GetInteger("\nWhat is your current percentage grade?", 0, 100); exam_percent = GetInteger("What percentage of the total grade is the exam worth?", 0, 100); desired_percent = GetInteger("What percentage grade do you want to end up with?", 0, 100); percent_needed = (desired_percent - current_percent * (1 - exam_percent * .01)) / (exam_percent * .01); cout << "\nYou need a " << percent_needed << "% on the exam to get a " << desired_percent << "% in the course." << endl; } break; case 3: earned_credits = GetInteger("\nHow many credits have you earned so far, not including this semester?", 0, 1000); gpa_earned = GetDouble("What is your current GPA, not including this semester?", 0, 4.000); current_credits = GetInteger("How many credit hours are you taking this semester?", 0, 30); gpa_needed = ( 3 * (current_credits + earned_credits) - gpa_earned * earned_credits) / current_credits; cout << "\nYou need to get a " << fixed << showpoint << setprecision(3) << gpa_needed << " this semester to keep your scholarship.\n"; break; } if(choice == 4) break; } cout << "\nHappy studying!\n\n"; return 0; } /****FUNCTION DEFINITIONS****/ int GetInteger(const char* prompt, int min, int max) { assert(min < max); int number; for(;;) { cout << prompt << ": "; cin >> number; if (cin.fail()) { cout << "Please enter an integer." << endl; cin.clear(); cin.ignore(1024,'\n'); } else if (cin.peek() != '\n') { cout << "Please enter only an integer." << endl; cin.ignore(1024,'\n'); } else if (number < min || number > max) { cout << "Please enter a number between " << min << " and " << max << "." << endl; cin.ignore(1024,'\n'); } else { cin.ignore(1024,'\n'); return number; } } } double GetDouble(const char* prompt, double min, double max) { assert(min < max); double number; for(;;) { cout << prompt << ": "; cin >> number; if (cin.fail()) { cout << "Please enter a number." << endl; cin.clear(); cin.ignore(1024,'\n'); } else if (cin.peek() != '\n') { cout << "Please enter only a number." << endl; cin.ignore(1024,'\n'); } else if (number < min || number > max) { cout << "Please enter a number between " << min << " and " << max << "." << endl; cin.ignore(1024,'\n'); } else { cin.ignore(1024,'\n'); return number; } } } char GetChar(const char* prompt) { char input; for(;;) { cout << prompt << ": "; cin >> input; if (cin.fail()) { cout << "Please enter a character." << endl; cin.clear(); cin.ignore(1024,'\n'); } else if (cin.peek() != '\n') { cout << "Please enter only one character." << endl; cin.ignore(1024,'\n'); } else { cin.ignore(1024,'\n'); return input; } } } int QPoints(char grade) { grade = toupper(grade); assert(grade == 'A' || grade == 'B' || grade == 'C' || grade == 'D' || grade == 'F'); int pts; switch(grade) //assign appropriate # of points according to letter grade { case 'A': pts = 4; break; case 'B': pts = 3; break; case 'C': pts = 2; break; case 'D': pts = 1; break; default: pts = 0; } return pts; }