OOP第三阶段PTA题目集总结

发布时间 2023-06-27 19:15:54作者: Chinrab

一、前言

    在本次Blog要分析的是OOP第三阶段PTA题目集。对于OOP第三阶段PTA题目集,我个人认为难度还是较大的,每次一看到有新的题目集更新了,就心里一颤,因为难度较大耗时长。但是,正因为难度高,本人也从中踩了很多的坑,学到了很多编程思想和更加熟悉了JAVA的语法,对我本人的帮忙还是非常大的。在此次Blog中,我将主要对课程成绩统计程序系列进行分析,同时也包括了一些与数据结构相关的题目(例如set和map相关的)和容器相关的题目。

二、设计与分析

详细的分析在注解中,小结则为该题的一些概括说明

课程成绩统计程序系列:该系列题目的要求是设计一个程序,用于计算不同学生、不同班级、不同课程的平均分,课程具有不同的性质。总体来说难度适中,没有很难,就是代码量较长,所以有很多的细枝末节需要特别注意,同时在修正代码的时候更需要心平气和。

1.课程成绩统计程序-1

7-1 课程成绩统计程序-1
分数 100
作者 蔡轲
单位 南昌航空大学

某高校课程从性质上分为:必修课、选修课,从考核方式上分为:考试、考察。

考试的总成绩由平时成绩、期末成绩分别乘以权重值得出,比如平时成绩权重0.3,期末成绩权重0.7,总成绩=平时成绩*0.3+期末成绩*0.7。

考察的总成绩直接等于期末成绩

必修课的考核方式必须为考试,选修课可以选择考试、考察任一考核方式。

1、输入:

包括课程、课程成绩两类信息。

课程信息包括:课程名称、课程性质、考核方式(可选,如果性质是必修课,考核方式可以没有)三个数据项。

课程信息格式:课程名称+英文空格+课程性质+英文空格+考核方式

课程性质输入项:必修、选修

考核方式输入选项:考试、考察

课程成绩信息包括:学号、姓名、课程名称、平时成绩(可选)、期末成绩

课程信息格式:学号+英文空格+姓名+英文空格+课程名称+英文空格+平时成绩+英文空格+期末成绩

以上信息的相关约束:

1)平时成绩和期末成绩的权重默认为0.3、0.7

2)成绩是整数,不包含小数部分,成绩的取值范围是【0,100】

3)学号由8位数字组成

4)姓名不超过10个字符

5)课程名称不超过10个字符

6)不特别输入班级信息,班级号是学号的前6位。

2、输出:

输出包含三个部分,包括学生所有课程总成绩的平均分、单门课程成绩平均分、单门课程总成绩平均分、班级所有课程总成绩平均分。

为避免误差,平均分的计算方法为累加所有符合条件的单个成绩,最后除以总数。

1)学生课程总成绩平均分按学号由低到高排序输出

格式:学号+英文空格+姓名+英文空格+总成绩平均分

如果某个学生没有任何成绩信息,输出:学号+英文空格+姓名+英文空格+"did not take any exams"

2)单门课程成绩平均分分为三个分值:平时成绩平均分(可选)、期末考试平均分、总成绩平均分,按课程名称的字符顺序输出

格式:课程名称+英文空格+平时成绩平均分+英文空格+期末考试平均分+英文空格+总成绩平均分

如果某门课程没有任何成绩信息,输出:课程名称+英文空格+"has no grades yet"

3)班级所有课程总成绩平均分按班级由低到高排序输出

格式:班级号+英文空格+总成绩平均分

如果某个班级没有任何成绩信息,输出:班级名称+英文空格+ "has no grades yet"

异常情况:

1)如果解析某个成绩信息时,课程名称不在已输入的课程列表中,输出:学号+英文空格+姓名+英文空格+":"+课程名称+英文空格+"does not exist"

2)如果解析某个成绩信息时,输入的成绩数量和课程的考核方式不匹配,输出:学号+英文空格+姓名+英文空格+": access mode mismatch"

以上两种情况如果同时出现,按第一种情况输出结果。

3)如果解析某个课程信息时,输入的课程性质和课程的考核方式不匹配,输出:课程名称+" : course type & access mode mismatch"

4)格式错误以及其他信息异常如成绩超出范围等,均按格式错误处理,输出"wrong format"

5)若出现重复的课程/成绩信息,只保留第一个课程信息,忽略后面输入的。

信息约束:

1)成绩平均分只取整数部分,小数部分丢弃

参考类图:


image.png

输入样例1:

仅有课程。例如:

java 必修 考试
数据结构 选修 考试
形式与政治 选修 考察
end
 

输出样例1:

在这里给出相应的输出。例如:

java has no grades yet
数据结构 has no grades yet
形式与政治 has no grades yet
 

输入样例2:

单门考试课程 单个学生。例如:

java 必修 考试
20201103 张三 java 20 40
end
 

输出样例2:

在这里给出相应的输出。例如:

20201103 张三 34
java 20 40 34
202011 34
 

输入样例3:

单门考察课程 单个学生。例如:

java 选修 考察
20201103 张三 java 40
end
 

输出样例3:

在这里给出相应的输出。例如:

20201103 张三 40
java 40 40
202011 40
 

输入样例4:

考试课程 单个学生 不匹配的考核方式。例如:

java 必修 考试
20201103 张三 java 20
end
 

输出样例4:

在这里给出相应的输出。例如:

20201103 张三 : access mode mismatch
20201103 张三 did not take any exams
java has no grades yet
202011 has no grades yet
 

输入样例5:

单门课程,单个学生,课程类型与考核类型不匹配。例如:

java 必修 考察
20201103 张三 java 40
end
 

输出样例5:

在这里给出相应的输出。例如:

java : course type & access mode mismatch
java does not exist
20201103 张三 did not take any exams
202011 has no grades yet
 

输入样例6:

单门课程,多个学生。例如:

java 选修 考察
20201103 李四 java 60
20201104 王五 java 60
20201101 张三 java 40
end
 

输出样例6:

在这里给出相应的输出。例如:

20201101 张三 40
20201103 李四 60
20201104 王五 60
java 53 53
202011 53
 

输入样例7:

单门课程,单个学生,课程类型与考核类型不匹配。例如:

形式与政治 必修 考试
数据库 选修 考试
java 选修 考察
数据结构 选修 考察
20201103 李四 数据结构 70
20201103 李四 形式与政治 80 90
20201103 李四 java 60
20201103 李四 数据库 70 78
end
 

输出样例7:

在这里给出相应的输出。例如:

20201103 李四 73
java 60 60
数据结构 70 70
数据库 70 78 75
形式与政治 80 90 87
202011 73
 

输入样例8:

单门课程,单个学生,成绩越界。例如:

数据结构 选修 考察
20201103 李四 数据结构 101
end
 

输出样例8:

在这里给出相应的输出。例如:

wrong format
数据结构 has no grades yet
 

输入样例9:

多门课程,多个学生,多个成绩。例如:

形式与政治 必修 考试
数据库 选修 考试
java 选修 考察
数据结构 选修 考察
20201205 李四 数据结构 70
20201103 李四 形式与政治 80 90
20201102 王五 java 60
20201211 张三 数据库 70 78
end
 

输出样例9:

在这里给出相应的输出。例如:

20201102 王五 60
20201103 李四 87
20201205 李四 70
20201211 张三 75
java 60 60
数据结构 70 70
数据库 70 78 75
形式与政治 80 90 87
202011 73
202012 72
 
代码长度限制
16 KB
时间限制
1000 ms
内存限制
64 MB
 
