机房收费系统中的分时间段计费问题

agangr 2003-09-11 11:02:11
我现在考虑设计一个分段计时计算消费额的程序,考虑跨天和年,我的想法是设定一个费率表
将一天24小时划分为几个时段,每个时段设定不同的费率。
在费率设置时,每一时段只设定开始时间,不需设定结束时间。这是因为本软件系统将每一时段的开始时间设定为既是本时段的开始点,又是上一时段的结束点,从而形成了一个循环。
例:我们将一天24小时分为3段:00:00~06:00、06:00~18:00、18:00~00:00,
即00:00既是00:00~06:00这时段的开始点,也是18:00~00:00这一时段的结束点,其它点与此相同,所以我们在费率设定时只需分别设置00:00、06:00、18:00这三个开始时间点的费率,即00:00所对应的消费的费率即是00:00~06:00这个时段的费率,06:00所对应的消费的费率即是06:00~18:00这个时段的费率,18:00所对应的消费的费率即是18:00~00:00(次日)这个时段的费率,因此就分别设定了三个时段的费率。

我的问题是在计算消费额的时候,应该用怎样算法来实现这个计费过程,特别是在跨时间段的消费的情况下,如何设计才合理?
...全文
145 9 打赏 收藏 转发到动态 举报
写回复
用AI写文章
9 条回复
切换为时间正序
请发表友善的回复…
发表回复
huazaijiajia 2003-09-16
  • 打赏
  • 举报
回复
恩,条条大路通罗马,只是不知道问问题的那个家伙能不能理解,呵呵。。。
PrgmLover 2003-09-16
  • 打赏
  • 举报
回复
呵呵,捧场来了。
支持huazaijiajia的算法。
对于日期之间的计算我倒更倾向于始末日期直接相减,得到差值,算出这整天的价钱(即(两个日期的差 - 1)---〉两个日期的差 ),然后再处理不满一天的时间,这样只用处理一边:即结束那天。如果结束时间在一天中早于开始时间,则减去我们计算的值,相反加上。一天内的计算当然是没问题。
huazaijiajia 2003-09-16
  • 打赏
  • 举报
回复
呵呵。。。谢谢捧场
XXSingle 2003-09-16
  • 打赏
  • 举报
回复
楼上好强喔。。。。帮你up
huazaijiajia 2003-09-16
  • 打赏
  • 举报
回复
这个算法其实还是可以的,因为不管你上机多少天,就算你上机一年都行,算法的时间复杂度都不会随之增加,上机一年跟上机一天所要运算的时间都是一样的!
我是这样想的:设3个变量:MorningCount(跨过00:00~06:00这个时段的次数), NoonCount(……), NightCount(……),这个题目就可以具体为算出这3个变量的值
最后的消费额=MorningCount*这个时段的价钱 + NoonCount*这个时段的价钱+NightCount*这个时段的价钱。好了,到这你也有个大概的眉目了吧!
那么我再具体一点,怎么算这个MorningCount和其他两个值呢?可以把这个功能做成一个函数,TotalCost(StartTime: TDateTime; EndTime: TDateTime): Double;有两个参数,一个是开始的时间,一个是结束的时间,两个时间均带日期,如:2003-9-3 18:12:12,
函数开始:初始化 然后,取两个时间的日期,只是日期,相减
if 两个日期的差 > 1 then
begin
MorningCount:= MorningCount + (两个日期的差 - 1);
NoonCount:= NoonCount + (两个日期的差 - 1);
NightCount:= NightCoun + (两个日期的差 - 1);
end;
举个例子,两个日期:2003-9-3和2003-9-6,相差3天,那么其中有2天完全是3个时段
都跨越了,所以相应的这三个值都要加上日期的差再减去1。到现在,中间所跨越的
次数已经算出来了,那么还剩下两头要计算,也就是2003-9-3和2003-9-6所要跨越的时段
这其实就是 if 来 if 去的,难度都不是很大。最后再来个总计算,不是很难啊!主要是
把思路理清楚
昨天晚上写这个程序,写了一个晚上,其中还是有蛮多细节要注意的,基本上算是完成了。
跟你说个故事:有一次我去面试一家软件公司,考官就出了类似的题目,说的是车库管理
的计算,有单车,摩托车,汽车,分时段收费。然后我写了个函数:
TotalCost(CarType: String; StartTime: TDateTime; EndTime: TDateTime): Double;
多了"车类型"这个参数,当时没有想得很仔细,很多地方考虑得都不完善,结果不合格。
那个家伙说:可能这个工作不大适合你们,你们看一下,还是……另外再找吧……。于是
我跟一同学拿起简历走人,走的时候他又说:你们的水平根本就达不到……,回去继续修炼
吧! 他妈的!我恨啊!为此郁闷几天,不过他说得也有道理,我的水平的确还不够硬,还
要继续努力!他妈的,真想毙了他!
平时没事来 csdn 逛逛,没想到你又提这样的问题,我还是写出来吧,于是昨晚本想把程序
写出来,后来一检测,还有一些小问题,今天就可以解决了
怎么样?你要不要源代码,我可以发给你!
蓝色光芒 2003-09-15
  • 打赏
  • 举报
回复
思路好象有问题,换一下思路试试。
shodoy 2003-09-11
  • 打赏
  • 举报
回复
让开,让开~~~~~~~
╭══╮
╭╯ΘΘ║
╰⊙═⊙╯。oо○-俺来给你送月饼了

八月十五中秋节快到了.送你一个月饼,含量成分:100%纯关心;配料:甜蜜+快乐+开心+宽容+忠诚=幸福;保质期:一辈子;保存方法:珍惜
(转载)
agangr 2003-09-11
  • 打赏
  • 举报
回复
想的不是很明白
huazaijiajia 2003-09-11
  • 打赏
  • 举报
回复
我的想法是:关键是算出跨过这个时段的次数,比如说这个人上机,他跨过00:00这个时段有多少次?跨过06:00又是多少次?计算出这个数字以后再乘上价钱

大概想想而已,还没有具体仔细的思考

2,496

社区成员

发帖
与我相关
我的任务
社区描述
Delphi 数据库相关
社区管理员
  • 数据库相关社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