This shows you the differences between two versions of the page.
— |
cs-142:do-you-wanna-build-a-snowman [2015/05/19 12:01] (current) cs142ta created |
||
---|---|---|---|
Line 1: | Line 1: | ||
+ | =Do you wanna build a snowman?= | ||
+ | ==Problem== | ||
+ | *You want to play in the snow in May. So you build a machine to create snow. You want a program to calculate how much snow you’ll need in order to build 1 of 3 choices: | ||
+ | **A bunch of snowballs (user gives width and count) | ||
+ | **A snowman (user gives 3 widths) | ||
+ | **An ideal snowman (user gives total height) | ||
+ | *An ideal snowman has snowball widths proportional the total height of 1/2, 1/3, and 1/6 as per [http://qz.com/153318/the-science-behind-the-art-of-building-a-snowman/] | ||
+ | ==Solution== | ||
+ | <code cpp> | ||
+ | /* | ||
+ | Test case 1: | ||
+ | Input: opt 1, asdf, 1, 2 (invalid snowball count, snowball opt) | ||
+ | Expected Output: reprompt, 4.18879 cub in | ||
+ | Actual Output: reprompt, 4.18879 cub in | ||
+ | |||
+ | Test case 2: | ||
+ | Input: opt 2, 6, 4, 2 (snowman of user specified heights) | ||
+ | Expected Output: 150.79632 cub in | ||
+ | |||
+ | Test case 3: | ||
+ | Input: opt 3, 12 (snowman of ideal proportions) | ||
+ | Expected Output: 150.79632 cub in | ||
+ | */ | ||
+ | |||
+ | #include <iostream> | ||
+ | #include <string> | ||
+ | |||
+ | using namespace std; | ||
+ | |||
+ | const double PI = 3.14159265359; | ||
+ | |||
+ | // These must be declared before the function that calls them (e.g., main), but can be defined below | ||
+ | void print_menu(); | ||
+ | int get_user_input(int min, int max); | ||
+ | double calculate_snowball_volume(double width); | ||
+ | double calculate_snowman_volume(double width1, double width2, double width3); | ||
+ | |||
+ | int main() | ||
+ | { | ||
+ | double total_volume = 0.0; | ||
+ | |||
+ | // prompt user for choice | ||
+ | print_menu(); | ||
+ | |||
+ | int choice = get_user_input(1, 3); | ||
+ | |||
+ | // if choice is 1 | ||
+ | if (choice == 1) | ||
+ | { | ||
+ | // prompt for width w and count c of snowballs | ||
+ | cout << "You chose 1. How many snowballs? "; | ||
+ | int snowball_count = get_user_input(0, INT_MAX); | ||
+ | |||
+ | cout << "How wide do you want your snowballs? "; | ||
+ | int snowball_width = get_user_input(0, INT_MAX); | ||
+ | |||
+ | // calculate volume for c snowballs of width w | ||
+ | total_volume = calculate_snowball_volume(snowball_width); | ||
+ | total_volume = total_volume * snowball_count; | ||
+ | } | ||
+ | |||
+ | // if choice is 2 | ||
+ | else if (choice == 2) | ||
+ | { | ||
+ | // prompt for 3 widths | ||
+ | int bottom_width, mid_width, top_width; | ||
+ | cout << "Give me the bottom width: "; | ||
+ | bottom_width = get_user_input(0, INT_MAX); | ||
+ | |||
+ | cout << "Give me the middle width: "; | ||
+ | mid_width = get_user_input(0, INT_MAX); | ||
+ | |||
+ | cout << "Give me the top width: "; | ||
+ | top_width = get_user_input(0, INT_MAX); | ||
+ | // calculate volume of snowman with three widths | ||
+ | total_volume = calculate_snowman_volume(bottom_width, mid_width, top_width); | ||
+ | } | ||
+ | |||
+ | // if choice is 3 | ||
+ | else if (choice == 3) | ||
+ | { | ||
+ | // prompt for height | ||
+ | cout << "How tall of an ideal snowman do you want? "; | ||
+ | int height; | ||
+ | height = get_user_input(0, INT_MAX); | ||
+ | |||
+ | // calculate volume of ideal snow man from height | ||
+ | total_volume = calculate_snowman_volume(height/2.0, height/3.0, height/6.0); | ||
+ | } | ||
+ | |||
+ | // Report total volume | ||
+ | cout << "Total volume of snow needed is " << total_volume << " cubic inches" << endl; | ||
+ | |||
+ | system("pause"); | ||
+ | return 0; | ||
+ | |||
+ | } | ||
+ | |||
+ | /* | ||
+ | Just print the menu (doesn't read input) | ||
+ | */ | ||
+ | void print_menu() | ||
+ | { | ||
+ | cout << "Choose from the following\n" | ||
+ | << "1. A bunch of snowballs\n" | ||
+ | << "2. A snowman\n" | ||
+ | << "3. An ideal snowman\n" | ||
+ | << "Choice: "; | ||
+ | |||
+ | return; | ||
+ | } | ||
+ | |||
+ | /* | ||
+ | Reads for integer input and reprompts until valid integer input is provided within range | ||
+ | @param min minimum value for range of input | ||
+ | @param max maximum value for range of input | ||
+ | @return first valid input integer | ||
+ | */ | ||
+ | int get_user_input(int min, int max) | ||
+ | { | ||
+ | int input; | ||
+ | // read in from cin | ||
+ | cin >> input; | ||
+ | |||
+ | // while it's bad (non-int or not in range) | ||
+ | while (cin.fail() || input < min || input > max) | ||
+ | { | ||
+ | // send message, reprompt | ||
+ | cout << "That's bad input. Gimme a value between " << min << " and " << max << ":"; | ||
+ | if (cin.fail()) | ||
+ | { | ||
+ | cin.clear(); | ||
+ | string dummy; | ||
+ | cin >> dummy; | ||
+ | } | ||
+ | // read again from cin | ||
+ | cin >> input; | ||
+ | } | ||
+ | |||
+ | return input; | ||
+ | } | ||
+ | |||
+ | /* | ||
+ | Calculate the volume of a sphere of particular width | ||
+ | @param width width of snowball to calculate volume for | ||
+ | @return volume of snowball with given width | ||
+ | */ | ||
+ | double calculate_snowball_volume(double width) | ||
+ | { | ||
+ | double volume = 0.0; | ||
+ | |||
+ | // volume is 4/3 pi r^3 (note that r is half of the width) | ||
+ | volume = 4 / 3.0 * PI * pow(width/2.0, 3); | ||
+ | |||
+ | return volume; | ||
+ | } | ||
+ | |||
+ | /* | ||
+ | Calculate the volume of a three-ball snowman with balls of particular widths | ||
+ | @param width1 width of bottom snowball to calculate volume for | ||
+ | @param width2 width of mid snowball to calculate volume for | ||
+ | @param width3 width of top snowball to calculate volume for | ||
+ | @return volume of snowball with given width | ||
+ | */ | ||
+ | double calculate_snowman_volume(double width1, double width2, double width3) | ||
+ | { | ||
+ | double volume = 0.0; | ||
+ | |||
+ | // add volume for three snowballs | ||
+ | volume += calculate_snowball_volume(width1); | ||
+ | volume += calculate_snowball_volume(width2); | ||
+ | volume += calculate_snowball_volume(width3); | ||
+ | |||
+ | return volume; | ||
+ | } | ||
+ | </code> |