YK的第三次BLOG作业

发布时间 2023-06-28 11:20:23作者: 泰尼号坦克

一、前言

第六次PTA作业:难度较大,只有一道题,需要综合运用Java的各种技巧

第七次PTA作业:除课程设计外,难度适中,需要综合运用Java的各种技巧

第八次PTA作业:除课程设计外,难度适中,需要综合运用Java的各种技巧

 

 

二、设计与分析

 第六次PTA作业:

1、设计分析:

题目描述了一个高校课程成绩管理系统。要求输入课程信息和学生的成绩信息,并根据给定的规则计算学生的总成绩平均分、单门课程成绩平均分和班级所有课程总成绩平均分。此外,还要求处理一些异常情况,如课程名称不存在、成绩数量和考核方式不匹配等。

为了实现这个题目,可以先定义一些数据结构来存储输入的信息。可以定义一个课程类,包含课程名称、课程性质和考核方式等属性。定义一个学生类,包含学号、姓名和成绩等属性。

解析输入的信息并将其存储到相应的数据结构中。使用字符串分割函数来分割输入的字符串,并根据输入格式将其转换为相应的数据类型。

根据给定的规则计算学生的总成绩平均分、单门课程成绩平均分和班级所有课程总成绩平均分。使用循环遍历学生列表和课程列表,并根据给定的公式计算相应的平均分。

按照题目要求输出结果。我们可以使用字符串格式化函数来格式化输出结果,并按照题目要求排序输出。

还需要注意处理异常情况,如课程名称不存在、成绩数量和考核方式不匹配等。可以使用条件语句来判断是否出现异常情况,并按照题目要求输出相应的错误信息。

  1 import java.text.Collator;
  2 import java.util.*;
  3 
  4 
  5 public class Main {
  6     public static void main(String[] args) {
  7         Scanner s = new Scanner(System.in);
  8         ParseInput handle = new ParseInput();
  9         String s_record;
 10         while (!(s_record = s.nextLine()).equals("end")) {
 11             handle.parseInput(s_record);
 12         }
 13         handle.MySort();
 14         handle.studentScore();
 15         handle.CourseScore();
 16         handle.ClassScore();
 17     }
 18 }
 19 class ParseInput{
 20     private ArrayList<SelectCourse> selectCourses = new ArrayList<>();
 21     private ArrayList<Course> courses = new ArrayList<>();
 22     private ArrayList<Student> students = new ArrayList<>();
 23     private ArrayList<String> Class = new ArrayList<>();
 24     public void parseInput(String input) {
 25         String[] inputs = input.split(" ");
 26         int inputType = InputMatching.matchingInput(input);
 27         if (inputType == 1) {
 28             if (checkCourse(inputs[0]) == null) {
 29                 if (inputs[1].equals("必修") && (!inputs[2].equals("考试"))) {
 30                     System.out.println(inputs[0] + " : course type & access mode mismatch");
 31                 } else {
 32                     courses.add(new Course(inputs[0], inputs[1], inputs[2]));
 33                 }
 34             }
 35         } else if (inputType == 2) {
 36             Student newStudent = new Student(inputs[0], inputs[1]);
 37             if (!checkStudent(newStudent.getNum())) students.add(newStudent);
 38             if (!checkClass(inputs[0].substring(0, 6))) Class.add(inputs[0].substring(0, 6));
 39             if (checkSelect(inputs[0], inputs[2])) return;
 40             Course findcourse = checkCourse(inputs[2]);
 41             if (findcourse == null) {
 42                 System.out.println(inputs[2] + " does not exist");
 43                 return;
 44             } else if ((findcourse.getMethod().equals("考试") && inputs.length != 5)
 45                     || (findcourse.getMethod().equals("考察") && inputs.length != 4)) {
 46                 System.out.println(inputs[0] + ' ' + inputs[1] + " : access mode mismatch");
 47             } else {
 48                 SelectCourse newSelectCourse = new SelectCourse();
 49                 newSelectCourse.setCourse(findcourse);
 50                 Grade grade;
 51                 if (findcourse.getMethod().equals("考试")) {
 52                     ExamGrade examGrade = new ExamGrade();
 53                     examGrade.setUsualGrade(Integer.parseInt(inputs[3]));
 54                     examGrade.setFinalGrade(Integer.parseInt(inputs[4]));
 55                     grade = examGrade;
 56                 } else {
 57                     NoExamGrade noExamGrade = new NoExamGrade();
 58                     noExamGrade.setFinalGrade(Integer.parseInt(inputs[3]));
 59                     grade = noExamGrade;
 60                 }
 61                 newSelectCourse.setGrade(grade);
 62                 newSelectCourse.setStudent(newStudent);
 63                 selectCourses.add(newSelectCourse);
 64             }
 65         } else {
 66             System.out.println("wrong format");
 67         }
 68     }
 69     private Course checkCourse(String courseName) {
 70         for (Course course : courses) {
 71             if (course.getName().equals(courseName)) return course;
 72         }
 73         return null;
 74     }
 75 
 76     private boolean checkStudent(String num) {
 77         for (Student student : students) {
 78             if (student.getNum().equals(num)) return true;
 79         }
 80         return false;
 81     }
 82 
 83     private boolean checkClass(String classnum) {
 84         for (String cname : Class) {
 85             if (cname.equals(classnum)) return true;
 86         }
 87         return false;
 88     }
 89 
 90     private boolean checkSelect(String stunum, String cname) {
 91         for (SelectCourse selectCourse : selectCourses) {
 92             if (selectCourse.getStudent().getNum().equals(stunum)
 93                     && selectCourse.getCourse().getName().equals(cname)) return true;
 94         }
 95         return false;
 96     }
 97 
 98     public void ShowSave() {
 99         for (Student student : students) System.out.println(student);
100         System.out.println("---------");
101         for (Course course : courses) System.out.println(course);
102         System.out.println("---------");
103         for (SelectCourse selectCourse : selectCourses) System.out.println(selectCourse);
104     }
105 
106 
107     public void studentScore() {
108         for (Student student : students) {
109             double sum = 0;
110             int count = 0;
111             for (SelectCourse selectCourse : selectCourses) {
112                 if (selectCourse.getStudent().getNum().equals(student.getNum())) {
113                     sum += selectCourse.getGrade().getTotalGrade();
114                     count++;
115                 }
116             }
117             if (count == 0) System.out.println(student.getNum() + ' ' + student.getName() + " did not take any exams");
118             else System.out.println(student.getNum() + ' ' + student.getName() + ' ' + (int) (sum / count));
119         }
120     }
121 
122     public void CourseScore() {
123         for (Course course : courses) {
124             double sumUsualScore = 0;
125             double sumFinalScore = 0;
126             double sumTotalScore = 0;
127             int count = 0;
128             for (SelectCourse selectCourse : selectCourses) {
129                 if (selectCourse.getCourse().getName().equals(course.getName())) {
130                     count++;
131                     sumTotalScore += selectCourse.getGrade().getTotalGrade();
132                     sumFinalScore += selectCourse.getGrade().getFinalGrade();
133                     if (selectCourse.getCourse().getMethod().equals("考试")) {
134                         sumUsualScore += selectCourse.getGrade().getUsualGrade();
135                     }
136                 }
137             }
138             if (count == 0) System.out.println(course.getName() + " has no grades yet");
139             else if (course.getMethod().equals("考试"))
140                 System.out.println(course.getName() + ' ' + (int) (sumUsualScore / count) + ' ' + (int) (sumFinalScore / count) + ' ' + (int) (sumTotalScore / count));
141             else if (course.getMethod().equals("考察"))
142                 System.out.println(course.getName() + ' ' + (int) (sumFinalScore / count) + ' ' + (int) (sumTotalScore / count));
143         }
144     }
145 
146     public void ClassScore() {
147         for (String classnum : Class) {
148             double sum = 0;
149             int count = 0;
150             for (SelectCourse selectCourse : selectCourses) {
151                 if (selectCourse.getStudent().getNum().substring(0, 6).equals(classnum)) {
152                     sum += selectCourse.getGrade().getTotalGrade();
153                     count++;
154                 }
155             }
156             if (count == 0) System.out.println(classnum + " has no grades yet");
157             else System.out.println(classnum + ' ' + (int) (sum / count));
158         }
159     }
160 
161     public void MySort() {
162         students.sort(Comparator.comparing(Student::getNum));
163         Collator instance = Collator.getInstance(Locale.CHINA);
164         courses.sort((x, y) -> instance.compare(x.getName(), y.getName()));
165         Collections.sort(Class);
166     }
167 
168 }
169 
170 
171 abstract class Grade {
172     double totalGrade;
173 
174     public double getTotalGrade() {
175         return totalGrade;
176     }
177 
178     public void setTotalGrade(int totalGrade) {
179         this.totalGrade = totalGrade;
180     }
181 
182     public int getUsualGrade() {
183         return 0;
184     }
185 
186     public int getFinalGrade() {
187         return 0;
188     }
189 }
190 
191 class ExamGrade extends Grade {
192     int usualGrade;
193     int finalGrade;
194 
195     public double getTotalGrade() {
196         return (0.3 * this.getUsualGrade() + 0.7 * this.getFinalGrade());
197     }
198 
199     public int getUsualGrade() {
200         return usualGrade;
201     }
202 
203     public void setUsualGrade(int usualGrade) {
204         this.usualGrade = usualGrade;
205     }
206 
207     public int getFinalGrade() {
208         return finalGrade;
209     }
210 
211     public void setFinalGrade(int finalGrade) {
212         this.finalGrade = finalGrade;
213     }
214 }
215 
216 class NoExamGrade extends Grade {
217     private int finalGrade;
218 
219     public double getTotalGrade() {
220         return finalGrade;
221     }
222 
223     public int getFinalGrade() {
224         return finalGrade;
225     }
226 
227     public void setFinalGrade(int finalGrade) {
228         this.finalGrade = finalGrade;
229     }
230 }
231 
232 class Course {
233     private String name;
234     private String kind; // 课程种类
235     private String method; // 考核方式
236 
237     public Course(String name, String kind, String method) {
238         this.name = name;
239         this.kind = kind;
240         this.method = method;
241     }
242 
243     public String getName() {
244         return name;
245     }
246 
247     public void setName(String name) {
248         this.name = name;
249     }
250 
251     public String getKind() {
252         return kind;
253     }
254 
255     public void setKind(String kind) {
256         this.kind = kind;
257     }
258 
259     public String getMethod() {
260         return method;
261     }
262 
263     public void setMethod(String method) {
264         this.method = method;
265     }
266 }
267 
268 
269 class Student {
270     private String num;
271     private String name;
272 
273     public Student(String num, String name) {
274         this.num = num;
275         this.name = name;
276     }
277 
278     public String getNum() {
279         return num;
280     }
281 
282     public void setNum(String num) {
283         this.num = num;
284     }
285 
286     public String getName() {
287         return name;
288     }
289 
290     public void setName(String name) {
291         this.name = name;
292     }
293 }
294 
295 class SelectCourse {
296     private Course course;
297     private Student student;
298     private Grade grade;
299 
300     public Course getCourse() {
301         return course;
302     }
303 
304     public void setCourse(Course course) {
305         this.course = course;
306     }
307 
308     public Student getStudent() {
309         return student;
310     }
311 
312     public void setStudent(Student student) {
313         this.student = student;
314     }
315 
316     public Grade getGrade() {
317         return grade;
318     }
319 
320     public void setGrade(Grade grade) {
321         this.grade = grade;
322     }
323 }
324 
325 
326 
327 class InputMatching {
328     private static final String STU_NUM_MATCHING = "[0-9]{8}"; // 8个0-9的数字
329     private static final String STU_NAME_MATCHING = "\\S{1,10}"; // 1到10个非空格(TAB)字符
330     private static final String SCORE_MATCHING = "(\\d|[1-9]\\d|100)";
331     private static final String COURSE_NAME_MATCHING = "\\S{1,10}"; // 1到10个非空格(TAB)字符
332     private static final String COURSE_TYPE_MATCHING = "(选修|必修)";
333     private static final String CHECK_COURSE_TYPE_MATCHING = "(考试|考察)";
334     // cousrInput用于定义课程信息模式(正则表达式)
335     private static final String COURSE_INPUT = COURSE_NAME_MATCHING + " " + COURSE_TYPE_MATCHING + " " + CHECK_COURSE_TYPE_MATCHING;
336     // scoreInput用于定义成绩信息模式(正则表达式)
337     private static final String SCORE_INPUT = STU_NUM_MATCHING + " " + STU_NAME_MATCHING + " " + COURSE_NAME_MATCHING + " " +
338             SCORE_MATCHING + "(\\s" + SCORE_MATCHING + ")?";
339 
340     public static int matchingInput(String s) {
341         if (matchingCourse(s)) {
342             return 1;
343         }
344         if (matchingScore(s)) {
345             return 2;
346         }
347         return 0;
348     }
349 
350     private static boolean matchingCourse(String s) {
351         return s.matches(COURSE_INPUT);
352     }
353 
354     private static boolean matchingScore(String s) {
355         return s.matches(SCORE_INPUT);
356     }
357 }

 

 2、源码分析:

