题目:对电话账单来说,春季和秋季的标准时间与夏时制时间的转换会带来有意思的问题。春 季,这种转换发生在(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() < 0 or time_difference.total_seconds() // 3600 > 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)<=7 and int(week_s) == 0 and int(hour_e) > 2:
print("是三月最后一个星期日且通话时间是在02:00:00之前,调至03:00:00之后")
fee_transformation_sum(minutes, seconds)
elif int(month) == 4 and int(day_s)<7 and int(week_s) == 0 and int(hour_e) > 2:
print("是四月最初一个星期日且通话时间是凌晨两点到三点之间")
fee_transformation_sum(minutes, seconds)
elif int(month) == 10 and 31-int(day_s)<=7 and int(week_s) == 0:
if int(hour_e) == 2 and minutes >= 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 |