对电话账单来说,春季和秋季的标准时间与夏时制时间的转换会带来有意思的问题。春季,这种转换发生在(3 月末,4 月初的)星期日凌晨 2:00 时,这时时钟要设置为凌晨 3:00 时。对称的转换通常发生在 10 月最后一个星期日,时钟要从 2:59:59 调回到 2:00:00。
请为采用以下费率计算用户的每月通话费:
(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>=0week%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 //判断是否为三月末、四月初的星期日
Min=Min-60;
}
}
return Min;
}
public static long testdate2(int Month,int Day,long Min){
if(Month==10) {
if(Day>=24&&Day //判断是否为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=3){
/*当时间在2:00到3:00转换的区域内时,
* 调用testdate1函数进一步判断是否为转换时间,
* 并对通话时间进行相应处理
*/
min=panduan.testdate1(Bmonth,Bday,min);
}
if(Bhour=2){
/*当时间在2:59:59到2:00转换的区域内时,
* 调用teatdate2函数进一步判断是否为转换时间,
* 并对通话时间进行相应处理
*/
min=panduan.testdate2(Bmonth,Bday,min);
}
//此处输出一下计算出来的时间,看是否正确
// System.out.println(“时间”+min);
if(min //当通话时间不超过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分钟处理。
后续仍需改进。
文章知识点与官方知识档案匹配,可进一步学习相关知识Java技能树首页概览93773 人正在系统学习中 相关资源:夏软还原大师v3.4.0.1116官方免费安装版-其它代码类资源-CSDN文库
声明:本站部分文章及图片源自用户投稿,如本站任何资料有侵权请您尽早请联系jinwei@zod.com.cn进行处理,非常感谢!