源代码:
  1 import java.util.Scanner;
  2 import java.text.Collator;
  3 import java.util.ArrayList;
  4 import java.util.Arrays;
  5 import java.util.Collections;
  6 import java.util.Comparator;
  7 
  8 public class Main{
  9     public static void main(String args[]) {
 10         SelectCourseCenter selectCourseCenter = new SelectCourseCenter();
 11         selectCourseCenter.start();
 12     }
 13 }
 14 
 15 class SelectCourseCenter {
 16     private ArrayList<Class> classAll = new ArrayList<Class>();
 17     private ArrayList<Course> courseAll = new ArrayList<Course>();
 18     public void start() {
 19         Scanner input = new Scanner(System.in);
 20         while(true) {
 21             String information = input.nextLine();
 22             String infos[] = information.split(" ");
 23             if(information.equals("end"))
 24                 break;
 25             if(infos.length == 2) {
 26                 if(infos[0].length() > 10) {
 27                     System.out.println("wrong format"); 
 28                 }
 29                 else {
 30                     if(infos[1].equals("选修")) {
 31                         System.out.println(infos[0] + " : course type & access mode mismatch");
 32                     }
 33                     else if(getAppointCourse(infos[0]) != null) {
 34                     }
 35                     else if(infos[1].equals("必修")){
 36                         courseAll.add(new Course(infos[0], infos[1]));
 37                     }
 38                     else {
 39                         System.out.println("wrong format");
 40                     }
 41                 }
 42             }
 43             else if(infos.length == 3) {
 44                 if(infos[0].length() > 10) {
 45                     System.out.println("wrong format");
 46                 }
 47                 else{
 48                     if(infos[1].equals("必修") && infos[2].equals("考察")) {
 49                         System.out.println(infos[0] + " : course type & access mode mismatch");
 50                     }
 51                     else if(getAppointCourse(infos[0]) != null) {
 52                     }
 53                     else if(infos[1].equals("选修") || (infos[1].equals("必修") && infos[2].equals("考试"))){
 54                         courseAll.add(new Course(infos[0], infos[1], infos[2]));
 55                     }
 56                     else {
 57                         System.out.println("wrong format");
 58                     }
 59                 }
 60             }
 61             else if(infos.length == 4) {
 62                 if(infos[0].length() != 8 || infos[1].length() > 10 || infos[2].length() > 10 || !isNumeric(infos[0])
 63                         || !isNumeric(infos[3])) {
 64                     System.out.println("wrong format");
 65                     continue;
 66                 }
 67                 int classNumber = Integer.parseInt(infos[0].substring(0, 6));
 68                 if(classAll.size() == 0 || getAppointClass(classNumber) == null) {
 69                     classAll.add(new Class(classNumber));
 70                 }
 71                 int scoreLast = Integer.parseInt(infos[3]);
 72                 int ID = Integer.parseInt(infos[0]);
 73                 Student student;
 74                 if(getAppointCourse(infos[2]) != null && // 是否存在该课程且分数合法
 75                         getAppointCourse(infos[2]).getAssessment().equals("考察") &&
 76                         scoreLast >= 0 && scoreLast <= 100) {
 77                     if(getAppointClass(classNumber).getStudents().size() == 0 ||
 78                            getAppointClass(classNumber).getAppointStudent(ID, infos[1]) == null){
 79                         student = new Student(ID, infos[1]);
 80                         student.getCourseAll().add(new Course(infos[2]
 81                                 , getAppointCourse(infos[2]).getAttribute()
 82                                 , getAppointCourse(infos[2]).getAssessment()));
 83                         student.getCourseAll().get(student.getCourseAll().size() - 1).getScore().setScoreLast(scoreLast);
 84                         student.getCourseAll().get(student.getCourseAll().size() - 1).getScore().calculateScoreEnd();
 85                         getAppointClass(classNumber).StudentTestNumber++;
 86                         getAppointClass(classNumber).getStudents().add(student);
 87                     }
 88                     else {
 89                         student = getAppointClass(classNumber).getAppointStudent(ID, infos[1]); // 引用
 90                         if(student.getAppointCourse(infos[2]) == null){
 91                             student.getCourseAll().add(new Course(infos[2]
 92                                     , getAppointCourse(infos[2]).getAttribute()
 93                                     , getAppointCourse(infos[2]).getAssessment()));
 94                             student.getAppointCourse(infos[2]).getScore().setScoreLast(scoreLast);
 95                             student.getAppointCourse(infos[2]).getScore().calculateScoreEnd();
 96                         }
 97                     }
 98                     getAppointCourse(infos[2]).studentTestNumber++;
 99                     getAppointCourse(infos[2]).getScore().setScoreLast(getAppointCourse(infos[2]).getScore().getScoreLast()
100                             + student.getCourseAll().get(student.getCourseAll().size() - 1).getScore().getScoreLast());
101                     getAppointCourse(infos[2]).getScore().calculateScoreEnd();
102                 }
103                 else if(getAppointCourse(infos[2]) == null) {
104                     System.out.println(infos[2] + " does not exist");
105                     student = new Student(ID, infos[1]);
106                     getAppointClass(classNumber).getStudents().add(student);
107                 }
108                 else if(getAppointCourse(infos[2]).getAssessment().equals("考试")) {
109                     student = new Student(ID, infos[1]);
110                     System.out.println(infos[0] + " " + infos[1] + " : access mode mismatch");
111                     getAppointClass(classNumber).getStudents().add(student);
112                 }
113                 else {
114                     System.out.println("wrong format");
115                 }
116             }
117             else {
118                 if(infos[0].length() != 8 || infos[1].length() > 10 || infos[2].length() > 10 || !isNumeric(infos[0])
119                         || !isNumeric(infos[3]) || !isNumeric(infos[4])) {
120                     System.out.println("wrong format");
121                     continue;
122                 }
123                 int classNumber = Integer.parseInt(infos[0].substring(0, 6));
124                 if(classAll.size() == 0 || getAppointClass(classNumber) == null) {
125                     classAll.add(new Class(classNumber));
126                 }
127                 int scoreOrdinary = Integer.parseInt(infos[3]);
128                 int scoreLast = Integer.parseInt(infos[4]);
129                 int ID = Integer.parseInt(infos[0]);
130                 Student student;
131                 if(getAppointCourse(infos[2]) != null && // 是否存在该课程且课程考核方式正确、成绩合法
132                         getAppointCourse(infos[2]).getAssessment().equals("考试") &&
133                         scoreLast >= 0 && scoreLast <= 100 && infos.length == 5 &&
134                         scoreOrdinary >= 0 && scoreOrdinary <= 100) {
135                     if(getAppointClass(classNumber).getStudents().size() == 0 ||
136                            getAppointClass(classNumber).getAppointStudent(ID, infos[1]) == null){
137                         student = new Student(ID, infos[1]);
138                         student.getCourseAll().add(new Course(infos[2], getAppointCourse(infos[2]).getAttribute(), "考试"));
139                         Score temp = student.getCourseAll().get(student.getCourseAll().size() - 1).getScore();// 引用
140                         temp.setScoreOrdinary(scoreOrdinary);
141                         temp.setScoreLast(scoreLast);
142                         temp.calculateScoreEnd();
143                         getAppointClass(classNumber).StudentTestNumber++;
144                         getAppointClass(classNumber).getStudents().add(student);
145                     }
146                     else {
147                         student = getAppointClass(classNumber).getAppointStudent(ID, infos[1]); // 引用
148                         if(student.getAppointCourse(infos[2]) == null) {
149                             student.getCourseAll().add(new Course(infos[2], getAppointCourse(infos[2]).getAttribute(), "考试"));
150                             student.getAppointCourse(infos[2]).getScore().setScoreOrdinary(scoreOrdinary);
151                             student.getAppointCourse(infos[2]).getScore().setScoreLast(scoreLast);
152                             student.getAppointCourse(infos[2]).getScore().calculateScoreEnd();
153                         }
154                     }
155                     if(getAppointCourse(infos[2]).studentTestNumber == 0)
156                         getAppointCourse(infos[2]).getScore().setScoreOrdinary(0);
157                     getAppointCourse(infos[2]).studentTestNumber++;
158                     Score temp = getAppointCourse(infos[2]).getScore(); // 引用
159                     getAppointCourse(infos[2]).getScore().setScoreOrdinary(getAppointCourse(infos[2]).getScore().getScoreOrdinary()
160                             + student.getCourseAll().get(student.getCourseAll().size() - 1).getScore().getScoreOrdinary());
161                     getAppointCourse(infos[2]).getScore().setScoreLast(getAppointCourse(infos[2]).getScore().getScoreLast()
162                             + student.getCourseAll().get(student.getCourseAll().size() - 1).getScore().getScoreLast());
163                     getAppointCourse(infos[2]).getScore().calculateScoreEnd();
164                 }
165                 else if(getAppointCourse(infos[2]) == null && infos.length == 5) {
166                     System.out.println(infos[2] + " does not exist");
167                     student = new Student(ID, infos[1]);
168                     student.calculateAverageStudent();
169                     getAppointClass(classNumber).getStudents().add(student);
170                 }
171                 else if(getAppointCourse(infos[2]).getAssessment().equals("考察") && infos.length == 5) {
172                     student = new Student(ID, infos[1]);
173                     System.out.println(infos[0] + " " + infos[1] + " : access mode mismatch");
174                     getAppointClass(classNumber).getStudents().add(student);
175                 }
176                 else {
177                     System.out.println("wrong format");
178                 }
179             }
180         }
181         for(int i = 0; i < classAll.size(); i++) { // 给班级排序
182             for(int j = i+1; j < classAll.size(); j++) {
183                 if(classAll.get(i).getClassNumber() > classAll.get(j).getClassNumber()) {
184                     Collections.swap(classAll, i, j);
185                 }
186             }
187         }
188         for(int i = 0; i < classAll.size(); i++) { // 输出学生成绩
189             classAll.get(i).Sort();
190             for(int j = 0; j < classAll.get(i).getStudents().size(); j++) {
191                 Student student = classAll.get(i).getStudents().get(j); // 引用
192                 student.calculateAverageStudent();
193                 if(student.getAverageStudent() == -1) {
194                     System.out.println(student.getID() + " " + student.getName() + " did not take any exams");
195                 }
196                 else {
197                     double  score = student.getAverageStudent();
198                     if(student.courseTestNumber != 0)
199                             score /= (double)student.courseTestNumber;
200                     System.out.println(student.getID() + " " + student.getName() + " " + (int)score);
201                 }
202             }
203         }
204         String courseCorrect[] = new String[courseAll.size()];
205         for(int i = 0; i < courseAll.size(); i++) {
206             courseCorrect[i] = new String();
207             courseCorrect[i] = courseAll.get(i).getName();
208         }
209         Comparator<Object> com = Collator.getInstance(java.util.Locale.CHINA);
210         Arrays.sort(courseCorrect, com); // 排序
211         for(int i = 0; i < courseAll.size(); i++) {
212             Collections.swap(courseAll, i, courseAll.indexOf(getAppointCourse(courseCorrect[i])));
213         }
214         for(int i = 0; i < courseAll.size(); i++) { // 输出每门课程成绩
215             if(courseAll.get(i).getScore().getScoreEnd() == -1) {
216                 System.out.println(courseAll.get(i).getName() + " has no grades yet");
217             }
218             else {
219                 String temp = courseAll.get(i).getName() + " ";
220                 if(courseAll.get(i).getScore().getScoreOrdinary() != -1) {
221                     temp += (int)(courseAll.get(i).getScore().getScoreOrdinary() / (double)courseAll.get(i).studentTestNumber) + " ";
222                 }
223                 temp += (int)(courseAll.get(i).getScore().getScoreLast() / (double)courseAll.get(i).studentTestNumber) + " "
224                         + (int)(courseAll.get(i).getScore().getScoreEnd() / (double)courseAll.get(i).studentTestNumber);
225                 System.out.println(temp);
226             }
227         }
228         for(int i = 0; i < classAll.size(); i++) { // 输出每班的成绩
229             classAll.get(i).calculateGcdMax();
230             classAll.get(i).calculateAverageClass();
231             if(classAll.get(i).getAverageClass() == -1 && classAll.get(i).getStudents().size() != 0)
232                 System.out.println(classAll.get(i).getClassNumber() + " has no grades yet");
233             else if(classAll.get(i).getStudents().size() != 0) {
234                 double score = classAll.get(i).getAverageClass();
235                 if(classAll.get(i).StudentTestNumber != 0)
236                     score /= classAll.get(i).StudentTestNumber * classAll.get(i).gcdMax;
237                 System.out.println(classAll.get(i).getClassNumber() + " "
238                         + (int)score);
239             }
240         }
241         input.close();
242     }
243     public Course getAppointCourse(String name) {
244         for(int i = 0; i < courseAll.size(); i++) {
245             if(courseAll.get(i).getName().equals(name))
246                 return courseAll.get(i);
247         }
248         return null;
249     }
250     public Class getAppointClass(int classNumber) {
251         for(int i = 0; i < classAll.size(); i++) {
252             if(classAll.get(i).getClassNumber() == classNumber)
253                 return classAll.get(i);
254         }
255         return null;
256     }
257     public boolean isNumeric(String checkString) {
258         for(int i = 0; i < checkString.length(); i++)
259             if(checkString.charAt(i) < '0' || checkString.charAt(i) > '9')
260                 return false;
261         return true;
262     }
263 }
264 
265 class Course {
266     private String name = new String();
267     private String attribute = new String(); // 课程性质
268     private String assessment = new String(); // 考核方式
269     private Score score;
270     protected int studentTestNumber = 0;
271     public Course() {}
272     public Course(String name, String attribute) {
273         this.name = name;
274         this.attribute = attribute;
275         if(attribute.equals("必修")) {
276             score = new scoreExamination();
277             this.assessment = "考试";
278         }
279     }
280     public Course(String name, String attribute, String assessment) {
281         this.name = name;
282         this.attribute = attribute;
283         this.assessment = assessment;
284         if(assessment.equals("考试")) {
285             score = new scoreExamination();
286         }
287         else if(assessment.equals("考察")) {
288             score = new scoreInvestigate();
289         }
290     }
291     public String getName() {
292         return name;
293     }
294     public String getAttribute() {
295         return attribute;
296     }
297     public String getAssessment() {
298         return assessment;
299     }
300     public Score getScore() {
301         return score;
302     }
303 }
304 
305 abstract class Score {
306     private double scoreLast = 0;
307     private double scoreEnd = -1; // 最终成绩
308     private double scoreOrdinary = -1;
309     public Score() {}
310     public abstract void calculateScoreEnd();
311     public double getScoreEnd() {
312         return scoreEnd;
313     }
314     public void setScoreEnd(double scoreEnd) {
315         this.scoreEnd = scoreEnd;
316     }
317     public double getScoreLast() {
318         return scoreLast;
319     }
320     public void setScoreLast(double scoreLast) {
321         this.scoreLast = scoreLast;
322     }
323     public double getScoreOrdinary() {
324         return scoreOrdinary;
325     }
326     public void setScoreOrdinary(double scoreOrdinary) {
327         this.scoreOrdinary = scoreOrdinary;
328     }
329 }
330 
331 class scoreExamination extends Score {
332     public scoreExamination() {}
333     public scoreExamination(double scoreOrdinary, double scoreLast) {
334         setScoreLast(scoreLast);
335         setScoreOrdinary(scoreOrdinary);
336     }
337     public void calculateScoreEnd() {
338         setScoreEnd(getScoreOrdinary() * 0.3 + getScoreLast() * 0.7);
339     }
340 }
341 
342 class scoreInvestigate extends Score {
343     public scoreInvestigate() {}
344     public scoreInvestigate(double scoreEnd) {
345         setScoreEnd(scoreEnd);
346     }
347     public void calculateScoreEnd() {
348         setScoreEnd(getScoreLast());
349     }
350 }
351 
352 class Class {
353     private ArrayList<Student> students = new ArrayList<Student>();
354     private int classNumber = 0;
355     private double averageClass = -1;
356     protected int StudentTestNumber = 0;
357     protected int gcdMax = 1;
358     public Class() {}
359     public Class(int classNumber) {
360         this.classNumber = classNumber;
361     }
362     public void calculateGcdMax(){
363         for(int i = 0; i < students.size(); i++){
364             Student temp = students.get(i);
365             for(int j = 0; j < temp.getCourseAll().size(); j++){
366                 if(temp.courseTestNumber != 0)
367                     gcdMax *= temp.courseTestNumber;
368             }
369         }
370     }
371     public void Sort() { // 学生排序
372         for(int i = 0; i < students.size(); i++) {
373             for(int j = i+1; j < students.size(); j++) {
374                 if(students.get(i).getID() > students.get(j).getID()) {
375                     Collections.swap(students, i, j);
376                 }
377             }
378         }
379     }
380     public Student getAppointStudent(int ID, String nameStudent) {
381         for(int i = 0; i < students.size(); i++) {
382             if(students.get(i).getID() == ID && students.get(i).getName().equals(nameStudent))
383                 return students.get(i);
384         }
385         return null;
386     }
387     public void calculateAverageClass() {
388         double average = 0; boolean flag = false;
389         for(int i = 0; i < students.size(); i++) {
390             if(students.get(i).getAverageStudent() != -1){
391                 average += (students.get(i).getAverageStudent() * gcdMax) / students.get(i).courseTestNumber;
392                 flag = true;
393             }
394         }
395         if(flag)
396             averageClass = average;
397     }
398     public int getClassNumber() {
399         return classNumber;
400     }
401     public double getAverageClass() {
402         return averageClass;
403     }
404     public ArrayList<Student> getStudents() {
405         return students;
406     }
407 }
408 class Student {
409     private String name = new String();
410     private int ID;
411     private double averageStudent = -1; 
412     private ArrayList<Course> courseAll = new ArrayList<Course>();
413     protected int courseTestNumber = 0;
414     public Student() {}
415     public Student(int ID, String name) {
416         this.name = name;
417         this.ID = ID;
418     }
419     public void calculateAverageStudent() {
420         double average = 0;
421         for(int i = 0; i < courseAll.size(); i++) {
422             if(courseAll.get(i).getScore().getScoreEnd() != -1) {
423                 average += courseAll.get(i).getScore().getScoreEnd();
424                 courseTestNumber++;
425             }
426         }
427         if(courseTestNumber != 0)
428             averageStudent = average;
429     }
430     public Course getAppointCourse(String nameCourse) {
431         for(int i = 0; i < courseAll.size(); i++) {
432             if(this.courseAll.get(i).getName().equals(nameCourse)) {
433                 return this.courseAll.get(i);
434             }
435         }
436         return null;
437     }
438     public String getName() {
439         return name;
440     }
441     public int getID() {
442         return ID;
443     }
444     public double getAverageStudent() {
445         return averageStudent;
446     }
447     public ArrayList<Course> getCourseAll() {
448         return courseAll;
449     }
450 }
课程成绩统计程序-1

 

