文章标题
来源:互联网 发布:js 中文 unicode 编辑:程序博客网 时间:2024/06/05 00:54
北京市出租车打车计费规则Q10
每公里单价计费2.3元
起步价13元(包含3公里)
晚上23点(含)至次日凌晨5点(不含)打车,每公里单价计费加收20%。
每次乘车加收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.学会用利用速度的变化来,分开计算时间段和费用。抓住主要的变速的之前需要处理的问题。
- 文章标题文章标题文章标题文章标题文章标题文章标题文章标题文章标题文章标题文章标题文章标题文章标题文章标题文章标题文章标题文章标题文章标题
- 文章标题
- 文章标题
- 文章标题
- 文章标题 文章标题 文章标题 文章标题
- 文章标题
- 文章标题
- 文章标题
- 文章标题
- 文章标题
- 文章标题
- 文章标题
- 文章标题
- 文章标题
- 文章标题
- 文章标题
- 文章标题
- 文章标题
- 【leetcode】141. Linked List Cycle
- spring框架的引入
- 51单片机与Arduino通过nrf24l01无线模块通信
- LeetCode-150.Evaluate Reverse Polish Notation
- emWin 2天速成实例教程000_如何快速入门ucGUI/emWin
- 文章标题
- POJ 2195 Going Home(最小权匹配、KM算法)
- The Donkey of Gui Zhou驴和老虎是否相遇问题(hdu4704)
- java容器
- Zabbix3.0 自动邮件报障
- leetcode 171 Excel Sheet Column Number C++
- <canvas>学习笔记——实时绘制线条摆动
- Java泛型
- Unity3d中的属性(Attributes)整理