软件测试——电话账单收费

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

 

实现代码如下:

import java.io.*;
import java.text.DecimalFormat;
public class panduan{
public static int testweek(int Year,int Month,int Day) {
//利用公式判断某年某月某日为星期几
int iweek = 0;
int y=0,c=0,m=0,d=0;

if(Month == 1 || Month == 2) {
c=(Year-1)/100;
y=(Year-1)%100;
m=Month+12;
d=Day;
}

else {
c=Year/100;
y=Year%100;
m=Month;
d=Day;
}
        
iweek=y+y/4+c/4-2*c+26*(m+1)/10+d-1;
iweek=iweek>=0?(iweek%7):(iweek%7+7);
if(iweek == 0) {
iweek=7;
}
return iweek;
}

//判断日期是否为特殊时间段,并对通话时间进行处理
public static long testdate1(int Month,int Day,long Min) {
//boolean flag=false;
if(Month==3||Month==4) {
if(Day+7>31||Day+1<8) {
//判断是否为三月末、四月初的星期日
  Min=Min-60;  
}
}
return Min;
}

public static long testdate2(int Month,int Day,long Min){

if(Month==10) {
if(Day>=24&&Day<=30) {
//判断是否为10月最后一个星期日
  Min=Min+60;
}
}

return Min;
}
}



import java.text.DecimalFormat;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Scanner;
import java.util.Date;
public class sy {
  public static void main(String [] args) throws ParseException { 
        Scanner sc = new Scanner(System.in); 
        System.out.println("请输入开始年:"); 
        int Byear = sc.nextInt(); 
        System.out.println("请输入开始月:"); 
        int Bmonth = sc.nextInt(); 
        System.out.println("请输入开始日:"); 
        int Bday = sc.nextInt();
        //后续判断需要用到“小时”,此处单独输入,下同
        System.out.println("请输入开始时:"); 
        int Bhour = sc.nextInt();
        System.out.println("请输入开始时分秒:"); 
        String Btime = sc.next(); 
       
       
        System.out.println("请输入截止日:"); 
        int Oday = sc.nextInt(); 
        System.out.println("请输入截止时:"); 
        int Ohour = sc.nextInt();
        System.out.println("请输入截止时分秒:"); 
        String Otime = sc.next(); 
       
        
        double money;
        
        //计算开始时间与截止时间的差值
        SimpleDateFormat dfs = new SimpleDateFormat("HH:mm:ss");
        
        Date begin=dfs.parse(Btime);
        Date end = dfs.parse(Otime);
        long between=(end.getTime()-begin.getTime())/1000;//除以1000是为了转换成秒
        long min=between/60;
        //不足一分钟的按一分钟计算
        if(between%60>0){
        min=min+1;
        }
         
        //System.out.print(min);
        
        int week;
        //调用testweek函数判断为星期几
        week=panduan.testweek(Byear,Bmonth,Bday);
        //当前时间为星期天时,考虑特殊情况
        if(week==7){
        if(Bhour<2||Ohour>=3){
         /*当时间在2:00到3:00转换的区域内时,
         * 调用testdate1函数进一步判断是否为转换时间,
         * 并对通话时间进行相应处理
         */
        min=panduan.testdate1(Bmonth,Bday,min);
        }
        if(Bhour<=2||Ohour>=2){
         /*当时间在2:59:59到2:00转换的区域内时,
         * 调用teatdate2函数进一步判断是否为转换时间,
         * 并对通话时间进行相应处理
         */
        min=panduan.testdate2(Bmonth,Bday,min);
        }
       //此处输出一下计算出来的时间,看是否正确
       // System.out.println("时间"+min);
        
        if(min<=20) {
//当通话时间不超过20分钟时,计算费用
money=0.05*min;
}
else {
//当通话时间超过20分钟时,计算费用
money=1+0.1*min;


}
//将double类型的money的值保留小数点后三位输出
DecimalFormat df = new DecimalFormat("0.000");
String mmoney = df.format(money);
System.out.printf("电话费用一共为:"+mmoney);
}
        
  }


}


总结:

当通话时期为10月最后一个星期日时,如果通话开始时间为2:20,截止时间为2:30,不能确定通话时长是10分钟还是70分钟,程序中直接作70分钟处理。

后续仍需改进。

  • 1
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
支付账单分期是一种常见的金融服务,它允许用户将大额账单分成多个期数进行还款。以下是一些支付账单分期的测试用例: 1. 正常分期: - 输入:账单金额、分期期数、利率、手续费等参数 - 预期输出:成功分期,并返回每期应还金额、总还款金额、利息、手续费等信息 2. 分期期数超出限制: - 输入:账单金额、超出限制的分期期数、利率、手续费等参数 - 预期输出:分期失败,提示分期期数超出限制 3. 账单金额为负数: - 输入:负数的账单金额、分期期数、利率、手续费等参数 - 预期输出:分期失败,提示账单金额无效 4. 利率为负数: - 输入:账单金额、分期期数、负数的利率、手续费等参数 - 预期输出:分期失败,提示利率无效 5. 手续费为负数: - 预期输出:分期失败,提示手续费无效 6. 分期金额小于每期最低还款金额: - 输入:账单金额、分期期数、利率、手续费等参数,其中分期金额小于每期最低还款金额 - 预期输出:分期失败,提示分期金额过低 7. 分期金额大于账单金额: - 输入:账单金额、分期期数、利率、手续费等参数,其中分期金额大于账单金额 - 预期输出:分期失败,提示分期金额超出账单金额 8. 分期成功后的还款计划: - 预期输出:返回每期应还金额、总还款金额、利息、手续费等信息
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值