包含两个类:MainParseInputMain类中有一个main方法,它是程序的入口点。在这个方法中,首先创建了一个Scanner对象s来读取用户输入,然后创建了一个ParseInput对象handle来处理输入。接下来,程序进入一个循环,每次循环都会读取一行输入并将其传递给handle.parseInput()方法进行处理,直到用户输入"end"为止。最后,调用了几个方法来对数据进行排序和输出。

ParseInput类中,定义了四个私有成员变量:selectCoursescoursesstudents, 和 Class。这些变量分别表示选课信息、课程信息、学生信息和班级信息。在这个类中还定义了一个公共方法parseInput(),它接受一个字符串作为参数,并根据输入的内容进行相应的处理。

在这个方法中,首先将输入字符串按空格分割成字符串数组,并使用InputMatching.matchingInput()方法来确定输入类型。如果输入类型为1,则表示输入的是课程信息;如果输入类型为2,则表示输入的是选课信息;否则输出"wrong format"。

对于课程信息,首先检查课程是否已经存在,如果不存在,则根据输入的信息创建一个新的课程对象并添加到课程列表中。对于选课信息,首先检查学生是否已经存在,如果不存在,则创建一个新的学生对象并添加到学生列表中。然后检查班级是否已经存在,如果不存在,则添加到班级列表中。接下来检查选课信息是否已经存在,如果不存在,则根据输入的信息创建一个新的选课对象并添加到选课列表中。

这段代码还包含一些其他的私有方法,用于检查课程、学生和选课信息是否已经存在。

类图:

 

第七次PTA作业:

1、设计分析:

题目要求输入课程信息和学生成绩信息,然后根据给定的规则计算并输出学生的总成绩平均分、单门课程成绩平均分、班级所有课程总成绩平均分。题目还给出了一些异常情况的处理方法。

为了实现这道题目,可以定义几个类来存储和处理数据。可以定义一个Course类来存储课程信息,包括课程名称、课程性质和考核方式。可以定义一个Student类来存储学生信息,包括学号、姓名和成绩信息。成绩信息可以用一个Map来存储,其中键为课程名称,值为成绩。

在读取输入数据时,需要根据输入格式解析数据并将其存储到相应的类中。在读取课程信息时,需要检查课程性质和考核方式是否匹配,并处理异常情况。在读取成绩信息时,需要检查课程名称是否存在,并处理异常情况。