设计类图:

SourceMonitor分析结果:

 小结:本题是课程成绩统计程序系列的第一道题,是该系列最基础的一道题,但是即使是最基础的,刚开始设计起来还是存在一定的难度,最后PTA的分数也只拿到了91分。

 

本题的难点在于如何计算平均分和如何对成绩排序,在设计上并没有太大难度,因为已经给出了参考的设计类图,加上之前的OOP训练已经能大致知道该怎么设计类与类之间的关系了。在成绩如何排序这块,学生和班级的排序并不难,按学号大小和班级大小进行排序即可,主要难度在于课程成绩排序的问题上。在该题目的要求中,要求按课程名称的字符顺序输出,刚开始看到的时候有些懵逼,字符顺序?可是如果夹杂着中文和英文呢?后面试错试了很多次,最终确认了中文和英文比较是要先将中文转化为汉语拼音再与英文比较进行排序的,这里使用的是这段代码实现的成绩排序操作:

 ;再一个难点就是平均分的计算了,在这一块,踩得坑数不胜数。因为存在误差,所以计算出的成绩总会差那么个一两分无法通过测试节点。这道题PTA只拿到了91分我认为原因就在于平均分的计算,因为在该道题的迭代版-2中将平均分的算法进行修改后拿到了更高的分数。同时我也发现了在-1中的算法中,似乎与题目的要求有所出入,题目中所说的是 :平均分的计算方法为累加所有符合条件的单个成绩,最后除以总数。这里的单个成绩,我认为是已经舍去了小数部分的单个成绩,因为在该道题目中我并没有进行舍去成绩的小数部分进行平均分的计算,而在迭代版中进行修改后,其测试节点中并没有出现太大的问题不能通过。

总的来说,在这道题中,我的收获还是很大的,我学会了如何较为系统性的设计一个解决较为复杂问题的程序,同时对于如何设计算法来避免误差有了更深入的了解。

 

2.课程成绩统计程序-2

在课程成绩统计程序-1的基础上加入了如下要求:

一、

课程成绩统计程序-3在第二次的基础上修改了计算总成绩的方式;

二、

修改类结构,将成绩类的继承关系改为组合关系,成绩信息由课程成绩类和分项成绩类组成,课程成绩类组合分项成绩类,分项成绩类由成绩分值和权重两个属性构成。完成课程成绩统计程序-2、3两次程序后,比较继承和组  合关系的区别。思考一下哪一种关系运用上更灵活,更能够适应变更。

三、

增加了实验课程,实验的总成绩等于课程每次实验成绩乘以权重后累加而得。课程权重值在录入课程信息时输入。(注意:所有分项成绩的权重之和应当等于1)

四、

课程信息包括:课程名称、课程性质、考核方式、分项成绩数量、每个分项成绩的权重。

考试课信息格式:课程名称+英文空格+课程性质+英文空格+考核方式+英文空格+平时成绩的权重+英文空格+期末成绩的权重

考察课信息格式:课程名称+英文空格+课程性质+英文空格+考核方式

实验课程信息格式:课程名称+英文空格+课程性质+英文空格+考核方式+英文空格+分项成绩数量n+英文空格+分项成绩1的权重+英文空格+。。。+英文空格+分项成绩n的权重

五、

实验课程成绩信息包括:学号、姓名、课程名称、每次成绩{在系列-2的基础上去掉了(实验次数),实验次数要和实验课程信息中输入的分项成绩数量保持一致}

六、

为避免四舍五入误差,

计算单个成绩时,分项成绩乘以权重后要保留小数位,计算总成绩时,累加所有分项成绩的权重分以后,再去掉小数位。

学生总成绩/整个班/课程平均分的计算方法为累加所有符合条件的单个成绩,最后除以总数。

七、

单门课程成绩按课程名称的字符顺序输出

课程成绩输出格式:课程名称+英文空格+总成绩平均分

八、

如果解析实验课程信息时,输入的分项成绩数量值和分项成绩权重的个数不匹配,输出:课程名称+" : number of scores does not match"

如果解析考试课、实验课时,分项成绩权重值的总和不等于1,输出:课程名称+" : weight value error"

