软件测试第一次实验

最近做过这样一个题目:

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

 

这道题中,通话在发生时制转换的那一天的情况是比较复杂的,下面是本人自己写的程序:

[html]  view plain  copy
  1. import java.text.ParseException;  
  2. import java.text.SimpleDateFormat;  
  3. import java.util.Calendar;  
  4. import java.util.Date;  
  5.   
  6. public class HoldingTime {  
  7.     private String startingTime;  
  8.     private String endingTime;  
  9.     private long minute;//通话时长  
  10.     public Date startT;  
  11.     public Date endT;  
  12.     public  HoldingTime(String startingTime,String endingTime){  
  13.         this.startingTime = startingTime;  
  14.         this.endingTime = endingTime;  
  15.         this.startT = StrToDate(this.startingTime);  
  16.         this.endT = StrToDate(this.endingTime);  
  17.     }  
  18.       
  19.     public Date StrToDate(String str) {  
  20.            SimpleDateFormat format = new SimpleDateFormat("yyyyMMddHHmmss");  
  21.            Date date = null;  
  22.            try {  
  23.             date = format.parse(str);  
  24.            } catch (ParseException e) {  
  25.             e.printStackTrace();  
  26.            }  
  27.            return date;  
  28.         }  
  29.     public String DateFormate(Date date){  
  30.         SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss E");  
  31.         String sdate = format.format(date);  
  32.         return sdate;  
  33.     }  
  34.     public long getHoldingTime(){  
  35.         long between;  
  36.         Calendar cal1 = Calendar.getInstance();  
  37.         cal1.setTime(startT);  
  38.         Calendar cal2 = Calendar.getInstance();  
  39.         cal2.setTime(endT);  
  40.           
  41.         between = cal2.getTime().getTime()-cal1.getTime().getTime();  
  42.         if(between<0)  
  43.             minute =( (cal2.getTime().getTime()-cal1.getTime().getTime())/1000)/60;//得到通话时长  
  44.         else  
  45.             minute = (between/1000+59)/60;  
  46.         //判断接通时间是否在发生转换的日期  
  47.         if((cal1.get(Calendar.MONTH) ==Calendar.MARCH && cal1.get(Calendar.DATE) >= 29 && cal1.get(Calendar.DATE) <= 31 && cal1.get(Calendar.DAY_OF_WEEK)==Calendar.SUNDAY)  
  48.             || ((cal1.get(Calendar.MONTH) ==Calendar.APRIL && cal1.get(Calendar.DATE) >= 1 && cal1.get(Calendar.DATE) <= 4 && cal1.get(Calendar.DAY_OF_WEEK)==Calendar.SUNDAY)))  
  49.         {  
  50.             System.out.println("需要转换1");  
  51.             if(cal1.get(Calendar.HOUR_OF_DAY)<2 && cal2.get(Calendar.HOUR_OF_DAY)>=3)  
  52.                 minute -=60;//时间从2点转换到3点减去1h  
  53.         }else{  
  54.             if((cal2.get(Calendar.MONTH) ==3 && cal2.get(Calendar.DATE) >= 29 && cal2.get(Calendar.DATE) <= 31 && cal2.get(Calendar.DAY_OF_WEEK)==Calendar.SUNDAY)  
  55.                     || ((cal2.get(Calendar.MONTH) ==4 && cal2.get(Calendar.DATE) >= 1 && cal2.get(Calendar.DATE) <= 4 && cal2.get(Calendar.DAY_OF_WEEK)==Calendar.SUNDAY)))  
  56.                 //判断结束时间是否在转换的日期  
  57.             {  
  58.                 if(cal2.get(Calendar.HOUR_OF_DAY)>3 )  
  59.                     minute -=60;  
  60.             }  
  61.         }  
  62.         //将位于转换的时间段内的时间都看作已经转换之后的  
  63.         if(cal1.get(Calendar.MONTH) ==Calendar.OCTOBER && cal1.get(Calendar.DATE) >= 25 && cal1.get(Calendar.DATE) <= 31 && cal1.get(Calendar.DAY_OF_WEEK)==Calendar.SUNDAY)  
  64.         {  
  65.             if(cal1.get(Calendar.HOUR_OF_DAY) ==2){  
  66.                         minute +=60;  
  67.             }  
  68.         }else{  
  69.             if(cal2.get(Calendar.MONTH) ==Calendar.OCTOBER && cal2.get(Calendar.DATE) >= 25 && cal2.get(Calendar.DATE) <= 31 && cal2.get(Calendar.DAY_OF_WEEK)==Calendar.SUNDAY)  
  70.             {  
  71.                 if(cal2.get(Calendar.HOUR_OF_DAY)==2)  
  72.                 {  
  73.                         minute +=60;  
  74.                 }  
  75.             }  
  76.         }  
  77.         if(minute>1200 || minute <0){  
  78.             System.out.println("时间错误,时限范围不对!");  
  79.             return 0;  
  80.         }else{  
  81.             //System.out.println("间隔正确");  
  82.             return minute;  
  83.         }  
  84.     }  
  85. }  
这段代码是判断时间并且返回通话时长的

-

[html]  view plain  copy
  1. import java.io.BufferedReader;  
  2. import java.io.IOException;  
  3. import java.io.InputStreamReader;  
  4. import java.text.DecimalFormat;  
  5. public class TelFee {  
  6.     public static void main(String[] args) {  
  7.           
  8.         double telFee;  
  9.         BufferedReader br = new BufferedReader(new InputStreamReader(System.in));//字符输入流  
  10.          try {  
  11.             System.out.println("请输入起始时间(如20170102030405):");  
  12.             String sd1=br.readLine();//按行读入  
  13.             System.out.println("请输入截止时间(如20170102030405):");  
  14.             String sd2=br.readLine();  
  15.               
  16.             HoldingTime ht = new HoldingTime(sd1,sd2);  
  17.               
  18.             System.out.println("电话接通时间:"+ht.DateFormate(ht.startT));  
  19.             System.out.println("电话结束时间:"+ht.DateFormate(ht.endT));  
  20.               
  21.             DecimalFormat    df   = new DecimalFormat("######0.00");   
  22.              long minute = ht.getHoldingTime();  
  23.             //计算话费  
  24.             if(minute <= 20){  
  25.                 telFee = 0.05*minute;  
  26.             }else{  
  27.                 telFee = 1.00 + (minute - 20)*0.1;  
  28.             }  
  29.             System.out.println("通话时间为:"+minute+"分钟");  
  30.             System.out.println("本次通话话费为:"+df.format(telFee)+"美元");  
  31.         }catch (IOException e) {  
  32.                e.printStackTrace();  
  33.              }  
  34.     }  
  35. }  
这段则是相应的输入输出代码。


做这道题的时候调用了Calendar类的一些方法,相较于Date类来说,个人觉得Calendar类使用起来更加的方便。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值