一、前言
第六次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、源码分析:
包含两个类:Main和ParseInput。Main类中有一个main方法,它是程序的入口点。在这个方法中,首先创建了一个Scanner对象s来读取用户输入,然后创建了一个ParseInput对象handle来处理输入。接下来,程序进入一个循环,每次循环都会读取一行输入并将其传递给handle.parseInput()方法进行处理,直到用户输入"end"为止。最后,调用了几个方法来对数据进行排序和输出。
在ParseInput类中,定义了四个私有成员变量:selectCourses, courses, students, 和 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、源码分析:
2、源码分析:
Main类中有一个main方法,它是程序的入口点。在这个方法中,首先创建了一个Scanner对象s来读取用户输入。然后创建了一个ParseInput对象handle来处理用户输入的数据。接下来,使用一个循环来读取用户输入的每一行数据,直到用户输入"end"为止。在循环中,每次读取一行数据并将其传递给handle.parseInput()方法进行解析。最后,调用handle.showStudents()、handle.showCourses()和handle.showClasses()方法来显示学生、课程和班级信息。
ParseInput类中包含了几个实例变量:listStudent、listCourse、listClass和listChooseCourse。它们分别用来存储学生、课程、班级和选课信息。
在这个类中,有一个重要的方法叫做parseInput()。这个方法接收一个字符串参数,表示用户输入的一行数据。在这个方法中,首先创建了一个InputMatching对象,并调用它的matchingInput()方法来判断用户输入的数据格式是否正确。如果格式不正确,则输出"wrong format";否则根据返回值判断是课程信息还是成绩信息,并调用相应的方法进行处理。
如果是课程信息,则调用courseMessage()方法来处理课程信息。在这个方法中,首先使用split()方法将输入的字符串按空格分割成字符串数组。然后从数组中提取出课程名、课程类型、课程考试类型和成绩数量等信息。接下来,检查输入的成绩数量是否与实际输入的成绩数量相符,如果不相符,则输出错误信息并返回。然后计算所有成绩的权重之和,如果权重之和不为1,则输出错误信息并返回。最后,将输入的成绩权重存储到一个ArrayList中,并创建一个新的Course对象。如果这个课程不存在且满足检查条件,则将其添加到课程列表中。
如果是成绩信息,则调用gradeMessage()方法来处理成绩信息。在这个方法中,首先使用split()方法将输入的字符串按空格分割成字符串数组。然后从数组中提取出学生学号、班级编号、学生姓名和课程名等信息。接下来,检查班级是否已经存在,如果不存在,则创建一个新的班级对象并将其添加到班级列表中。然后创建一个新的学生对象,如果这个学生不存在,则将其添加到学生列表中。最后,检查课程是否存在,如果不存在,则输出错误信息并返回。
类图:

三、踩坑心得:
-
输入数据的格式检查:在
parseInput()方法中,需要检查用户输入的数据格式是否正确。这需要编写一个InputMatching类来实现。在这个类中,需要编写一个matchingInput()方法来判断用户输入的数据格式是否正确。这个方法的实现可能会比较复杂,需要仔细设计和测试。例如,需要考虑各种不同的输入格式,以及如何准确地判断它们是否符合要求。 -
数据的存储和管理:在
ParseInput类中,需要使用多个ArrayList来存储学生、课程、班级和选课信息。在处理用户输入的数据时,需要对这些列表进行增删改查操作。这些操作需要仔细设计和实现,以避免出现错误。例如,在添加新的学生、课程或班级时,需要检查它们是否已经存在;在查询学生、课程或班级信息时,需要考虑如何快速地查找到相应的数据。 -
错误处理:在处理用户输入的数据时,可能会出现各种错误情况,例如输入的成绩数量不匹配、权重之和不为1、课程不存在等。需要在代码中对这些错误情况进行检查,并输出相应的错误信息。这部分代码需要仔细设计和测试,以确保能够准确地捕获并处理各种错误情况。
-
代码的可读性和可维护性:上述代码包含了多个类和方法,实现了较为复杂的功能。为了提高代码的可读性和可维护性,需要对代码进行良好的组织和规划,合理地划分模块和功能,并编写清晰易懂的注释。此外,在编写代码时,应该注意遵循一些良好的编程实践,例如使用有意义的变量名、避免过长的方法和过深的嵌套等。
四、改进意见:
-
输入数据的格式检查:为了更好地检查用户输入的数据格式是否正确,可以考虑使用正则表达式来实现。正则表达式是一种强大的文本匹配工具,可以用来准确地判断用户输入的数据格式是否符合要求。在
InputMatching类中,可以编写一个matchingInput()方法,使用正则表达式来判断用户输入的数据格式是否正确。 -
数据的存储和管理:为了更好地存储和管理数据,可以考虑使用更加高效的数据结构来替换
ArrayList。例如,可以使用HashMap来存储学生、课程和班级信息,这样在查询时就可以快速地查找到相应的数据。此外,在处理用户输入的数据时,应该注意避免重复操作,以提高代码的效率。 -
错误处理:为了更好地处理错误情况,可以考虑使用异常处理机制来实现。在代码中,可以定义一些自定义异常类,用来表示各种不同的错误情况。然后,在处理用户输入的数据时,如果遇到错误情况,则抛出相应的异常。在
main方法中,可以使用try-catch语句来捕获并处理这些异常。 -
代码的可读性和可维护性:为了提高代码的可读性和可维护性,应该注意遵循一些良好的编程实践。例如,在编写代码时,应该使用有意义的变量名、避免过长的方法和过深的嵌套等。此外,在编写代码时,应该注意模块化设计,将程序划分成若干个独立的模块,每个模块负责实现一个特定的功能。
-
持续重构:在编写代码的过程中,应该不断地重构代码,以提高代码的质量。重构是指在不改变代码外部行为的情况下,改进代码的内部结构。通过重构,可以消除代码中的重复、简化复杂的逻辑、提高代码的可读性和可维护性等。
-
编写测试用例:为了确保代码的正确性,应该编写测试用例来对代码进行测试。测试用例可以帮助我们快速地发现代码中的错误,并及时修复它们。此外,测试用例还可以帮助我们验证重构后的代码是否仍然能够正确地工作。
-
代码审查:可以定期进行代码审查,邀请其他开发人员对代码进行审查。通过代码审查,可以发现代码中的问题,并及时修复它们。此外,代码审查还可以帮助我们学习其他开发人员的经验和技巧,从而提高自己的编程能力。
-
持续学习:作为一名开发人员,应该不断地学习新知识和技能,以便更好地应对各种挑战。可以阅读技术书籍、参加技术培训、参加技术交流会等方式来学习新知识和技能。
五、总结:
通过本阶段(10-16周)的学习,可以学到以下几点:
-
通过本阶段的学习,可以了解Java语言的基本语法和特性,以及如何使用Java语言来实现各种功能。
-
如何组织和管理数据:上述代码中包含了多个类和方法,用来存储和管理学生、课程、班级和选课信息。通过学习这段代码,可以了解如何使用
ArrayList等数据结构来存储和管理数据,以及如何对数据进行增删改查操作。 -
如何处理用户输入:上述代码中包含了一个
parseInput()方法,用来处理用户输入的数据。通过学习这段代码,可以了解如何使用Scanner类来读取用户输入,以及如何对用户输入的数据进行解析和处理。 -
如何进行错误处理:上述代码中包含了多处错误处理的代码,用来检查用户输入的数据是否正确,并输出相应的错误信息。通过学习这段代码,可以了解如何在代码中进行错误检查,并输出相应的错误信息。
对于需要进一步学习和研究的地方,包括:
-
更深入地学习Java语言:上述代码只展示了Java语言的基础知识,要想更好地掌握Java语言,还需要更深入地学习Java语言的高级特性和技巧。
-
学习更多的数据结构和算法:上述代码中只使用了
ArrayList这一种数据结构,要想更好地存储和管理数据,还需要学习更多的数据结构和算法。 -
学习软件工程相关知识:上述代码只是一个简单的程序,要想编写更大型、更复杂的软件系统,还需要学习软件工程相关知识,包括需求分析、设计、编码、测试等方面。
对教师、课程、作业、实验、课上及课下组织方式等方面的改进建议及意见:
1.希望能有更加充裕的时间来完成作业。
2.希望老师能提供更加详细周到的帮助。
3.希望作业的难度能够循序渐进,不要难度跨越过大。
4.希望老师能使用更加有趣的教学方式。
