//可以一边分析一边设计一边写代码
//先考虑整体框架,再考虑细节,称为“自顶向下,逐步求精”
#include <iostream>
#include <cstdlib>
#include <cmath>
#include <iomanip>
using namespace std;
void ShowMenu()
{
cout << "****************************************" << endl;
cout << "* 欢迎使用自动售卖机,请输入您的选择。 *" << endl;
cout << "* 1. 下订单 *" << endl;
cout << "* 2. 退出自动售卖 *" << endl;
cout << "****************************************" << endl;
}
void ShowSubMenu()
{
cout << "++++++++++++++++++++++++++++++++++++++++" << endl;
cout << "+ 开始处理订单,请输入您的选择。 +" << endl;
cout << "+ 1. 购买苹果(3.5元/公斤) +" << endl;
cout << "+ 2. 购买香蕉(2.7元/公斤) +" << endl;
cout << "+ 3. 结账 +" << endl;
cout << "+ 4. 放弃购买 +" << endl;
cout << "++++++++++++++++++++++++++++++++++++++++" << endl;
}//苹果是北方水果,香蕉是南方水果,所以北京那边香蕉比苹果贵,但在武汉苹果比香蕉贵
//子菜单的花边框用+组成,区别于主菜单的*边框
void DealOrder()
{
double apple_price = 3.5;
double apple_weight = 0;
double banana_price = 2.7;
double banana_weight = 0;
double sum = 0; //需严格注意变量的作用域
double weight = 0;
while(1)
{
//显示子菜单
ShowSubMenu();
//todo:显示已买水果总价
cout << "已购买水果总价: " << fixed << setprecision(2) << setw(8) << sum << "元" << endl;
cout << "您的选择是:";
int input;
cin >> input;
switch(input)
{
case 1:
//todo:处理买苹果
cout << "请输入称重(公斤):";
cin >> weight;
sum += apple_price * weight; //注意分清weight和apple_weight
apple_weight += weight;
break;
case 2:
//todo:处理买香蕉
cout << "请输入称重(公斤):";
cin >> weight;
sum += banana_price * weight;
banana_weight += weight;
break;
case 3:
//todo:显示总价
//cout << "已购买水果总价:" << fixed << setprecision(2) << setw(8) << sum << "元" << endl;
if(sum > 1E-6)
{
cout << "您一共购买了";
if(fabs(apple_weight) > 1E-6)
//加绝对值的原因是允许“买了苹果后嫌买多了又退几个”的情况
cout << apple_weight << "公斤苹果,";
if(fabs(banana_weight) > 1E-6)
//加绝对值原因同上,退货的时候也要称重,所以存在负数,总重可能略小于0
cout << banana_weight << "公斤香蕉,";
cout << "总价是" << sum << "元" << endl;
//核心技巧:前面已经对sum作了输出流格式控制,然后所有跟sum发生计算关系的变量
//都统一成了与sum相同的输出流格式,所以这里就不必再加格式控制符了
system("pause");
}
case 4:
system("cls");
return;
}
}
}
int main()
{
while(1)
{
ShowMenu();
cout << "您的选择是:";
int input;
cin >> input;
switch(input)
{
case 1:
DealOrder();
break;
case 2:
return 0;
}
}
}
主流程图:
子流程图:
运行结果: