/*---
    Examples for CS 111 - Week 10 lecture 2

    by: Sharon Tuttle
    last modified: 2026-10-29
---*/

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

/*===
    signature: describe_grade: char -> string
    purpose: expects a single-letter letter grade
    and returns its description, as follows:

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

    If the given letter grade is not one
    of these, return the description
    "Unrecognized Grade"
tests:
    describe_grade('a') == "Excellent"
    describe_grade('A') == "Excellent"
    describe_grade('b') == "Very Good"
    describe_grade('B') == "Very Good"
    describe_grade('c') == "Acceptable"
    describe_grade('C') == "Acceptable"
    describe_grade('t') == "Try Again"
    describe_grade('T') == "Try Again"
    describe_grade('Q') == "Unrecognized Grade"

===*/

string describe_grade(char letter_grade)
{
    /*=== if-else-if pattern version
    if ((letter_grade == 'A') || (letter_grade == 'a'))
    {
        return "Excellent";
    }
    else if ((letter_grade == 'B') || (letter_grade == 'b'))
    {
        return "Very Good";
    }
    else if ((letter_grade == 'C') || (letter_grade == 'c'))
    {
        return "Acceptable";
    }
    else if ((letter_grade == 'T') || (letter_grade == 't'))
    {
        return "Try Again";
    }
    else
    {
        return "Unrecognized Grade";
    }
    ===*/

    // version using a switch statement

    switch(letter_grade)
    {
        case 'A':
        case 'a':
            return "Excellent";

            // OK this is not strictly necessary HERE,
            //    but including so you remember it frequently
            //    IS needed in a switch statement

            break;

        case 'B':
        case 'b':
            return "Very Good";
            break;

        case 'C':
        case 'c':
            return "Acceptable";
            break;

        case 'T':
        case 't':
            return "Try Again";
            break;

        default:
            return "Unrecognized Grade";
    }
}

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

int main()
{
    cout << boolalpha;

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

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

    cout << "Just for fun: " << describe_grade('T') << endl;

    cout << endl;
    cout << "checking answers for in-class substr paper activity" << endl;
    cout << "===================================================" << endl;

    const string DB_INTRO = "CS 325";

    cout << (DB_INTRO.substr(0, 2) == "CS") << endl;
    cout << (DB_INTRO.substr(3) == "325")<< endl;
    cout << (DB_INTRO.substr(1, 27) == "S 325") << endl;

    return EXIT_SUCCESS;
}