C++ Part 4

// ---------- C++ Tutorial 4  ----------

#include <cstdlib>
#include <iostream>
#include <string>
#include <vector>
#include <numeric>

std::vector<int> Range(int start, 
        int max, int step);

int main() {

// ----- WHILE / BREAK / CONTINUE -----
// While loops continue to run the code in them
// as long as a condition is true

// Create the variable used in the while condition
// before the while loop
int i = 1;

while (i <= 20){

    // If a value is even don't print it
    if((i % 2) == 0){
        i += 1;

        // Continue skips the rest of the code
        // and jumps back to the beginning
        // of the loop
        continue;
    }

    // Break stops execution of the loop and jumps 
    // to the line after the loops closing }
    if(i == 15) break;

    std::cout << i << "\n";

    // Increment i so the loop eventually ends
    i += 1;

}
// ----- END WHILE / BREAK / CONTINUE -----

// ----- PROBLEM DRAW A PINE TREE -----
// For this problem I want you to draw a pine 
// tree after asking the user for the number 
// of rows. Here is the sample program

/*
 How tall is the tree : 5
    #
   ###
  #####
 #######
#########
    #
 */

/*
I know that this is the number of spaces 
and hashes for the tree
4 - 1
3 - 3
2 - 5
1 - 7
0 - 9
Spaces before stump = Spaces before top

So I need to
1. Decrement spaces by one each time through 
the loop
2. Increment the hashes by 2 each time through 
the loop
3. Save spaces to the stump by calculating 
tree height - 1
4. Decrement from tree height until it equals 0
5. Print spaces and then hashes for each row
6. Print stump spaces and then 1 hash
*/

std::cout << "How tall is the tree : ";

// The top of the tree starts with 1 hash
int treeHeight = 0, spaces = 0, hashes = 1,
        stumpSpaces = 0; 

std::cin >> treeHeight;

// Starting spaces = treeHeight - 1
spaces = treeHeight - 1;

// Spaces before stump = tree height - 1
stumpSpaces = treeHeight - 1;

// while there are more rows to print keep going
while(treeHeight != 0){

    // Print spaces before hashes
    for(auto x: Range(1, spaces, 1))
        std::cout << " ";

    // Print the hashes
    for(auto x: Range(1, hashes, 1))
        std::cout << "#";

    // Newline after each row
    std::cout << "\n";

    // Spaces decremented by 1 each time
    spaces -= 1;

    // Hashes incremented by 2 each time
    hashes += 2;

    // Decrement treeHeight so loop ends
    treeHeight -= 1;

}

// Print spaces befor stump
for(auto x: Range(1, stumpSpaces, 1))
        std::cout << " ";

// Print stump
std::cout << "#";

    return 0;
}

std::vector<int> Range(int start, int max, 
        int step){

    // Every while statement needs an index 
    // to start with
    int i = start;

    // Will hold returning vector
    std::vector<int> range;

    // Make sure we don't go past max value
    while(i <= max){

        // Add value to the vector
        range.push_back(i);

        // Increment the required amount
        i += step;
    }

    return range;

}

// ----- END PROBLEM DRAW A PINE TREE -----

// ----- EXCEPTION HANDLING EX 1 -----
    // Exceptions are errors that occur when things don't 
    // go as expected. 
    // 1. You expect and int and get a string
    // 2. You expect a file to be available and it isn't
    // 3. You expect the user to not enter 0 and they do

    // You try to execute code that could be troublesome
    // and if an error occurs you catch it and throw
    // it to another block of code for handling

    double num1 = 0, num2 = 0;

    std::cout << "Enter number 1 : ";
    std::cin >> num1;
    std::cout << "Enter number 2 : ";
    std::cin >> num2;

    try{
        if(num2 == 0){
            throw "Division by zero is not possible";
        } else {

            printf("%.1f / %.1f = %.2f", num1, num2, 
            (num1 / num2));
        }
    }

    catch(const char* exp){
        std::cout << "Error : " << exp << "\n";
    }


// ----- END OF EXCEPTION HANDLING EX 1 -----

// ----- EXCEPTION HANDLING EX 2 -----
    try {
        std::cout << "Throwing exception\n";

        // Another way to throw an exception
        throw std::runtime_error("Error Occurred");

        // This point is never reached
        std::cout << "Can you print me?\n";
    }

    // All exceptions are based on std::exception
    catch(std::exception &exp){

        // what() Prints an explanatory string
        std::cout << "Handled Exception : " << 
                exp.what() << "\n";
    }

    // If exceptions aren't caught any place else 
    // this will catch it
    catch(...){
        std::cout << "Default exception catch\n";
    }


// ----- END OF EXCEPTION HANDLING EX 2 -----

// ----- DO WHILE LOOPS -----

    // Needed for the time function
    #include <ctime>

    // Do while loops are guaranteed to execute at least once
    // We'll create a secret number guessing game

    // Generate random number from 0 - 10

    // We need to seed the random number generator
    // time() returns the number of seconds since 1, 1, 1970
    srand(time(NULL));

    // If you divide any number it is impossible to get a 
    // remainder >= 11
    int secretNum = std::rand() % 11;
    int guess = 0;

    do{

        std::cout << "Guess the number : ";
        std::cin >> guess;

        if(guess > secretNum) std::cout << "To Big\n";
        if(guess < secretNum) std::cout << "To Small\n";

    } while(secretNum != guess);

    std::cout << "You guessed it\n";


    // ----- END OF DO WHILE LOOPS -----

    // ----- PROBLEM CREATE A DO WHILE LOOP WITH WHILE -----
    secretNum = std::rand() % 11;
    while(true){
        std::cout << "Guess the number : ";
        std::cin >> guess;

        if(guess > secretNum) std::cout << "To Big\n";
        if(guess < secretNum) std::cout << "To Small\n";

        if(guess == secretNum) break;
    }

    std::cout << "You guessed it\n";

// ----- END PROBLEM CREATE A DO WHILE LOOP WITH WHILE -----

// ---------- End of C++ Tutorial 4  ----------