在计算学生的总成绩平均分时,需要遍历每个学生的成绩信息,并根据题目中给定的规则计算每门课程的总成绩。然后将所有课程的总成绩累加起来,除以课程数量得到学生的总成绩平均分。

在计算单门课程成绩平均分时,需要遍历所有学生的成绩信息,并根据题目中给定的规则计算每个学生的单门课程成绩。然后将所有学生的单门课程成绩累加起来,除以学生数量得到单门课程成绩平均分。

在计算班级所有课程总成绩平均分时,需要遍历所有学生的成绩信息,并根据题目中给定的规则计算每个学生的总成绩。然后将所有学生的总成绩累加起来,除以学生数量得到班级所有课程总成绩平均分。

最后,在输出结果时,需要按照题目中给定的格式输出结果,并处理异常情况。

  1 import java.text.Collator;
  2 import java.util.ArrayList;
  3 import java.util.Collections;
  4 import java.util.Comparator;
  5 import java.util.Scanner;
  6 public class main {
  7     static boolean isNumber(String str) {
  8         return str.matches("\\d+");
  9     }
 10 
 11     public static void main(String[] args) {
 12         Scanner input=new Scanner(System.in);
 13         String str="";
 14         studentList students=new studentList();
 15         InputMatching matching=new InputMatching();
 16         chooseCourseList choose=new chooseCourseList();
 17         Cls cls=new Cls();
 18         courseList course=new courseList();
 19         String str1,str2,str3;
 20         while (true) {
 21             String inputLine = input.nextLine();
 22             if (inputLine.equals("end")) {
 23                 break;
 24             }
 25             String[] inputParts = inputLine.split(" ");
 26             String studentNumber = inputParts[0];
 27             String studentName = inputParts[1];
 28             String subject = inputParts[2];
 29             int grade = Integer.parseInt(inputParts[3]);
 30             if (InputMatching.matchingInput(studentNumber + " " + studentName + " " + subject + " " + grade) != 2 && InputMatching.matchingInput(studentNumber + " " + studentName + " " + subject + " " + grade) != 3 && course.searchQuality(subject) != 2) {
 31                 System.out.println("wrong format");
 32                 continue;
 33             }
 34             if (grade < 4 || grade > 9 && inputParts.length > 5) {
 35                 System.out.println("wrong format");
 36                 continue;
 37             }
 38             String classId = studentNumber.substring(0, 6);
 39             if (!cls.searchCls(classId)) {
 40                 cls.cls.add(cls.addCls(classId));
 41             }
 42             students.stu.add(students.addStudent(studentNumber, studentName));
 43         }
 44 
 45         String number,name,subject;
 46         int UsualGrades,FinalGrades;
 47         boolean flag=false;
 48         while (!str.equals("end")) {
 49             if (flag) {
 50                 str = input.nextLine();
 51             }
 52             flag = true;
 53             if (str.equals("end")) {
 54                 break;
 55             }
 56             String ssr = str.split(" ")[0] + " " + str.split(" ")[1] + " " + str.split(" ")[2] + " " + str.split(" ")[3];
 57             if (InputMatching.matchingInput(ssr) != 2 && InputMatching.matchingInput(ssr) != 3 && course.searchQuality(str.split(" ")[2]) != 2) {
 58                 System.out.println("wrong format");
 59                 continue;
 60             }
 61             if (((Integer.parseInt(str.split(" ")[3])) < 4 || (Integer.parseInt(str.split(" ")[3])) > 9) && str.split(" ").length > 5) {
 62                 System.out.println("wrong format");
 63                 continue;
 64             }
 65             number = str.split(" ")[0];
 66             String Class = number.substring(0, 6);
 67             if (!cls.searchCls(Class)) {
 68                 cls.cls.add(cls.addCls(Class));
 69             }
 70             name = str.split(" ")[1];
 71             students.stu.add(students.addStudent(number, name));
 72             subject = str.split(" ")[2];
 73             try {
 74                 if (course.searchQuality(subject) == 1) {
 75                     UsualGrades = Integer.parseInt(str.split(" ")[3]);
 76                     if (choose.searchCourse(subject) && choose.searchId(number)) {
 77                         continue;
 78                     }
 79                     FinalGrades = Integer.parseInt(str.split(" ")[4]);
 80                     students.students.add(students.addStudentCompulsory(number, name, subject, UsualGrades, FinalGrades));
 81                 } else if (course.searchQuality(subject) == 0) {
 82                     UsualGrades = Integer.parseInt(str.split(" ")[3]);
 83                     if (choose.searchCourse(subject) && choose.searchId(number)) {
 84                         continue;
 85                     }
 86                     if (str.split(" ").length > 4) {
 87                         System.out.println(number + " " + name + " : access mode mismatch");
 88                         continue;
 89                     }
 90                     students.students.add(students.addStudentTake(number, name, subject, UsualGrades));
 91                 } else if (course.searchQuality(subject) == -1) {
 92                     System.out.println(subject + " does not exist");
 93                 } else if (course.searchQuality(subject) == 2) {
 94                     int testNumber = Integer.parseInt(str.split(" ")[3]);
 95                     if (str.split(" ").length - 4 != testNumber) {
 96                         System.out.println(number + " " + name + " : access mode mismatch");
 97                         continue;
 98                     }
 99                     int sum = 0;
100                     for (int i = 0; i < testNumber; i++) {
101                         sum += Integer.parseInt(str.split(" ")[4 + i]);
102                     }
103                     sum /= testNumber;
104                     students.students.add(students.addExperimentalGrades(number, name, subject, sum));
105                 }
106             } catch (ArrayIndexOutOfBoundsException e) {
107                 System.out.println(number + " " + name + " : access mode mismatch");
108             }
109         }
110 
111         chooseCourseList chooses=new chooseCourseList();
112         chooses.getAverageGrade(students,course,cls);
113     }
114 }
115 
116 
117 
118 class student {
119     int experimentalGrades;
120     String number;
121     String name;
122     String course;
123     int UsualGrades = 0;
124     int FinalGrades = 0;
125     String Class;
126     int grade = 0;
127 
128     public static Comparator<student> getNumberComparator() {
129         return new Comparator<student>() {
130             @Override
131             public int compare(student s1, student s2) {
132                 return s1.number.compareTo(s2.number);
133             }
134         };
135     }
136 }
137 
138 class course {
139     String name;
140     String quality;
141     String manner;
142 
143     public static Comparator<course> getChineseNameComparator() {
144         final Collator collator = Collator.getInstance(java.util.Locale.CHINA);
145         return (c1, c2) -> collator.compare(c1.name, c2.name);
146     }
147 }
148 
149 class courseList {
150     ArrayList<course> courses = new ArrayList<>();
151 
152     boolean searchCourse(String courseName) {
153         return courses.stream().anyMatch(c -> c.name.equals(courseName));
154     }
155 
156     course addCourse(String name, String quality, String manner) {
157         course newCourse = new course();
158         newCourse.name = name;
159         newCourse.quality = quality;
160         newCourse.manner = manner;
161         return newCourse;
162     }
163 
164     int searchQuality(String subject) {
165         for (course c : courses) {
166             if (c.name.equals(subject)) {
167                 if (c.quality.equals("必修") || c.manner.equals("考试")) {
168                     return 1;
169                 } else if (c.quality.equals("实验") || c.manner.equals("实验")) {
170                     return 2;
171                 } else {
172                     return 0;
173                 }
174             }
175         }
176         return -1;
177     }
178 }
179 
180 class studentList  {
181     ArrayList<student> students = new ArrayList<>();
182     ArrayList<student> stu = new ArrayList<>();
183 
184     student addStudentCompulsory(String studentNumber, String studentName, String courseName, int usualGrades, int finalGrades) {
185         student newStudent = new student();
186         chooseCourseList newChoose = new chooseCourseList();
187         newStudent.name = studentName;
188         if (chooseCourseList.searchCourse(courseName) && chooseCourseList.chooseCourse.get(chooseCourseList.searchCourseInt(courseName)).name.equals(studentName) && chooseCourseList.chooseCourse.get(chooseCourseList.searchCourseInt(courseName)).number.equals(studentNumber)) {
189             return null;
190         }
191         Cls newCls = new Cls();
192         newStudent.number = studentNumber;
193         newStudent.course = courseName;
194         newStudent.grade = (int) (finalGrades * 0.7 + usualGrades * 0.3);
195         String classId = studentNumber.substring(0, 6);
196         if (!newCls.searchCls(classId)) {
197             newCls.cls.add(newCls.addCls(classId));
198         }
199         chooseCourseList.chooseCourse.add(newChoose.addChoose(studentNumber, studentName, courseName, classId, usualGrades, finalGrades, newStudent.grade));
200         return newStudent;
201     }
202 
203     student addStudentTake(String studentNumber, String studentName, String courseName, int usualGrades) {
204         student newStudent = new student();
205         newStudent.name = studentName;
206         newStudent.number = studentNumber;
207         newStudent.course = courseName;
208         newStudent.grade = usualGrades;
209         String classId = studentNumber.substring(0, 6);
210         chooseCourseList newChoose = new chooseCourseList();
211         if (chooseCourseList.searchCourse(courseName) && chooseCourseList.chooseCourse.get(chooseCourseList.searchCourseInt(courseName)).name.equals(studentName) && chooseCourseList.chooseCourse.get(chooseCourseList.searchCourseInt(courseName)).number.equals(studentNumber)) {
212             return null;
213         }
214         chooseCourseList.chooseCourse.add(newChoose.addChooseTake(studentNumber, studentName, courseName, classId, usualGrades, newStudent.grade));
215         return newStudent;
216     }
217 
218     student addExperimentalGrades(String studentNumber, String studentName, String courseName, int experimentalGrades) {
219         student newStudent = new student();
220         newStudent.name = studentName;
221         newStudent.number = studentNumber;
222         newStudent.course = courseName;
223         newStudent.experimentalGrades = experimentalGrades;
224         newStudent.grade = experimentalGrades;
225         String classId = studentNumber.substring(0, 6);
226         chooseCourseList newChoose = new chooseCourseList();
227         if (chooseCourseList.searchCourse(courseName) && chooseCourseList.chooseCourse.get(chooseCourseList.searchCourseInt(courseName)).name.equals(studentName) && chooseCourseList.chooseCourse.get(chooseCourseList.searchCourseInt(courseName)).number.equals(studentNumber)) {
228             return null;
229         }
230         chooseCourseList.chooseCourse.add(newChoose.addChooseExperimental(studentNumber, studentName, courseName, classId, experimentalGrades,newStudent.grade));
231         return newStudent;
232     }
233 
234     student addStudent(String studentNumber, String studentName) {
235         student newStudent = new student();
236         newStudent.number = studentNumber;
237         newStudent.name = studentName;
238         return newStudent;
239     }
240 
241     boolean searchStudent(String studentName) {
242         for (student s : students) {
243             if (s.name.equals(studentName)) {
244                 return true;
245             }
246         }
247         return false;
248     }
249 
250 
251 
252 }
253 
254 
255 class Cls {
256     private static int nextIndex = 0;
257     String id;
258     private int index;
259 
260     ArrayList<Cls> cls = new ArrayList<>();
261 
262     public Cls addCls(String classId) {
263         Cls newCls = new Cls();
264         newCls.id = classId;
265         newCls.index = nextIndex++;
266         cls.add(newCls);
267         return newCls;
268     }
269 
270     public boolean searchCls(String classId) {
271         for (int i = 0; i < cls.size(); i++) {
272             if (cls.get(i).id.equals(classId)) {
273                 return true;
274             }
275         }
276         return false;
277     }
278 
279     public static Comparator<Cls> getIndexComparator() {
280         return new Comparator<Cls>() {
281             @Override
282             public int compare(Cls c1, Cls c2) {
283                 return c1.id.compareTo(c2.id);
284             }
285         };
286     }
287 }
288 
289 
290 class InputMatching {
291     static String studentNumberPattern = "[0-9]{8}";
292     static String studentNamePattern = "\\S{1,10}";
293     static String scorePattern = "([1-9]?[0-9]|100)";
294     static String courseNamePattern = "\\S{1,10}";
295     static String courseTypePattern = "(选修|必修|实验)";
296     static String checkCourseTypePattern = "(考试|考察|实验)";
297 
298     static String courseInputPattern = courseNamePattern + " " + courseTypePattern + " " + checkCourseTypePattern;
299     static String scoreInputPattern1 = studentNumberPattern + " " + studentNamePattern + " " + courseNamePattern + " " +
300             scorePattern + "(scoreMatching)?";
301     static String scoreInputPattern2 = studentNumberPattern + " " + studentNamePattern + " " + courseNamePattern + " " +
302             scorePattern + "(scoreMatching)?"+" "+scorePattern + "(scoreMatching)?";
303 
304     public static int matchingInput(String input) {
305         if (matchingCourse(input)) {
306             return 1;
307         }
308         if (matchingScore1(input)) {
309             return 2;
310         }
311         if (matchingScore2(input)) {
312             return 3;
313         }
314         return 0;
315     }
316 
317     static boolean matchingCourse(String input) {
318         return input.matches(courseInputPattern);
319     }
320 
321     static boolean matchingScore1(String input) {
322         return input.matches(scoreInputPattern1);
323     }
324 
325     static boolean matchingScore2(String input) {
326         return input.matches(scoreInputPattern2);
327     }
328 }
329 
330 class chooseCourseList{
331     static ArrayList<student> chooseCourse = new ArrayList<>();
332 
333     static boolean searchId(String studentNumber) {
334         for (student s : chooseCourse) {
335             if (s.number.equals(studentNumber)) {
336                 return true;
337             }
338         }
339         return false;
340     }
341 
342     static boolean searchCourse(String courseName) {
343         for (int i = 0; i < chooseCourse.size(); i++) {
344             if (chooseCourse.get(i).course.equals(courseName)) {
345                 return true;
346             }
347         }
348         return false;
349     }
350 
351     static int searchCourseInt(String courseName) {
352         for (int i = 0; i < chooseCourse.size(); i++) {
353             if (chooseCourse.get(i).course.equals(courseName)) {
354                 return i;
355             }
356         }
357         return -1;
358     }
359 
360     static boolean searchClass(String classId) {
361         for (int i = 0; i < chooseCourse.size(); i++) {
362             if (chooseCourse.get(i).Class.equals(classId)) {
363                 return true;
364             }
365         }
366         return false;
367     }
368 
369     student addChoose(String studentNumber, String studentName, String courseName, String classId, int usualGrades, int finalGrades, int grade) {
370         student newStudent = new student();
371         newStudent.Class = classId;
372         newStudent.number = studentNumber;
373         newStudent.name = studentName;
374         newStudent.course = courseName;
375         newStudent.UsualGrades = usualGrades;
376         newStudent.FinalGrades = finalGrades;
377         newStudent.grade = grade;
378         return newStudent;
379     }
380 
381     student addChooseTake(String id,String name,String course,String Class,int UsualGrades,int grade )
382     {
383         student newStudent=new student();
384         newStudent.Class=Class;
385         newStudent.number=id;
386         newStudent.name=name;
387         newStudent.course=course;
388         newStudent.UsualGrades=UsualGrades;
389         newStudent.grade=grade;
390         return newStudent;
391     }
392     student addChooseExperimental(String studentNumber, String studentName, String courseName, String classId, int experimentalGrades, int grade) {
393         student newStudent = new student();
394         newStudent.Class = classId;
395         newStudent.number = studentNumber;
396         newStudent.name = studentName;
397         newStudent.course = courseName;
398         newStudent.experimentalGrades = experimentalGrades;
399         newStudent.grade = experimentalGrades;
400         return newStudent;
401     }
402 
403     public int getAverageGrades(String studentNumber) {
404         int sum = 0, count = 0;
405         for (int i = 0; i < chooseCourse.size(); i++) {
406             if (chooseCourse.get(i).number.equals(studentNumber)) {
407                 sum += chooseCourse.get(i).grade;
408                 count++;
409             }
410         }
411         return sum / count;
412     }
413 
414     public int getAverageCourseUsualGrades(String courseName) {
415         int sum = 0, count = 0;
416         for (int i = 0; i < chooseCourse.size(); i++) {
417             if (chooseCourse.get(i).course.equals(courseName)) {
418                 sum += chooseCourse.get(i).UsualGrades;
419                 count++;
420             }
421         }
422         return sum / count;
423     }
424 
425     public int getAverageCourseFinalGrades(String courseName) {
426         int sum = 0, count = 0;
427         for (int i = 0; i < chooseCourse.size(); i++) {
428             if (chooseCourse.get(i).course.equals(courseName)) {
429                 sum += chooseCourse.get(i).FinalGrades;
430                 count++;
431             }
432         }
433         return sum / count;
434     }
435 
436     public int getAverageCourseGrades(String courseName) {
437         int sum = 0, count = 0;
438         for (int i = 0; i < chooseCourse.size(); i++) {
439             if (chooseCourse.get(i).course.equals(courseName)) {
440                 sum += chooseCourse.get(i).grade;
441                 count++;
442             }
443         }
444         return sum / count;
445     }
446 
447     public int getAverageExperimentalGrades(String courseName) {
448         int sum = 0, count = 0;
449         for (int i = 0; i < chooseCourse.size(); i++) {
450             if (chooseCourse.get(i).course.equals(courseName)) {
451                 sum += chooseCourse.get(i).experimentalGrades;
452                 count++;
453             }
454         }
455         return sum / count;
456     }
457 
458     public int getClassAverageGrades(String classId) {
459         int sum = 0, count = 0;
460         for (int i = 0; i < chooseCourse.size(); i++) {
461             if (chooseCourse.get(i).Class.equals(classId)) {
462                 sum += chooseCourse.get(i).grade;
463                 count++;
464             }
465         }
466         return sum / count;
467     }
468 
469 
470     public void getAverageGrade(studentList students, courseList courses, Cls cls) {
471         Collections.sort(students.stu, student.getNumberComparator());
472         Collections.sort(cls.cls, Cls.getIndexComparator());
473         Collections.sort(courses.courses, course.getChineseNameComparator());
474 
475         for (int i = 0; i < students.stu.size(); i++) {
476             int flag = 0;
477             for (int j = 0; j < i; j++) {
478                 if (students.stu.get(j).number.equals(students.stu.get(i).number)) {
479                     flag = 1;
480                     break;
481                 }
482             }
483             if (flag == 1) {
484                 continue;
485             }
486             if (searchId(students.stu.get(i).number)) {
487                 System.out.println(students.stu.get(i).number + " " + students.stu.get(i).name + " " + getAverageGrades(students.stu.get(i).number));
488             } else {
489                 System.out.println(students.stu.get(i).number + " " + students.stu.get(i).name + " did not take any exams");
490             }
491         }
492 
493         for (int i = 0; i < courses.courses.size(); i++) {
494             if (searchCourse(courses.courses.get(i).name)) {
495                 if (courses.courses.get(i).manner.equals("考试")) {
496                     System.out.println(courses.courses.get(i).name + " " + getAverageCourseUsualGrades(courses.courses.get(i).name)
497                             + " " + getAverageCourseFinalGrades(courses.courses.get(i).name) + " " + getAverageCourseGrades(courses.courses.get(i).name));
498                 } else if (courses.courses.get(i).manner.equals("考察")) {
499                     System.out.println(courses.courses.get(i).name + " " + getAverageCourseUsualGrades(courses.courses.get(i).name)
500                             + " " + getAverageCourseGrades(courses.courses.get(i).name));
501                 } else {
502                     System.out.println(courses.courses.get(i).name + " " + getAverageExperimentalGrades(courses.courses.get(i).name));
503                 }
504             } else {
505                 System.out.println(courses.courses.get(i).name + " has no grades yet");
506             }
507         }
508 
509         for (int i = 0; i < cls.cls.size(); i++) {
510             int flag = 0;
511             for (int j = 0; j < i; j++) {
512                 if (cls.cls.get(j).equals(cls.cls.get(i))) {
513                     flag = 1;
514                     break;
515                 }
516             }
517             if (flag == 1) {
518                 continue;
519             }
520             if (searchClass(cls.cls.get(i).id)) {
521                 System.out.println(cls.cls.get(i).id + " " + getClassAverageGrades(cls.cls.get(i).id));
522             } else {
523                 System.out.println(cls.cls.get(i).id + " has no grades yet");
524             }
525         }
526     }
527 
528 }

 

