在10--16的阶段性学习中,主要是针对JAVA中继承和多态的应用,课后的题量相对来说较少,但是难度相对较大,而且得分难,一般来说每次作业三个题目,第一题的内容占80分,而后面两个题目加起来也只能得到20分的满分。
设计与分析:我在本阶段碰到的第一题--“电信计费系列--1”中要求如下:
实现一个简单的电信计费程序:
假设南昌市电信分公司针对市内座机用户采用的计费方式:
月租20元,接电话免费,市内拨打电话0.1元/分钟,省内长途0.3元/分钟,国内长途拨打0.6元/分钟。不足一分钟按一分钟计。
南昌市的区号:0791,江西省内各地市区号包括:0790~0799以及0701。
输入格式:
输入信息包括两种类型
1、逐行输入南昌市用户开户的信息,每行一个用户,
格式:u-号码 计费类型 (计费类型包括:0-座机 1-手机实时计费 2-手机A套餐)
例如:u-079186300001 0
座机号码除区号外由是7-8位数字组成。
本题只考虑计费类型0-座机计费,电信系列2、3题会逐步增加计费类型。
2、逐行输入本月某些用户的通讯信息,通讯信息格式:
座机呼叫座机:t-主叫号码 接听号码 起始时间 结束时间
t-079186330022 058686330022 2022.1.3 10:00:25 2022.1.3 10:05:11
以上四项内容之间以一个英文空格分隔,
时间必须符合"yyyy.MM.dd HH:mm:ss"格式。提示:使用SimpleDateFormat类。
以上两类信息,先输入所有开户信息,再输入所有通讯信息,最后一行以“end”结束。
注意:
本题非法输入只做格式非法的判断,不做内容是否合理的判断(时间除外,否则无法计算),比如:
1、输入的所有通讯信息均认为是同一个月的通讯信息,不做日期是否在同一个月还是多个月的判定,直接将通讯费用累加,因此月租只计算一次。
2、记录中如果同一电话号码的多条通话记录时间出现重合,这种情况也不做判断,直接 计算每条记录的费用并累加。
3、用户区号不为南昌市的区号也作为正常用户处理。
输出格式:
根据输入的详细通讯信息,计算所有已开户的用户的当月费用(精确到小数点后2位,
单位元)。假设每个用户初始余额是100元。
每条通讯信息单独计费后累加,不是将所有时间累计后统一计费。
格式:号码+英文空格符+总的话费+英文空格符+余额
每个用户一行,用户之间按号码字符从小到大排序。
错误处理:
输入数据中出现的不符合格式要求的行一律忽略。
类图不过多展示。
输入样例:
在这里给出一组输入。例如:
u-079186300001 0 t-079186300001 058686330022 2022.1.3 10:00:25 2022.1.3 10:05:25 end
输出样例:
在这里给出相应的输出。例如:
079186300001 3.0 77.0
其余参考样例详见附件,未尽事宜以附件样例为准
我对题目的理解:除去常规的输入之外,应该设计一个类专门用来存储区号信息以及做区号检测,还有一个类用来计费,如果没有专门的类用来存储区号,后续的题目系列调用就会出问题
如下是我第一次提交的代码:import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.Scanner;
//2022.1.3 10:05:25
//u-079186300001 0
//t-079186300001 058686330022 2022.1.3 10:00:25
public class Main {
public static void main(String[] args) throws ParseException {
Scanner scanner = new Scanner(System.in);
// String line = null ;
// while(!"end".equals(line = scanner.nextLine())) {
String str1 = scanner.nextLine();//开户号
String str2 = scanner.next();//主叫
String str3 = scanner.next();//接听
String str4 = scanner.next();//第一个时间
String str5 = scanner.next();//第二个时间
String str6 = scanner.next();//第三个时间
String str7 = scanner.next();//第四个时间
String line = null ;
while(!"end".equals(line = scanner.nextLine())) {
SimpleDateFormat dateFormat=new SimpleDateFormat("HH:mm:ss");
// String format = dateFormat.format(str4);
Date d1 = dateFormat.parse(str5);
Date d2 = dateFormat.parse(str7);
long d3 = d2.getTime() - d1.getTime();
long second1 = d3 / (1000);
int second2 = (int) second1;
int b,c;
b = second2 / 60;
c = second2 % 60;
if(!(c==0))
b = b + 1;
if ("0791".equals(str3.substring(0, 4))) {
double d,e;
d = b*0.1;
e = 80.0-d;
System.out.print(str2.substring(2) + " ");
System.out.print(d + " ");
System.out.print(e);
}
else if ("0790".equals(str3.substring(0, 4))) {
double d,e;
d = b*0.3;
e = 80.0-d;
System.out.print(str2.substring(2) + " ");
System.out.print(d + " ");
System.out.print(e);
}
else if ("0792".equals(str3.substring(0, 4))) {
double d,e;
d = b*0.3;
e = 80.0-d;
System.out.print(str2.substring(2) + " ");
System.out.print(d + " ");
System.out.print(e);
}
else if ("0793".equals(str3.substring(0, 4))) {
double d,e;
d = b*0.3;
e = 80.0-d;
System.out.print(str2.substring(2) + " ");
System.out.print(d + " ");
System.out.print(e);
}
else if ("0794".equals(str3.substring(0, 4))) {
double d,e;
d = b*0.3;
e = 80.0-d;
System.out.print(str2.substring(2) + " ");
System.out.print(d + " ");
System.out.print(e);
}
else if ("0795".equals(str3.substring(0, 4))) {
double d,e;
d = b*0.3;
e = 80.0-d;
System.out.print(str2.substring(2) + " ");
System.out.print(d + " ");
System.out.print(e);
}
else if ("0796".equals(str3.substring(0, 4))) {
double d,e;
d = b*0.3;
e = 80.0-d;
System.out.print(str2.substring(2) + " ");
System.out.print(d + " ");
System.out.print(e);
}
else if ("0797".equals(str3.substring(0, 4))) {
double d,e;
d = b*0.3;
e = 80.0-d;
System.out.print(str2.substring(2) + " ");
System.out.print(d + " ");
System.out.print(e);
}
else if ("0798".equals(str3.substring(0, 4))) {
double d,e;
d = b*0.3;
e = 80.0-d;
System.out.print(str2.substring(2) + " ");
System.out.print(d + " ");
System.out.print(e);
}
else if ("0799".equals(str3.substring(0, 4))) {
double d,e;
d = b*0.3;
e = 80.0-d;
System.out.print(str2.substring(2) + " ");
System.out.print(d + " ");
System.out.print(e);
}
else {
double d,e;
d = b*0.6;
e = 80.0-d;
System.out.print(str2.substring(2) + " ");
System.out.print(d + " ");
System.out.print(e);
}
// System.out.println(str1 + " ");
// System.out.println(str1);
// System.out.printf(format);
// System.out.println(str1);
// System.out.print(str2 + " ");
// System.out.print(str3);
// System.out.print(str4 + " ");
// System.out.println(str5);
// System.out.print(second2);
// System.out.println(n);
}
}
}
这段代码的问题就在于没有设计类去解决数据存储以及调用,无法解耦,只是我第一次为了实现效果先在主类Main中的初稿。
踩坑心得:首先遇到的遇到的第一个问题是输入的内容问题,首先我只用了5个String输入,我假设将后面两个日期时间是连在一起的,但是很快我就发现,由于PTA的输入是以空格来当跳符的,所以只能修改输入个数改为7个输入,第一个的类型是nextLine(),因为这里的输入里有一个回车的跳符,第二行就分为6个输入,分别对应每一个有空格的输入。
遇到的第二个问题是调用SimpleDateFormat时间类的格式问题,因为我的输入将日期和具体的日期分开了的,所以我只要将原本的"yyyy.MM.dd HH:mm:ss"格式改为“HH:mm:ss”,从我最后面的代码注释就看得出来在这里纠结了一会。
第三个问题是数据的存放问题,因为对应的区号并不是连串的,所以就可能要用到正则表达式去对区号进行匹配检测,否则就是我第一次提交的代码这样,繁重的工作量大大提升了代码的耦合性。
改进建议:重新设计新的类,包括了新的数据存放数组和方法,节省代码空间。
多做继承应用之类的题目,不能第一时间反应出来总归到底是做的题目不够写的代码太少了。
总结:用过本阶段的学习,增加了对继承和多态的理解,尤其是继承和接口的应用,在很多时候方便我们自己写代码而可以设计简单的类去进行调用。
对平时作业的建议是可能相对现在的我来说确实很赶,实验和作业一大堆,一般写JAVA都是晚上或者半夜,白天上课多,下午做实验,晚上又没什么精神,而且最难得是得分少,总共三个题目,后面两个虽说简单一些,但是写满分也才20分,第一个的占比太高了,而且有时候题目的跨度很大,一下子根本做不出来复杂的设计和代码实现,所以很难拿到平时分。
对教师和其他线上线下实验并无其他改进建议,老师还是很负责的。



