/*---
    CS 111 - Week 11 Lecture 1 - 2024-11-05

    by: Sharon Tuttle
    last modified: 2024-11-06
---*/

#include <cstdlib>
#include <iostream>
#include <string>
#include <cmath>
using namespace std;

// imagine a world where letter grades are just
//    a single letter -- and there are only 4 letter
//    grades:
//    A - Excellent
//    B - Very Good
//    C - Acceptable
//    T - Try Again
//
// and I decide I want a function that gives the
//    grade description given a letter grade

/*===
    signature: describe_grade: char -> string
    purpose: expects a letter grade, and returns
        the desired description for that grade,
        as follows:

        A or a - Excellent
        B or b - Very Good
        C or c - Acceptable
        T or t - Try Again

        BUT if given an unrecognized grade,
        it returns "Unrecognized Grade"

    tests:
        describe_grade('A') == "Excellent"
        describe_grade('B') == "Very Good"
        describe_grade('C') == "Acceptable"
        describe_grade('T') == "Try Again"
        describe_grade('a') == "Excellent"
        describe_grade('b') == "Very Good"
        describe_grade('c') == "Acceptable"
        describe_grade('t') == "Try Again"
        describe_grade('F') == "Unrecognized Grade"
===*/

string describe_grade(char grade)
{
    /*=== 1st version: using an if-else-if pattern 

    if ((grade == 'A') || (grade == 'a'))
    {
        return "Excellent";
    }
    else if ((grade == 'B') || (grade == 'b'))
    {
        return "Very Good";
    }
    else if ((grade == 'C') || (grade == 'c'))
    {
        return "Acceptable";
    }
    else if ((grade == 'T') || (grade == 't'))
    {
        return "Try Again";
    }
    else
    {
        return "Unrecognized Grade";
    }

    ===*/

    // now using a local variable and a switch statement
    //    (comment out the break statements below to see
    //    how that leads to incorrect results!)
  
    string desired_descr = "";

    switch (grade)
    {
        case 'A':
        case 'a':
            desired_descr =  "Excellent";
            break;

        case 'B':
        case 'b':
            desired_descr =  "Very Good";
            break;

        case 'C':
        case 'c':
            desired_descr = "Acceptable";
            break;

        case 'T':
        case 't':
            desired_descr = "Try Again";
            break;

        default:
            desired_descr = "Unrecognized Grade";
    }

    return desired_descr;
}

/*---
   test the functions above
---*/

int main()
{
    cout << boolalpha;

    cout << "*** Testing: describe_grade ***" << endl;

    cout << (describe_grade('A') == "Excellent") << endl;
    cout << (describe_grade('B') == "Very Good") << endl;
    cout << (describe_grade('C') == "Acceptable") << endl;
    cout << (describe_grade('T') == "Try Again") << endl;
    cout << (describe_grade('a') == "Excellent") << endl;
    cout << (describe_grade('b') == "Very Good") << endl;
    cout << (describe_grade('c') == "Acceptable") << endl;
    cout << (describe_grade('t') == "Try Again") << endl;
    cout << (describe_grade('F') == "Unrecognized Grade") << endl;

    // now using a local variable assigned using
    //     interactive input to let user specify
    //     a grade to describe!
    
    char desired_grade;

    cout << endl;
    cout << "What grade do you want described? (A,B,C,T are OK)"
         << endl;

    cin >> desired_grade;

    cout << "That grade's description is: "
         << describe_grade(desired_grade) << endl;

    return EXIT_SUCCESS;
}