2、源码分析:

主类 main,其中定义了一个静态方法 isNumber,用于检查一个字符串是否为数字。在 main 方法中,首先创建了一些对象,包括 Scanner 对象用于读取输入,studentList 对象用于管理学生列表,InputMatching 对象用于匹配输入,chooseCourseList 对象用于选择课程列表,Cls 对象用于管理班级,以及 courseList 对象用于管理课程列表。

接下来是一个循环,读取输入行并根据输入行的内容进行处理。如果输入行为 “end”,则退出循环。否则,将输入行分割成多个部分,并获取学生编号、学生姓名、科目和成绩。然后进行一些检查,如果输入格式不正确或者科目不合法,则输出 “wrong format” 并继续下一次循环。否则,获取班级编号并检查是否存在该班级,如果不存在,则添加该班级。最后将学生添加到学生列表中。

接下来是另一个循环,读取输入行并根据输入行的内容进行处理。如果输入行为 “end”,则退出循环。否则,进行一些检查,如果输入格式不正确或者科目不合法,则输出 “wrong format” 并继续下一次循环。然后获取学生编号、班级编号、学生姓名和科目,并检查是否存在该班级,如果不存在,则添加该班级。最后将学生添加到学生列表中。

类图:

 

第八次PTA作业:

1、设计分析:

这道题目要求修改类结构,将成绩类的继承关系改为组合关系。这意味着,成绩信息将由课程成绩类和分项成绩类组成。课程成绩类将组合分项成绩类,而分项成绩类由成绩分值和权重两个属性构成。

在完成课程成绩统计程序后,需要比较继承和组合关系的区别。继承是一种“是一个”的关系,即子类是父类的一种特殊形式。而组合是一种“有一个”的关系,即一个类包含另一个类的实例作为其属性。在这个例子中,组合关系更灵活,因为它允许我们更改分项成绩类而不影响课程成绩类。

要实现这个程序,首先需要定义课程成绩类和分项成绩类。然后,在课程成绩类中添加一个分项成绩类的实例作为其属性。接下来,需要根据题目要求实现相关的方法和逻辑,例如计算总成绩、输出结果等。

  1 import java.text.Collator;
  2 import java.util.*;
  3 import java.util.ArrayList;
  4 import java.util.stream.Collectors;
  5 
  6 public class Main {
  7     public static void main(String[] args) {
  8         Scanner s = new Scanner(System.in);
  9         ParseInput handle = new ParseInput();
 10         String s_record;
 11         while (!(s_record = s.nextLine()).equals("end")) {
 12             handle.parseInput(s_record); // 解析用户输入的每一行数据
 13         }
 14         handle.showStudents();
 15         handle.showCourses();
 16         handle.showClasses();
 17     }
 18 }
 19 
 20 class ParseInput{
 21     ArrayList<Student> listStudent=new ArrayList<>();
 22     ArrayList<Course> listCourse=new ArrayList<>();
 23     ArrayList<Class> listClass=new ArrayList<>();
 24     ArrayList<ChooseCourse> listChooseCourse=new ArrayList<>();
 25 
 26     public void parseInput(String str) {
 27         InputMatching mat = new InputMatching();
 28         int flag = mat.matchingInput(str);
 29         if (flag == 0) {
 30             System.out.println("wrong format");
 31         } else if (flag == 1) {
 32             courseMessage(str);
 33         } else if (flag == 2) {
 34             gradeMessage(str);
 35         }
 36     }
 37     public void courseMessage(String str) {
 38         String[] letters = str.split(" ");
 39         String courseName = letters[0]; // 课程名
 40         String type = letters[1]; // 课程类型
 41         String testType = letters[2]; // 课程考试类型
 42         int num = Integer.parseInt(letters[3]);
 43         if (letters.length - 4 != num) {
 44             System.out.println(courseName + " : number of scores does not match");
 45             return;
 46         }
 47         float totalPower = 0;
 48         for (int i = 4; i < letters.length; i++) {
 49             totalPower += Float.parseFloat(letters[i]);
 50         }
 51         if (totalPower != 1.0) {
 52             System.out.println(courseName + " : weight value error");
 53             return;
 54         }
 55         ArrayList<String> power = new ArrayList<>(Arrays.asList(letters).subList(4, letters.length));
 56         Course course = new Course(courseName, type, testType, power);
 57         if (checkCourse(course) && searchCourse(courseName) == null) {
 58             listCourse.add(course);
 59         }
 60     }
 61 
 62     public void gradeMessage(String str) {
 63         String[] letters = str.split(" ");
 64         String stuId = letters[0]; // 学生学号
 65         String classID = letters[0].substring(0, 6);
 66         String name = letters[1]; // 学生姓名
 67         String courseName = letters[2]; // 课程名字
 68 
 69         // 如果该班级第一次出现
 70         if (searchClass(classID) == null) {
 71             Class cla = new Class(classID);
 72             listClass.add(cla);
 73         }
 74 
 75         Student stu = new Student(classID, stuId, name);
 76         if (!searchStudent(stuId)) {
 77             listStudent.add(stu); // 将学生加入列表中
 78         }
 79 
 80         Course course = searchCourse(courseName);
 81         if (course == null) {
 82             System.out.println(courseName + " does not exist");
 83             return;
 84         }
 85 
 86         if (letters.length == 4 && course.testType.equals("考察")) {
 87             int finalGrade = Integer.parseInt(letters[3]);
 88             AssessGrade assessGrade = new AssessGrade(finalGrade);
 89             ChooseCourse chooseCourse = new ChooseCourse(course, stu, assessGrade);
 90             if (!searchChooseCourse(name, courseName)) {
 91                 listChooseCourse.add(chooseCourse);
 92             }
 93         } else if (letters.length == 5 && course.testType.equals("考试")) {
 94             int usualGrade = Integer.parseInt(letters[3]);
 95             int finalGrade = Integer.parseInt(letters[4]);
 96             ExamGrade examGrade = new ExamGrade(usualGrade, finalGrade, course.powers);
 97             ChooseCourse chooseCourse = new ChooseCourse(course, stu, examGrade);
 98             listChooseCourse.add(chooseCourse);
 99         } else if (letters.length > 5 && course.testType.equals("实验")) {
100             int exNum = course.powers.size();
101             if (exNum != letters.length - 3) {
102                 System.out.println(stuId + " " + name + " : access mode mismatch");
103                 return;
104             }
105             ArrayList<Integer> scores = new ArrayList<>();
106             for (int i = 3; i < letters.length; i++) {
107                 scores.add(Integer.parseInt(letters[i]));
108             }
109             ExperimentGrade experimentGrade = new ExperimentGrade(scores, course.powers);
110             ChooseCourse chooseCourse = new ChooseCourse(course, stu, experimentGrade);
111             listChooseCourse.add(chooseCourse);
112         } else {
113             System.out.println(stuId + " " + name + " : access mode mismatch");
114         }
115     }
116 
117 
118     public boolean checkCourse(Course course) {
119         String type = course.getType();
120         String testType = course.getTestType();
121         if (type.equals("必修") && testType.equals("考试")) {
122             return true;
123         } else if (type.equals("选修") && (testType.equals("考试") || testType.equals("考察"))) {
124             return true;
125         } else if (type.equals("实验") && testType.equals("实验")) {
126             return true;
127         } else {
128             System.out.println(course.getCourseName() + " : course type & access mode mismatch");
129             return false;
130         }
131     }
132 
133     public Class searchClass(String classId) {
134         return listClass.stream()
135                 .filter(cls -> cls.getClassId().equals(classId))
136                 .findFirst()
137                 .orElse(null);
138     }
139 
140     public Course searchCourse(String name) {
141         return listCourse.stream()
142                 .filter(course -> course.getCourseName().equals(name))
143                 .findFirst()
144                 .orElse(null);
145     }
146 
147     public boolean searchStudent(String id) {
148         return listStudent.stream()
149                 .anyMatch(stu -> stu.getId().equals(id));
150     }
151 
152     // 查找是否有重复选课成绩
153     public boolean searchChooseCourse(String stuName, String courseName) {
154         return listChooseCourse.stream()
155                 .anyMatch(cs -> cs.student.getStuName().equals(stuName) && cs.course.getCourseName().equals(courseName));
156     }
157 
158     public void showStudents() {
159         Collections.sort(listStudent);
160         for (Student stu : listStudent) {
161             ArrayList<ChooseCourse> stuCourseSelects = getStudentSelects(stu.getId());
162             if (stuCourseSelects.size() != 0) {
163                 System.out.println(stu.getId() + " " + stu.getStuName() + " " + getAvgTotalScore(stuCourseSelects));
164             } else {
165                 System.out.println(stu.getId() + " " + stu.getStuName() + " did not take any exams");
166             }
167         }
168     }
169 
170     //java 选修 考察
171     public void showCourses() {
172         Collections.sort(listCourse);
173         for (Course course : listCourse) {
174             ArrayList<ChooseCourse> stuCourseSelects = getCourseSelects(course.getCourseName());
175             if (stuCourseSelects.size() != 0) {
176                 System.out.println(course.getCourseName() + " " + getAvgTotalScore(stuCourseSelects));
177             } else {
178                 System.out.println(course.courseName + " has no grades yet");
179             }
180         }
181     }
182 
183     public void showClasses() {
184         Collections.sort(listClass);
185         for (Class cls : listClass) {
186             ArrayList<ChooseCourse> stuCourseSelects = getClassSelects(cls.getClassId());
187             if (stuCourseSelects.size() != 0) {
188                 System.out.println(cls.getClassId() + " " + getAvgTotalScore(stuCourseSelects));
189             } else {
190                 System.out.println(cls.getClassId() + " has no grades yet");
191             }
192         }
193     }
194     public ArrayList<ChooseCourse> getStudentSelects(String id) {
195         return listChooseCourse.stream()
196                 .filter(cos -> cos.student.getId().equals(id))
197                 .collect(Collectors.toCollection(ArrayList::new));
198     }
199 
200     public ArrayList<ChooseCourse> getCourseSelects(String courseName) {
201         return listChooseCourse.stream()
202                 .filter(cos -> cos.course.getCourseName().equals(courseName))
203                 .collect(Collectors.toCollection(ArrayList::new));
204     }
205 
206     public ArrayList<ChooseCourse> getClassSelects(String clsId) {
207         return listChooseCourse.stream()
208                 .filter(cos -> cos.student.getClsId().equals(clsId))
209                 .collect(Collectors.toCollection(ArrayList::new));
210     }
211 
212     public int getAvgTotalScore(ArrayList<ChooseCourse> cs) {
213         return (int) cs.stream()
214                 .mapToInt(c -> c.grade.getTotalGrade())
215                 .average()
216                 .orElse(0);
217     }
218 
219     public int getAvgUsualScore(ArrayList<ChooseCourse> cs) {
220         return (int) cs.stream()
221                 .filter(c -> c.course.getTestType().equals("考试"))
222                 .mapToInt(c -> c.grade.getUsualGrade())
223                 .average()
224                 .orElse(0);
225     }
226 
227     public int getAvgFinalScore(ArrayList<ChooseCourse> cs) {
228         return (int) cs.stream()
229                 .mapToInt(c -> c.grade.finalGrade)
230                 .average()
231                 .orElse(0);
232     }
233 
234 }
235 class ChooseCourse {
236     Course course;
237     Student student;
238     Grade grade;
239 
240     public ChooseCourse(Course course, Student student, Grade grade) {
241         this.course = course;
242         this.student = student;
243         this.grade = grade;
244     }
245 }
246 
247 class Student implements Comparable<Student> {
248     String stuName;
249     String id;
250     String clsId;
251 
252     public Student(String clsId, String id, String stuName) {
253         this.clsId = clsId;
254         this.id = id;
255         this.stuName = stuName;
256     }
257 
258     public String getId() {
259         return id;
260     }
261 
262     public String getStuName() {
263         return stuName;
264     }
265 
266     public String getClsId() {
267         return clsId;
268     }
269 
270     @Override
271     public int compareTo(Student stu) {
272         return getId().compareTo(stu.getId());
273     }
274 }
275 
276 class Course implements Comparable<Course> {
277     String courseName;
278     String type;
279     String testType;
280     ArrayList<String> powers = new ArrayList<>();
281 
282     public Course(String courseName, String type, String testType, ArrayList<String> powers) {
283         this.courseName = courseName;
284         this.type = type;
285         this.testType = testType;
286         this.powers = powers;
287     }
288 
289     public String getCourseName() {
290         return courseName;
291     }
292 
293     public String getType() {
294         return type;
295     }
296 
297     public String getTestType() {
298         return testType;
299     }
300 
301     @Override
302     public int compareTo(Course o) {
303         Comparator<Object> compare = Collator.getInstance(java.util.Locale.CHINA);
304         return compare.compare(courseName, o.getCourseName());
305     }
306 }
307 
308 class Class implements Comparable<Class> {
309     String classId;
310 
311     public Class(String classId) {
312         this.classId = classId;
313     }
314 
315     public String getClassId() {
316         return classId;
317     }
318 
319     @Override
320     public int compareTo(Class o) {
321         return getClassId().compareTo(o.getClassId());
322     }
323 }
324 
325 abstract class Grade {
326     int finalGrade;
327     ArrayList<String> powers = new ArrayList<>();
328 
329     public abstract int getUsualGrade();
330 
331     public abstract int getTotalGrade();
332 }
333 
334 class ExamGrade extends Grade {
335     int usualGrade;
336     ArrayList<Float> powers = new ArrayList<>();
337 
338     public ExamGrade(int usualGrade, int finalGrade, ArrayList<String> powers) {
339         super.finalGrade = finalGrade;
340         this.usualGrade = usualGrade;
341         super.powers = powers;
342     }
343 
344     @Override
345     public int getUsualGrade() {
346         return usualGrade;
347     }
348 
349     @Override
350     public int getTotalGrade() {
351         return (int) (usualGrade * powers.get(0) + finalGrade * powers.get(1));
352     }
353 }
354 
355 class AssessGrade extends Grade {
356 
357     public AssessGrade(int finalGrade) {
358         this.finalGrade = finalGrade;
359     }
360 
361     @Override
362     public int getUsualGrade() {
363         return 0;
364     }
365 
366     @Override
367     public int getTotalGrade() {
368         return finalGrade;
369     }
370 }
371 
372 class ExperimentGrade extends Grade {
373     ArrayList<Integer> exGrade = new ArrayList<>(); // 成绩
374 
375     public ExperimentGrade(ArrayList<Integer> scores, ArrayList<String> powers) {
376         exGrade = scores;
377         super.powers = powers;
378     }
379 
380     @Override
381     public int getUsualGrade() {
382         return 0;
383     }
384 
385     @Override
386     public int getTotalGrade() {
387         float sum = 0;
388         for (int i = 0; i < exGrade.size(); i++) {
389             sum += exGrade.get(i) * Float.parseFloat(powers.get(i));
390         }
391         return (int) sum;
392     }
393 }
394 
395 class InputMatching {
396     static String stuNumMatching = "[0-9]{8}"; // 8个0-9的数字
397     static String stuNameMatching = "\\S{1,10}"; // 1到10个非空格(TAB)字符
398     static String scoreMatching = "([1-9]?[0-9]|100)";
399     static String experimentNum = "^[4-9]$";
400     static String coursePowerNum = "[1-9]";
401     static String powerNum = "(^[0-9]*\\.([0-9]{1}\\d*)$)|[1]"; // 小于或等于1的数
402     static String courseNameMatching = "\\S{1,10}"; // 1到10个非空格(TAB)字符
403     static String courseTypeMatching = "(选修|必修|实验)";
404     static String checkCourseTypeMatching = "(考试|考察|实验)";
405     // courseInput用于定义课程信息模式(正则表达式)
406     static String courseInput = courseNameMatching + " " + courseTypeMatching + " " + checkCourseTypeMatching;
407     // scoreInput用于定义成绩信息模式(正则表达式)
408     static String scoreInput1 = stuNumMatching + " " + stuNameMatching + " " + courseNameMatching + " " +
409             scoreMatching;
410     static String scoreInput2 = stuNumMatching + " " + stuNameMatching + " " + courseNameMatching + " " +
411             scoreMatching + " " + scoreMatching;
412     static String scoreInput3 = stuNumMatching + " " + stuNameMatching + " " + courseNameMatching + " " +
413             experimentNum;
414 
415     public int matchingInput(String s) {
416         if (matchingCourse(s)) {
417             return 1;
418         }
419         if (matchingScore(s) || matchingExScore(s)) {
420             return 2;
421         }
422         return 0;
423     }
424 
425     // 课程信息
426     private static boolean matchingCourse(String s) {
427         String[] letters = s.split(" ");
428         if (letters[0].matches(courseNameMatching) && letters[1].matches(courseTypeMatching)
429                 && letters[2].matches(checkCourseTypeMatching) && letters[3].matches(coursePowerNum)) {
430             if (letters[2].equals("实验") && (!letters[3].matches(experimentNum))) {
431                 return false;
432             }
433             for (int i = 4; i < letters.length; i++) {
434                 if (!letters[i].matches(powerNum)) {
435                     return false;
436                 }
437             }
438             return true;
439         }
440         return false;
441     }
442 
443     // 成绩信息
444     private static boolean matchingScore(String s) {
445         if (s.matches(scoreInput1) || s.matches(scoreInput2)) {
446             return true;
447         }
448         return false;
449     }
450 
451     // 实验课信息
452     private static boolean matchingExScore(String s) {
453         String[] letters = s.split(" ");
454         if (letters[0].matches(stuNumMatching) && letters[1].matches(stuNameMatching) && letters[2].matches(courseNameMatching)) {
455             for (int i = 3; i < letters.length; i++) {
456                 if (!letters[i].matches(scoreMatching)) {
457                     return false;
458                 }
459             }
460             return true;
461         }
462         return false;
463     }
464 }

 