源代码:

  1 import java.util.Scanner;
  2 import java.text.Collator;
  3 import java.util.ArrayList;
  4 import java.util.Arrays;
  5 import java.util.Collections;
  6 import java.util.Comparator;
  7 
  8 public class Main{
  9     public static void main(String args[]) {
 10         SelectCourseCenter selectCourseCenter = new SelectCourseCenter();
 11         selectCourseCenter.start();
 12     }
 13 }
 14 
 15 class SelectCourseCenter {
 16     private ArrayList<Class> classAll = new ArrayList<Class>();
 17     private ArrayList<Course> courseAll = new ArrayList<Course>();
 18     public void start() {
 19         Scanner input = new Scanner(System.in);
 20         while(true) {
 21             String information = input.nextLine();
 22             String infos[] = information.split(" ");
 23             if(information.equals("end"))
 24                 break;
 25             if(infos[2].equals("实验") && infos.length > 4) { // 实验课程
 26                 if(infos[0].length() > 10) {
 27                     System.out.println("wrong format");
 28                     continue;
 29                 }
 30                 if(getAppointCourse(infos[0]) != null)
 31                     continue;
 32                 if(!infos[1].equals("实验")) {
 33                     System.out.println(infos[0] + " : course type & access mode mismatch");
 34                     Course courseExperiment = new Course(infos[0], infos[1], "实验");
 35                     courseAll.add(courseExperiment);
 36                     continue;
 37                 }
 38                 int experimentNumber = Integer.parseInt(infos[3]);
 39                 if(experimentNumber < 4) {
 40                     System.out.println("wrong format");
 41                 }
 42                 else {
 43                     if(infos.length - 4 != experimentNumber) {
 44                         System.out.println(infos[0] + " : number of scores does not match");
 45                     }
 46                     else if(infos.length - 4 > 9) {
 47                         System.out.println("wrong format");
 48                     }
 49                     else {
 50                         ArrayList<Float> experimentPercent = new ArrayList<Float>();
 51                         float checkIsOne = 0;
 52                         for(int i = 0; i < experimentNumber; i++) {
 53                             float percent = Float.parseFloat(infos[i + 4]);
 54                             checkIsOne += percent;
 55                             experimentPercent.add(percent);
 56                         }
 57                         if(Math.abs(checkIsOne - 1) > 0.0001) {
 58                             System.out.println(infos[0] + " : weight value error");
 59                         }
 60                         else {
 61                             Course courseExperiment = new Course(infos[0], infos[1], "实验");
 62                             courseExperiment.getScore().getScoreExperiment().scorePercent = experimentPercent;
 63                             courseAll.add(courseExperiment);
 64                         }
 65                     }
 66                 }
 67                 continue;
 68             }
 69             if(infos[2].equals("考试") && infos.length >= 5) { // 考试课程
 70                 if(infos[0].length() > 10) {
 71                     System.out.println("wrong format");
 72                     continue;
 73                 }
 74                 if(getAppointCourse(infos[0]) != null)
 75                     continue;
 76                 if(!infos[1].equals("必修")) {
 77                     System.out.println(infos[0] + " : course type & access mode mismatch");
 78                     Course courseExamination = new Course(infos[0], infos[1], infos[2]);
 79                     courseAll.add(courseExamination);
 80                 }
 81                 else {
 82                     float percentOrdinary = Float.parseFloat(infos[3]);
 83                     float percentLast = Float.parseFloat(infos[4]);
 84                     if(percentOrdinary + percentLast != 1) {
 85                         System.out.println(infos[0] + " : weight value error");
 86                     }
 87                     else {
 88                         Course courseExamination = new Course(infos[0], infos[1], infos[2]);
 89                         courseExamination.getScore().getScoreExamination().setPercentOrdinary(percentOrdinary);
 90                         courseExamination.getScore().getScoreExamination().setPercentLast(percentLast);
 91                         courseAll.add(courseExamination);
 92                     }
 93                 }
 94                 continue;
 95             }
 96             else if(infos.length == 3) { // 考察课程
 97                 if(infos[0].length() > 10) {
 98                     System.out.println("wrong format");
 99                 }
100                 else{
101                     if((infos[1].equals("必修") && !infos[2].equals("考试")) || (infos[1].equals("实验") && !infos[2].equals("实验"))) {
102                         System.out.println(infos[0] + " : course type & access mode mismatch");
103                     }
104                     else if(infos[1].equals("必修") && infos[2].equals("考试")) {
105                         System.out.println(infos[0] + " : weight value error");
106                     }
107                     else if(getAppointCourse(infos[0]) != null) {
108                     }
109                     else if(infos[1].equals("选修") && infos[2].equals("考察")){
110                         courseAll.add(new Course(infos[0], infos[1], infos[2]));
111                     }
112                     else {
113                         System.out.println("wrong format");
114                     }
115                 }
116             }
117             else if(infos.length == 4) { // 进行考察的成绩分析
118                 if(infos[0].length() != 8 || infos[1].length() > 10 || infos[2].length() > 10) {
119                     System.out.println("wrong format");
120                     continue;
121                 }
122                 int classNumber = Integer.parseInt(infos[0].substring(0, 6));
123                 if(classAll.size() == 0 || getAppointClass(classNumber) == null) { // 是否存在该班级
124                     classAll.add(new Class(classNumber));
125                 }
126                 int scoreLast = Integer.parseInt(infos[3]);
127                 int ID = Integer.parseInt(infos[0]);
128                 Student student;
129                 if(getAppointCourse(infos[2]) != null &&
130                         getAppointCourse(infos[2]).getAssessment().equals("考察") &&
131                         scoreLast >= 0 && scoreLast <= 100) {
132                     if(getAppointClass(classNumber).getStudents().size() == 0 ||
133                            getAppointClass(classNumber).getAppointStudent(ID, infos[1]) == null){ // 是否存在学生
134                         student = new Student(ID, infos[1]);
135                         student.getCourseAll().add(new Course(infos[2]
136                                 , getAppointCourse(infos[2]).getAttribute()
137                                 , getAppointCourse(infos[2]).getAssessment()));
138                         student.getCourseAll().get(student.getCourseAll().size() - 1).getScore().getScoreInvestigate().setScoreLast(scoreLast);
139                         getAppointClass(classNumber).StudentTestNumber++;
140                         getAppointClass(classNumber).getStudents().add(student);
141                     }
142                     else {
143                         student = getAppointClass(classNumber).getAppointStudent(ID, infos[1]); // 引用
144                         if(student.getAppointCourse(infos[2]) == null){
145                             student.getCourseAll().add(new Course(infos[2]
146                                     , getAppointCourse(infos[2]).getAttribute()
147                                     , getAppointCourse(infos[2]).getAssessment()));
148                             student.getAppointCourse(infos[2]).getScore().getScoreInvestigate().setScoreLast(scoreLast);
149                         }
150                     }
151                     getAppointCourse(infos[2]).studentTestNumber++; // 参与考试学生人数+1
152                     getAppointCourse(infos[2]).getScore().getScoreInvestigate().setScoreLast(getAppointCourse(infos[2]).getScore().getScoreInvestigate().getScoreLast()
153                             + student.getCourseAll().get(student.getCourseAll().size() - 1).getScore().getScoreInvestigate().getScoreLast());
154                 }
155                 else if(getAppointCourse(infos[2]) == null) {
156                     if(scoreLast >= 0 && scoreLast <= 100){
157                         System.out.println(infos[2] + " does not exist");
158                         student = new Student(ID, infos[1]);
159                         getAppointClass(classNumber).getStudents().add(student);
160                     }
161                 }
162                 else if(getAppointCourse(infos[2]).getAssessment().equals("考试") || getAppointCourse(infos[2]).getAssessment().equals("实验")) {
163                     student = new Student(ID, infos[1]);
164                     System.out.println(infos[0] + " " + infos[1] + " : access mode mismatch");
165                     getAppointClass(classNumber).getStudents().add(student);
166                 }
167                 else {
168                     System.out.println("wrong format");
169                 }
170                 if(!(scoreLast >= 0 && scoreLast <= 100)) {
171                     System.out.println("wrong format");
172                 }
173             }
174             else if(infos.length == 5) { // 进行考试的成绩分析
175                 if(infos[0].length() != 8 || infos[1].length() > 10 || infos[2].length() > 10) {
176                     System.out.println("wrong format");
177                     continue;
178                 }
179                 int classNumber = Integer.parseInt(infos[0].substring(0, 6));
180                 if(classAll.size() == 0 || getAppointClass(classNumber) == null) {
181                     classAll.add(new Class(classNumber));
182                 }
183                 int scoreOrdinary = Integer.parseInt(infos[3]);
184                 int scoreLast = Integer.parseInt(infos[4]);
185                 int ID = Integer.parseInt(infos[0]);
186                 Student student;
187                 if(getAppointCourse(infos[2]) != null &&
188                         getAppointCourse(infos[2]).getAssessment().equals("考试") &&
189                         scoreLast >= 0 && scoreLast <= 100 &&
190                         scoreOrdinary >= 0 && scoreOrdinary <= 100) { // 是否合法
191                     if(getAppointClass(classNumber).getStudents().size() == 0 ||
192                            getAppointClass(classNumber).getAppointStudent(ID, infos[1]) == null){
193                         student = new Student(ID, infos[1]);
194                         student.getCourseAll().add(new Course(infos[2], getAppointCourse(infos[2]).getAttribute(), "考试"));
195                         Score temp = student.getCourseAll().get(student.getCourseAll().size() - 1).getScore();// 引用
196                         temp.getScoreExamination().setScoreOrdinary(scoreOrdinary);
197                         temp.getScoreExamination().setScoreLast(scoreLast);
198                         temp.getScoreExamination().setPercentLast(getAppointCourse(infos[2]).getScore().getScoreExamination().getPercentLast());
199                         temp.getScoreExamination().setPercentOrdinary(getAppointCourse(infos[2]).getScore().getScoreExamination().getPercentOrdinary());
200                         getAppointClass(classNumber).StudentTestNumber++;
201                         getAppointClass(classNumber).getStudents().add(student);
202                     }
203                     else {
204                         student = getAppointClass(classNumber).getAppointStudent(ID, infos[1]);
205                         if(student.getAppointCourse(infos[2]) == null) {
206                             student.getCourseAll().add(new Course(infos[2], getAppointCourse(infos[2]).getAttribute(), "考试"));
207                             scoreExamination temp = student.getAppointCourse(infos[2]).getScore().getScoreExamination();
208                             temp.setScoreOrdinary(scoreOrdinary);
209                             temp.setScoreLast(scoreLast);
210                             temp.setPercentLast(getAppointCourse(infos[2]).getScore().getScoreExamination().getPercentLast());
211                             temp.setPercentOrdinary(getAppointCourse(infos[2]).getScore().getScoreExamination().getPercentOrdinary());
212                         }
213                     }
214                     if(getAppointCourse(infos[2]).studentTestNumber == 0){
215                         getAppointCourse(infos[2]).getScore().getScoreExamination().setScoreOrdinary(0);
216                         getAppointCourse(infos[2]).getScore().setScoreEnd(0);
217                     }
218                     getAppointCourse(infos[2]).studentTestNumber++;
219                     getAppointCourse(infos[2]).getScore().getScoreExamination().
220                         setScoreOrdinary(getAppointCourse(infos[2]).getScore().getScoreExamination().getScoreOrdinary()
221                             + student.getCourseAll().get(student.getCourseAll().size() - 1).
222                                          getScore().getScoreExamination().getScoreOrdinary());
223                     getAppointCourse(infos[2]).getScore().getScoreExamination().
224                         setScoreLast(getAppointCourse(infos[2]).getScore().getScoreExamination().getScoreLast()
225                             + student.getCourseAll().get(student.getCourseAll().size() - 1).
226                                      getScore().getScoreExamination().getScoreLast());
227                     getAppointCourse(infos[2]).getScore().setScoreEnd(getAppointCourse(infos[2]).getScore().getScoreEnd()
228                             + (int)student.getCourseAll().get(student.getCourseAll().size() - 1).getScore().getScoreEnd());
229                 }
230                 else if(getAppointCourse(infos[2]) == null) {
231                     if(scoreLast >= 0 && scoreLast <= 100 &&
232                             scoreOrdinary >= 0 && scoreOrdinary <= 100) {
233                         System.out.println(infos[2] + " does not exist");
234                         student = new Student(ID, infos[1]);
235                         student.calculateAverageStudent();
236                         getAppointClass(classNumber).getStudents().add(student);
237                     }
238                 }
239                 else if(getAppointCourse(infos[2]).getAssessment().equals("考察") || getAppointCourse(infos[2]).getAssessment().equals("实验")) {
240                         student = new Student(ID, infos[1]);
241                         System.out.println(infos[0] + " " + infos[1] + " : access mode mismatch");
242                         getAppointClass(classNumber).getStudents().add(student);
243                 }
244                 else {
245                     System.out.println("wrong format");
246                 }
247                 if(scoreLast < 0 || scoreLast > 100 ||
248                         scoreOrdinary < 0 || scoreOrdinary > 100) {
249                     System.out.println("wrong format");
250                 }
251             }
252             else if((infos.length > 5 && infos.length < 7)) { // 进行错误的实验课程成绩分析
253                 ArrayList<Integer> scoreArray = new ArrayList<Integer>();
254                 for(int i = 3; i < infos.length; i++) {
255                     scoreArray.add(Integer.parseInt(infos[i]));
256                 }
257                 if(infos[0].length() != 8 || infos[1].length() > 10 || infos[2].length() > 10
258                         || scoreArray.size() < 4) {
259                     System.out.println("wrong format");
260                     continue;
261                 }
262                 int classNumber = Integer.parseInt(infos[0].substring(0, 6));
263                 if(classAll.size() == 0 || getAppointClass(classNumber) == null) {
264                     classAll.add(new Class(classNumber));
265                 }
266                 int ID = Integer.parseInt(infos[0]);
267                 Student student;
268                 if(getAppointCourse(infos[2]) != null) {
269                     student = new Student(ID, infos[1]);
270                     System.out.println(infos[0] + " " + infos[1] + " : access mode mismatch");
271                     getAppointClass(classNumber).getStudents().add(student);
272                 }
273                 else if(getAppointCourse(infos[2]) == null) {
274                     if(checkScoreExperiment(scoreArray)){
275                         System.out.println(infos[2] + " does not exist");
276                         student = new Student(ID, infos[1]);
277                         getAppointClass(classNumber).getStudents().add(student);
278                     }
279                 }
280                 if(!checkScoreExperiment(scoreArray)) {
281                     System.out.println("wrong format");
282                 }
283             }
284             else if(infos.length >= 7 && infos.length <= 12) { // 进行实验课程成绩分析
285                 ArrayList<Integer> scoreArray = new ArrayList<Integer>();
286                 for(int i = 3; i < infos.length; i++) {
287                     scoreArray.add(Integer.parseInt(infos[i]));
288                 }
289                 if(infos[0].length() != 8 || infos[1].length() > 10 || infos[2].length() > 10) {
290                     System.out.println("wrong format");
291                     continue;
292                 }
293                 int classNumber = Integer.parseInt(infos[0].substring(0, 6));
294                 if(classAll.size() == 0 || getAppointClass(classNumber) == null) {
295                     classAll.add(new Class(classNumber));
296                 }
297                 int ID = Integer.parseInt(infos[0]);
298                 Student student;
299                 if(getAppointCourse(infos[2]) != null &&
300                         getAppointCourse(infos[2]).getAssessment().equals("实验") &&
301                         checkScoreExperiment(scoreArray)) {
302                     if(scoreArray.size() != getAppointCourse(infos[2]).getScore().getScoreExperiment().scorePercent.size()) {
303                         student = new Student(ID, infos[1]);
304                         System.out.println(infos[0] + " " + infos[1] + " : access mode mismatch");
305                         getAppointClass(classNumber).getStudents().add(student);
306                         continue;
307                     }
308                     if(getAppointClass(classNumber).getStudents().size() == 0 ||
309                            getAppointClass(classNumber).getAppointStudent(ID, infos[1]) == null){
310                         student = new Student(ID, infos[1]);
311                         student.getCourseAll().add(new Course(infos[2], "实验", "实验"));
312                         Score temp = student.getCourseAll().get(student.getCourseAll().size() - 1).getScore();
313                         temp.getScoreExperiment().scoreArrays = scoreArray; // 引用
314                         temp.getScoreExperiment().scorePercent = getAppointCourse(infos[2]).getScore().getScoreExperiment().scorePercent; // 引用
315                         temp.getScoreExperiment().calculateScoreEnd();
316                         getAppointClass(classNumber).StudentTestNumber++;
317                         getAppointClass(classNumber).getStudents().add(student);
318                     }
319                     else {
320                         student = getAppointClass(classNumber).getAppointStudent(ID, infos[1]);
321                         if(student.getAppointCourse(infos[2]) == null) {
322                             student.getCourseAll().add(new Course(infos[2], "实验", "实验"));
323                             scoreExperiment temp = new scoreExperiment(); // 引用
324                             temp.scoreArrays = scoreArray;
325                             temp.scorePercent = getAppointCourse(infos[2]).getScore().getScoreExperiment().scorePercent; // 引用
326                             temp.calculateScoreEnd();
327                         }
328                     }
329                     if(getAppointCourse(infos[2]).getScore().getScoreEnd() == -1) {
330                         getAppointCourse(infos[2]).getScore().setScoreEnd(0);
331                     }
332                     getAppointCourse(infos[2]).studentTestNumber++;
333                     getAppointCourse(infos[2]).getScore().setScoreEnd(getAppointCourse(infos[2]).getScore().getScoreEnd()
334                             + (int)student.getCourseAll().get(student.getCourseAll().size() - 1).getScore().getScoreEnd());
335                 }
336                 else if(getAppointCourse(infos[2]) == null) {
337                     if(checkScoreExperiment(scoreArray)){
338                         System.out.println(infos[2] + " does not exist");
339                         student = new Student(ID, infos[1]);
340                         getAppointClass(classNumber).getStudents().add(student);
341                     }
342                 }
343                 else if(getAppointCourse(infos[2]) != null) {
344                     if(getAppointCourse(infos[2]).getAssessment().equals("考察") || getAppointCourse(infos[2]).getAssessment().equals("考试")) {
345                         student = new Student(ID, infos[1]);
346                         System.out.println(infos[0] + " " + infos[1] + " : access mode mismatch");
347                         getAppointClass(classNumber).getStudents().add(student);
348                     }
349                 }
350                 if(!checkScoreExperiment(scoreArray)) {
351                     System.out.println("wrong format");
352                 }
353             }
354         }
355         for(int i = 0; i < classAll.size(); i++) { // 给班级排序
356             for(int j = i+1; j < classAll.size(); j++) {
357                 if(classAll.get(i).getClassNumber() > classAll.get(j).getClassNumber()) {
358                     Collections.swap(classAll, i, j);
359                 }
360             }
361         }
362         for(int i = 0; i < classAll.size(); i++) { // 给学生排序
363             classAll.get(i).Sort();
364             for(int j = 0; j < classAll.get(i).getStudents().size(); j++) {
365                 Student student = classAll.get(i).getStudents().get(j);
366                 student.calculateAverageStudent();
367                 if(student.getAverageStudent() == -1) {
368                     System.out.println(student.getID() + " " + student.getName() + " did not take any exams");
369                 }
370                 else {
371                     float  score = student.getAverageStudent();
372                     if(student.courseTestNumber != 0)
373                             score /= student.courseTestNumber;
374                     System.out.println(student.getID() + " " + student.getName() + " " + (int)score);
375                 }
376             }
377         }
378         String courseCorrect[] = new String[courseAll.size()];
379         for(int i = 0; i < courseAll.size(); i++) {
380             courseCorrect[i] = new String();
381             courseCorrect[i] = courseAll.get(i).getName();
382         }
383         Arrays.sort(courseCorrect, Collator.getInstance(java.util.Locale.CHINA)); // 给课程排序
384         for(int i = 0; i < courseAll.size(); i++) {
385             Collections.swap(courseAll, i, courseAll.indexOf(getAppointCourse(courseCorrect[i])));
386         }
387         for(int i = 0; i < courseAll.size(); i++) {
388             if(courseAll.get(i).getScore().getScoreEnd() == -1) {
389                 System.out.println(courseAll.get(i).getName() + " has no grades yet");
390             }
391             else {
392                 String temp = courseAll.get(i).getName() + " ";
393                 temp += (int)(courseAll.get(i).getScore().getScoreEnd() / courseAll.get(i).studentTestNumber);
394                 System.out.println(temp);
395             }
396         }
397         for(int i = 0; i < classAll.size(); i++) { // 班级平均分
398             classAll.get(i).calculateAverageClass();
399             if(classAll.get(i).getAverageClass() == -1 && classAll.get(i).getStudents().size() != 0)
400                 System.out.println(classAll.get(i).getClassNumber() + " has no grades yet");
401             else if(classAll.get(i).getStudents().size() != 0) {
402                 float score = classAll.get(i).getAverageClass();
403                 System.out.println(classAll.get(i).getClassNumber() + " " + (int)(score));
404             }
405         }
406         input.close();
407     }
408     public boolean checkScoreExperiment(ArrayList<Integer> scoreArray) { // 实验成绩是否合法
409         for(int score : scoreArray)
410             if(score < 0 || score > 100)
411                 return false;
412         return true;
413     }
414     public Course getAppointCourse(String name) { // 查找指定课程
415         for(int i = 0; i < courseAll.size(); i++) {
416             if(courseAll.get(i).getName().equals(name))
417                 return courseAll.get(i);
418         }
419         return null;
420     }
421     public Class getAppointClass(int classNumber) { // 查找指定班级
422         for(int i = 0; i < classAll.size(); i++) {
423             if(classAll.get(i).getClassNumber() == classNumber)
424                 return classAll.get(i);
425         }
426         return null;
427     }
428 }
429 
430 class Course {
431     private String name = new String();
432     private String attribute = new String(); // 课程性质
433     private String assessment = new String(); // 考核方式
434     private Score score;
435     protected int studentTestNumber = 0; // 参与该课程考试人数
436     public Course() {}
437     public Course(String name, String attribute) {
438         this.name = name;
439         this.attribute = attribute;
440         if(attribute.equals("必修")) {
441             score = new Score("考试");
442             this.assessment = "考试";
443         }
444     }
445     public Course(String name, String attribute, String assessment) {
446         this.name = name;
447         this.attribute = attribute;
448         this.assessment = assessment;
449         if(assessment.equals("考试")) {
450             score = new Score("考试");
451         }
452         else if(assessment.equals("考察")) {
453             score = new Score("考察");
454         }
455         else if(assessment.equals("实验")) {
456             score = new Score("实验");
457         }
458     }
459     public String getName() {
460         return name;
461     }
462     public String getAttribute() {
463         return attribute;
464     }
465     public String getAssessment() {
466         return assessment;
467     }
468     public Score getScore() {
469         return score;
470     }
471 }
472 
473 class Score { // 分数
474     private float scoreEnd = -1; // 最终成绩
475     private String type = new String(); // 分数类型
476     private scoreExamination examination;
477     private scoreInvestigate investigate;
478     private scoreExperiment experiment;
479     
480     public Score(String type) {
481         this.type = type;
482         if(type.equals("考试")) {
483             examination = new scoreExamination();
484         }
485         else if(type.equals("考察")) {
486             investigate = new scoreInvestigate();
487         }
488         else if(type.equals("实验")) {
489             experiment = new scoreExperiment();
490         }
491     }
492     public scoreExamination getScoreExamination() {
493         return this.examination;
494     }
495     public scoreInvestigate getScoreInvestigate() {
496         return this.investigate;
497     }
498     public scoreExperiment getScoreExperiment() {
499         return this.experiment;
500     }
501     public void setScoreEnd(float scoreEnd) {
502         this.scoreEnd = scoreEnd;
503     }
504     public float getScoreEnd() {
505         if(this.scoreEnd == -1) {
506             if(type.equals("考试")) {
507                 this.scoreEnd = (int)examination.calculateScoreEnd();
508             }
509             else if(type.equals("考察")) {
510                 this.scoreEnd = (int)investigate.calculateScoreEnd();
511             }
512             else if(type.equals("实验")) {
513                 this.scoreEnd = (int)experiment.calculateScoreEnd();
514             }
515         }
516         return this.scoreEnd;
517     }
518     public String getType() {
519         return type;
520     }
521 }
522 
523 class scoreExamination { // 考试成绩
524     private float scoreOrdinary = -1; //平时分
525     private float scoreLast = 0; // 期末成绩
526     private float percentOrdinary = 0; // 平时分权重
527     private float percentLast = 0; // 期末成绩权重
528     
529     public scoreExamination() {}
530     public scoreExamination(float scoreOrdinary, float scoreLast) {
531         setScoreLast(scoreLast);
532         setScoreOrdinary(scoreOrdinary);
533     }
534     public float calculateScoreEnd() {
535         return getScoreOrdinary() * percentOrdinary + getScoreLast() * percentLast;
536     }
537     public float getPercentOrdinary() {
538         return this.percentOrdinary;
539     }
540     public float getPercentLast() {
541         return this.percentLast;
542     }
543     public void setPercentOrdinary(float percentOrdinary) {
544         this.percentOrdinary = percentOrdinary;
545     }
546     public void setPercentLast(float percentLast) {
547         this.percentLast = percentLast;
548     }
549     public void setScoreOrdinary(float scoreOrdinary) {
550         this.scoreOrdinary = scoreOrdinary;
551     }
552     public float getScoreOrdinary() {
553         return this.scoreOrdinary;
554     }
555     public void setScoreLast(float scoreLast) {
556         this.scoreLast = scoreLast;
557     }
558     public float getScoreLast() {
559         return this.scoreLast;
560     }
561 }
562 
563 class scoreInvestigate { // 考察成绩
564     private float scoreLast = 0; // 期末成绩
565     
566     public scoreInvestigate() {}
567     public scoreInvestigate(float scoreLast) {
568         setScoreLast(scoreLast);
569     }
570     public float calculateScoreEnd() {
571         return getScoreLast();
572     }
573     public void setScoreLast(float scoreLast) {
574         this.scoreLast = scoreLast;
575     }
576     public float getScoreLast() {
577         return this.scoreLast;
578     }
579 }
580 
581 class scoreExperiment { // 实验成绩
582     ArrayList<Integer> scoreArrays = new ArrayList<Integer>(); // 每次实验成绩的权重数组
583     ArrayList<Float> scorePercent = new ArrayList<Float>(); // 每次的实验成绩
584     
585     public scoreExperiment() {}
586     public float calculateScoreEnd() {
587         float scoreEnd = -1;
588         if(scoreArrays.size() != 0){
589             scoreEnd = 0;
590             for(int i = 0; i < scoreArrays.size(); i++) {
591                 scoreEnd += scoreArrays.get(i) * scorePercent.get(i);
592             }
593         }
594         return scoreEnd;
595     }
596 }
597 
598 class Class {
599     private ArrayList<Student> students = new ArrayList<Student>();
600     private int classNumber = 0; // 班级号
601     private float averageClass = -1; // 班级平均分
602     protected int StudentTestNumber = 0; // 班级内参与了考试的学生数
603     public Class() {}
604     public Class(int classNumber) {
605         this.classNumber = classNumber;
606     }
607     public void Sort() {
608         for(int i = 0; i < students.size(); i++) {
609             for(int j = i+1; j < students.size(); j++) {
610                 if(students.get(i).getID() > students.get(j).getID()) {
611                     Collections.swap(students, i, j);
612                 }
613             }
614         }
615     }
616     public Student getAppointStudent(int ID, String nameStudent) {
617         for(int i = 0; i < students.size(); i++) {
618             if(students.get(i).getID() == ID && students.get(i).getName().equals(nameStudent))
619                 return students.get(i);
620         }
621         return null;
622     }
623     public void calculateAverageClass() {
624         float average = 0; boolean flag = false;
625         for(int i = 0; i < students.size(); i++) {
626             if(students.get(i).getAverageStudent() != -1){
627                 average += (int)(students.get(i).getAverageStudent());
628                 flag = true;
629             }
630         }
631         if(flag)
632             averageClass = average / StudentTestNumber;
633     }
634     public int getClassNumber() {
635         return classNumber;
636     }
637     public float getAverageClass() {
638         return averageClass;
639     }
640     public ArrayList<Student> getStudents() {
641         return students;
642     }
643 }
644 class Student {
645     private String name = new String();
646     private int ID;
647     private float averageStudent = -1;  // 学生平均分
648     private ArrayList<Course> courseAll = new ArrayList<Course>();
649     protected int courseTestNumber = 0; // 该学生参与的课程考试数
650     public Student() {}
651     public Student(int ID, String name) {
652         this.name = name;
653         this.ID = ID;
654     }
655     public void calculateAverageStudent() {
656         float average = 0;
657         for(int i = 0; i < courseAll.size(); i++) {
658             if(courseAll.get(i).getScore().getScoreEnd() != -1) {
659                 average += courseAll.get(i).getScore().getScoreEnd();
660                 courseTestNumber++;
661             }
662         }
663         if(courseTestNumber != 0)
664             averageStudent = (int)average;
665     }
666     public Course getAppointCourse(String nameCourse) {
667         for(int i = 0; i < courseAll.size(); i++) {
668             if(this.courseAll.get(i).getName().equals(nameCourse)) {
669                 return this.courseAll.get(i);
670             }
671         }
672         return null;
673     }
674     public String getName() {
675         return name;
676     }
677     public int getID() {
678         return ID;
679     }
680     public float getAverageStudent() {
681         return averageStudent;
682     }
683     public ArrayList<Course> getCourseAll() {
684         return courseAll;
685     }
686 }
课程成绩统计程序-2

