Do you wanna build a snowman?
Problem
Solution
/*
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;
}
Back to top