2、源码分析:

Main类中有一个main方法,它是程序的入口点。在这个方法中,首先创建了一个Scanner对象s来读取用户输入。然后创建了一个ParseInput对象handle来处理用户输入的数据。接下来,使用一个循环来读取用户输入的每一行数据,直到用户输入"end"为止。在循环中,每次读取一行数据并将其传递给handle.parseInput()方法进行解析。最后,调用handle.showStudents()handle.showCourses()handle.showClasses()方法来显示学生、课程和班级信息。

ParseInput类中包含了几个实例变量:listStudentlistCourselistClasslistChooseCourse。它们分别用来存储学生、课程、班级和选课信息。

在这个类中,有一个重要的方法叫做parseInput()。这个方法接收一个字符串参数,表示用户输入的一行数据。在这个方法中,首先创建了一个InputMatching对象,并调用它的matchingInput()方法来判断用户输入的数据格式是否正确。如果格式不正确,则输出"wrong format";否则根据返回值判断是课程信息还是成绩信息,并调用相应的方法进行处理。

如果是课程信息,则调用courseMessage()方法来处理课程信息。在这个方法中,首先使用split()方法将输入的字符串按空格分割成字符串数组。然后从数组中提取出课程名、课程类型、课程考试类型和成绩数量等信息。接下来,检查输入的成绩数量是否与实际输入的成绩数量相符,如果不相符,则输出错误信息并返回。然后计算所有成绩的权重之和,如果权重之和不为1,则输出错误信息并返回。最后,将输入的成绩权重存储到一个ArrayList中,并创建一个新的Course对象。如果这个课程不存在且满足检查条件,则将其添加到课程列表中。

