题目:对电话账单来说,春季和秋季的标准时间与夏时制时间的转换会带来有意思的问题。春 季,这种转换发生在(3 月末,4 月初的)星期日凌晨 2:00 时,这时时钟要设置为凌晨 3:00 时。对称的转换通常发生在 10 月最后一个星期日,时钟要从 2:59:59 调回到 2:00:00。
请为采用以下费率计算用户的每月通话费:
(1)通话时间<=20 分钟时,每分钟收费 0.05 美元,通话时间不到 1 分钟时按 1 分钟 计算。
(2)通话时间>20 分钟时,收费 1.00 美元,外加每分钟 0.10 美元,超过 20 分钟的部 分,不到 1 分钟时按 1 分钟计算。
假设:
(1)通话计费时间从被叫方应答开始计算,到呼叫方挂机时结束。
(2)通话时间的秒数四舍五入到分钟。
(3)没有超过 20 个小时的通话。
最近,软件测试实验要求,写一个程序,关于电话账单的题目,要交作业了,我现在修改了代码,写个博客。在网上,也找搜了好些,但是基本上都是用Java或者c++来写的,我觉得这个代码太麻烦了,使用了python来解决了这道题,可能有点不对,但是可以参考。使用Python的时间类datetime包处理时间比Java和c++简单得多。
先说说我对这道题的理解,也不知道对不对,我是按照我的理解来写的代码。我的理解是春夏时制转换的时候,需要减去一个小时,如从01:30:00开始通话,当到达02:00:00的时候,由于存在转换,此时显示的是03:30:00。相应的夏秋时制转换的时候,需要加上一个小时,如从02:00:00通话,到02:10:00结束,由于存在转换,可以是由02:00:00通话到02:59:59后,调回到02:00:00然后又继续通话十分钟,实际是70分钟,当然这个02:00:00也可以是从02:59:59调回到02:00:00后在进行通话的,所有也有可能是10分钟。
from datetime import datetime as dt
import datetime
print("请输入如'2020-03-20 14:16:30'的时间格式")
# 判读输入的时间是否正确,是否超过20小时,如果错误,将重新输入
while True:
start_time = input("输入通话开始时间:\n")
end_time = input("输入通话结束时间:\n")
s_time = dt.strptime(start_time, '%Y-%m-%d %H:%M:%S') #标准化输入时间
e_time = dt.strptime(end_time, '%Y-%m-%d %H:%M:%S')
time_difference = (e_time - s_time)
if time_difference.total_seconds() 20:
month = s_time.strftime("%m")
day = s_time.strftime("%d")
week = s_time.strftime("%w")
hour_str = s_time.strftime("%H")
hour_end = e_time.strftime("%H")
# 这里判断时间是否是十月最后一个星期日,如果是可以输入开始时间为02:30:00,结束时间为02:10:00
if int(month) == 10 and 31-int(day)<7 and int(week) == 0 and int(hour_str) == 2 and int(hour_end) == 2:
break
else:
print("输入的时间有误,请重新输入!")
else:
break
# 春夏时制转换收费
def fee_transformation_sum(minute, second):
total_minute = minute - 60
fee_transformation_no(total_minute, second)
# 夏秋时制转换收费
def fee_transformation_aut(minute, second):
total_minute = minute + 60
fee_transformation_no(total_minute, second)
# 无时制转换收费
def fee_transformation_no(minute, second):
if second == 0:
if minute <= 20:
fee = minute * 0.05
print("通话费用是:", fee)
else:
fee = 1 + (minute - 20) * 0.1
print("通话费用是:", fee)
else:
if (minute + 1) <= 20:
fee = (minute + 1) * 0.05
print("通话费用是:", fee)
else:
fee = 1 + (minute + 1 -20) * 0.1
print("通话费用是:", fee)
# 获取输入的时间的月份、天数、星期几、小时
month = s_time.strftime("%m")
day_s = s_time.strftime("%d")
week_s = s_time.strftime("%w")
hour_s = s_time.strftime("%H")
hour_e = e_time.strftime("%H")
# 取得通话时长
minutes = time_difference.total_seconds() // 60
seconds = time_difference.total_seconds() % 60
if int(month) == 3 and 31-int(day_s) 2:
print("是三月最后一个星期日且通话时间是在02:00:00之前,调至03:00:00之后")
fee_transformation_sum(minutes, seconds)
elif int(month) == 4 and int(day_s) 2:
print("是四月最初一个星期日且通话时间是凌晨两点到三点之间")
fee_transformation_sum(minutes, seconds)
elif int(month) == 10 and 31-int(day_s)= 0:
print("如果是十月最后一个星期日且通话时间是在02:00:00之前,转换到02:00:00,则")
fee_transformation_aut(minutes, seconds)
print("或者是十月最后一个星期日且通话时间是在02:00:00之前,未转换到02:00:00,则")
fee_transformation_no(minutes, seconds)
elif int(hour_s) == 2 and int(hour_e) == 2 and minutes < 0:
minu = (time_difference.total_seconds() + 3600) // 60
seco = (time_difference.total_seconds() + 3600) % 60
fee_transformation_no(minu, seco)
else:
fee_transformation_no(minutes, seconds)
else:
fee_transformation_no(minutes, seconds)
以下是按照等价类和边界值进行测试的数据
等价类划分:
T1={通话时长不到1分钟}
T2={1分钟 ≤ 通话时长 ≤ 20分钟}
T3={通话时长大于20分钟}
S1={无时制转换}
S2={春时制与夏时制转换}
S3={夏时制与秋时制转换}
用例ID
输入数据
预期输出
实际输出
是否通过
备注
1
2020-02-26 14:00:00
2020-02-26 14:00:10
0.05
0.05
是
对应等价类T1,S1
2
2020-03-29 02:00:00
2020-03-29 03:00:20
0.05
0.05
是
对应等价类T1,S2
3
2020-10-25 02:59:34
2020-10-25 02:00:22
0.05
0.05
是
对应等价类T1,S3
4
2020-10-25 01:59:22
2020-10-25
02:00:20
5.1或0.05
5.1或0.05
是
对于等价类T1,S3
5
2020-02-26 14:00:00
2020-02-26 14:18:10
0.95
0.95
是
对应等价类T2,S1
6
2020-03-29 01:59:00
2020-03-29 03:16:10
0.9
0.9
是
对应等价类T2,S2
7
2020-10-25 02:58:00
2020-10-25 02:16:10
0.95
0.95
是
对应等价类T2,S3
8
2020-10-25 01:58:00
2020-10-25 02:16:10
6.9或0.95
6.9或0.95
是
对应等价类T2,S3
9
2020-02-26 14:00:00
2020-02-26 15:30:30
8.1
8.1
是
对应等价类T3,S1
10
2020-03-29 01:59:00
2020-03-29 03:16:10
0.9
0.9
是
对应等价类T3,S2
11
2020-10-25 01:58:00
2020-10-25 02:36:10
8.9或2.9
8.9或2.9
是
对应等价类T3,S3
12
2020-10-25 02:36:10
2020-10-25 02:26:10
4.0
4.0
是
对应等价类T3,S3
边界值测试:
边界值分析:
通话时长:{59s,1min,1min1s,19min,19min59s,20min,20min1s,21min}
通话日期:{无时制转换时间,三月末四月初的一个星期日(春时制与夏时制转换),十月的最后一个星期日(夏时制与秋时制转换)}
用户ID
输入数据
预期输出
实际输出
是否通过
备注
1
2020-02-27 14:00:00
2020-02-27 14:00:59
0.05
0.05
是
59s,无转换
2
2020-03-29 01:59:10
2020-03-29 03:00:09
0.05
0.05
是
59s,春夏转换
3
2020-10-25 02:59:10
2020-10-25 02:00:09
0.05
0.05
是
59s,夏秋转换
4
2020-02-27 14:00:12
2020-02-27 14:01:12
0.05
0.05
是
1min,无转换
5
2020-03-29 01:59:10
2020-03-29 03:00:10
0.05
0.05
是
1min,春夏转换
6
2020-10-25 02:59:10
2020-10-25 02:00:10
0.05
0.05
是
1min,夏秋转换
7
2020-02-27 14:00:12
2020-02-27 14:01:13
0.1
0.1
是
1min1s,无转换
8
2020-03-29 01:59:10
2020-03-29 03:00:11
0.1
0.1
是
1min1s,春夏转换
9
2020-10-25 02:59:10
2020-10-25 02:00:11
0.1
0.1
是
1min1s,夏秋转换
10
2020-02-27 14:00:12
2020-02-27 14:19:12
0.95
0.95
是
19min,无转换
11
2020-03-29 01:59:10
2020-03-29 03:18:10
0.95
0.95
是
19min,春夏转换
12
2020-10-25 02:59:10
2020-10-25 02:18:10
0.95
0.95
是
19min,夏秋转换
13
2020-02-27 14:00:12
2020-02-27 14:20:11
1.0
1.0
是
19min59s,无转换
14
2020-03-29 01:59:10
2020-03-29 03:19:09
1.0
1.0
是
19min59s,春夏转换
15
2020-10-25 02:59:10
2020-10-25 02:19:09
1.0
1.0
是
19min59s,夏秋转换
16
2020-02-27 14:00:12
2020-02-27 14:20:12
1.0
1.0
是
20min,无转换
17
2020-03-29 01:59:10
2020-03-29 03:19:10
1.0
1.0
是
20min,春夏转换
18
2020-10-25 02:59:10
2020-10-25 02:19:10
1.0
1.0
是
20min,夏秋转换
19
2020-02-27 14:00:12
2020-02-27 14:20:13
1.1
1.1
是
20min1s,无转换
20
2020-03-29 01:59:10
2020-03-29 03:19:11
1.1
1.1
是
20min1s,春夏转换
21
2020-10-25 02:59:10
2020-10-25 02:19:11
1.1
1.1
是
20min1s,夏秋转换
22
2020-02-27 14:00:12
2020-02-27 14:21:12
1.1
1.1
是
21min,无转换
23
2020-03-29 01:59:10
2020-03-29 03:20:10
1.1
1.1
是
21min,春夏转换
24
2020-10-25 02:59:10
2020-10-25 02:20:10
1.1
1.1
是
21min,夏秋转换
实验测试的部分截图:
我个人觉得还是python写起来简单很多的。
作者:foolishbig