MOOC清华《程序设计基础》第9章:自动售卖程序 v 1.0

//可以一边分析一边设计一边写代码
//先考虑整体框架,再考虑细节,称为“自顶向下,逐步求精” 

#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;
		}
	}
}

主流程图:


子流程图:


运行结果:


posted on 2017-10-05 18:17  sunshineman1986  阅读(119)  评论(0)    收藏  举报

导航