如果是成绩信息,则调用gradeMessage()方法来处理成绩信息。在这个方法中,首先使用split()方法将输入的字符串按空格分割成字符串数组。然后从数组中提取出学生学号、班级编号、学生姓名和课程名等信息。接下来,检查班级是否已经存在,如果不存在,则创建一个新的班级对象并将其添加到班级列表中。然后创建一个新的学生对象,如果这个学生不存在,则将其添加到学生列表中。最后,检查课程是否存在,如果不存在,则输出错误信息并返回。

类图:

 

三、踩坑心得:

  1. 输入数据的格式检查:在parseInput()方法中,需要检查用户输入的数据格式是否正确。这需要编写一个InputMatching类来实现。在这个类中,需要编写一个matchingInput()方法来判断用户输入的数据格式是否正确。这个方法的实现可能会比较复杂,需要仔细设计和测试。例如,需要考虑各种不同的输入格式,以及如何准确地判断它们是否符合要求。

  2. 数据的存储和管理:在ParseInput类中,需要使用多个ArrayList来存储学生、课程、班级和选课信息。在处理用户输入的数据时,需要对这些列表进行增删改查操作。这些操作需要仔细设计和实现,以避免出现错误。例如,在添加新的学生、课程或班级时,需要检查它们是否已经存在;在查询学生、课程或班级信息时,需要考虑如何快速地查找到相应的数据。

  3. 错误处理:在处理用户输入的数据时,可能会出现各种错误情况,例如输入的成绩数量不匹配、权重之和不为1、课程不存在等。需要在代码中对这些错误情况进行检查,并输出相应的错误信息。这部分代码需要仔细设计和测试,以确保能够准确地捕获并处理各种错误情况。

  4. 代码的可读性和可维护性:上述代码包含了多个类和方法,实现了较为复杂的功能。为了提高代码的可读性和可维护性,需要对代码进行良好的组织和规划,合理地划分模块和功能,并编写清晰易懂的注释。此外,在编写代码时,应该注意遵循一些良好的编程实践,例如使用有意义的变量名、避免过长的方法和过深的嵌套等。

        

