对电话账单来说,春季和秋季的标准时间与夏时制时间的转换会带来有意思的问题。春季,这种转换发生在(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 个小时的通话。
两个代码放在一个包中,需要在代码开头加上package test否则代码会报错。
通话在发生时制转换的那一天的情况是比较复杂的,比如说我从2017年1月2日20时整开始通话一直到2017年1月3日10时整,那么就会有一天的跳跃,就需要24减去20再加上10,再判断是否大于20分钟进行计费。而在春夏转化时,则需要判断是否需要转换,转换就需要减去一个小时,因为我们实际通话时间多了一个小时。
而在10月最后一个星期日,则需要加一个小时。
等价类划分是一种典型的黑盒测试方法,等价类测试方法是把所有可能的输入数据,即程序的输入域划分成若干部分,然后从每一部分中选取少数有代表性的数据作为测试用例。使用等价类划分方法设计测试用例要经历划分等价类(列出等价类表)和选取测试用例两步。
等价类划分法:将测试过程中的输入、输出、操作等相似内容分组,从每组中挑选具有代表性的内容作为测试用例,划分份有效等价类和无效等价类
边界值分析法:确认输入、输出的边界,然后取刚好等于、大于、小于边界的参数作为测试用例测试;
他俩的定义就是不同,一个属于确认有有效区间,一个属于确认边界,联系就是等价类划分和边界值要一起考虑,边界值分析法属于等价类划分法的补充,任何等价区间都有边界,有边界就有等价区间。
代码:
package test;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Calendar;
import java.util.Date;
public class Telephone {
private String startingTime;
private String endingTime;
private long minute;//通话时长
public Date startT;
public Date endT;
public Telephone(String startingTime,String endingTime){
this.startingTime = startingTime;
this.endingTime = endingTime;
this.startT = StrToDate(this.startingTime);
this.endT = StrToDate(this.endingTime);
}
public Date StrToDate(String str) {
SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd HHmmss");
Date date = null;
try {
date = format.parse(str);
} catch (ParseException e) {
e.printStackTrace();
}
return date;
}
public String DateFormate(Date date){
SimpleDateFormat format = new SimpleDateFormat("yyyy/MM/dd HH:mm:ss E");
String sdate = format.format(date);
return sdate;
}
public long getTelephone(){
long between;
Calendar cal1 = Calendar.getInstance();
cal1.setTime(startT);
Calendar cal2 = Calendar.getInstance();
cal2.setTime(endT);
between = cal2.getTime().getTime()-cal1.getTime().getTime();
if(between<0)
minute =( (cal2.getTime().getTime()-cal1.getTime().getTime())/1000)/60;//得到通话时长
else
minute = (between/1000+59)/60;
//判断接通时间是否在发生转换的日期
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)
|| ((cal1.get(Calendar.MONTH) ==Calendar.APRIL && cal1.get(Calendar.DATE) >= 1 && cal1.get(Calendar.DATE) <= 4 && cal1.get(Calendar.DAY_OF_WEEK)==Calendar.SUNDAY)))
{
System.out.println("需要转换1");
if(cal1.get(Calendar.HOUR_OF_DAY)<2 && cal2.get(Calendar.HOUR_OF_DAY)>=3)
minute -=60;//时间从2点转换到3点减去1h
}else{
if((cal2.get(Calendar.MONTH) ==3 && cal2.get(Calendar.DATE) >= 29 && cal2.get(Calendar.DATE) <= 31 && cal2.get(Calendar.DAY_OF_WEEK)==Calendar.SUNDAY)
|| ((cal2.get(Calendar.MONTH) ==4 && cal2.get(Calendar.DATE) >= 1 && cal2.get(Calendar.DATE) <= 4 && cal2.get(Calendar.DAY_OF_WEEK)==Calendar.SUNDAY)))
//判断结束时间是否在转换的日期
{
if(cal2.get(Calendar.HOUR_OF_DAY)>3 )
minute -=60;
}
}
//将位于转换的时间段内的时间都看作已经转换之后的
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)
{
if(cal1.get(Calendar.HOUR_OF_DAY) ==2){
minute +=60;
}
}else{
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)
{
if(cal2.get(Calendar.HOUR_OF_DAY)==2)
{
minute +=60;
}
}
}
if(minute>1200 || minute <0){
System.out.println("时间错误,时限范围不对!");
return 0;
}else{
//System.out.println("间隔正确");
return minute;
}
}
}
代码2:
package test;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.text.DecimalFormat;
public class Telfee {
public static void main(String[] args) {
double Telfee;
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));//字符输入流
try {
System.out.println("请输入起始时间(如2017-01-02 030405):");
String sd1=br.readLine();//按行读入
System.out.println("请输入截止时间(如2017-01-02 030405):");
String sd2=br.readLine();
Telephone ht = new Telephone(sd1,sd2);
System.out.println("电话接通时间:"+ht.DateFormate(ht.startT));
System.out.println("电话结束时间:"+ht.DateFormate(ht.endT));
DecimalFormat df = new DecimalFormat("######0.00");
long minute = ( ht.getTelephone());
//计算话费
if(minute <= 20){
Telfee = 0.05*minute;
}else{
Telfee = 1.00 + (minute - 20)*0.1;
}
System.out.println("通话时间为:"+minute+"分钟");
System.out.println("本次通话话费为:"+df.format(Telfee)+"美元");
}catch (IOException e) {
e.printStackTrace();
}
}
}