设计类图:

 SourceMonitor分析结果:

 小结:

这道题是课程成绩统计程序-1的迭代版-2,难度上,个人认为如果课程成绩统计程序-1如果在设计没有太大偏差,解决该道题难度并不大。这道题的分数是60分,本人拿到了56分。

 

 此道题在课程成绩统计程序-1的基础上只是添加了一门实验课程,并没有做太大的改动,鉴于在课程成绩统计程序-1中设计录入必修课程和考察课程的经验,录入实验课程实现起来很轻松,在修改了平均分的算法后,就并没有太多需要总结的。非要说哪里存在难度,也许是case14这个节点,我在设计报错提示的顺序可能出现了一点偏差,多次调整代码中报错输出的顺序后其它测试节点依旧顺利通过而case14始终无法通过。

3.课程成绩统计程序-3

这道题是课程成绩统计程序-2的迭代版-3,添加的题目要求如下:

一、

课程成绩统计程序-3在第二次的基础上修改了计算总成绩的方式,

要求:修改类结构,将成绩类的继承关系改为组合关系,成绩信息由课程成绩类和分项成绩类组成,课程成绩类组合分项成绩类,分项成绩类由成绩分值和权重两个属性构成。

完成课程成绩统计程序-2、3两次程序后,比较继承和组合关系的区别。思考一下哪一种关系运用上更灵活,更能够适应变更。

二、

实验的总成绩等于课程每次实验成绩乘以权重后累加而得。

