Blog第三次作业总结
一、前言
(1)训练集07
7-1 菜单计价程序-5
总结:这次作业是之前菜单系列的最后一次升级版,增加了“口味度”这个属性,总的来说还是较难,要考虑的异常输入也很多。
(2)训练集08
7-1 课程成绩统计程序-1
二、设计与分析
7-1 课程成绩统计程序-1

这是题目所给的类图,根据这个就可以基本上把这道题大概的轮廓给写出来了。但是呢,还不够需考虑到主函数里面的细节,因为要判断错误的输入信息所以根据输入信息的问题以及要输出的内容,我设计了几个函数:print1(ArrayList<Student>·students,·ArrayList<CourseSelection>·courseSelections) 用来输出学生所有课程总成绩的平均分;print2(ArrayList<Course> courses, ArrayList<CourseSelection> courseSelections) 用来输出单门课程成绩平均分、单门课程总成绩平均分;isCourseExist(String courseName, ArrayList<Course> courses, int length, Student student) 用来判断课程信息是否存在;RepetitiveCourses(Course course,ArrayList<Course> courses) 判断是否为重复的课程信息;RepetitiveScores(CourseSelection courseSelection,ArrayList<CourseSelection> courseSelections) 判断是否为重复的课程成绩信息;addCourse(String[] nextLine, ArrayList<Course> courses) 添加课程信息;addScoredCourseSelection(String[] nextLine, ArrayList<CourseSelection> courseSelections, ArrayList<Student> students, ArrayList<Course> courses) 添加考试的课程成绩信息;addUnScoredCourseSelection(String[] nextLine, ArrayList<Course> courses, ArrayList<Student> students, ArrayList<CourseSelection> courseSelections) 添加考察的课程信息。之后简化的main函数如下:
public static void main(String[] args) { ArrayList<Class> classes = new ArrayList<>(); ArrayList<Course> courses = new ArrayList<>(); ArrayList<Student> students = new ArrayList<>(); ArrayList<CourseSelection> courseSelections = new ArrayList<>(); Scanner input = new Scanner(System.in); while (true) { String str = input.nextLine(); if (str.equals("end")) { break; } String[] nextLine = str.split(" "); if (nextLine.length == 3) { addCourse(nextLine,courses); } else if (nextLine.length == 5) { addScoredCourseSelection(nextLine,courseSelections,students,courses); } else if (nextLine.length == 4) { addUnScoredCourseSelection(nextLine, courses, students, courseSelections); } else { System.out.println("wrong format"); } } for (Student student:students ) { int classNumber = Integer.parseInt(student.getStudentNumber()) / 100; if (classes.size() == 0) { Class clas = new Class(); clas.setClassNumber(classNumber); clas.getStudents().add(student); classes.add(clas); } else { ListIterator<Class> iterator = classes.listIterator(); while (iterator.hasNext()) { Class clas = iterator.next(); if (clas.getClassNumber() == classNumber) { clas.getStudents().add(student); break; } else { if (classes.indexOf(clas) == classes.size() - 1) { Class clasNew = new Class(); clasNew.setClassNumber(classNumber); clasNew.getStudents().add(student); iterator.add(clasNew); } } } } } Collections.sort(classes, Comparator.comparingInt(o -> o.getClassNumber())); for (Class clas:classes ) { clas.setClassAverageScore(print1(clas.getStudents(), courseSelections)); } print2(courses, courseSelections); for (Class clas:classes ) { if (clas.getClassAverageScore() == -1) { System.out.println(clas.getClassNumber() + " has no grades yet"); } else System.out.println(clas.getClassNumber() + " " + clas.getClassAverageScore()); } }
整个代码类图如下:

