课堂练习——买书问题

一、题目及要求

书店针对《哈利波特》系列书籍进行促销活动,一共5卷,用编号0、1、2、3、4表示,单独一卷售价8元, 具体折扣如下所示:

                              

本数 折扣
2 5%
3 10%
4 20%
5 25%

 

根据购买的卷数以及本数,会对应不同折扣规则情况。单数一本书只会对应一个折扣规则,例如购买了两本卷1,一本卷2,则可以享受5%的折扣,另外一本卷一则不享受优惠。设计算法能够计算出读者购买一批书的最低价格。

二、设计思路

分析如下:

先找规律:

买1本: 1*8=8

买2本: 2*8*(1-5%)=15.2

买3本: 3*8*(1-10%)=21.6

买4本:   4*8*(1-20%)=25.6

买5本:   5*8*(1-25%)=30       一套

买6本:   1*8+5*8*(1-25%)=38       最优(一套一本)

            2*8*(1-5%)+4*8*(1-20%)=40.8

            3*8*(1-10%)+3*8*(1-10%)=43.2

买7本最优:2*8*(1-5%)+5*8*(1-25%)=45.2   (一套二本)

买8本最优:4*8*(1-20%)+4*8*(1-20%)=51.2   (两套中的不同4本)

买9本最优:4*8*(1-20%)+5*8*(1-25%)=55.6    (一套四本)

买10本最优: 5*8*(1-25%)+ 5*8*(1-25%)=60   (两套)

....

由上可知:除了买8本时最优解不含5,其他为1+5,2+5,4+5,5+5.

所以可以除以10取余数。如11即为10+1,12为10+2....

   所花费用=除以10的商*60+个位数所对应钱(所取余数对应情况)

    购买计划:

               除了余数为8时:商数*2套书和上面所列情况

                    余数为8时:商数*2套书和两套中的不同4本

算法:

(1)获取输入的书数

(2)求得书数的余数与商

(3)利用switch语句或if语句选择对应的情况,计算余数对应本数所花费钱

(4)输出所得结果

三、源代码

 1 /*2016.6.2 weilihua 买书问题*/
 2 #include<iostream>
 3 using namespace std;
 4 int main()
 5 {
 6       int book_num=0;
 7       int shangshu;//商数
 8       int yushu=0;//余数
 9       double ys_money;//余数部分对应钱
10       double money;//总钱数
11       while (book_num==NULL||book_num == 0)//如果书数为空或零则请重新输入
12       {
13         cout<<"请输入买书数量:";
14         cin>>book_num;
15        }
16       shangshu=book_num/10;
17       yushu=book_num%10;
18       switch(yushu)
19       {
20       case 0:
21           ys_money=0;
22       break;
23       case 1:
24            ys_money=8;
25       break;
26       case 2:
27            ys_money=15.2;
28       break;
29       case 3:
30            ys_money=21.6;
31       break;
32       case 4:
33            ys_money=25.6;
34       break;
35       case 5:
36            ys_money=30;
37       break;
38       case 6:
39            ys_money=38;
40       break;
41       case 7:
42            ys_money=45.2;
43       break;
44       case 8:
45            ys_money=51.2;
46       break;
47        case 9:
48            ys_money=55.6;
49       break;
50       }
51       money= shangshu*60+ ys_money;
52       cout<<"一共花"<<money<<""<<endl;
53       cout<<"购买计划如下:"<<endl;
54      
55       if((yushu==8))//购买本数余数为8时特殊处理
56       {
57       cout<<"需购买"<<shangshu*2<<"套和和两套中的不同4本"<<endl;
58       }
59       else if((yushu==5)||(yushu==0))//余数为5或0时为整套
60       {
61            cout<<"需购买"<<book_num/5<<""<<endl;
62       }
63       else if(yushu>5)//余数大于5时情况(排除8)
64       {
65       cout<<"需购买"<<book_num/5<<"套和"<<"一套中的不同"<<yushu%5<<""<<endl;
66       } 
67       else if(yushu>0)//余数小于5情况(排除0)
68       {
69       cout<<"需购买"<<shangshu*2<<"套和"<<"一套中的不同"<<yushu<<""<<endl;
70       }
71     
72         return 0;
73 }

四、截图

五、项目计划日志

周活动总结表

姓名:魏**                  日期2016.6.2

日期   任务 听课  编写程序 阅读书籍 准备考试     日总计

周一

100           100

周三

   100         100

周四

  100         100

周总结

100 200         300

阶段时间和效率                                            周数(上一次周活动表的周数+1):

不包括上一周在内的累计时间      

总计

 100

 200

 

 

 

 

 300

平均

 100

 200

 

 

 

 

 300

最大

 100

 200

 

 

 

 

 300

最小

 100

 200

 

 

 

 

 300

 以前各周的累计时间      

总计

 100

 200

 

 

 

 

 300

平均

 100

200

 

 

 

 

 300

最大

 100

200

 

 

 

 

 300

最小

 100

200

 

 

 

 

 300

 

六、时间记录表:

学生       魏**                                           日期   2016年6月2日 

教师        王**                                          课程        软件工程      

日期

开始时间

结束时间

中断时间

净时间

活动

备注

 5.30

 14:30

16;20 

10

 100

 上课

 

 6.1

22:00

23:50

 10

100

编写程序

 

 6.2

14:30

16:30

100

编写程序

作业

 

 

七、个人总结

  这次买书问题,上课时老师提醒枚举的方法找出规律,把不同的特例单独解决,本以为实现时会很简单,但在实现过程中发现仍然要细心才能解决。

原文地址:https://www.cnblogs.com/a1397240667/p/5550978.html