23201430-张文杰的第一次博客作业
(1)前言:
- 本次布置的三次题目集涉及的知识点: 题目集1 主要侧重于考察了java中 类与对象 的知识点,同时涉及了关于java中数组的基本应用,关联类等知识的考查。题目集2 主要侧重于考察方法的运用,用于解决简单的应用题。题目集3主要侧重于考察了进阶的类的运用。
- 题量逐渐减少。
- 难度逐渐提升。
- 代码量逐渐增。
(2)设计与分析:
题目集1:
第一题uml图

对题目的分析:
- 设计Fan类:根据题目要求,设计Fan类的属性和方法,包括成员变量、构造方法和toString方法。
- 创建对象:根据输入的属性,使用无参构造方法和有参构造方法分别创建两个Fan对象。
- 调用方法:调用对象的toString方法,显示风扇的信息。
- 输出格式:按照输出格式要求,输出风扇的速度、颜色、半径以及风扇是否打开的信息。
第二题uml图

对题目的分析:
具体要求包括:
- 定义三个常量SLOW、MEDIUM和FAST,分别对应速度1、2和3。
- 定义私有数据域speed(int类型,默认值为SLOW)、on(boolean类型,默认值为false)、radius(double类型,默认值为5)、color(String类型,默认值为"white")。
- 提供访问器和修改器方法来操作这些数据域。
- 提供无参构造方法和有参构造方法。
- 提供toString方法,根据风扇是否打开返回相应的描述字符串。
接下来,我们可以根据上述要求设计Fan类的UML图,包括类名、属性和方法,并根据UML图编写Java代码实现Fan类。
第三题UML图

分析理解:
首先,我们可以设计一个Student类,包含上述属性和方法。接着,根据输入的5个学生信息,将每个学生的信息封装在一个Student对象中,并计算每个学生的总分和平均分。
接下来,按照输入顺序依次输出5个学生的总分和平均分,保留小数点后两位,并按照四舍五入规则计算最后一位。
最后,按照输出格式要求,输出每个学生的学号、姓名、总成绩和平均分。
在实现过程中,我们需要注意以下几点:
- 设计Student类:定义学生类Student,包含学号、姓名、语文成绩、数学成绩、物理成绩等属性,以及计算总分和平均分的方法。
- 创建对象:根据输入的学生信息,创建5个Student对象,并计算每个学生的总分和平均分。
- 输出格式:按照输出格式要求,依次输出每个学生的学号、姓名、总成绩和平均分
第四题uml图:

根据题目要求,我们需要创建一个名为Grade的类来表示每门课程的成绩,包含平时成绩和期末成绩属性,并实现计算总成绩的方法。
然后,我们设计一个名为Student的类来表示学生,包含学号、姓名以及各门课程的成绩,每门课程的成绩由Grade类表示。在Student类中实现计算总分和平均分的方法。
接下来,根据输入的3个学生的每门课成绩。
最后,按照输入顺序依次输出3个学生的总分和平均分,保留小数点后两位,并按照四舍五入规则计算最后一位。
第五题UML图:

对该题目的分析:
1.解析输入信息:需要正确解析输入的题目数量、题目内容和答题信息,以便后续处理。
2.比对答案:根据输入题目信息中的标准答案,与答题信息中给出的答案进行比对,判断是否正确。
3.输出格式:按照输出格式要求,输出题目内容和对应的判题结果。
题目集二:
第一题UNL图:

分析理解:
-
创建一个名为MobilePhone的类,包含type(型号,String类型)和price(价格,int类型)属性。让该类实现Comparable接口,并重写compareTo方法,按照price的大小来确定两个手机对象的大小关系。
-
创建一个主程序,首先从键盘输入三部手机的型号和价格信息,创建三个MobilePhone对象并将它们添加到一个链表中。
-
使用Collections类的sort方法对链表中的MobilePhone对象按照price升序排序。
-
接着从键盘输入第四部手机的型号和价格信息,创建一个MobilePhone对象。
-
遍历排序后的链表,查找是否有手机的价格与第四部手机的价格相同。
-
最后按照输出格式输出排序前的手机信息、排序后的手机信息以及第四部手机与链表中的手机价格比较的结果。
第二题UML图:

分析理解
这道题目要求我们定义一个圆类Circle,包括成员变量radius、无参构造方法、有参构造方法、set方法、get方法、求圆面积方法getArea()和重写toString方法。
第三题UML图:

分析理解:
在Main类中,通过实例化Car类的对象,设置新速度和停车,并输出车主姓名、当前速度和方向盘转向角度的信息。
最后一题UML图:

分析解释:
按照读取每行
输出时按题目顺序输出
同时,如果输入的答案信息少于试卷的题目数量,需要输出"answer is null"来表示。
程序首先对每份试卷进行遍历,计算每份试卷的总分,并检查是否等于100分。如果不等于100分,则输出警告信息。
然后对每份答案进行遍历,找到对应的试卷信息,并逐个比对答案与正确答案,计算得分。如果答案信息不足以匹配试卷的题目数量,输出"answer is null"。最后输出每个问题的得分情况以及总得分。
题目集三:
第一题uUML表:

分析:
题目要求创建一个名为Student的类,其中包含私有成员变量(学号、姓名、年龄、专业)、无参构造方法和有参构造方法(有参构造方法中需要对年龄进行判定)、print()方法以特定格式输出学生信息,以及setXxx和getXxx方法(注意:setAge()方法中需要对年龄进行判定)。
接下来是一个Main类,其中包含main方法,通过Scanner输入学生信息,创建两个学生对象,并调用print()方法输出学生信息。
第二题UML表:

分析:
- 输入一个日期字符串,判断是否为合法日期。如果合法,判断该年是否闰年,输出相关信息。
- 输入起始日期和结束日期两个字符串,判断这两个日期是否合法且结束日期不早于开始日期。如果均合法,输出这两个日期之间的相差的天数、月数、年数。
具体实现步骤如下:
-
读取第一行日期字符串,判断是否合法:
- 如果不合法,输出错误信息。
- 如果合法,判断是否为闰年,输出相关信息。
-
读取第二行两个日期字符串,判断是否合法且结束日期不早于开始日期:
- 如果有任一日期不合法,或者结束日期早于开始日期,输出错误信息。
- 如果均合法且结束日期不早于开始日期,输出这两个日期之间的相差的天数、月数、年数
最后一题ULM图:
分析理解
(3)采坑心得:
一,在题目集1的第五题中,存在测试点、
输入样例6:
含多余的空格符。例如:
1
#N:1 #Q: The starting point of the Long March is #A:ruijin
#A:ruijin
end
输出样例6:
在这里给出相应的输出。例如:
The starting point of the Long March is~ruijin
true
与
输入样例7:
含多余的空格符。例如:
1
#N: 1 #Q: 5 +5= #A:10
#A:10
end
输出样例7:
在这里给出相应的输出。例如:
5 +5=~10
true
在没有发现错误之前,当输入“输入样例7”时,没有数据输出,于是出现错误 1.输入#N: 1 #Q: 5 +5= #A:10时代码if (input.startsWith("#N:")) {//1
String[] parts = input.split("#Q");
int number = Integer.parseInt(parts[0].split(":")[1]);
String content = parts[1].split(" #A")[0].split(":")[1];
String correctanswer = (parts[1].split("#A")[1]).split(":")[1];
questions.add(new Question(number, content, correctanswer));
}未考虑出现其余空格的情况,于是无法识别该行数据,于是将 int number = Integer.parseInt(parts[0].split(":")[1]);更改为 int number = Integer.parseInt(parts[0].split(":")[1]).trim();更改后可识别。
二.上述错误经过更改后发现依然存在错误,检查后发现,若#N行中的content中出现多余空格如输入样例7:5 +5= ,由于一开始划分部分是由 String content = parts[1].split(" ")[0].split(":")[1]; 于是当有多个空格时,无法正确识别,于是将原识别代码改为while (!(input = scanner.nextLine()).equals("end")) {
if (input.startsWith("#N:")) {//1
String[] parts = input.split("#Q");
int number = Integer.parseInt(parts[0].split(":")[1]).trim();
String content = parts[1].split(" #A")[0].split(":")[1];
String correctanswer = (parts[1].split("#A")[1]).split(":")[1];,将划分符号改为“#A”,更改后结果正确。
三.在题目集二的第四题中,在第一次编程完成后,检查时,发现原代码输出数据时无法区分不同试卷的题目在测试输入样例时发现有如下情况出现
alert: full score of test paper2 is not 100 points
3+2=~5~true
2+2=~22~false
7 0~7
2+2=~5~false
1+1=~4~false时由于都要遍历question数组,本来应该有办法在一次遍历时就可以将两个信息全部输出,但是我却遍历的两次如
int totalScoreOfTestPaper = 0;
for (TestPaper testPaper : testPapers) {
for (int i = 0; i < testPaper.questionNumbers.size(); i++) {
int questionNumber = testPaper.questionNumbers.get(i);
int score = testPaper.questionScores.get(i);
for (Question question : questions) {
if (question.number == questionNumber) {
totalScoreOfTestPaper += score;
break;
}
}
}
if(totalScoreOfTestPaper!=100){
System.out.println("alert: full score of test paper"+testPaper.paperNumber+" is not 100 points");
}
}
for (Answer answer : answers) {
int totalTrueScore = 0;
TestPaper testPaper = null;
for (TestPaper paper : testPapers) {
if (paper.paperNumber == answer.paperNumber) {
testPaper = paper;
break;
}
}
int[] finalScore=new int[answer.answers.size()];
if (testPaper == null) {
System.out.println("alert: full score of test paper" + answer.paperNumber + " is not 100 points");
continue;
}
for (int i = 0; i < answer.answers.size(); i++) {
int questionNumber = testPaper.questionNumbers.get(i);
int score = testPaper.questionScores.get(i);
for (Question question : questions) {
if (question.number == questionNumber) {
if (answer.answers.get(i) == question.answer) {
System.out.println(question.content + "~" + answer.answers.get(i) + "~true");
totalTrueScore += score;
finalScore[i]=score;
} else {
System.out.println(question.content + "~" + answer.answers.get(i) + "~false");
finalScore[i]=0;
}
}
}
(5)总结:首先,我认为本次三个题目集设置良好,题目难度逐渐进阶,且都出现在一个试卷分数的实际背景,让我在昨晚三个题目集后收益良多,如我学到了基础的类的运用,和数组和列表的运用,对实际问题的解析能力等等。其次,我发现自身再对于hashmap的运用上缺乏能力,希望往后能完善这方面的知识。