课程权重值在录入课程信息时输入。(注意:所有分项成绩的权重之和应当等于1

三、

课程信息包括:课程名称、课程性质、考核方式、分项成绩数量、每个分项成绩的权重。

考试课信息格式:课程名称+英文空格+课程性质+英文空格+考核方式+英文空格+平时成绩的权重+英文空格+期末成绩的权重

考察课信息格式:课程名称+英文空格+课程性质+英文空格+考核方式

实验课程信息格式:课程名称+英文空格+课程性质+英文空格+考核方式+英文空格+分项成绩数量n+英文空格+分项成绩1的权重+英文空格+。。。+英文空格+分项成绩n的权重

四、

实验课程成绩信息包括:学号、姓名、课程名称、每次成绩{在系列-2的基础上去掉了(实验次数),实验次数要和实验课程信息中输入的分项成绩数量保持一致}

实验课程信息格式:学号+英文空格+姓名+英文空格+课程名称+英文空格+第一次实验成绩+...+英文空格+最后一次实验成绩

五、

如果解析实验课程信息时,输入的分项成绩数量值和分项成绩权重的个数不匹配,输出:课程名称+" : number of scores does not match"

如果解析考试课、实验课时,分项成绩权重值的总和不等于1,输出:课程名称+" : weight value error"

源代码:

  1 import java.util.Scanner;
  2 import java.text.Collator;
  3 import java.util.ArrayList;
  4 import java.util.Arrays;
  5 import java.util.Collections;
  6 import java.util.Comparator;
  7 
  8 public class Main{
  9     public static void main(String args[]) {
 10         SelectCourseCenter selectCourseCenter = new SelectCourseCenter();
 11         selectCourseCenter.start();
 12     }
 13 }
 14 
 15 class SelectCourseCenter {
 16     private ArrayList<Class> classAll = new ArrayList<Class>();
 17     private ArrayList<Course> courseAll = new ArrayList<Course>();
 18     public void start() {
 19         Scanner input = new Scanner(System.in);
 20         while(true) {
 21             String information = input.nextLine();
 22             String infos[] = information.split(" ");
 23             if(information.equals("end"))
 24                 break;
 25             if(infos[2].equals("实验") && infos.length > 4) { // 实验课程
 26                 if(infos[0].length() > 10) {
 27                     System.out.println("wrong format");
 28                     continue;
 29                 }
 30                 if(getAppointCourse(infos[0]) != null)
 31                     continue;
 32                 if(!infos[1].equals("实验")) {
 33                     System.out.println(infos[0] + " : course type & access mode mismatch");
 34                     Course courseExperiment = new Course(infos[0], infos[1], "实验");
 35                     courseAll.add(courseExperiment);
 36                     continue;
 37                 }
 38                 int experimentNumber = Integer.parseInt(infos[3]);
 39                 if(experimentNumber < 4) {
 40                     System.out.println("wrong format");
 41                 }
 42                 else {
 43                     if(infos.length - 4 != experimentNumber) {
 44                         System.out.println(infos[0] + " : number of scores does not match");
 45                     }
 46                     else if(infos.length - 4 > 9) {
 47                         System.out.println("wrong format");
 48                     }
 49                     else {
 50                         ArrayList<Float> experimentPercent = new ArrayList<Float>();
 51                         float checkIsOne = 0;
 52                         for(int i = 0; i < experimentNumber; i++) {
 53                             float percent = Float.parseFloat(infos[i + 4]);
 54                             checkIsOne += percent;
 55                             experimentPercent.add(percent);
 56                         }
 57                         if(Math.abs(checkIsOne - 1) > 0.0001) {
 58                             System.out.println(infos[0] + " : weight value error");
 59                         }
 60                         else {
 61                             Course courseExperiment = new Course(infos[0], infos[1], "实验");
 62                             courseExperiment.getScore().getScoreExperiment().scorePercent = experimentPercent;
 63                             courseAll.add(courseExperiment);
 64                         }
 65                     }
 66                 }
 67                 continue;
 68             }
 69             if(infos[2].equals("考试") && infos.length >= 5) { // 考试课程
 70                 if(infos[0].length() > 10) {
 71                     System.out.println("wrong format");
 72                     continue;
 73                 }
 74                 if(getAppointCourse(infos[0]) != null)
 75                     continue;
 76                 if(!infos[1].equals("必修")) {
 77                     System.out.println(infos[0] + " : course type & access mode mismatch");
 78                     Course courseExamination = new Course(infos[0], infos[1], infos[2]);
 79                     courseAll.add(courseExamination);
 80                 }
 81                 else {
 82                     float percentOrdinary = Float.parseFloat(infos[3]);
 83                     float percentLast = Float.parseFloat(infos[4]);
 84                     if(percentOrdinary + percentLast != 1) {
 85                         System.out.println(infos[0] + " : weight value error");
 86                     }
 87                     else {
 88                         Course courseExamination = new Course(infos[0], infos[1], infos[2]);
 89                         courseExamination.getScore().getScoreExamination().setPercentOrdinary(percentOrdinary);
 90                         courseExamination.getScore().getScoreExamination().setPercentLast(percentLast);
 91                         courseAll.add(courseExamination);
 92                     }
 93                 }
 94                 continue;
 95             }
 96             else if(infos.length == 3) { // 考察课程
 97                 if(infos[0].length() > 10) {
 98                     System.out.println("wrong format");
 99                 }
100                 else{
101                     if((infos[1].equals("必修") && !infos[2].equals("考试")) || (infos[1].equals("实验") && !infos[2].equals("实验"))) {
102                         System.out.println(infos[0] + " : course type & access mode mismatch");
103                     }
104                     else if(infos[1].equals("必修") && infos[2].equals("考试")) {
105                         System.out.println(infos[0] + " : weight value error");
106                     }
107                     else if(getAppointCourse(infos[0]) != null) {
108                     }
109                     else if(infos[1].equals("选修") && infos[2].equals("考察")){
110                         courseAll.add(new Course(infos[0], infos[1], infos[2]));
111                     }
112                     else {
113                         System.out.println("wrong format");
114                     }
115                 }
116             }
117             else if(infos.length == 4) { // 进行考察的成绩分析
118                 if(infos[0].length() != 8 || infos[1].length() > 10 || infos[2].length() > 10) {
119                     System.out.println("wrong format");
120                     continue;
121                 }
122                 int classNumber = Integer.parseInt(infos[0].substring(0, 6));
123                 if(classAll.size() == 0 || getAppointClass(classNumber) == null) { // 是否存在该班级
124                     classAll.add(new Class(classNumber));
125                 }
126                 int scoreLast = Integer.parseInt(infos[3]);
127                 int ID = Integer.parseInt(infos[0]);
128                 Student student;
129                 if(getAppointCourse(infos[2]) != null &&
130                         getAppointCourse(infos[2]).getAssessment().equals("考察") &&
131                         scoreLast >= 0 && scoreLast <= 100) {
132                     if(getAppointClass(classNumber).getStudents().size() == 0 ||
133                            getAppointClass(classNumber).getAppointStudent(ID, infos[1]) == null){ // 是否存在学生
134                         student = new Student(ID, infos[1]);
135                         student.getCourseAll().add(new Course(infos[2]
136                                 , getAppointCourse(infos[2]).getAttribute()
137                                 , getAppointCourse(infos[2]).getAssessment()));
138                         student.getCourseAll().get(student.getCourseAll().size() - 1).getScore().getScoreInvestigate().setScoreLast(scoreLast);
139                         getAppointClass(classNumber).StudentTestNumber++;
140                         getAppointClass(classNumber).getStudents().add(student);
141                     }
142                     else {
143                         student = getAppointClass(classNumber).getAppointStudent(ID, infos[1]); // 引用
144                         if(student.getAppointCourse(infos[2]) == null){
145                             student.getCourseAll().add(new Course(infos[2]
146                                     , getAppointCourse(infos[2]).getAttribute()
147                                     , getAppointCourse(infos[2]).getAssessment()));
148                             student.getAppointCourse(infos[2]).getScore().getScoreInvestigate().setScoreLast(scoreLast);
149                         }
150                     }
151                     getAppointCourse(infos[2]).studentTestNumber++; // 参与考试学生人数+1
152                     getAppointCourse(infos[2]).getScore().getScoreInvestigate().setScoreLast(getAppointCourse(infos[2]).getScore().getScoreInvestigate().getScoreLast()
153                             + student.getCourseAll().get(student.getCourseAll().size() - 1).getScore().getScoreInvestigate().getScoreLast());
154                 }
155                 else if(getAppointCourse(infos[2]) == null) {
156                     if(scoreLast >= 0 && scoreLast <= 100){
157                         System.out.println(infos[2] + " does not exist");
158                         student = new Student(ID, infos[1]);
159                         getAppointClass(classNumber).getStudents().add(student);
160                     }
161                 }
162                 else if(getAppointCourse(infos[2]).getAssessment().equals("考试") || getAppointCourse(infos[2]).getAssessment().equals("实验")) {
163                     student = new Student(ID, infos[1]);
164                     System.out.println(infos[0] + " " + infos[1] + " : access mode mismatch");
165                     getAppointClass(classNumber).getStudents().add(student);
166                 }
167                 else {
168                     System.out.println("wrong format");
169                 }
170                 if(!(scoreLast >= 0 && scoreLast <= 100)) {
171                     System.out.println("wrong format");
172                 }
173             }
174             else if(infos.length == 5) { // 进行考试的成绩分析
175                 if(infos[0].length() != 8 || infos[1].length() > 10 || infos[2].length() > 10) {
176                     System.out.println("wrong format");
177                     continue;
178                 }
179                 int classNumber = Integer.parseInt(infos[0].substring(0, 6));
180                 if(classAll.size() == 0 || getAppointClass(classNumber) == null) {
181                     classAll.add(new Class(classNumber));
182                 }
183                 int scoreOrdinary = Integer.parseInt(infos[3]);
184                 int scoreLast = Integer.parseInt(infos[4]);
185                 int ID = Integer.parseInt(infos[0]);
186                 Student student;
187                 if(getAppointCourse(infos[2]) != null &&
188                         getAppointCourse(infos[2]).getAssessment().equals("考试") &&
189                         scoreLast >= 0 && scoreLast <= 100 &&
190                         scoreOrdinary >= 0 && scoreOrdinary <= 100) { // 是否合法
191                     if(getAppointClass(classNumber).getStudents().size() == 0 ||
192                            getAppointClass(classNumber).getAppointStudent(ID, infos[1]) == null){
193                         student = new Student(ID, infos[1]);
194                         student.getCourseAll().add(new Course(infos[2], getAppointCourse(infos[2]).getAttribute(), "考试"));
195                         Score temp = student.getCourseAll().get(student.getCourseAll().size() - 1).getScore();// 引用
196                         temp.getScoreExamination().setScoreOrdinary(scoreOrdinary);
197                         temp.getScoreExamination().setScoreLast(scoreLast);
198                         temp.getScoreExamination().setPercentLast(getAppointCourse(infos[2]).getScore().getScoreExamination().getPercentLast());
199                         temp.getScoreExamination().setPercentOrdinary(getAppointCourse(infos[2]).getScore().getScoreExamination().getPercentOrdinary());
200                         getAppointClass(classNumber).StudentTestNumber++;
201                         getAppointClass(classNumber).getStudents().add(student);
202                     }
203                     else {
204                         student = getAppointClass(classNumber).getAppointStudent(ID, infos[1]);
205                         if(student.getAppointCourse(infos[2]) == null) {
206                             student.getCourseAll().add(new Course(infos[2], getAppointCourse(infos[2]).getAttribute(), "考试"));
207                             scoreExamination temp = student.getAppointCourse(infos[2]).getScore().getScoreExamination();
208                             temp.setScoreOrdinary(scoreOrdinary);
209                             temp.setScoreLast(scoreLast);
210                             temp.setPercentLast(getAppointCourse(infos[2]).getScore().getScoreExamination().getPercentLast());
211                             temp.setPercentOrdinary(getAppointCourse(infos[2]).getScore().getScoreExamination().getPercentOrdinary());
212                         }
213                     }
214                     if(getAppointCourse(infos[2]).studentTestNumber == 0){
215                         getAppointCourse(infos[2]).getScore().getScoreExamination().setScoreOrdinary(0);
216                         getAppointCourse(infos[2]).getScore().setScoreEnd(0);
217                     }
218                     getAppointCourse(infos[2]).studentTestNumber++;
219                     getAppointCourse(infos[2]).getScore().getScoreExamination().
220                         setScoreOrdinary(getAppointCourse(infos[2]).getScore().getScoreExamination().getScoreOrdinary()
221                             + student.getCourseAll().get(student.getCourseAll().size() - 1).
222                                          getScore().getScoreExamination().getScoreOrdinary());
223                     getAppointCourse(infos[2]).getScore().getScoreExamination().
224                         setScoreLast(getAppointCourse(infos[2]).getScore().getScoreExamination().getScoreLast()
225                             + student.getCourseAll().get(student.getCourseAll().size() - 1).
226                                      getScore().getScoreExamination().getScoreLast());
227                     getAppointCourse(infos[2]).getScore().setScoreEnd(getAppointCourse(infos[2]).getScore().getScoreEnd()
228                             + (int)student.getCourseAll().get(student.getCourseAll().size() - 1).getScore().getScoreEnd());
229                 }
230                 else if(getAppointCourse(infos[2]) == null) {
231                     if(scoreLast >= 0 && scoreLast <= 100 &&
232                             scoreOrdinary >= 0 && scoreOrdinary <= 100) {
233                         System.out.println(infos[2] + " does not exist");
234                         student = new Student(ID, infos[1]);
235                         student.calculateAverageStudent();
236                         getAppointClass(classNumber).getStudents().add(student);
237                     }
238                 }
239                 else if(getAppointCourse(infos[2]).getAssessment().equals("考察") || getAppointCourse(infos[2]).getAssessment().equals("实验")) {
240                         student = new Student(ID, infos[1]);
241                         System.out.println(infos[0] + " " + infos[1] + " : access mode mismatch");
242                         getAppointClass(classNumber).getStudents().add(student);
243                 }
244                 else {
245                     System.out.println("wrong format");
246                 }
247                 if(scoreLast < 0 || scoreLast > 100 ||
248                         scoreOrdinary < 0 || scoreOrdinary > 100) {
249                     System.out.println("wrong format");
250                 }
251             }
252             else if((infos.length > 5 && infos.length < 7)) { // 进行错误的实验课程成绩分析
253                 ArrayList<Integer> scoreArray = new ArrayList<Integer>();
254                 for(int i = 3; i < infos.length; i++) {
255                     scoreArray.add(Integer.parseInt(infos[i]));
256                 }
257                 if(infos[0].length() != 8 || infos[1].length() > 10 || infos[2].length() > 10
258                         || scoreArray.size() < 4) {
259                     System.out.println("wrong format");
260                     continue;
261                 }
262                 int classNumber = Integer.parseInt(infos[0].substring(0, 6));
263                 if(classAll.size() == 0 || getAppointClass(classNumber) == null) {
264                     classAll.add(new Class(classNumber));
265                 }
266                 int ID = Integer.parseInt(infos[0]);
267                 Student student;
268                 if(getAppointCourse(infos[2]) != null) {
269                     student = new Student(ID, infos[1]);
270                     System.out.println(infos[0] + " " + infos[1] + " : access mode mismatch");
271                     getAppointClass(classNumber).getStudents().add(student);
272                 }
273                 else if(getAppointCourse(infos[2]) == null) {
274                     if(checkScoreExperiment(scoreArray)){
275                         System.out.println(infos[2] + " does not exist");
276                         student = new Student(ID, infos[1]);
277                         getAppointClass(classNumber).getStudents().add(student);
278                     }
279                 }
280                 if(!checkScoreExperiment(scoreArray)) {
281                     System.out.println("wrong format");
282                 }
283             }
284             else if(infos.length >= 7 && infos.length <= 12) { // 进行实验课程成绩分析
285                 ArrayList<Integer> scoreArray = new ArrayList<Integer>();
286                 for(int i = 3; i < infos.length; i++) {
287                     scoreArray.add(Integer.parseInt(infos[i]));
288                 }
289                 if(infos[0].length() != 8 || infos[1].length() > 10 || infos[2].length() > 10) {
290                     System.out.println("wrong format");
291                     continue;
292                 }
293                 int classNumber = Integer.parseInt(infos[0].substring(0, 6));
294                 if(classAll.size() == 0 || getAppointClass(classNumber) == null) {
295                     classAll.add(new Class(classNumber));
296                 }
297                 int ID = Integer.parseInt(infos[0]);
298                 Student student;
299                 if(getAppointCourse(infos[2]) != null &&
300                         getAppointCourse(infos[2]).getAssessment().equals("实验") &&
301                         checkScoreExperiment(scoreArray)) {
302                     if(scoreArray.size() != getAppointCourse(infos[2]).getScore().getScoreExperiment().scorePercent.size()) {
303                         student = new Student(ID, infos[1]);
304                         System.out.println(infos[0] + " " + infos[1] + " : access mode mismatch");
305                         getAppointClass(classNumber).getStudents().add(student);
306                         continue;
307                     }
308                     if(getAppointClass(classNumber).getStudents().size() == 0 ||
309                            getAppointClass(classNumber).getAppointStudent(ID, infos[1]) == null){
310                         student = new Student(ID, infos[1]);
311                         student.getCourseAll().add(new Course(infos[2], "实验", "实验"));
312                         Score temp = student.getCourseAll().get(student.getCourseAll().size() - 1).getScore();
313                         temp.getScoreExperiment().scoreArrays = scoreArray; // 引用
314                         temp.getScoreExperiment().scorePercent = getAppointCourse(infos[2]).getScore().getScoreExperiment().scorePercent; // 引用
315                         temp.getScoreExperiment().calculateScoreEnd();
316                         getAppointClass(classNumber).StudentTestNumber++;
317                         getAppointClass(classNumber).getStudents().add(student);
318                     }
319                     else {
320                         student = getAppointClass(classNumber).getAppointStudent(ID, infos[1]);
321                         if(student.getAppointCourse(infos[2]) == null) {
322                             student.getCourseAll().add(new Course(infos[2], "实验", "实验"));
323                             scoreExperiment temp = new scoreExperiment(); // 引用
324                             temp.scoreArrays = scoreArray;
325                             temp.scorePercent = getAppointCourse(infos[2]).getScore().getScoreExperiment().scorePercent; // 引用
326                             temp.calculateScoreEnd();
327                         }
328                     }
329                     if(getAppointCourse(infos[2]).getScore().getScoreEnd() == -1) {
330                         getAppointCourse(infos[2]).getScore().setScoreEnd(0);
331                     }
332                     getAppointCourse(infos[2]).studentTestNumber++;
333                     getAppointCourse(infos[2]).getScore().setScoreEnd(getAppointCourse(infos[2]).getScore().getScoreEnd()
334                             + (int)student.getCourseAll().get(student.getCourseAll().size() - 1).getScore().getScoreEnd());
335                 }
336                 else if(getAppointCourse(infos[2]) == null) {
337                     if(checkScoreExperiment(scoreArray)){
338                         System.out.println(infos[2] + " does not exist");
339                         student = new Student(ID, infos[1]);
340                         getAppointClass(classNumber).getStudents().add(student);
341                     }
342                 }
343                 else if(getAppointCourse(infos[2]) != null) {
344                     if(getAppointCourse(infos[2]).getAssessment().equals("考察") || getAppointCourse(infos[2]).getAssessment().equals("考试")) {
345                         student = new Student(ID, infos[1]);
346                         System.out.println(infos[0] + " " + infos[1] + " : access mode mismatch");
347                         getAppointClass(classNumber).getStudents().add(student);
348                     }
349                 }
350                 if(!checkScoreExperiment(scoreArray)) {
351                     System.out.println("wrong format");
352                 }
353             }
354         }
355         for(int i = 0; i < classAll.size(); i++) { // 给班级排序
356             for(int j = i+1; j < classAll.size(); j++) {
357                 if(classAll.get(i).getClassNumber() > classAll.get(j).getClassNumber()) {
358                     Collections.swap(classAll, i, j);
359                 }
360             }
361         }
362         for(int i = 0; i < classAll.size(); i++) { // 给学生排序
363             classAll.get(i).Sort();
364             for(int j = 0; j < classAll.get(i).getStudents().size(); j++) {
365                 Student student = classAll.get(i).getStudents().get(j);
366                 student.calculateAverageStudent();
367                 if(student.getAverageStudent() == -1) {
368                     System.out.println(student.getID() + " " + student.getName() + " did not take any exams");
369                 }
370                 else {
371                     float  score = student.getAverageStudent();
372                     if(student.courseTestNumber != 0)
373                             score /= student.courseTestNumber;
374                     System.out.println(student.getID() + " " + student.getName() + " " + (int)score);
375                 }
376             }
377         }
378         String courseCorrect[] = new String[courseAll.size()];
379         for(int i = 0; i < courseAll.size(); i++) {
380             courseCorrect[i] = new String();
381             courseCorrect[i] = courseAll.get(i).getName();
382         }
383         Arrays.sort(courseCorrect, Collator.getInstance(java.util.Locale.CHINA)); // 给课程排序
384         for(int i = 0; i < courseAll.size(); i++) {
385             Collections.swap(courseAll, i, courseAll.indexOf(getAppointCourse(courseCorrect[i])));
386         }
387         for(int i = 0; i < courseAll.size(); i++) {
388             if(courseAll.get(i).getScore().getScoreEnd() == -1) {
389                 System.out.println(courseAll.get(i).getName() + " has no grades yet");
390             }
391             else {
392                 String temp = courseAll.get(i).getName() + " ";
393                 temp += (int)(courseAll.get(i).getScore().getScoreEnd() / courseAll.get(i).studentTestNumber);
394                 System.out.println(temp);
395             }
396         }
397         for(int i = 0; i < classAll.size(); i++) { // 班级平均分
398             classAll.get(i).calculateAverageClass();
399             if(classAll.get(i).getAverageClass() == -1 && classAll.get(i).getStudents().size() != 0)
400                 System.out.println(classAll.get(i).getClassNumber() + " has no grades yet");
401             else if(classAll.get(i).getStudents().size() != 0) {
402                 float score = classAll.get(i).getAverageClass();
403                 System.out.println(classAll.get(i).getClassNumber() + " " + (int)(score));
404             }
405         }
406         input.close();
407     }
408     public boolean checkScoreExperiment(ArrayList<Integer> scoreArray) { // 实验成绩是否合法
409         for(int score : scoreArray)
410             if(score < 0 || score > 100)
411                 return false;
412         return true;
413     }
414     public Course getAppointCourse(String name) { // 查找指定课程
415         for(int i = 0; i < courseAll.size(); i++) {
416             if(courseAll.get(i).getName().equals(name))
417                 return courseAll.get(i);
418         }
419         return null;
420     }
421     public Class getAppointClass(int classNumber) { // 查找指定班级
422         for(int i = 0; i < classAll.size(); i++) {
423             if(classAll.get(i).getClassNumber() == classNumber)
424                 return classAll.get(i);
425         }
426         return null;
427     }
428 }
429 
430 class Course {
431     private String name = new String();
432     private String attribute = new String(); // 课程性质
433     private String assessment = new String(); // 考核方式
434     private Score score;
435     protected int studentTestNumber = 0; // 参与该课程考试人数
436     public Course() {}
437     public Course(String name, String attribute) {
438         this.name = name;
439         this.attribute = attribute;
440         if(attribute.equals("必修")) {
441             score = new Score("考试");
442             this.assessment = "考试";
443         }
444     }
445     public Course(String name, String attribute, String assessment) {
446         this.name = name;
447         this.attribute = attribute;
448         this.assessment = assessment;
449         if(assessment.equals("考试")) {
450             score = new Score("考试");
451         }
452         else if(assessment.equals("考察")) {
453             score = new Score("考察");
454         }
455         else if(assessment.equals("实验")) {
456             score = new Score("实验");
457         }
458     }
459     public String getName() {
460         return name;
461     }
462     public String getAttribute() {
463         return attribute;
464     }
465     public String getAssessment() {
466         return assessment;
467     }
468     public Score getScore() {
469         return score;
470     }
471 }
472 
473 class Score { // 分数
474     private float scoreEnd = -1; // 最终成绩
475     private String type = new String(); // 分数类型
476     private scoreExamination examination;
477     private scoreInvestigate investigate;
478     private scoreExperiment experiment;
479     
480     public Score(String type) {
481         this.type = type;
482         if(type.equals("考试")) {
483             examination = new scoreExamination();
484         }
485         else if(type.equals("考察")) {
486             investigate = new scoreInvestigate();
487         }
488         else if(type.equals("实验")) {
489             experiment = new scoreExperiment();
490         }
491     }
492     public scoreExamination getScoreExamination() {
493         return this.examination;
494     }
495     public scoreInvestigate getScoreInvestigate() {
496         return this.investigate;
497     }
498     public scoreExperiment getScoreExperiment() {
499         return this.experiment;
500     }
501     public void setScoreEnd(float scoreEnd) {
502         this.scoreEnd = scoreEnd;
503     }
504     public float getScoreEnd() {
505         if(this.scoreEnd == -1) {
506             if(type.equals("考试")) {
507                 this.scoreEnd = (int)examination.calculateScoreEnd();
508             }
509             else if(type.equals("考察")) {
510                 this.scoreEnd = (int)investigate.calculateScoreEnd();
511             }
512             else if(type.equals("实验")) {
513                 this.scoreEnd = (int)experiment.calculateScoreEnd();
514             }
515         }
516         return this.scoreEnd;
517     }
518     public String getType() {
519         return type;
520     }
521 }
522 
523 class scoreExamination { // 考试成绩
524     private float scoreOrdinary = -1; //平时分
525     private float scoreLast = 0; // 期末成绩
526     private float percentOrdinary = 0; // 平时分权重
527     private float percentLast = 0; // 期末成绩权重
528     
529     public scoreExamination() {}
530     public scoreExamination(float scoreOrdinary, float scoreLast) {
531         setScoreLast(scoreLast);
532         setScoreOrdinary(scoreOrdinary);
533     }
534     public float calculateScoreEnd() {
535         return getScoreOrdinary() * percentOrdinary + getScoreLast() * percentLast;
536     }
537     public float getPercentOrdinary() {
538         return this.percentOrdinary;
539     }
540     public float getPercentLast() {
541         return this.percentLast;
542     }
543     public void setPercentOrdinary(float percentOrdinary) {
544         this.percentOrdinary = percentOrdinary;
545     }
546     public void setPercentLast(float percentLast) {
547         this.percentLast = percentLast;
548     }
549     public void setScoreOrdinary(float scoreOrdinary) {
550         this.scoreOrdinary = scoreOrdinary;
551     }
552     public float getScoreOrdinary() {
553         return this.scoreOrdinary;
554     }
555     public void setScoreLast(float scoreLast) {
556         this.scoreLast = scoreLast;
557     }
558     public float getScoreLast() {
559         return this.scoreLast;
560     }
561 }
562 
563 class scoreInvestigate { // 考察成绩
564     private float scoreLast = 0; // 期末成绩
565     
566     public scoreInvestigate() {}
567     public scoreInvestigate(float scoreLast) {
568         setScoreLast(scoreLast);
569     }
570     public float calculateScoreEnd() {
571         return getScoreLast();
572     }
573     public void setScoreLast(float scoreLast) {
574         this.scoreLast = scoreLast;
575     }
576     public float getScoreLast() {
577         return this.scoreLast;
578     }
579 }
580 
581 class scoreExperiment { // 实验成绩
582     ArrayList<Integer> scoreArrays = new ArrayList<Integer>(); // 每次实验成绩的权重数组
583     ArrayList<Float> scorePercent = new ArrayList<Float>(); // 每次的实验成绩
584     
585     public scoreExperiment() {}
586     public float calculateScoreEnd() {
587         float scoreEnd = -1;
588         if(scoreArrays.size() != 0){
589             scoreEnd = 0;
590             for(int i = 0; i < scoreArrays.size(); i++) {
591                 scoreEnd += scoreArrays.get(i) * scorePercent.get(i);
592             }
593         }
594         return scoreEnd;
595     }
596 }
597 
598 class Class {
599     private ArrayList<Student> students = new ArrayList<Student>();
600     private int classNumber = 0; // 班级号
601     private float averageClass = -1; // 班级平均分
602     protected int StudentTestNumber = 0; // 班级内参与了考试的学生数
603     public Class() {}
604     public Class(int classNumber) {
605         this.classNumber = classNumber;
606     }
607     public void Sort() {
608         for(int i = 0; i < students.size(); i++) {
609             for(int j = i+1; j < students.size(); j++) {
610                 if(students.get(i).getID() > students.get(j).getID()) {
611                     Collections.swap(students, i, j);
612                 }
613             }
614         }
615     }
616     public Student getAppointStudent(int ID, String nameStudent) {
617         for(int i = 0; i < students.size(); i++) {
618             if(students.get(i).getID() == ID && students.get(i).getName().equals(nameStudent))
619                 return students.get(i);
620         }
621         return null;
622     }
623     public void calculateAverageClass() {
624         float average = 0; boolean flag = false;
625         for(int i = 0; i < students.size(); i++) {
626             if(students.get(i).getAverageStudent() != -1){
627                 average += (int)(students.get(i).getAverageStudent());
628                 flag = true;
629             }
630         }
631         if(flag)
632             averageClass = average / StudentTestNumber;
633     }
634     public int getClassNumber() {
635         return classNumber;
636     }
637     public float getAverageClass() {
638         return averageClass;
639     }
640     public ArrayList<Student> getStudents() {
641         return students;
642     }
643 }
644 class Student {
645     private String name = new String();
646     private int ID;
647     private float averageStudent = -1;  // 学生平均分
648     private ArrayList<Course> courseAll = new ArrayList<Course>();
649     protected int courseTestNumber = 0; // 该学生参与的课程考试数
650     public Student() {}
651     public Student(int ID, String name) {
652         this.name = name;
653         this.ID = ID;
654     }
655     public void calculateAverageStudent() {
656         float average = 0;
657         for(int i = 0; i < courseAll.size(); i++) {
658             if(courseAll.get(i).getScore().getScoreEnd() != -1) {
659                 average += courseAll.get(i).getScore().getScoreEnd();
660                 courseTestNumber++;
661             }
662         }
663         if(courseTestNumber != 0)
664             averageStudent = (int)average;
665     }
666     public Course getAppointCourse(String nameCourse) {
667         for(int i = 0; i < courseAll.size(); i++) {
668             if(this.courseAll.get(i).getName().equals(nameCourse)) {
669                 return this.courseAll.get(i);
670             }
671         }
672         return null;
673     }
674     public String getName() {
675         return name;
676     }
677     public int getID() {
678         return ID;
679     }
680     public float getAverageStudent() {
681         return averageStudent;
682     }
683     public ArrayList<Course> getCourseAll() {
684         return courseAll;
685     }
686 }
课程成绩统计程序-3

设计类图:

 SourceMonitor分析结果:

 小结:

与课程成绩统计程序-2一样,如果设计好了上一次的版本,该次的迭代版也不会太难,这道题的分数是64分,这里我拿到了60分。

 

 该道题目在-2的基础上主要改动就是实验课程成绩的每次分数的权重不再是平均分配,而是需要自己输入权重,于是这里就会存在一个问题,因为计算机在进行浮点数的运算的时候,答案并不是完全精确的,而是相对精确存在一定误差,刚开始并没有注意到此点。所以最初使用的权重判断语句是否等于1直接采用的是==1的形式,于是在半成品的代码中这几个测试点无法通过:

 

后将判定条件修改为该权重总和与1的误差是否在一个很小的范围顺利通过:

 

 这是这道题最坑的地方,也是让我印象最深刻的地方,计算机的浮点数运算并不精确现在已经牢记于心。在与其他同学交流的过程中,我发现了好几位同学也出现了与我相同的问题,都是直接判断==1,后经修改分数都来到了90分以上。

接着是第二个坑的地方,double类型浮点数和float类型浮点数精确度不一样,我开始使用的全部为double类型的浮点数,始终无法通过case8这个测试节点:

 

 后将double类型修改为float后顺利通过:

 

 总的来说,该题相较于课程成绩统计程序-2也并没有太难,其难度在于如何控制精度,要考虑计算机不同浮点数计算的误差大小,注意了这点,这题也就迎刃而解了。

 

数据结构相关题目:考察的点并不难,考察目的是为了让我们稍微了解数据结构中的一些内容,为大二的数据结构做准备,这里只挑一道具有代表性的题目分析。

1.统计Java程序中关键词出现的次数(必须使用Set和Map)

分数 100
作者 段喜龙
单位 南昌航空大学

编写程序统计一个输入的Java源码中关键字(区分大小写)出现的次数。说明如下:

  • Java中共有53个关键字(自行百度)
  • 从键盘输入一段源码,统计这段源码中出现的关键字的数量
  • 注释中出现的关键字不用统计
  • 字符串中出现的关键字不用统计
  • 统计出的关键字及数量按照关键字升序进行排序输出
  • 未输入源码则认为输入非法

输入格式:

输入Java源码字符串,可以一行或多行,以exit行作为结束标志

输出格式:

  • 当未输入源码时,程序输出Wrong Format
  • 当没有统计数据时,输出为空
  • 当有统计数据时,关键字按照升序排列,每行输出一个关键字及数量,格式为数量\t关键字

输入样例:

在这里给出一组输入。例如:

//Test public method
public HashMap(int initialCapacity) {
        this(initialCapacity, DEFAULT_LOAD_FACTOR);
    }
    public HashMap(int initialCapacity, float loadFactor) {
        if (initialCapacity < 0)
            throw new IllegalArgumentException("Illegal initial capacity: " +
                                               initialCapacity);
        if (initialCapacity > MAXIMUM_CAPACITY)
            initialCapacity = MAXIMUM_CAPACITY;
        if (loadFactor <= 0 || Float.isNaN(loadFactor))
            throw new IllegalArgumentException("Illegal load factor: " +
                                               loadFactor);
        this.loadFactor = loadFactor;
        this.threshold = tableSizeFor(initialCapacity);
    }
exit
 

输出样例:

在这里给出相应的输出。例如:

1	float
3	if
2	int
2	new
2	public
3	this
2	throw
 
代码长度限制
16 KB
时间限制
400 ms
内存限制
64 MB
源代码:
 1 import java.util.*;
 2 
 3 public class Main {
 4     public static void main(String[] args) {
 5         Scanner input = new Scanner(System.in);
 6         HashMap<String,Integer> JavaKeyAll = new HashMap<>(); // 用于存放关键字的HashMap
 7         TreeMap<String,Integer> res = new TreeMap<>();
 8         String[] JavaKeyAllTemp = {"abstract", "assert", "boolean", "break", "byte", "case", "catch", "char", "class", "const", "continue", "default", "do", "double", "else", "enum", "extends", "false", "final", "finally", "float", "for", "goto", "if", "implements", "import", "instanceof", "int", "interface", "long", "native", "new", "null", "package", "private", "protected", "public", "return", "short", "static", "strictfp", "super", "switch", "synchronized", "this", "throw", "throws", "transient", "true", "try", "void", "volatile", "while"};
 9         for(int i = 0; i < 53; i++)
10             JavaKeyAll.put(JavaKeyAllTemp[i], 0); // 放入HashMap中
11         String information = "";
12         StringBuilder temp = new StringBuilder();
13         boolean isNull = true;
14         boolean sameLine = true;
15         while(input.hasNext()) {
16             information = input.nextLine();
17             if(!sameLine) { // 多行注释
18                 if(information.matches(".*/"))
19                     sameLine = true;
20             }
21             if(information.matches("/*.*") && !information.matches(".*/")) {
22                 sameLine = false;
23                 information.replace("\n", " "); 
24             }
25             if (information.equals("exit"))
26                 break;
27             isNull = false;
28             temp.append(information.replaceAll("//.*", " ").replaceAll("\".*\""," "));// 利用正则表达式去掉"//"类型注释后面的内容以及双引号里的内容并用空格字符代替
29         }
30         String temp2 = temp.toString().replaceAll("/\\*.*?\\*/", " ").replace("{", " ").replace("}", " ").replace("(", " ").replace(")", " ")
31                 .replace("=", "").replace(":", " ").replace(";", " ").replace("[", " ").replace("]", " ").replace(",", " ").replace(".", " ");//去掉"/* */"里的内容以及各种括号和分号
32         String codeAll[] = temp2.split(" ");
33         for(int i=0; i < codeAll.length; i++) { // 查找每一个关键词,并得到相应的出现的次数
34             String codeTemp = codeAll[i].replaceAll(" ", "").replaceAll("    ", ""); // 去除所有空格
35             if (JavaKeyAll.containsKey(codeTemp)) { //判断是否是关键词
36                 if (!res.containsKey(codeTemp)) 
37                     res.put(codeTemp, 1);
38                 else 
39                     res.replace(codeTemp, res.get(codeTemp) + 1);
40             }
41         }
42         for(String i : res.keySet())
43             System.out.println(res.get(i) + "\t" + i); // 输出
44         if (isNull)
45             System.out.println("Wrong Format"); // 无输入
46     }
47 }
统计Java程序中关键词的出现次数

小结:

该题代码长度较短且只有一个主类,这些就不放出类图设计和SourceMonitor的分析结果了。本道题主要是为了让我们了解Set和Map的用法,同时也需要了解一些正则表达式的用法。在这道题上踩的坑也挺多的,因为注释分为两种,一种是单行注释,另一种是多行注释。单行注释很简单,就是一个//后面加上内容就可以了;而多行注释是/* */,内容在星号之间,可以进行换行处理,如果进行了换行注释,那么要将该注释分离出去就存在了一定难度,刚开始并没有考虑到存在多行注释的问题。再一个踩坑的点就是多行注释可以写在代码的前头,不会将后面的代码内容变成注释,最初并没有考虑到这种情况,而节点9这个点就是用于测试这种极端情况的。

修改前:

 修改后:

 从这道题中,我了解了基本的Set和Map的用法,对容器和key也有了基本的了解,同时也知道了注释有多少种情况,这对我帮助很大,也为日后我写注释该如何更加简练打下了基础。

三、采坑心得

(在小结中已经很详细了,这里只写个大概或者进行适当补充。)

课程成绩统计程序系列题目:

1、了解到了计算机浮点数的运算并不精确,存在一定的误差,在日后需要特别注意,同时这也让我对计算机为什么无法精确计算浮点数产生了一些兴趣;

2、double类型和float类型浮点数精度不同,在复杂运算中的结果有误差不相同,需要注意;

3、自定义类变量的交换,只会交换指向地址,所以不能采用一个中间变量进行交换,可以使用ArrayList中的方法swap()进行交换;

4、审题一定要仔细仔细再仔细!!!!不能遗漏任何关键信息,任何一个字都是有价值的;

5、对系统性设计程序有了更加清楚的认识;

6、对于过长的类名,可以定义一个相对应的类的变量temp,然后将该过长的类名的变量的地址赋给temp,实现引用(类似于指针),可以减少代码的长度,增强代码可读性;

数据结构相关题目:

1、HashMap中的元素是不能直接输出的且可能与输入的顺序不同没有重复数据;

2、正则表达式中有许多表达式长相类似,不太熟悉可以通过写一段小程序不断试错;

3、对于测试程序的正确性,需要考虑各种各样的情况,正常情况、边缘数据测试、非法数据测试、极端数据测试等,通过了这些测试后发现代码依旧存在问题说明需要修正;

 

四、改进建议:

1、代码长度要更加简练,可以将重复的部分设置一个方法实现其功能。在课程成绩统计程序题目中设计的代码长度过长,有好几次出现了代码长度超出限制的提示,将代码注释几乎删除后才能提交;

2、定义的类可以更加简练一点。一定不能太复杂,因为名字太长会造成代码可读性大大降低,在此次程序设计中就吃了这个亏;

3、可以提前适当做好功课准备。例如在这次的Set和Map的题目中就花了大量时间,就一道简单的题花了有三四个小时,效率有点低了;

4、还是那句老话,不能太焦急,而是应该仔细仔细再仔细去看清题目中的每一个要求,审清题目了,才能好好设计代码;

五、总结

首先还是关于自己:

1、要仔细;

2、对于不了解的知识点需要提前做好功课准备;

3、一定要善于利用网络资源和程序设计课本寻找可能有用的Java等语言存在的方法和思想;

4、一定要相信自己,这是最重要的。在第三阶段的学习中,我不再像第二阶段遇到难题就退缩而是选择了迎难而上,最后发现自己是可以的,只是看上去难,但当自己真正花了时间之后,才会发现自己之前认为摆在面前的大山不是大山,而是一座能跨越的小山峰而已。万事开头难,只有鼓足勇气走下去,相信自己,终将会成功;

接着是教学方面:

1教学过程(PTA题目集驱动)PTA线上题目集的训练是非常好的,题目都有很高的质量,尤其是自己学校老师的自主命题,很有质量很有水平,能很好训练OOP的设计思想。但还是特别建议老师能够在一次题目集结束后放出相应的测试节点的输入和输出,这样才能好针对性地发现自己的问题所在,能更好地学习OOP。老师可能会觉得在日后的工作中都是未知的,没有什么标准答案,但是我认为我们在本科阶段的专业性知识还尚不成熟,还是需要不断地试错,这样就更需要针对性地更正,所以我还是特别希望老师能够放出测试节点的;

2、线下的教学情况,也只有课堂了,课堂这方面,我个人认为还是做的很到位的,边讲边练这种教学方法,我觉得很科学,我认为可以改进的是要更加注重“练”,应该少讲多练,实践才能出真理,磨炼硬实力;

3、线上的教学,就是PTA和学习通网课了,PTA在第一点已经阐述了,这里说一下网课的情况。我觉得网课可以不需要或者是出更加一点针对PTA题目知识点的网课,而不是那种太宽泛包括了大部分Java知识点的,就我本人和我身边的人而言,都是那种遇到了什么困难,才会去学习相应的能解决该困难的知识点,而不是提前做好所有的功课,就我本人而言为什么要这么做是因为人的记忆力是有限的,就算是学了,但是日后也很难想起来,只能在遇到困难的时候找相应的知识点学习;

 

 

六、对本门课程的评价以及改进建议

1、课程的教学理念(OBE):个人认为教学理念是很好的。课程的教学理念是让我们学会OOP的思想,而不是只会敲代码,面向过程编程。因此在教学这块对于Java语法的讲解还是比较少的,虽然刚开始在面对OOP训练集01时十分困难,在PTA上都是各种非零返回和编译错误,但是在自己稍微自学了一点Java语法后,还是没有太大问题的,因为学会了思想,就知道该用什么设计和方法,在本学期三个阶段的PTA训练中,我也明显能感受到自己编程能力的提升和OOP思想的构成,因此我认为教学理念可以一直延续下去;

2、教学方法(边讲边练)教学组织(线上线下混合式教学)教学过程(PTA题目集驱动)在总结的1、2、3点中都有提到并用橘黄色背景标记出关键词,这里便不再赘述;

3、教学模式(BOPPPS):这种教学模式我认为大体是很好、正确的,只有小部分我个人认为不好的地方需要注意,这里在上述都有提到,这里也不多赘述。总之,我个人是比较喜欢这种教学模式的,虽然又苦又难,但在吃下了这些苦和抗过了这些难后,才知道自己原来是可以的,能让自己提升那么大,所以我还是很认可这种教学模式的;