四、改进意见:

  1. 输入数据的格式检查:为了更好地检查用户输入的数据格式是否正确,可以考虑使用正则表达式来实现。正则表达式是一种强大的文本匹配工具,可以用来准确地判断用户输入的数据格式是否符合要求。在InputMatching类中,可以编写一个matchingInput()方法,使用正则表达式来判断用户输入的数据格式是否正确。

  2. 数据的存储和管理:为了更好地存储和管理数据,可以考虑使用更加高效的数据结构来替换ArrayList。例如,可以使用HashMap来存储学生、课程和班级信息,这样在查询时就可以快速地查找到相应的数据。此外,在处理用户输入的数据时,应该注意避免重复操作,以提高代码的效率。

  3. 错误处理:为了更好地处理错误情况,可以考虑使用异常处理机制来实现。在代码中,可以定义一些自定义异常类,用来表示各种不同的错误情况。然后,在处理用户输入的数据时,如果遇到错误情况,则抛出相应的异常。在main方法中,可以使用try-catch语句来捕获并处理这些异常。

  4. 代码的可读性和可维护性:为了提高代码的可读性和可维护性,应该注意遵循一些良好的编程实践。例如,在编写代码时,应该使用有意义的变量名、避免过长的方法和过深的嵌套等。此外,在编写代码时,应该注意模块化设计,将程序划分成若干个独立的模块,每个模块负责实现一个特定的功能。

         

  1. 持续重构:在编写代码的过程中,应该不断地重构代码,以提高代码的质量。重构是指在不改变代码外部行为的情况下,改进代码的内部结构。通过重构,可以消除代码中的重复、简化复杂的逻辑、提高代码的可读性和可维护性等。

  2. 编写测试用例:为了确保代码的正确性,应该编写测试用例来对代码进行测试。测试用例可以帮助我们快速地发现代码中的错误,并及时修复它们。此外,测试用例还可以帮助我们验证重构后的代码是否仍然能够正确地工作。

  3. 代码审查:可以定期进行代码审查,邀请其他开发人员对代码进行审查。通过代码审查,可以发现代码中的问题,并及时修复它们。此外,代码审查还可以帮助我们学习其他开发人员的经验和技巧,从而提高自己的编程能力。

  4. 持续学习:作为一名开发人员,应该不断地学习新知识和技能,以便更好地应对各种挑战。可以阅读技术书籍、参加技术培训、参加技术交流会等方式来学习新知识和技能。

 

五、总结:

通过本阶段(10-16周)的学习,可以学到以下几点:

  1. 通过本阶段的学习,可以了解Java语言的基本语法和特性,以及如何使用Java语言来实现各种功能。

  2. 如何组织和管理数据:上述代码中包含了多个类和方法,用来存储和管理学生、课程、班级和选课信息。通过学习这段代码,可以了解如何使用ArrayList等数据结构来存储和管理数据,以及如何对数据进行增删改查操作。

  3. 如何处理用户输入:上述代码中包含了一个parseInput()方法,用来处理用户输入的数据。通过学习这段代码,可以了解如何使用Scanner类来读取用户输入,以及如何对用户输入的数据进行解析和处理。

  4. 如何进行错误处理:上述代码中包含了多处错误处理的代码,用来检查用户输入的数据是否正确,并输出相应的错误信息。通过学习这段代码,可以了解如何在代码中进行错误检查,并输出相应的错误信息。

对于需要进一步学习和研究的地方,包括:

  1. 更深入地学习Java语言:上述代码只展示了Java语言的基础知识,要想更好地掌握Java语言,还需要更深入地学习Java语言的高级特性和技巧。

  2. 学习更多的数据结构和算法:上述代码中只使用了ArrayList这一种数据结构,要想更好地存储和管理数据,还需要学习更多的数据结构和算法。

  3. 学习软件工程相关知识:上述代码只是一个简单的程序,要想编写更大型、更复杂的软件系统,还需要学习软件工程相关知识,包括需求分析、设计、编码、测试等方面。

对教师、课程、作业、实验、课上及课下组织方式等方面的改进建议及意见:

         1.希望能有更加充裕的时间来完成作业。

         2.希望老师能提供更加详细周到的帮助。

         3.希望作业的难度能够循序渐进,不要难度跨越过大。

         4.希望老师能使用更加有趣的教学方式。