软件工程个人项目——买书的最低价格
题目要求:
书店针对《哈利波特》系列书籍进行促销活动,一共5卷,用编号0、1、2、3、4表示,单独一卷售价8元, 具体折扣如下所示:
本数 折扣
2 5%
3 10%
4 20%
5 25%
根据购买的卷数以及本数,会对应不同折扣规则情况。单数一本书只会对应一个折扣规则,例如购买了两本卷1,一本卷2,则可以享受5%的折扣,另外一本卷一则不享受优惠。
设计算法能够计算出读者购买一批书的最低价格。
一、设计思想
本题采用的是找规律的方法,经过计算会发现,购买的数量在5以内的时候没什么问题,都是按照成套的购买打折的。但是从6开始就会出现多种组合方式,我们就逐一进行计算,发现10以内只有8是特殊的。她不是购买5的倍数最便宜,而是采用4+4的方式最便宜。所以我们先按照5的倍数记录折扣率方便以后的计算,然后再把购买情况按照10分类。单独讨论余数为8的情况:8按照4+4的方式购买,其余按照5的倍数成套购买。余数不为8的情况都以5的多少倍成套购买,剩下的单独购买。
二、代码实现
1 //求买书的最低价格 2016/6/3 Zhao Ziyin 2 #include<iostream> 3 using namespace std; 4 5 int main() 6 { 7 int num = 0, s, b; 8 int multi, remain; 9 double p_price = 8;//单价为8 10 double rate, low_price; 11 12 //输入 13 cout << "输入买书的数量:"; 14 cin >> num; 15 while (num < 1) 16 { 17 cout << "输入的数量有误!"<<endl; 18 cout << "输入买书的数量:"; 19 cin >> num; 20 } 21 22 multi = num / 10;//除以10的商 23 remain = num % 10;//余数 24 s = num % 5;//除以5的余数 25 b = num / 5;//商 26 switch (s)//根据数量是5的几倍求折扣率rate 27 { 28 case 0: rate = 0.75; break; 29 case 1: rate = 1; break; 30 case 2: rate = 0.95; break; 31 case 3: rate = 0.9; break; 32 case 4: rate = 0.8; break; 33 } 34 if (remain == 8)//8是特例,是4+4的形式 35 { 36 low_price = (multi * 10 * p_price * 0.75) + (2 * 4 * p_price * 0.8); 37 } 38 else 39 { 40 low_price = (b * 5 * p_price * 0.75) + (s * p_price * rate); 41 } 42 cout << "您购买这些书的最低价格为:" << low_price << endl; 43 44 return 0; 45 }
三、实现截图
输入错误处理:
输入10以内:
特殊以8为基准的数:
其他情况:
四、个人总结
本次实验并不难,但是开始时候我们还是没有什么思路,老师提醒我们把情况都列举出来找规律。我以后要学习这种编程的方法。
还有就是代码的简略问题,开始的时候我用switch语句编写从余数为0到5的情况,写到6的时候我发现这些的情况都是相通的,无非是5的倍数不同、剩余单独购买的本数不同、折扣率不同,只有余数为8的时候不是以5为基准写的。所以我修改了代码,只是用if……else写出了余数是否为8,然后把情况合在一起写,这样减少了很多代码冗余,然后我看代码的时候也能比较清晰。
最后就是要注意一些编程的细节,,貌似最近都在用java写安卓,swich语句开始居然忘记了写break!然后定义int类型的变量习惯了把这次的low_price等价格最开始也定义成了int……下次要细心啊……