完整源码如下:
import java.text.Collator; import java.util.*; public class Main { public static void main(String[] args) { ArrayList<Class> classes = new ArrayList<>(); ArrayList<Course> courses = new ArrayList<>(); ArrayList<Student> students = new ArrayList<>(); ArrayList<CourseSelection> courseSelections = new ArrayList<>(); Scanner input = new Scanner(System.in); while (true) { String str = input.nextLine(); if (str.equals("end")) { break; } String[] nextLine = str.split(" "); if (nextLine.length == 3) { addCourse(nextLine,courses); } else if (nextLine.length == 5) { addScoredCourseSelection(nextLine,courseSelections,students,courses); } else if (nextLine.length == 4) { addUnScoredCourseSelection(nextLine, courses, students, courseSelections); } else { System.out.println("wrong format"); } } for (Student student:students ) { int classNumber = Integer.parseInt(student.getStudentNumber()) / 100; if (classes.size() == 0) { Class clas = new Class(); clas.setClassNumber(classNumber); clas.getStudents().add(student); classes.add(clas); } else { ListIterator<Class> iterator = classes.listIterator(); while (iterator.hasNext()) { Class clas = iterator.next(); if (clas.getClassNumber() == classNumber) { clas.getStudents().add(student); break; } else { if (classes.indexOf(clas) == classes.size() - 1) { Class clasNew = new Class(); clasNew.setClassNumber(classNumber); clasNew.getStudents().add(student); iterator.add(clasNew); } } } } } Collections.sort(classes, Comparator.comparingInt(o -> o.getClassNumber())); for (Class clas:classes ) { clas.setClassAverageScore(print1(clas.getStudents(), courseSelections)); } print2(courses, courseSelections); for (Class clas:classes ) { if (clas.getClassAverageScore() == -1) { System.out.println(clas.getClassNumber() + " has no grades yet"); } else System.out.println(clas.getClassNumber() + " " + clas.getClassAverageScore()); } } public static int print1(ArrayList<Student> students, ArrayList<CourseSelection> courseSelections) { int classAverageScore = 0; Collections.sort(students, Comparator.comparingInt(o -> Integer.parseInt(o.getStudentNumber()))); for (Student student:students ) { int averageScore = 0; int courseNum = 0; for (CourseSelection cs:courseSelections ) { if (cs.getStudent().getStudentNumber().equals(student.getStudentNumber())) { averageScore += cs.getScore().getTotalScore(); courseNum ++; } } if (courseNum == 0) { System.out.println(student.getStudentNumber() + " " + student.getStudentName() + " did not take any exams"); return -1; } else { averageScore /= courseNum; System.out.println(student.getStudentNumber() + " " + student.getStudentName() + " " + averageScore); } classAverageScore += averageScore; } return classAverageScore / students.size(); } public static void print2(ArrayList<Course> courses, ArrayList<CourseSelection> courseSelections) { Collections.sort(courses, (o1, o2) -> { Collator collator = Collator.getInstance(Locale.CHINA); return collator.compare(o1.getCourseName(), o2.getCourseName()); }); for (Course course:courses ) { int courseAverageScore = 0; int courseDailyPerformance = 0; int courseFinalGrade = 0; int studentNum = 0; for (CourseSelection cs:courseSelections ) { if (course.getCourseName().equals(cs.getCourse().getCourseName())) { courseAverageScore += cs.getScore().getTotalScore(); courseDailyPerformance += cs.getScore().getDailyPerformance(); courseFinalGrade += cs.getScore().getFinalGrade(); studentNum ++; } } if (studentNum == 0) { System.out.println(course.getCourseName() + " has no grades yet"); } else { courseAverageScore /= studentNum; courseDailyPerformance /= studentNum; courseFinalGrade /= studentNum; if (course.getAssessmentMethod().equals("考试")) { System.out.println(course.getCourseName() + " " + courseDailyPerformance + " " + courseFinalGrade + " " + courseAverageScore); } else { System.out.println(course.getCourseName() + " " + courseFinalGrade + " " + courseAverageScore); } } } } public static boolean isCourseExist(String courseName, ArrayList<Course> courses, int length, Student student) { for (Course course:courses ) { if (course.getCourseName().equals(courseName)) { if ((course.getAssessmentMethod().equals("考试") && length != 5) || (course.getAssessmentMethod().equals("考察") && length != 4)) { System.out.println(student.getStudentNumber() + " " + student.getStudentName() + " : access mode mismatch"); return false; } else return true; } } System.out.println(courseName + " does not exist"); return true; } public static boolean RepetitiveCourses(Course course,ArrayList<Course> courses) { for (Course cou:courses ) { if (cou.getCourseName().equals(course.getCourseName())) return true; } return false; } public static boolean RepetitiveScores(CourseSelection courseSelection,ArrayList<CourseSelection> courseSelections) { for (CourseSelection cs:courseSelections ) { if (cs.getStudent().getStudentName().equals(courseSelection.getStudent().getStudentName())) { if (cs.getCourse().getCourseName().equals(courseSelection.getCourse().getCourseName())) { return true; } } } return false; } public static void addCourse(String[] nextLine, ArrayList<Course> courses) { Course course = new Course(nextLine[0], nextLine[1], nextLine[2]); if (RepetitiveCourses(course,courses)) return; if (nextLine[0].length() > 10 || (!nextLine[1].equals("必修") && !nextLine[1].equals("选修")) || (!nextLine[2].equals("考试") && (!nextLine[2].equals("考察")))) { System.out.println("wrong format"); return; } if (course.getCourseNature().equals("必修") && !course.getAssessmentMethod().equals("考试")) { System.out.println(course.getCourseName() + " : course type & access mode mismatch"); return; } courses.add(course); } public static void addScoredCourseSelection(String[] nextLine, ArrayList<CourseSelection> courseSelections, ArrayList<Student> students, ArrayList<Course> courses) { if (!nextLine[3].matches("100|[1-9][0-9]|[0-9]") || !nextLine[4].matches("100|[1-9][0-9]|[0-9]") || nextLine[0].length() != 8 || nextLine[1].length() > 10) { System.out.println("wrong format"); return; } Student student = new Student(nextLine[0], nextLine[1]); Iterator<Student> iterator = students.iterator(); while (iterator.hasNext()) { Student stu = iterator.next(); if (stu.getStudentNumber().equals(student.getStudentNumber())) { iterator.remove(); } } students.add(student); if (isCourseExist(nextLine[2], courses, nextLine.length, student)) { Score score = new ExaminationResults(Integer.parseInt(nextLine[3]), Integer.parseInt(nextLine[4])); for (Course course:courses ) { if (course.getCourseName().equals(nextLine[2])) { CourseSelection courseSelection = new CourseSelection(course, student, score); if (RepetitiveScores(courseSelection,courseSelections)) continue; courseSelections.add(courseSelection); } } } } public static void addUnScoredCourseSelection(String[] nextLine, ArrayList<Course> courses, ArrayList<Student> students, ArrayList<CourseSelection> courseSelections) { if (!nextLine[3].matches("100|[1-9][0-9]|[0-9]") || nextLine[0].length() != 8 || nextLine[1].length() > 10) { System.out.println("wrong format"); return; } Student student = new Student(nextLine[0], nextLine[1]); Iterator<Student> iterator = students.iterator(); while (iterator.hasNext()) { Student stu = iterator.next(); if (stu.getStudentNumber().equals(student.getStudentNumber())) { iterator.remove(); } } students.add(student); if (isCourseExist(nextLine[2], courses, nextLine.length, student)) { Score score = new AssessmentResults(Integer.parseInt(nextLine[3])); for (Course course:courses ) { if (course.getCourseName().equals(nextLine[2])) { CourseSelection courseSelection = new CourseSelection(course, student, score); if (RepetitiveScores(courseSelection,courseSelections)) continue; courseSelections.add(courseSelection); } } } } } abstract class Score { private int dailyPerformance; // 平时成绩 private int finalGrade; // 期末成绩 public Score(int finalGrade) { this.finalGrade = finalGrade; } public Score(int dailyPerformance, int finalGrade) { this.dailyPerformance = dailyPerformance; this.finalGrade = finalGrade; } public int getDailyPerformance() { return dailyPerformance; } public void setDailyPerformance(int dailyPerformance) { this.dailyPerformance = dailyPerformance; } public int getFinalGrade() { return finalGrade; } public void setFinalGrade(int finalGrade) { this.finalGrade = finalGrade; } public abstract int getTotalScore(); } class ExaminationResults extends Score { public ExaminationResults(int dailyPerformance, int finalGrade) { super(dailyPerformance, finalGrade); } @Override public int getTotalScore() { return (int) (getDailyPerformance() * 0.3 + getFinalGrade() * 0.7); } } class AssessmentResults extends Score { public AssessmentResults(int finalGrade) { super(finalGrade); } public int getTotalScore() { return getFinalGrade(); } } class Course { private String courseName; // 课程名称 private String courseNature; // 课程性质 private String AssessmentMethod; // 考核方式 public Course(String courseName, String courseNature, String assessmentMethod) { this.courseName = courseName; this.courseNature = courseNature; AssessmentMethod = assessmentMethod; } public Course() { } public String getCourseName() { return courseName; } public void setCourseName(String courseName) { this.courseName = courseName; } public String getCourseNature() { return courseNature; } public void setCourseNature(String courseNature) { this.courseNature = courseNature; } public String getAssessmentMethod() { return AssessmentMethod; } public void setAssessmentMethod(String assessmentMethod) { AssessmentMethod = assessmentMethod; } } class Student { private String studentNumber; private String studentName; public Student(String studentNumber, String studentName) { this.studentNumber = studentNumber; this.studentName = studentName; } public String getStudentNumber() { return studentNumber; } public void setStudentNumber(String studentNumber) { this.studentNumber = studentNumber; } public String getStudentName() { return studentName; } } class Class { private int classNumber; private int classAverageScore; private ArrayList<Student> students = new ArrayList<>(); public Class(int classNumber, ArrayList<Student> students) { this.classNumber = classNumber; this.students = students; } public Class() { } public int getClassAverageScore() { return classAverageScore; } public void setClassAverageScore(int classAverageScore) { this.classAverageScore = classAverageScore; } public int getClassNumber() { return classNumber; } public void setClassNumber(int classNumber) { this.classNumber = classNumber; } public ArrayList<Student> getStudents() { return students; } public void setStudents(ArrayList<Student> students) { this.students = students; } public void addStudent(Student student) { students.add(student); } } class CourseSelection { private Course course; private Student student; private Score score; public CourseSelection(Course course, Student student, Score score) { this.course = course; this.student = student; this.score = score; } public Course getCourse() { return course; } public void setCourse(Course course) { this.course = course; } public Student getStudent() { return student; } public void setStudent(Student student) { this.student = student; } public Score getScore() { return score; } public void setScore(Score score) { this.score = score; } }
7-3 课程成绩统计程序-2
这是成绩计算系列的第二个,较之前添加了实验课的内容,题目的整体结构基本没变,所以相应的我添加了ExperimentalResults类,以及添加实验课信息的方法public static void addScoredCourseSelection2(String[] nextLine, ArrayList<Course> courses, ArrayList<Student> students, ArrayList<CourseSelection> courseSelections)。其他的方法也要有相应的修改具体见源码。但最后我还要一个测试点没过,如下:
只能说真的是尽力,我想应该是实验课算成绩有浮点误差吧。
该题类图如下:

源码如下:
import java.text.Collator; import java.util.*; public class Main { public static void main(String[] args) { ArrayList<Class> classes = new ArrayList<>(); ArrayList<Course> courses = new ArrayList<>(); ArrayList<Student> students = new ArrayList<>(); ArrayList<CourseSelection> courseSelections = new ArrayList<>(); Scanner input = new Scanner(System.in); while (true) { String str = input.nextLine(); if (str.equals("end")) { break; } String[] nextLine = str.split(" "); if (nextLine.length == 3) { addCourse(nextLine,courses); } else if (nextLine.length == 5) { addScoredCourseSelection1(nextLine,courseSelections,students,courses); } else if (nextLine.length == 4) { addScoredCourseSelection2(nextLine, courses, students, courseSelections); } else if (nextLine.length > 5) { addScoredCourseSelection3(nextLine,courses,students,courseSelections); } else { System.out.println("wrong format"); } } for (Student student:students ) { int classNumber = Integer.parseInt(student.getStudentNumber()) / 100; if (classes.size() == 0) { Class clas = new Class(); clas.setClassNumber(classNumber); clas.getStudents().add(student); classes.add(clas); } else { ListIterator<Class> iterator = classes.listIterator(); while (iterator.hasNext()) { Class clas = iterator.next(); if (clas.getClassNumber() == classNumber) { clas.getStudents().add(student); break; } else { if (classes.indexOf(clas) == classes.size() - 1) { Class clasNew = new Class(); clasNew.setClassNumber(classNumber); clasNew.getStudents().add(student); iterator.add(clasNew); } } } } } Collections.sort(classes, Comparator.comparingInt(o -> o.getClassNumber())); for (Class clas:classes ) { clas.setClassAverageScore(print1(clas.getStudents(), courseSelections)); } print2(courses, courseSelections); for (Class clas:classes ) { if (clas.getClassAverageScore() == -1) { System.out.println(clas.getClassNumber() + " has no grades yet"); } else System.out.println(clas.getClassNumber() + " " + clas.getClassAverageScore()); } } public static int print1(ArrayList<Student> students, ArrayList<CourseSelection> courseSelections) { int classAverageScore = 0; Collections.sort(students, Comparator.comparingInt(o -> Integer.parseInt(o.getStudentNumber()))); for (Student student:students ) { int averageScore = 0; int courseNum = 0; for (CourseSelection cs:courseSelections ) { if (cs.getStudent().getStudentNumber().equals(student.getStudentNumber())) { averageScore += cs.getScore().getTotalScore(); courseNum ++; } } if (courseNum == 0) { System.out.println(student.getStudentNumber() + " " + student.getStudentName() + " did not take any exams"); return -1; } else { averageScore /= courseNum; System.out.println(student.getStudentNumber() + " " + student.getStudentName() + " " + averageScore); } classAverageScore += averageScore; } return classAverageScore / students.size(); } public static void print2(ArrayList<Course> courses, ArrayList<CourseSelection> courseSelections) { Collections.sort(courses, (o1, o2) -> { Collator collator = Collator.getInstance(Locale.CHINA); return collator.compare(o1.getCourseName(), o2.getCourseName()); }); for (Course course:courses ) { int courseAverageScore = 0; int courseDailyPerformance = 0; int courseFinalGrade = 0; int studentNum = 0; for (CourseSelection cs:courseSelections ) { if (course.getCourseName().equals(cs.getCourse().getCourseName())) { courseAverageScore += cs.getScore().getTotalScore(); courseDailyPerformance += cs.getScore().getDailyPerformance(); courseFinalGrade += cs.getScore().getFinalGrade(); studentNum ++; } } if (studentNum == 0) { System.out.println(course.getCourseName() + " has no grades yet"); } else { courseAverageScore /= studentNum; courseDailyPerformance /= studentNum; courseFinalGrade /= studentNum; if (course.getAssessmentMethod().equals("考试")) { System.out.println(course.getCourseName() + " " + courseDailyPerformance + " " + courseFinalGrade + " " + courseAverageScore); } else if (course.getAssessmentMethod().equals("考察")) { System.out.println(course.getCourseName() + " " + courseFinalGrade + " " + courseAverageScore); } else { System.out.println(course.getCourseName() + " " + courseAverageScore); } } } } public static boolean isCourseExist(String courseName, ArrayList<Course> courses, int length, Student student) { for (Course course:courses ) { if (course.getCourseName().equals(courseName)) { if ((course.getAssessmentMethod().equals("考试") && length != 5) || (course.getAssessmentMethod().equals("考察") && length != 4) || (course.getAssessmentMethod().equals("实验") && length != 4)) { System.out.println(student.getStudentNumber() + " " + student.getStudentName() + " : access mode mismatch"); return false; } else return true; } } System.out.println(courseName + " does not exist"); return true; } public static boolean RepetitiveCourses(Course course,ArrayList<Course> courses) { for (Course cou:courses ) { if (cou.getCourseName().equals(course.getCourseName())) return true; } return false; } public static boolean RepetitiveScores(CourseSelection courseSelection,ArrayList<CourseSelection> courseSelections) { for (CourseSelection cs:courseSelections ) { if (cs.getStudent().getStudentName().equals(courseSelection.getStudent().getStudentName())) { if (cs.getCourse().getCourseName().equals(courseSelection.getCourse().getCourseName())) { return true; } } } return false; } public static void addCourse(String[] nextLine, ArrayList<Course> courses) { Course course = new Course(nextLine[0], nextLine[1], nextLine[2]); if (RepetitiveCourses(course,courses)) return; if (nextLine[0].length() > 10 || (!nextLine[1].equals("必修") && !nextLine[1].equals("选修") && !nextLine[1].equals("实验")) || (!nextLine[2].equals("考试") && !nextLine[2].equals("考察") && !nextLine[2].equals("实验"))) { System.out.println("wrong format"); return; } if ((course.getCourseNature().equals("必修") && !course.getAssessmentMethod().equals("考试")) || (course.getCourseNature().equals("实验") && !course.getAssessmentMethod().equals("实验"))) { System.out.println(course.getCourseName() + " : course type & access mode mismatch"); return; } courses.add(course); } public static void addScoredCourseSelection1(String[] nextLine, ArrayList<CourseSelection> courseSelections, ArrayList<Student> students, ArrayList<Course> courses) { if (!nextLine[3].matches("100|[1-9][0-9]|[0-9]") || !nextLine[4].matches("100|[1-9][0-9]|[0-9]") || nextLine[0].length() != 8 || nextLine[1].length() > 10) { System.out.println("wrong format"); return; } Student student = new Student(nextLine[0], nextLine[1]); Iterator<Student> iterator = students.iterator(); while (iterator.hasNext()) { Student stu = iterator.next(); if (stu.getStudentNumber().equals(student.getStudentNumber())) { iterator.remove(); } } students.add(student); if (isCourseExist(nextLine[2], courses, nextLine.length, student)) { Score score = new ExaminationResults(Integer.parseInt(nextLine[3]), Integer.parseInt(nextLine[4])); for (Course course:courses ) { if (course.getCourseName().equals(nextLine[2])) { CourseSelection courseSelection = new CourseSelection(course, student, score); if (RepetitiveScores(courseSelection,courseSelections)) continue; courseSelections.add(courseSelection); } } } } public static void addScoredCourseSelection2(String[] nextLine, ArrayList<Course> courses, ArrayList<Student> students, ArrayList<CourseSelection> courseSelections) { if (!nextLine[3].matches("100|[1-9][0-9]|[0-9]") || nextLine[0].length() != 8 || nextLine[1].length() > 10) { System.out.println("wrong format"); return; } Student student = new Student(nextLine[0], nextLine[1]); Iterator<Student> iterator = students.iterator(); while (iterator.hasNext()) { Student stu = iterator.next(); if (stu.getStudentNumber().equals(student.getStudentNumber())) { iterator.remove(); } } students.add(student); if (isCourseExist(nextLine[2], courses, nextLine.length, student)) { Score score = new AssessmentResults(Integer.parseInt(nextLine[3])); for (Course course:courses ) { if (course.getCourseName().equals(nextLine[2])) { CourseSelection courseSelection = new CourseSelection(course, student, score); if (RepetitiveScores(courseSelection,courseSelections)) continue; courseSelections.add(courseSelection); } } } } public static void addScoredCourseSelection3(String[] nextLine, ArrayList<Course> courses, ArrayList<Student> students, ArrayList<CourseSelection> courseSelections) { ArrayList<Integer> results = new ArrayList<>(); if (nextLine[0].length() != 8 || nextLine[1].length() > 10 || !nextLine[3].matches("[4-9]")) { System.out.println("wrong format"); return; } for (int i = 4;i < nextLine.length;i ++) { if (!nextLine[i].matches("100|[1-9][0-9]|[0-9]")) { System.out.println("wrong format"); return; } results.add(Integer.parseInt(nextLine[i])); } Student student = new Student(nextLine[0], nextLine[1]); Iterator<Student> iterator = students.iterator(); while (iterator.hasNext()) { Student stu = iterator.next(); if (stu.getStudentNumber().equals(student.getStudentNumber())) { iterator.remove(); } } students.add(student); if (isCourseExist(nextLine[2], courses, nextLine.length - Integer.parseInt(nextLine[3]), student)) { Score score = new ExperimentalResults(results, Integer.parseInt(nextLine[3])); for (Course course:courses ) { if (course.getCourseName().equals(nextLine[2])) { CourseSelection courseSelection = new CourseSelection(course, student, score); if (RepetitiveScores(courseSelection,courseSelections)) continue; courseSelections.add(courseSelection); } } } } } abstract class Score { private int dailyPerformance; // 平时成绩 private int finalGrade; // 期末成绩 public Score() { } public Score(int finalGrade) { this.finalGrade = finalGrade; } public Score(int dailyPerformance, int finalGrade) { this.dailyPerformance = dailyPerformance; this.finalGrade = finalGrade; } public int getDailyPerformance() { return dailyPerformance; } public void setDailyPerformance(int dailyPerformance) { this.dailyPerformance = dailyPerformance; } public int getFinalGrade() { return finalGrade; } public void setFinalGrade(int finalGrade) { this.finalGrade = finalGrade; } public abstract int getTotalScore(); } class ExaminationResults extends Score { public ExaminationResults(int dailyPerformance, int finalGrade) { super(dailyPerformance, finalGrade); } @Override public int getTotalScore() { return (int) (getDailyPerformance() * 0.3 + getFinalGrade() * 0.7); } } class AssessmentResults extends Score { public AssessmentResults(int finalGrade) { super(finalGrade); } public int getTotalScore() { return getFinalGrade(); } } class ExperimentalResults extends Score { private ArrayList<Integer> results = new ArrayList<>(); private int NumberOfTests; public ExperimentalResults(ArrayList<Integer> results, int numberOfTests) { this.results = results; this.NumberOfTests = numberOfTests; } public ArrayList<Integer> getResults() { return results; } public void setResults(ArrayList<Integer> results) { this.results = results; } public int getNumberOfTests() { return NumberOfTests; } public void setNumberOfTests(int numberOfTests) { NumberOfTests = numberOfTests; } @Override public int getTotalScore() { int totalScore = 0; for (int score:this.results ) { totalScore += score; } return totalScore / this.NumberOfTests; } } class Course { private String courseName; // 课程名称 private String courseNature; // 课程性质 private String AssessmentMethod; // 考核方式 public Course(String courseName, String courseNature, String assessmentMethod) { this.courseName = courseName; this.courseNature = courseNature; AssessmentMethod = assessmentMethod; } public Course() { } public String getCourseName() { return courseName; } public void setCourseName(String courseName) { this.courseName = courseName; } public String getCourseNature() { return courseNature; } public void setCourseNature(String courseNature) { this.courseNature = courseNature; } public String getAssessmentMethod() { return AssessmentMethod; } public void setAssessmentMethod(String assessmentMethod) { AssessmentMethod = assessmentMethod; } } class Student { private String studentNumber; private String studentName; public Student(String studentNumber, String studentName) { this.studentNumber = studentNumber; this.studentName = studentName; } public String getStudentNumber() { return studentNumber; } public void setStudentNumber(String studentNumber) { this.studentNumber = studentNumber; } public String getStudentName() { return studentName; } } class Class { private int classNumber; private int classAverageScore; private ArrayList<Student> students = new ArrayList<>(); public Class(int classNumber, ArrayList<Student> students) { this.classNumber = classNumber; this.students = students; } public Class() { } public int getClassAverageScore() { return classAverageScore; } public void setClassAverageScore(int classAverageScore) { this.classAverageScore = classAverageScore; } public int getClassNumber() { return classNumber; } public void setClassNumber(int classNumber) { this.classNumber = classNumber; } public ArrayList<Student> getStudents() { return students; } public void setStudents(ArrayList<Student> students) { this.students = students; } public void addStudent(Student student) { students.add(student); } } class CourseSelection { private Course course; private Student student; private Score score; public CourseSelection(Course course, Student student, Score score) { this.course = course; this.student = student; this.score = score; } public Course getCourse() { return course; } public void setCourse(Course course) { this.course = course; } public Student getStudent() { return student; } public void setStudent(Student student) { this.student = student; } public Score getScore() { return score; } public void setScore(Score score) { this.score = score; } }
7-2 课程成绩统计程序-3
这次较前次实验的总成绩等于课程每次实验成绩乘以权重后累加而得,并且要修改结构,将继承改为组合。主要是要将成绩类个修改一下,并且要注意权重是有浮点误差的所以这个也要判断一下。
类图如下:

源码如下:
import java.text.Collator; import java.util.*; public class Main { public static void main(String[] args) { ArrayList<Class> classes = new ArrayList<>(); ArrayList<Course> courses = new ArrayList<>(); ArrayList<Student> students = new ArrayList<>(); ArrayList<CourseSelection> courseSelections = new ArrayList<>(); Scanner input = new Scanner(System.in); while (true) { String str = input.nextLine(); if (str.equals("end")) { break; } String[] nextLine = str.split(" "); if (nextLine[1].equals("必修") || nextLine[1].equals("选修") || nextLine[1].equals("实验")) { addCourse(nextLine,courses); } else if (nextLine.length == 5) { addScoredCourseSelection1(nextLine,courseSelections,students,courses); } else if (nextLine.length == 4) { addScoredCourseSelection2(nextLine, courses, students, courseSelections); } else if (nextLine.length > 5) { addScoredCourseSelection3(nextLine,courses,students,courseSelections); } else { System.out.println("wrong format"); } } for (Student student:students ) { int classNumber = Integer.parseInt(student.getStudentNumber()) / 100; if (classes.size() == 0) { Class clas = new Class(); clas.setClassNumber(classNumber); clas.getStudents().add(student); classes.add(clas); } else { ListIterator<Class> iterator = classes.listIterator(); while (iterator.hasNext()) { Class clas = iterator.next(); if (clas.getClassNumber() == classNumber) { clas.getStudents().add(student); break; } else { if (classes.indexOf(clas) == classes.size() - 1) { Class clasNew = new Class(); clasNew.setClassNumber(classNumber); clasNew.getStudents().add(student); iterator.add(clasNew); } } } } } Collections.sort(classes, Comparator.comparingInt(o -> o.getClassNumber())); for (Class clas:classes ) { clas.setClassAverageScore(print1(clas.getStudents(), courseSelections)); } print2(courses, courseSelections); for (Class clas:classes ) { if (clas.getClassAverageScore() == -1) { System.out.println(clas.getClassNumber() + " has no grades yet"); } else System.out.println(clas.getClassNumber() + " " + clas.getClassAverageScore()); } } public static int print1(ArrayList<Student> students, ArrayList<CourseSelection> courseSelections) { int classAverageScore = 0; Collections.sort(students, Comparator.comparingInt(o -> Integer.parseInt(o.getStudentNumber()))); for (Student student:students ) { int averageScore = 0; int courseNum = 0; for (CourseSelection cs:courseSelections ) { if (cs.getStudent().getStudentNumber().equals(student.getStudentNumber())) { averageScore += cs.getScore().getTotalScore(); courseNum ++; } } if (courseNum == 0) { System.out.println(student.getStudentNumber() + " " + student.getStudentName() + " did not take any exams"); return -1; } else { averageScore /= courseNum; System.out.println(student.getStudentNumber() + " " + student.getStudentName() + " " + averageScore); } classAverageScore += averageScore; } return classAverageScore / students.size(); } public static void print2(ArrayList<Course> courses, ArrayList<CourseSelection> courseSelections) { Collections.sort(courses, (o1, o2) -> { Collator collator = Collator.getInstance(Locale.CHINA); return collator.compare(o1.getCourseName(), o2.getCourseName()); }); for (Course course:courses ) { int courseAverageScore = 0; int studentNum = 0; for (CourseSelection cs:courseSelections ) { if (course.getCourseName().equals(cs.getCourse().getCourseName())) { courseAverageScore += cs.getScore().getTotalScore(); studentNum ++; } } if (studentNum == 0) { System.out.println(course.getCourseName() + " has no grades yet"); } else { courseAverageScore /= studentNum; System.out.println(course.getCourseName() + " " + courseAverageScore); } } } public static boolean isCourseExist(String courseName, ArrayList<Course> courses, int length, Student student) { for (Course course:courses ) { if (course.getCourseName().equals(courseName)) { if ((course.getAssessmentMethod().equals("考试") && length == 5) || (course.getAssessmentMethod().equals("考察") && length == 4) || (course.getAssessmentMethod().equals("实验") && length == course.getWeightNumber())) { return true; } else { System.out.println(student.getStudentNumber() + " " + student.getStudentName() + " : access mode mismatch"); return false; } } } System.out.println(courseName + " does not exist"); return false; } public static boolean RepetitiveCourses(String courseName,ArrayList<Course> courses) { for (Course cou:courses ) { if (cou.getCourseName().equals(courseName)) return true; } return false; } public static boolean RepetitiveScores(CourseSelection courseSelection,ArrayList<CourseSelection> courseSelections) { for (CourseSelection cs:courseSelections ) { if (cs.getStudent().getStudentName().equals(courseSelection.getStudent().getStudentName())) { if (cs.getCourse().getCourseName().equals(courseSelection.getCourse().getCourseName())) { return true; } } } return false; } public static void addCourse(String[] nextLine, ArrayList<Course> courses) { if (RepetitiveCourses(nextLine[0],courses)) return; if (nextLine[0].length() > 10 || (!nextLine[2].equals("考试") && !nextLine[2].equals("考察") && !nextLine[2].equals("实验"))) { System.out.println("wrong format"); return; } int weightNumber; double totalWeight = 0; ArrayList<Double> weights = new ArrayList<>(); if (nextLine[1].equals("必修")) { if (nextLine.length != 5) { System.out.println(nextLine[0] + " : number of scores does not match"); return; } weightNumber = 2; weights.add(Double.parseDouble(nextLine[3])); weights.add(Double.parseDouble(nextLine[4])); for (double weight:weights ) { totalWeight += weight; } } else if (nextLine[1].equals("选修")) { weightNumber = 1; totalWeight = 1; weights.add(1.0); } else if (nextLine[1].equals("实验")) { weightNumber = Integer.parseInt(nextLine[3]); if (nextLine.length != 4 + weightNumber) { System.out.println(nextLine[0] + " : number of scores does not match"); return; } if (!nextLine[3].matches("[4-9]")) { System.out.println("wrong format"); return; } for (int i = 4;i < nextLine.length;i ++) { weights.add(Double.parseDouble(nextLine[i])); totalWeight += Double.parseDouble(nextLine[i]); } } else { System.out.println("wrong format"); return; } if (Math.abs(totalWeight - 1) > 0.01) { System.out.println(nextLine[0] + " : weight value error"); return; } Course course = new Course(nextLine[0], nextLine[1], nextLine[2], weightNumber, weights); if ((course.getCourseNature().equals("必修") && !course.getAssessmentMethod().equals("考试")) || (course.getCourseNature().equals("实验") && !course.getAssessmentMethod().equals("实验"))) { System.out.println(course.getCourseName() + " : course type & access mode mismatch"); return; } courses.add(course); } public static void addScoredCourseSelection1(String[] nextLine, ArrayList<CourseSelection> courseSelections, ArrayList<Student> students, ArrayList<Course> courses) { if (!nextLine[3].matches("100|[1-9][0-9]|[0-9]") || !nextLine[4].matches("100|[1-9][0-9]|[0-9]") || nextLine[0].length() != 8 || nextLine[1].length() > 10) { System.out.println("wrong format"); return; } Student student = new Student(nextLine[0], nextLine[1]); Iterator<Student> iterator = students.iterator(); while (iterator.hasNext()) { Student stu = iterator.next(); if (stu.getStudentNumber().equals(student.getStudentNumber())) { iterator.remove(); } } students.add(student); if (isCourseExist(nextLine[2], courses, nextLine.length, student)) { for (Course course:courses ) { if (course.getCourseName().equals(nextLine[2])) { Score score = new Score(new ExaminationResults(Integer.parseInt(nextLine[3]), Integer.parseInt(nextLine[4])), course); CourseSelection courseSelection = new CourseSelection(course, student, score); if (RepetitiveScores(courseSelection,courseSelections)) break; courseSelections.add(courseSelection); } } } } public static void addScoredCourseSelection2(String[] nextLine, ArrayList<Course> courses, ArrayList<Student> students, ArrayList<CourseSelection> courseSelections) { if (!nextLine[3].matches("100|[1-9][0-9]|[0-9]") || nextLine[0].length() != 8 || nextLine[1].length() > 10) { System.out.println("wrong format"); return; } Student student = new Student(nextLine[0], nextLine[1]); Iterator<Student> iterator = students.iterator(); while (iterator.hasNext()) { Student stu = iterator.next(); if (stu.getStudentNumber().equals(student.getStudentNumber())) { iterator.remove(); } } students.add(student); if (isCourseExist(nextLine[2], courses, nextLine.length, student)) { for (Course course:courses ) { if (course.getCourseName().equals(nextLine[2])) { Score score = new Score(new AssessmentResults(Integer.parseInt(nextLine[3])), course); CourseSelection courseSelection = new CourseSelection(course, student, score); if (RepetitiveScores(courseSelection,courseSelections)) break; courseSelections.add(courseSelection); } } } } public static void addScoredCourseSelection3(String[] nextLine, ArrayList<Course> courses, ArrayList<Student> students, ArrayList<CourseSelection> courseSelections) { ArrayList<Integer> results = new ArrayList<>(); if (nextLine[0].length() != 8 || nextLine[1].length() > 10) { System.out.println("wrong format"); return; } for (int i = 3;i < nextLine.length;i ++) { if (!nextLine[i].matches("100|[1-9][0-9]|[0-9]")) { System.out.println("wrong format"); return; } results.add(Integer.parseInt(nextLine[i])); } Student student = new Student(nextLine[0], nextLine[1]); Iterator<Student> iterator = students.iterator(); while (iterator.hasNext()) { Student stu = iterator.next(); if (stu.getStudentNumber().equals(student.getStudentNumber())) { iterator.remove(); } } students.add(student); if (isCourseExist(nextLine[2], courses, nextLine.length - 3, student)) { for (Course course:courses ) { if (course.getCourseName().equals(nextLine[2])) { Score score = new Score(new ExperimentalResults(results), course); CourseSelection courseSelection = new CourseSelection(course, student, score); if (RepetitiveScores(courseSelection,courseSelections)) break; courseSelections.add(courseSelection); } } } } } class Score { private ExaminationResults examinationResults; private AssessmentResults assessmentResults; private ExperimentalResults experimentalResults; private Course course; public Score(ExaminationResults examinationResults, Course course) { this.examinationResults = examinationResults; this.course = course; } public Score(AssessmentResults assessmentResults, Course course) { this.assessmentResults = assessmentResults; this.course = course; } public Score(ExperimentalResults experimentalResults, Course course) { this.experimentalResults = experimentalResults; this.course = course; } public int getTotalScore() { if (course.getAssessmentMethod().equals("考试")) { return (int) (examinationResults.getDailyPerformance() * course.getWeight().get(0) + examinationResults.getFinalGrade() * course.getWeight().get(1)); } else if (course.getAssessmentMethod().equals("考察")) { return assessmentResults.getTotalScore(); } else { double totalScore = 0; int i = 0; for (int result:experimentalResults.getResults() ) { totalScore += result * course.getWeight().get(i); i ++; } return (int) (totalScore); } } } class ExaminationResults { private int dailyPerformance; private int finalGrade; public ExaminationResults(int dailyPerformance, int finalGrade) { this.dailyPerformance = dailyPerformance; this.finalGrade = finalGrade; } public int getDailyPerformance() { return dailyPerformance; } public void setDailyPerformance(int dailyPerformance) { this.dailyPerformance = dailyPerformance; } public int getFinalGrade() { return finalGrade; } public void setFinalGrade(int finalGrade) { this.finalGrade = finalGrade; } } class AssessmentResults { private int totalScore; public int getTotalScore() { return totalScore; } public void setTotalScore(int totalScore) { this.totalScore = totalScore; } public AssessmentResults(int totalScore) { this.totalScore = totalScore; } } class ExperimentalResults { private ArrayList<Integer> results = new ArrayList<>(); public ExperimentalResults(ArrayList<Integer> results) { this.results = results; } public ArrayList<Integer> getResults() { return results; } public void setResults(ArrayList<Integer> results) { this.results = results; } } class Course { private String courseName; // 课程名称 private String courseNature; // 课程性质 private String AssessmentMethod; // 考核方式 private int weightNumber; private ArrayList<Double> weight; public Course(String courseName, String courseNature, String assessmentMethod, int weightNumber, ArrayList<Double> weight) { this.courseName = courseName; this.courseNature = courseNature; AssessmentMethod = assessmentMethod; this.weightNumber = weightNumber; this.weight = weight; } public String getCourseName() { return courseName; } public void setCourseName(String courseName) { this.courseName = courseName; } public String getCourseNature() { return courseNature; } public void setCourseNature(String courseNature) { this.courseNature = courseNature; } public String getAssessmentMethod() { return AssessmentMethod; } public void setAssessmentMethod(String assessmentMethod) { AssessmentMethod = assessmentMethod; } public int getWeightNumber() { return weightNumber; } public void setWeightNumber(int weightNumber) { this.weightNumber = weightNumber; } public ArrayList<Double> getWeight() { return weight; } public void setWeight(ArrayList<Double> weight) { this.weight = weight; } } class Student { private String studentNumber; private String studentName; public Student(String studentNumber, String studentName) { this.studentNumber = studentNumber; this.studentName = studentName; } public String getStudentNumber() { return studentNumber; } public void setStudentNumber(String studentNumber) { this.studentNumber = studentNumber; } public String getStudentName() { return studentName; } } class Class { private int classNumber; private int classAverageScore; private ArrayList<Student> students = new ArrayList<>(); public Class(int classNumber, ArrayList<Student> students) { this.classNumber = classNumber; this.students = students; } public Class() { } public int getClassAverageScore() { return classAverageScore; } public void setClassAverageScore(int classAverageScore) { this.classAverageScore = classAverageScore; } public int getClassNumber() { return classNumber; } public void setClassNumber(int classNumber) { this.classNumber = classNumber; } public ArrayList<Student> getStudents() { return students; } public void setStudents(ArrayList<Student> students) { this.students = students; } public void addStudent(Student student) { students.add(student); } } class CourseSelection { private Course course; private Student student; private Score score; public CourseSelection(Course course, Student student, Score score) { this.course = course; this.student = student; this.score = score; } public Course getCourse() { return course; } public void setCourse(Course course) { this.course = course; } public Student getStudent() { return student; } public void setStudent(Student student) { this.student = student; } public Score getScore() { return score; } public void setScore(Score score) { this.score = score; } }
心得:就是题目给出了类图,就行根据这个类图先把整体的框架写出来,然后慢慢构思、一步一步来就行,当然了,还需要注意一下细节就比如浮点误差这个。
三、采坑心得
我觉得在训练集9这道题吧,就我自己的操作是把输入里全部无关紧要的符号全部替换成了空格,但是又会有问题,然而只用正则表达式又不能去掉没用的符合。但把二者结合就不会了,我就一个个试着先把没有的符合去掉,再用正则表判断了。
还有就是最后那次成绩计算系列那道题了,就那个权重和浮点误差的坑了我好久,其实浮点数都又这个问题,以后养成习惯遇到浮点数就要有这个觉悟就行了。
四、改进建议
要改进的就感觉得加点注释了,就比如我现在自己去看都会有点云里雾里的感觉。就成绩计算系列中主函数还是写得太复杂了些,感觉还是没有做到面对对象,导致了后面修改也很复制,写得感觉有点乱,希望日后能有所改进吧。
五、总结
这个阶段虽然感觉比较难,但也确实学到了很多东西,比如说整个javafx的学习以及相关的作业,可能自己做得并不好,但也确实熟悉了javafx。还有就是map和set的学习,这两个一开始还只是在网上搜代码看到了,直到自己用还有训练,也确实真正学习到了,并且也是真好用。此外,就是stock这些,刚开始学是真有点不懂,直到自己摸索以及训练,才真正懂得了其中的奥秘。总之就是要肯下功夫,有时候真正学会了一样东西是真的会有成就感。
六、评价
最后评价一下吧,学Java这门课也有一个学期了,对于段老师边讲边练、以练代学的教学方法,一开始是有点不知所措,但也确实可以学的很多知识,这种方法也让我后期Java的学习变得可以游刃有余了。至于教学组织的线上线下混合式教学,我感觉好像不是很有用,因为网上的课我看得并不是很认真,而且自己学、看课本、查资料也能行。教学过程的pta题目级驱动,我感觉真的很有必要,自己时刻保持这种状态去学习是真的可以学到东西。至于教学模式,感觉比较新颖,比如说javafx这一章的,通过小组学习里面的内容,再让小组亲自讲,激发了我非常大的好奇心,因为小组要亲自讲,所以自己肯定要学得比较透彻,别的大部分小组也讲的很好,这样确实激发了学习的兴趣。总的来说,java这门课还是学得比较有趣,如果pta作业能多延几天就更好了。

浙公网安备 33010602011771号