diff --git a/src/sample_3.cpp b/src/sample_3.cpp new file mode 100644 index 0000000000000000000000000000000000000000..02a85823c7ff6d56c90139717ca63fead420922e --- /dev/null +++ b/src/sample_3.cpp @@ -0,0 +1,166 @@ +#include <iostream> +#include "sample_3.h" + + +void city::copy_repaint(city::House torepaint) { + torepaint.color = black; +} + +void city::copy_free_repaint(city::House &torepaint) { + torepaint.color = black; +} + +void city::describe_house(city::House &house) { + std::cout << "The resident " << house.owner; + std::cout << " is currently living in their "; + switch (house.color) + { + case red: + std::cout << "red"; + break; + case green: + std::cout << "green"; + break; + case blue: + std::cout << "blue"; + break; + case black: + std::cout << "black"; + break; + case white: + std::cout << "white"; + break; + default: + std::cout << "mystey-colored"; + break; + } + std::cout << " house at number " << house.number << std::endl; +} + +int main(int argc, char** argv) { + using std::string; + using std::cout; + using std::cin; + using std::endl; + using namespace city; + + // Declare a variable to hold the name of the user + string owner; + + // Write out static text + cout << "Dear new resident of the city. Please tell us your name:" << endl; + + // An infinite loop + while (1) { + // Read in a string + cin >> owner; + + // Check if the name has at least 3 characters + if (owner.length() < 3) { + // Print out hint + cout << "Your name is suspiciously short. Please enter at least 3 characters" << endl; + // Skip to next run of loop + continue; + } + else { + // Write out a mix of a static string and the string previously read in + cout << "So your name is " << owner << "." << endl; + + // Let us break free of this infinite loop + break; + } + } + + + // Let's ask the user for a color of the house + cout << "Which color should your house have? (r|g|b|w)" << endl; + + HouseColor houseColor; + char color; + while (1) { + // Read one character from the input + cin >> color; + // Discard the rest of the line + cin.ignore(); + + // Add a variable to keep track of an error + bool unknown_color = false; + + // Handle different cases of the entered color + switch (color) { + case 'r': + houseColor = red; + break; + case 'g': + houseColor = green; + break; + case 'b': + houseColor = blue; + break; + case 'w': + houseColor = white; + break; + default: + unknown_color = true; + break; + } + + // Deal with an unknown color + if (unknown_color) { + cout << "The color you chose was not known. Please choose one out of r,g,b,w" << endl; + // Retry + continue; + } + else { + cout << "The color you chose was " << color << ". Your house will be painted in this color." << endl; + // End loop + break; + } + } + + cout << "Do you have a favorite house number?" << endl; + + // Define a variable for the house number + int32_t house_number; + + // Another infinite loop for the reading of the house number + while (1) { + // Read the number + cin >> house_number; + + if (house_number <= 0) { + cout << "Oh no! Your favorite house number should certainly be positive. Please consider this again." << endl; + // Retry + continue; + } + else { + cout << "Oh, so your house will have the number " << house_number << " just for you." << endl; + // Stop the trying loop + break; + } + } + + + // Declare a house of custom type and assign its member fields. + House designed_house; + designed_house.color = houseColor; + designed_house.number = house_number; + designed_house.owner = owner; + + std::cout << "Let us summarize your registration:" << endl; + describe_house(designed_house); + + std::cout << "Let us summarize your registration:" << endl; + describe_house(designed_house); + + std::cout << "We will now try to repaint your house black:" << endl; + copy_repaint(designed_house); + describe_house(designed_house); + + std::cout << "Let us try it again a little differently:" << endl; + copy_free_repaint(designed_house); + describe_house(designed_house); + + + return 0; +} \ No newline at end of file diff --git a/src/sample_3.h b/src/sample_3.h new file mode 100644 index 0000000000000000000000000000000000000000..4baec98a294705f85082fc54be29c25eeda02d4b --- /dev/null +++ b/src/sample_3.h @@ -0,0 +1,37 @@ +#ifndef __SAMPLE_3_H__ +#define __SAMPLE_3_H__ + +#include <string> + +namespace city { + + // A custom type with a fixed number of permitted values + enum HouseColor { + red, + blue, + green, + white, + black + }; + + // A custom type with data fields + struct House { + // Our custom color + HouseColor color; + // A house number + uint32_t number; + // The name of the owner + std::string owner; + }; + + // A function to illustrate call by value + void copy_repaint(House torepaint); + + // A function to illustrate call by referene + void copy_free_repaint(House &torepaint); + + // A function to print out a description of the house + void describe_house(House &house); +}; + +#endif \ No newline at end of file