文章标题

来源:互联网 发布:js 中文 unicode 编辑:程序博客网 时间:2024/06/05 00:54

北京市出租车打车计费规则Q10

  1. 每公里单价计费2.3元

  2. 起步价13元(包含3公里)

  3. 晚上23点(含)至次日凌晨5点(不含)打车,每公里单价计费加收20%。

  4. 每次乘车加收1元钱的燃油附加税。


输入 :时间和 速度序列,直到序列中速度为0为止。

例如输入:

9:1:10(时间) 20(车速,即起车时间为9点1分10秒,车速为20公里/小时行驶)

9:4:20(时间) 30(车速变成30,之前一直是上一个时间的速度20,即20公里/小时行驶了3分钟10秒)

9:10:12(时间) 60(车速变成60,之前一直是上一个时间的速度30)

10:1:10(时间) 30(车速变成30,之前一直是上一个时间的速度60)

10:1:20(时间) 0(10点1分20秒车停止了,速度是0)

则车辆停止,从这段时间内的总价格。

注意:跨度点比如夜里

输入

22:50:00 20

23:20:01 40

23:30:5 0

那么计价标准会行驶中变化(超过23:00:00,每公里加收20%)

要考虑 跨越午夜0:00的情况。

比如可能上车时间:

23:55:05

下车时间 0:20:07.

不需考虑时间超过1天的情况——即不用考虑日期。

输入格式要求:

时间 空格 速度

时间 空格 速度
输出:
总价格,保留2位小数
样例输入:

第一组(相邻时间均为5点~23点)
输入
6:10:0 10
6:40:0 24
6:50:0 0
输出
27.8
第二组(包含相邻时间跨23点)
输入
22:10:0 10
22:40:0 24
23:40:0 0
输出
81.16
第三组(包含相邻时间跨0点和23点)
输入
22:10:0 10
22:40:0 24
0:40:0 18
1:20:0 0
输出
180.52
第四组(包含相邻时间跨0点和5点)
输入
23:20:0 6
5:20:0 18
6:0:0 0
输出
131.76
第五组(时间均在23点到0点间)
输入
23:10:0 10
23:40:0 24
23:50:0 0
输出
30.56
第六组(包含相邻时间跨0点)
输入
23:40:0 18
0:20:0 24
0:40:0 0
输出
60.92
第七组(包含相邻时间跨5点)
输入
4:10:0 10
4:40:0 24
5:40:0 0
输出
78.4
第八组(包含相邻时间跨5点和23点)
输入
3:40:0 24
4:40:0 6
23:40:0 0
输出
336.92
第九组(时间均在0点到5点之间)
输入
2:10:0 10
2:40:0 24
2:50:0 0
输出
30.56


程序设计的初步想法

代码:

// billing system.cpp : Defines the entry point for the console application.//#include <iostream>#include <stdio.h>using std::cout;using std::cin;using std::endl;typedef struct In_fo{int hour;          int minute;int second;int velocity;       }Info;class Taxi{public:Taxi(){time1=0;time2=0;road=-3;flag=0;sum=0;}~Taxi(){delete [] p;}void input();void output();public:void compare();void calcOfTime(Info a,Info b);void calcmony(Info a,Info b);bool sameArea(Info a,Info b)const;bool normalArea(Info a); void isOffset(double &time,Info a);private:Info *p;int record;double sum;double time1;  double time2;double road;int flag;};void Taxi::input()    {p=NULL;p = new Info[5];for(int i=0;;++i){cin>>p[i].hour;             //输入一个数getchar();                  //然后接着输入字符     getchar() 的作用 使得输入很方便   12:30:0 6cin>>p[i].minute;            //再输入数             getchar();                   //输入字符            cin>>p[i].second;cin>>p[i].velocity;   record = i;if(p[i].velocity==0)break;}compare();                 //输入完成以后,进入总的框架}//总框架void Taxi::compare(){for(int i=0;i<record;++i){calcOfTime(p[i],p[i+1]);            //首先计算在到达下一次变速时计算time1,time2的时间calcmony(p[i],p[i+1]);              //计算费用}}void Taxi::calcOfTime(Info a,Info b)   //计算时间{time1=time2=0;int temple = a.hour;if(normalArea(a) && a.hour!=b.hour){time1 = 60 -a.minute;isOffset(time1,a);             //isOffset把最初的的3公里给消除,不可遗漏的小细节a.hour+=1;a.minute=0;}else if(!normalArea(a) && a.hour!=b.hour){time2 = 60 -a.minute;isOffset(time2,a);a.hour+=1;a.minute=0;}if(a.hour>=24)a.hour=0;if(temple<b.hour){for(int i=a.hour;i<b.hour && (temple+1)!=b.hour;++i){if(a.hour<5 || a.hour>=23){time2+=60;isOffset(time2,a);}else{time1+=60;isOffset(time1,a);}}}else if(temple>b.hour){if(a.hour>=23){time2 += 60;isOffset(time2,a);}else if(a.hour<23 && a.hour>=5){time1 += (23-a.hour)*60;isOffset(time1,a);}for(int i=0;i<b.hour;++i){if(i<5 || i>=23){time2 +=60;isOffset(time2,a);}else{time1 +=60;isOffset(time1,a);}}}if(b.hour<5 || b.hour>=23){time2 += b.minute - a.minute;isOffset(time2,a);}else{time1 += b.minute - a.minute;isOffset(time1,a);}}void Taxi::isOffset(double &time,Info a){if(flag==1)             //这里用来设置,一旦最初的3公里消除,那么就时间就可以真正计入到time1,time2中return;double i = time/60*a.velocity+road;if(i>0){flag=1;time -= (-road)*60/a.velocity;road=0;}else{time = 0;road =i;}return ;}bool Taxi::normalArea(Info a)     //是否是正常的时间,一边记录到time1,time2 中{return (a.hour>=5 &&a.hour<23);}void Taxi::calcmony(Info a,Info b){sum += time1*a.velocity*2.3/60;sum += time2*a.velocity*2.3*1.2/60;}void Taxi::output(){sum +=14;printf("%.2lf \n",sum);}void main(void){Taxi T;T.input();T.output(); }

问题:

1.模块的设计要分清各自执行什么功能,模块之间有相互联系。
2.一个模块的细节做好,有利于下一模块的处理。比如时间段的处理,使得费用的计算变得简单;

收获:

1.学会用getchar(),来处理输入的问题;
2.学会用利用速度的变化来,分开计算时间段和费用。抓住主要的变速的之前需要处理的问题。

0 0
原创粉丝点击