/*========
  Fall 2024 - CS 111
  Week 10 Lab Exercise

  date: 2024-11-01
========*/

/*---
    USING pair-programming
    *   COPY and PASTE the contents of this 
        file into a lab10.cpp file within the CS50 IDE

    *   ADD the parts asked for below
        (one student saying what to type,
        the other student typing it into the CS50 IDE)

    *   each time you want to compile:
        in a CS50 terminal that is open to the folder         
        CONTAINING this .cpp file, 
        ("Open in Integrated Terminal"), type:
   
        g++ lab10.cpp -o lab10

    *   IF it compiles with no errors:
        to run: in that same CS50 terminal that is open to the folder
        CONTAINING this .cpp file, type:

        ./lab10

    *   When you are satisfied with its output, create an
        example output file by typing:

        ./lab10 > lab10-out.txt

    *   Download copies of your resulting lab10.cpp and lab10-out.cpp
        by right-clicking on their names in the file explorer on the
        left of the CS50 IDE, and use Gmail to MAIL a copy of these
        files to BOTH of you.

    *   And, EACH of you should SUBMIT these TWO files
        lab10.cpp and lab10-out.txt to Canvas

---*/

/*---
    by: PUT BOTH of YOUR NAMES HERE 
    last modified: 2024-11-01
---*/

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

/*---  INFO YOU NEED TO KNOW for PROBLEM 1! ---

    FUN FACT: the C++ string class also includes a substring method
    named substr -- if given a starting position and a length, it returns
    the string starting at that position and going that many characters
    (or until the end of the string, whatever comes first).  

    So, for example, if you had a string parameter thingy, and you
    wanted the string that was the first 3 characters in thingy, you
    could use the expression: 

    thingy.substr(0, 3)  // start at position 0, grab 3 characters,
                         //     return the string of those 3 characters 

    *   so -- what is the difference between
        thingy.at(0)         // grab the char at position 0
        and
        thingy.substr(0, 1)  // grab the string of length 1 starting 
                             //     at pos 0

        at returns a char, but substr returns a string!

        THAT IS, if thingy is, say, "moo",
        thingy.at(0) == 'm'
        thingy.substr(0, 1) == "m"
---*/

/*--- WEEK 10 LAB EXERCISE - PROBLEM 1 ---*/

/*---
    Use the design recipe to design and write a C++ function
    short_name that expects a first name and a last name, and returns a
    shorter version of that full name made up of the first initial (the
    first letter of the first name), a period, a blank, and the last name.

    For example, short_name("Charlie", "Brown") would return "C. Brown".

    *   (IF you want: in the main function,
        you can also include one or more cout statements
        that JUST include an example call of short_name AFTER its
        tests, so you can SEE the value those call(s) return)
---*/

/*---
    signature:

    purpose:

    tests:

---*/






/*--- WEEK 10 LAB EXERCISE - PROBLEM 2 ---*/

/*---
    The purpose of this problem is to make sure that you are familiar
    with the class indentation style for the chained if-else-if "pattern".

    LOOK over Week 10 Lecture 2's posted NOTES, which compared the Racket
    cond expression to its rough-C++ if-else-if-pattern equivalent:

    if (bool_expr1)
    {
        return result_expr1;
    }
    else if (bool_expr2)
    {
        return result_expr2;
    }
    ...
    else
    {
        return result_else;
    }

    The above does follow the class style standards.

    BUT, the following function header and body for function try_it BELOW,
    while syntactically correct, does NOT follow class
    coding standards!

    So -- MODIFY the function below to FOLLOW the class style!

    (try_it is called in the main function below, so you can make sure
    it still works after you fix its style)

    NOTE!! The instructor will HAPPILY check over your answer IN LAB
    before you submit this and let you know if your version meets
    class style!!! <-- just ask! 
---*/
    
/*--- IMPROVE the FORMATTING of this WORKING function
      to MEET CS 111 CLASS CODING STANDARDS ---*/

double try_it(double val1, double val2)
{ if (val1 < val2){ return val2 - val1;} else if
(val2 < val1){ return val1 - val2; }else {return val1 + val2;}}




/*--- WEEK 10 LAB EXERCISE - PROBLEM 3 ---*/ 

/*---
    In the Week 4 Lab Exercise, you designed a Racket function
    size->quant that expected the *name* of one of these drink sizes:

    size name:    "short"  "tall"      "grande"   "venti"    "trenta"
    # ounces:       8       12          16         20         31

    ...and returned just the *number* of ounces you get for that drink
    size. 
    (that is, for example, you call it with "short", it returns just 8)

    And it returned a drink size of 0 if the drink name given
    was NOT equal to one of these.

    Use the design recipe to design a C++ version of this function
    named size_to_quant.

    *   for full credit, appropriately use a chained if-else-if "pattern"
        in this function

    *   be careful -- at least how many tests are needed for this 
        function?

    *   (IF you want: in the main function, 
        you can also include one or more cout statements
        that JUST include an example call of size_to_quant AFTER its
        tests, so you can SEE the value those call(s) return)
---*/

/*---
    signature:

    purpose:

    tests:

---*/






/*--- WEEK 10 LAB EXERCISE - PROBLEM 4 ---*/

/*---
    In the Week 4 Lab Exercise, you designed a Racket function
    judge-carbs that expected the number of carbohydrates some food
    has in a serving, and, based on the following:

    *   Someone has decided that they want to judge a food as
        low-carbohydrate if if has less than or equal to 10 grams of
        carbohydrates per serving.

    *   And, if > 10 grams and <= 20 grams, they want to judge it as
        moderate-carbohydrate,

    *   and if > 20 grams, they want to judge it as high-carbohydrate.

    ...it returned whether, for this person, they would judge that
    number of carbohydrates as "lo-carb", "mod-carb", or
    "hi-carb". 

    Use the design recipe to design a C++ version of this function
    named judge_carbs.

    *   for full credit, appropriately use a chained if-else-if "pattern"
        in this function

    *   be careful -- at least how many tests are needed for this 
        function?

    *   (IF you want: in the main function,
        you can also include one or more cout statements
        that JUST include an example call of judge_carbs AFTER its
        tests, so you can SEE the value those call(s) return)
---*/

/*---
    signature:

    purpose:

    tests:

---*/






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

int main()
{
    cout << boolalpha;

    cout << "*** Testing short_name ***" << endl;

    // copy each of short_name's test expressions into a 
    //     cout statement to print its result
    // (then REMOVE the // comment parts so you can RUN that cout!)

    // cout << () << endl; 
    // cout << () << endl; 
    
    cout << "*** Making sure Problem 2's function try_it runs ***" 
         << endl;

    cout << "try_it: " << try_it(3.5, 1.2) << endl;

    cout << "*** Testing size_to_quant ***" << endl;

    // copy each of size_to_quant's test expressions into a 
    //     cout statement to print its result
    // (then REMOVE the // comment parts so you can RUN that cout!)

    // cout << () << endl; 
    // cout << () << endl; 
    // cout << () << endl; 
    // cout << () << endl; 
    // cout << () << endl; 
    // cout << () << endl; 

    cout << "*** Testing judge_carbs ***" << endl;

    // copy each of judge_carbs' test expressions into a 
    //     cout statement to print its result
    // (then REMOVE the // comment parts so you can RUN that cout!)

    // cout << () << endl; 
    // cout << () << endl; 
    // cout << () << endl;
    // cout << () << endl; 
    // cout << () << endl; 
    
    return EXIT_SUCCESS;
}