**对电话账单来说,春季和秋季的标准时间与夏时制时间的转换会带来有意思的问题。春 季,这种转换发生在(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.util.Scanner;
public class bill {
public static int[] starttime = new int[3];
public static int[] endtime = new int[3];
public static int[] poortime = new int[3];
public static int time;
public static float money;
public static int year;
public static int month;
public static int day;
public static int T = 0;
public static int W = 1;
public static int M = 1;
public static void main(String []args){
Scanner input=new Scanner(System.in);
System.out.println("开始年月日:");
year = input.nextInt();
month = input.nextInt();
day = input.nextInt();
System.out.println("开始时间:");
for(int i = 0;i < 3;i++){
starttime[i] = input.nextInt();
}
System.out.println("结束时间:");
for(int i = 0;i < 3;i++){
endtime[i] = input.nextInt();
}
Date();
Time();
if(M == 0){
System.out.println("时间是否经过变化了(是:1;否:0)");
int n = input.nextInt();
if(n == 1){
time = time + 60;
}
}
Money();
System.out.println("话费为" + money + "美元.");
}
public static void Date(){
if(month == 1 || month == 2)
{
year--;
month += 12;
}
W = (day + 2 * month + 3 * (month + 1)/5 + year + year/4 - year/100 + year/400 + 1) % 7;//0是周日,其他对应
if(month > 12)
{
year++;
month -= 12;
}
if(W == 0){
if(month == 3 && day >=25 && day <= 31){
T = 1;
}
else if(month == 10 && day >=25 && day <= 31){
T = 2;
}
else T = 0;
}
else T = 0;
}
public static void Time(){
if(starttime[0] > endtime[0]){
endtime[0] += 24;
}
for(int i = 0;i < 3;i++){
poortime[i] = endtime[i] - starttime[i];
}
if(T == 0){
if(W == 6 && endtime[0] >= 27){
if(month == 3 && day >=24 && day <= 30){
poortime[0]--;
}
else if(month == 10 && day >=25 && day <= 31){
poortime[0]++;
}
}
else if(W == 6 && endtime[0] >= 26 && endtime[0] <= 27 && month == 10 && day >=25 && day <= 31){
M = 0;//判断时间是否经过变化了的
}
}
else if(T == 1){
if(starttime[0] <= 2 && endtime[0] >= 3){
poortime[0]--;
}
}
else if(T == 2){
if(starttime[0] < 2 && endtime[0] >= 3){
poortime[0]++;
}
else if(poortime[1] < 0 && starttime[0] == 2 && endtime[0] == 2){
poortime[0]++;
}
else if(starttime[0] <= 2 && endtime[0] == 2){
M = 0;//判断时间是否经过变化了的
}
else if(starttime[0] == 2 && endtime[0] > 2){
M = 0;//判断时间是否经过变化了的
}
}
time = poortime[0] * 60 + poortime[1];
if(poortime[2] > 0){//为负数或0时不像前进,为正确值
time++;
}
}
public static void Money(){
if(time <= 20){
money = (float)(time * 0.05);
}
else{
money = (float) (1 + (time - 20) * 0.10);
}
}
}
1、等价类测试
等价类划分:
T1={通话时长不到1分钟};
T2={1分钟 ≤ 通话时长 ≤ 20分钟};
T3={通话时长大于20分钟};
S1={无时制转换};
S2={春时制与夏时制转换};
S3={夏时制与秋时制转换};
用例ID | 输入数据 | 预期输出 | 实际输出 | 是否通过 | 备注 |
---|---|---|---|---|---|
1 | 2017 5 26 12 15 26 12 15 56 | 0.05 | 话费为0.05美元. | 是 | 对应等价类T1,S1 |
2 | 2017 3 26 1 59 30 3 0 15 | 0.05 | 话费为0.05美元. | 是 | 对应等价类T1,S2 |
3 | 2017 10 29 2 59 50 2 0 15 | 0.05 | 话费为0.05美元. | 是 | 对应等价类T1,S3 |
4 | 2017 6 15 25 30 5 35 20 | 0.5 | 话费为0.5美元. | 是 | 对应等价类T2,S1 |
5 | 2017 3 26 1 50 20 3 5 10 | 0.75 | 话费为0.75美元. | 是 | 对应等价类T2,S2 |
6 | 2017 10 29 2 50 50 2 5 30 | 0.75 | 话费为0.75美元. | 是 | 对应等价类T2,S3 |
7 | 2017 8 5 6 30 45 8 29 50 | 11 | 话费为11.0美元. | 是 | 对应等价类T3,S1 |
8 | 2017 3 26 1 30 25 3 50 25 | 7 | 话费为7.0美元. | 是 | 对应等价类T3,S2 |
9* | 2017 10 28 23 50 25 3 50 20 | 29 | 话费为29.0美元. | 是 | 对应等价类T3,S3 |
2、边界值测试
边界值分析:
通话时长:{59s,1min,1min1s,19min,19min59s,20min,20min1s, 21min}
通话日期:{无时制转换时间,三月末四月初的一个星期日(春时制与夏时制转换),十月的最后一个星期日(夏时制与秋时制转换)}
用例ID | 输入数据 | 预期输出 | 实际输出 | 是否通过 | 备注 |
---|---|---|---|---|---|
1 | 2017 10 5 5 20 10 5 21 9 | 0.05 | 话费为0.05美元. | 是 | 59s,无转换 |
2 | 2017 3 26 1 59 50 3 0 49 | 0.05 | 话费为0.05美元. | 是 | 59s,春夏转换 |
3 | 2017 10 29 2 59 40 2 0 39 | 0.05 | 话费为0.05美元. | 是 | 59s,夏秋转换 |
4 | 2017 8 26 16 50 12 16 51 12 | 0.05 | 话费为0.05美元. | 是 | 1min,无转换 |
5 | 2017 3 26 1 59 50 3 0 50 | 0.05 | 话费为0.05美元. | 是 | 1min,春夏转换 |
6 | 2017 10 29 2 59 45 2 0 45 | 0.05 | 话费为0.05美元. | 是 | 1min,夏秋转换 |
7 | 2017 5 6 21 25 56 21 26 57 | 0.1 | 话费为0.1美元. | 是 | 1min1s,无转换 |
8 | 2017 3 26 1 59 20 3 0 21 | 0.1 | 话费为0.1美元. | 是 | 1min1s,春夏转换 |
9 | 2017 10 29 2 59 35 2 0 36 | 0.1 | 话费为0.1美元. | 是 | 1min1s,夏秋转换 |
10 | 2017 8 27 12 56 15 13 15 15 | 0.95 | 话费为0.95美元. | 是 | 19min,无转换 |
11 | 2017 3 26 2 0 0 3 19 0 | 0.95 | 话费为0.95美元. | 是 | 19min,春夏转换 |
12 | 2017 10 29 2 50 6 2 9 6 | 0.95 | 话费为0.95美元. | 是 | 19min,夏秋转换 |
13 | 2017 1 9 11 10 1 11 30 0 | 1 | 话费为1.0美元. | 是 | 19min59s,无转换 |
14 | 2017 3 26 1 50 20 3 10 19 | 1 | 话费为1.0美元. | 是 | 19min59s,春夏转换 |
15 | 2017 10 29 2 50 50 2 10 49 | 1 | 话费为1.0美元. | 是 | 19min59s,夏秋转换 |
16 | 2017 6 26 17 50 16 18 10 16 | 1 | 话费为1.0美元. | 是 | 20min,无转换 |
17 | 2017 3 26 1 56 26 3 16 26 | 1 | 话费为1.0美元. | 是 | 20min,春夏转换 |
18 | 2017 10 29 2 50 22 2 10 22 | 1 | 话费为1.0美元. | 是 | 20min,夏秋转换 |
19 | 2017 2 3 23 50 26 0 10 27 | 1.1 | 话费为1.1美元. | 是 | 20min1s,无转换 |
20 | 2017 3 26 1 55 26 3 15 27 | 1.1 | 话费为1.1美元. | 是 | 20min1s,春夏转换 |
21 | 2017 10 29 2 50 59 2 11 0 | 1.1 | 话费为1.1美元. | 是 | 20min1s,夏秋转换 |
22 | 2017 9 8 12 59 22 13 20 22 | 1.1 | 话费为1.1美元. | 是 | 21min,无转换 |
23 | 2017 3 26 1 50 26 3 11 26 | 1.1 | 话费为1.1美元. | 是 | 21min,春夏转换 |
24 | 2017 10 29 2 56 11 2 17 11 | 1.1 | 话费为1.1美元. | 是 | 21min,夏秋转换 |