软件测试python版本‘电话账单’题解

题目:对电话账单来说,春季和秋季的标准时间与夏时制时间的转换会带来有意思的问题。春 季,这种转换发生在(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

  • 1
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值