前言:从第六次PTA作业开始,就开始进行了一个全新的题目系列,成绩计算系列的java题目依旧复杂,这几次的PTA作业都没有拿到满分,都会有几个测试点无法通过
源码:
import java.text.Collator; import java.util.Locale; import java.util.Scanner; import java.util.Arrays; public class Main { public static void main(String[] args){ Scanner in=new Scanner(System.in); Record record=new Record(); String str = in.nextLine(); while (!str.equals("end")) { String[] data=str.split(" "); if((data.length==3&&data[1].equals("必修")&&data[2].equals("考试")))//对考察方式进行分析 { record.addACourse(data[0],data[1],data[2]); } else if(data.length==3&&data[1].equals("选修")&&(data[2].equals("考试")||data[2].equals("考察")))//对考察方式进行分析 { record.addACourse(data[0],data[1],data[2]); } else if(data.length==3&&data[1].equals("必修")&&data[2].equals("考察"))//对考察方式进行分析 { System.out.println(data[0] + " : " + "course type & access mode mismatch"); } else if(data.length==4||data.length==5) { if(data.length==4&&!(Integer.parseInt(data[3])>=0)&&!(Integer.parseInt(data[3])<=100)) { System.out.println("wrong format");//错误的输入 continue; } else if(data.length==5&&!(Integer.parseInt(data[3])>=0)&&!(Integer.parseInt(data[3])<=100)&&!(Integer.parseInt(data[4])>=0)&&!(Integer.parseInt(data[4])<=100)) { System.out.println("wrong format");//错误的输入 continue; } if(record.findACourse(data[2])!=null) { if(record.findACourse(data[2]).type.equals("必修")&&data.length==5)//对考察方式进行分析 { if(record.findAClass(data[0].substring(0,6))==null) { record.addAClass(data[0].substring(0, 6)); } Grade grade=new ExamGrade(Integer.parseInt(data[3]),Integer.parseInt(data[4])); if(data[0].length()==8&&data[1].length()<=10&&data[2].length()<=10&&Integer.parseInt(data[3])>=0&&Integer.parseInt(data[3])<=100&&Integer.parseInt(data[4])<=100&&Integer.parseInt(data[4])>=0) { record.findAClass(data[0].substring(0, 6)).addAStudent(data[0], data[1], data[2], grade); record.findACourse(data[2]).addScore((ExamGrade) grade); } else System.out.println("wrong format");//错误的输入 } else if(record.findACourse(data[2]).type.equals("选修")&&data.length==4&&record.findACourse(data[2]).assessmentMethod.equals("考察"))//对考察方式进行分析 { if(record.findAClass(data[0].substring(0,6))==null) { record.addAClass(data[0].substring(0, 6)); } Grade grade = new InvestigateGrade(); grade.finalGrade=Integer.parseInt(data[3]); if(data[0].length()==8&&data[1].length()<=10&&data[2].length()<=10&&Integer.parseInt(data[3])>=0&&Integer.parseInt(data[3])<=100) { record.findAClass(data[0].substring(0, 6)).addAStudent(data[0], data[1], data[2], grade); record.findACourse(data[2]).addScore((InvestigateGrade) grade); } else System.out.println("wrong format");//错误的输入 } else if(record.findACourse(data[2]).type.equals("选修")&&data.length==5&&record.findACourse(data[2]).assessmentMethod.equals("考试"))//对考察方式进行分析 { if(record.findAClass(data[0].substring(0,6))==null) { record.addAClass(data[0].substring(0, 6)); } Grade grade=new ExamGrade(Integer.parseInt(data[3]),Integer.parseInt(data[4])); if(data[0].length()==8&&data[1].length()<=10&&data[2].length()<=10&&Integer.parseInt(data[3])>=0&&Integer.parseInt(data[3])<=100&&Integer.parseInt(data[4])<=100&&Integer.parseInt(data[4])>=0) { record.findAClass(data[0].substring(0, 6)).addAStudent(data[0], data[1], data[2], grade); record.findACourse(data[2]).addScore((ExamGrade) grade); } else System.out.println("wrong format");//错误的输入 } else { if(data.length==5) { if(record.findAClass(data[0].substring(0,6))==null) { record.addAClass(data[0].substring(0, 6)); } if(data[0].length()==8&&data[1].length()<=10&&data[2].length()<=10&&Integer.parseInt(data[3])>=0&&Integer.parseInt(data[3])<=100&&Integer.parseInt(data[4])<=100&&Integer.parseInt(data[4])>=0) record.findAClass(data[0].substring(0,6)).addAIllegalStudent(data[0],data[1]); else System.out.println("wrong format");//错误的输入 System.out.println(data[0] + " " + data[1] + " " + ": access mode mismatch");//输入存在错误的输出 } else if(data.length==4)//当数据里的信息长度为4 { if(record.findAClass(data[0].substring(0,6))==null) { record.addAClass(data[0].substring(0, 6)); } if(data[0].length()==8&&data[1].length()<=10&&data[2].length()<=10&&Integer.parseInt(data[3])>=0&&Integer.parseInt(data[3])<=100) record.findAClass(data[0].substring(0,6)).addAIllegalStudent(data[0],data[1]); else System.out.println("wrong format");//错误的输入 System.out.println(data[0] + " " + data[1] + " " + ": access mode mismatch");//输入存在错误的输出 } } } else if(record.findACourse(data[2])==null) { System.out.println(data[2]+" does not exist");//不存在成绩的情况输出 if(record.findAClass(data[0].substring(0,6))==null) { record.addAClass(data[0].substring(0, 6)); } record.findAClass(data[0].substring(0,6)).addAIllegalStudent(data[0],data[1]); } } else System.out.println("wrong format");//错误的输入 str=in.nextLine(); } record.getStudentScore(); record.getCourseScore(); record.getClassScore(); } }
设计与分析:
该程序主要是用于记录学生的成绩信息并进行分析。首先通过Scanner类获取输入的字符串,然后根据输入的字符串进行相应的操作。具体的操作包括:
1. 将输入的字符串按空格分割为数组,判断数组长度以及元素内容,根据不同的条件执行相应的操作。
2. 如果输入的字符串符合要求(长度、格式等),则将数据存入Record类的对象中,包括学生信息、课程信息、成绩信息等。
3. 如果输入的字符串不符合要求,则输出错误提示信息。
4. 当输入的字符串为"end"时,停止输入并进行分析,输出学生的总分、平均分、课程的平均分、班级的平均分等统计结果。
该程序的功能包括:
1. 记录学生的成绩信息,包括学号、姓名、课程名称、成绩等。
2. 分析学生的总分、平均分,课程的平均分,班级的平均分等统计结果。
需要注意的地方:
1. 输入的字符串格式必须符合要求,否则会输出错误提示信息。
2. 考察方式必须是"必修"或"选修",且考察方式与课程类型匹配。
3. 成绩必须在0-100之间。
4. 输入的学生信息、课程信息、成绩信息必须完整,缺少任何一项都会输出错误提示信息。
最后,调用Record类的方法,输出学生的成绩信息以及各项统计结果。
源码:
class Record{//记录所有信息 Class[] theClass = new Class[100]; int n=0; Course[] courses = new Course[100]; static int m=0; Class findAClass(String num) { for(int i=0;i<n;i++) { if(theClass[i].num.equals(num)) return theClass[i]; } return null; } Course findACourse(String courseName) { for(int i=0;i<m;i++) { if(courses[i].courseName.equals(courseName)) return courses[i]; } return null; } void addAClass(String num) { theClass[n]=new Class(); theClass[n].num=num; n++; } void addACourse(String CourseName,String type,String AssessmentMethod ) { if(findACourse(CourseName)==null) { if (CourseName.length() <= 10 && CourseName.length() > 0&&(type.equals("必修")||type.equals("选修"))&&(AssessmentMethod.equals("考察")||AssessmentMethod.equals("考试"))) { courses[m] = new Course(); courses[m].courseName = CourseName; courses[m].type = type; courses[m].assessmentMethod = AssessmentMethod; m++; } else System.out.println("wrong format"); } else if(findACourse(CourseName)!=null) { if (CourseName.length() > 10) { System.out.println("wrong format"); } } } void getStudentScore() { for(int i=0;i<n-1;i++) { for(int j=0;j<n-1-i;j++) { if(theClass[j].num.compareTo(theClass[j+1].num)>0) { Class temp; temp=theClass[j+1]; theClass[j+1]=theClass[j]; theClass[j]=temp; } } } for(int i=0;i<n;i++) { for(int j=0;j<theClass[i].temp-1;j++) { for(int k=1;k<=theClass[i].temp-1-i;k++) { if(theClass[i].student[k].classNum.compareTo(theClass[i].student[k+1].classNum)>0) { Student temp; temp = theClass[i].student[k+1]; theClass[i].student[k+1]=theClass[i].student[k]; theClass[i].student[k]=temp; } } } } for(int i=0;i<n;i++) { for(int j=1;j<=theClass[i].temp;j++) { if(theClass[i].student[j].y>0) System.out.println(theClass[i].student[j].classNum+" "+theClass[i].student[j].name+" "+theClass[i].student[j].getTotalGrade()); else System.out.println(theClass[i].student[j].classNum+" "+theClass[i].student[j].name+" did not take any exams"); } } } void getClassScore() { for(int i=0;i<n;i++) { if(theClass[i].temp==1&&theClass[i].student[1].y==0) { System.out.println(theClass[i].num + " has no grades yet"); break; } if(theClass[i].temp>0) System.out.println(theClass[i].num+" "+theClass[i].getTotalAverageGrade()); } } void getCourseScore() { for(int i=0;i<m;i++) { if(courses[i].studentNum==0) System.out.println(courses[i].courseName+" has no grades yet"); } Collator collator = Collator.getInstance(Locale.CHINA); Arrays.sort(courses,0,m, (c1, c2) -> collator.compare(c1.courseName, c2.courseName)); for(int i=0;i<m;i++) { if(courses[i].type.equals("必修")) { if(courses[i].studentNum>0) { System.out.println(courses[i].courseName + " " + courses[i].getAverageUsualScore() + " " + courses[i].getAverageFinalScore() + " " + courses[i].getAverageScore()); } } else if(courses[i].type.equals("选修")&&courses[i].assessmentMethod.equals("考察")) { if(courses[i].studentNum>0) { System.out.println(courses[i].courseName + " " + courses[i].getAverageFinalScore() + " " + courses[i].getAverageFinalScore()); } } else if(courses[i].type.equals("选修")&&courses[i].assessmentMethod.equals("考试")) { if(courses[i].studentNum>0) { System.out.println(courses[i].courseName + " " + courses[i].getAverageUsualScore() + " " + courses[i].getAverageFinalScore() + " " + courses[i].getAverageScore()); } } } } }
设计与分析:
这段代码是一个Record类,用于记录学生的成绩信息,并进行相应的分析和统计。主要包括以下几个部分:
1. 类的成员变量:
- `theClass`:一个Class类的数组,用于存储班级的信息。
- `n`:记录班级数量的变量。
- `courses`:一个Course类的数组,用于存储课程的信息。
- `m`:记录课程数量的变量。
2. 类的方法:
- `findAClass(String num)`:根据班级号在`theClass`数组中查找并返回相应的Class对象。
- `findACourse(String courseName)`:根据课程名称在`courses`数组中查找并返回相应的Course对象。
- `addAClass(String num)`:向`theClass`数组中添加一个新的班级对象。
- `addACourse(String CourseName,String type,String AssessmentMethod)`:向`courses`数组中添加一个新的课程对象。需要满足一定的格式要求,否则输出错误提示信息。
- `getStudentScore()`:根据学生的班级号和姓名进行排序,并输出学生的成绩信息。
- `getClassScore()`:根据班级号进行排序,并输出班级的平均分。
- `getCourseScore()`:根据课程名称进行排序,并输出课程的平均分。
总结:
该Record类主要用于记录学生的成绩信息,包括学生的基本信息、课程的信息和成绩信息,并提供相应的方法进行分析和统计。通过调用Record类的方法,可以输出学生的成绩信息和各项统计结果。
源码:
class Class{ String num; Student[] student=new Student[100]; int temp=0; int getTotalAverageGrade() { int grade=0; for(int i=1;i<=temp;i++) { grade+=student[i].getTotalGrade(); } return grade/temp; } Student findAStudent(String name) { for(int i=1;i<=temp;i++) { if(student[i].name.equals(name)) { return student[i]; } } return null; } void addAStudent(String classNum, String name, String SubjectName,Grade grade) { if(findAStudent(name)==null) { temp++; student[temp] = new Student(); student[temp].classNum = classNum; student[temp].name = name; //if(student[x].findSubject(SubjectName)==null) student[temp].addSubject(SubjectName, grade); } else if(findAStudent(name)!=null) { if(student[temp].findSubject(SubjectName)==null) findAStudent(name).addSubject(SubjectName, grade); } } void addAIllegalStudent(String classNum,String name) { temp++; student[temp] = new Student(); student[temp].classNum = classNum; student[temp].name = name; } }
设计与分析:
这段代码是一个Class类,用于表示一个班级的信息。主要包括以下几个部分:
1. 类的成员变量:
- `num`:班级号。
- `student`:一个Student类的数组,用于存储学生的信息。
- `temp`:记录学生数量的变量。
2. 类的方法:
- `getTotalAverageGrade()`:计算班级所有学生的平均成绩。遍历学生数组,累加每个学生的总成绩,然后除以学生数量得到平均成绩。
- `findAStudent(String name)`:根据学生姓名在学生数组中查找并返回相应的Student对象。
- `addAStudent(String classNum, String name, String SubjectName,Grade grade)`:向学生数组中添加一个新的学生对象。如果学生已存在,则在该学生对象上添加一个新的科目和成绩;如果学生不存在,则创建一个新的学生对象,并添加科目和成绩。
- `addAIllegalStudent(String classNum,String name)`:向学生数组中添加一个非法学生对象。即不包含科目和成绩信息。
总结:
该Class类用于表示班级的信息,通过存储学生的信息和成绩,提供了计算班级平均成绩以及添加学生和科目的方法。通过调用Class类的方法,可以对班级的学生和成绩进行操作。
源码:
class ExamGrade extends Grade{ public ExamGrade(int parseInt, int parseInt1) { super(parseInt,parseInt1); } int getGrade(){ return (int) (getUsualGrade() * 0.3 + finalGrade * 0.7); } } class InvestigateGrade extends Grade{ public InvestigateGrade(){ } int getGrade(){ return finalGrade; } } class Student{ String classNum; String name; Subject[] subject=new Subject[100]; int y=0; int getTotalGrade() { int totalGrade=0; for(int i=0;i<y;i++) { totalGrade+=subject[i].grade.getGrade(); } if(y!=0) return totalGrade/y; return -1; } void addSubject(String SubjectName,Grade grade) { subject[y]=new Subject(); subject[y].SubjectName = SubjectName; subject[y].grade = grade; y++; } Subject findSubject(String SubjectName) { for(int i=0;i<y;i++) { if(subject[i].SubjectName.equals(SubjectName)) return subject[i]; } return null; } } class Subject{ String SubjectName; Grade grade; } class Course { String courseName; String type; String assessmentMethod; int usualScore = 0; int finalScore = 0; int studentNum = 0; void addScore(ExamGrade examGrade) { finalScore += examGrade.finalGrade; usualScore += examGrade.getUsualGrade(); studentNum++; } void addScore(InvestigateGrade investigateGrade) { finalScore += investigateGrade.finalGrade; studentNum++; } int getAverageUsualScore() { return usualScore/studentNum; } int getAverageFinalScore() { return finalScore/studentNum; } int getAverageScore() { if (type.equals("必修")) { return (int)(getAverageUsualScore() * 0.3 + getAverageFinalScore() * 0.7); } else if (type.equals("选修") && assessmentMethod.equals("考察")) { return getAverageFinalScore(); } else if (type.equals("选修") && assessmentMethod.equals("考试")) { return (int)(getAverageUsualScore() * 0.3 + getAverageFinalScore() * 0.7); } return 0; } } abstract class Grade{ private int usualGrade; int finalGrade; public void setUsualGrade(int usualGrade) { this.usualGrade = usualGrade; } public int getUsualGrade() { return usualGrade; } public Grade(){ } public Grade(int usualGrade, int finalGrade) { setUsualGrade(usualGrade); this.finalGrade=finalGrade; } abstract int getGrade(); }
设计与分析:
这段代码包含了几个类:ExamGrade、InvestigateGrade、Student、Subject、Course和Grade。这些类主要用于表示成绩的信息和进行成绩计算。
1. ExamGrade类:
- 继承自Grade类,表示考试成绩的信息。
- 构造函数接受两个整型参数,分别表示平时成绩和期末成绩。
- 重写了父类的getGrade()方法,根据平时成绩和期末成绩的权重计算最终成绩。
2. InvestigateGrade类:
- 继承自Grade类,表示调查成绩的信息。
- 没有定义构造函数,使用默认构造函数。
- 重写了父类的getGrade()方法,直接返回期末成绩。
3. Student类:
- 表示学生的信息和成绩。
- 成员变量包括班级号、姓名和Subject数组(用于存储学科信息)。
- getTotalGrade()方法计算学生的总成绩,遍历学科数组,累加每个学科的成绩,并返回总成绩的平均值。
- addSubject()方法向学科数组中添加一个新的学科和成绩。
- findSubject()方法根据学科名称在学科数组中查找并返回相应的Subject对象。
4. Subject类:
- 表示学科的信息。
- 成员变量包括学科名称和Grade对象(用于存储成绩信息)。
5. Course类:
- 表示课程的信息。
- 成员变量包括课程名称、类型、考核方式、平时成绩、期末成绩和学生人数。
- addScore()方法根据成绩类型向课程中添加一个新的成绩,并更新平时成绩、期末成绩和学生人数。
- getAverageUsualScore()方法计算平时成绩的平均值。
- getAverageFinalScore()方法计算期末成绩的平均值。
- getAverageScore()方法根据课程类型和考核方式计算课程的平均分。
6. Grade抽象类:
- 表示成绩的信息。
- 成员变量包括平时成绩和期末成绩。
- setUsualGrade()方法设置平时成绩。
- getUsualGrade()方法获取平时成绩。
- 构造函数接受两个整型参数,分别表示平时成绩和期末成绩。
- 定义了抽象方法getGrade(),用于子类实现具体的成绩计算逻辑。
总结:
这些类主要用于表示学生的成绩信息和进行成绩的计算。通过构建对象和调用方法,可以计算学生的总成绩、课程的平均分等。这些类之间通过对象的引用实现了数据的传递和操作。
源码:
import java.text.Collator; import java.util.*; public class Main { // 存储成绩信息的List,每个元素为Grade对象 private static Map<String, Course> courses = new TreeMap<>(); // 存储成绩信息的List,每个元素为Grade对象 private static List<Grade> grades = new ArrayList<>(); public static void main(String[] args) { int flag = 0; Scanner scanner = new Scanner(System.in); StringBuilder sb = new StringBuilder(); String line; while (true) { line = scanner.nextLine(); if (line.equals("end")) { break; } sb.append(line).append("\n"); } String[] st = sb.toString().split("\n"); // 解析输入的数据 for (String a:st) { String[] data = a.split(" "); for (String s : data) { if (s.isEmpty() || s.contains(" ")) { System.out.println("wrong format"); flag = 1; } } if(flag ==0){ if (data.length >= 2 && data.length <= 3) { // 课程信息 if (data[0].length() > 10) { System.out.println("wrong format"); } else if (data[0].length() > 0 && data[0].length() <= 10){ if ((data[1].equals("必修") || data[1].equals("选修") || data[2].equals("实验"))) { if (data.length == 3) { if (data[2].equals("考试") || data[2].equals("考察") || data[2].equals("实验")) { String courseName = data[0]; String courseType = data[1]; String accessMode = data[2]; addCourse(courseName, courseType, accessMode); } else { System.out.println("wrong format"); } } else if (data.length == 2) { String courseName = data[0]; String courseType = data[1]; addCourse(courseName, courseType, "考试"); } else { System.out.println("wrong format"); } } else { System.out.println("wrong format"); } } else { System.out.println("wrong format"); } } else if (data.length >=4 && data.length <= 5) { // 成绩信息 if (data[0].length() != 8) { System.out.println("wrong format"); } else if (courses.keySet().contains(data[2])){ String studentID = data[0]; String studentName = data[1]; String courseName = data[2]; String regex = "^\\d{1,2}$|^100$"; // 匹配0-100的数 if (data.length == 4) { if(data[3].matches(regex)){ int finalGrade = Integer.parseInt(data[3]); addGrade(studentID, studentName, courseName, -1, finalGrade); } else { System.out.println("wrong format"); } } else if (data.length == 5){ if(data[3].matches(regex)){ int dailyGrade = Integer.parseInt(data[3]); int finalGrade = Integer.parseInt(data[4]); addGrade(studentID, studentName, courseName, dailyGrade, finalGrade); } else { System.out.println("wrong format"); } }else { System.out.println("wrong format"); } }else { System.out.println("wrong format"); } } else if (data.length > 5 && data.length <= 13){ // 实验成绩信息 if (data[0].length() != 8) { System.out.println("wrong format"); } else if (courses.keySet().contains(data[2])){ String studentID = data[0]; String studentName = data[1]; String courseName = data[2]; String regex = "^\\d{1,2}$|^100$"; // 匹配0-100的数 if ( data[3].matches("[4-9]")) { for (int i = 4; i < data.length; i++) { if(data[i].matches(regex)) { }else{ break; } } int i; if(data[3].matches("[4-9]")){ i = Integer.parseInt(data[3]); if(i != (data.length - 4)){ addGrade(studentID, studentName, courseName, 0,100); }else{ switch (Integer.parseInt(data[3])) { case 4: int[] exGrades1 = {Integer.parseInt(data[4]), Integer.parseInt(data[5]), Integer.parseInt(data[6]), Integer.parseInt(data[7])}; addGrade(studentID, studentName, courseName, exGrades1); break; case 5: int[] exGrades2 = {Integer.parseInt(data[4]), Integer.parseInt(data[5]), Integer.parseInt(data[6]), Integer.parseInt(data[7]), Integer.parseInt(data[8])}; addGrade(studentID, studentName, courseName, exGrades2); break; case 6: int[] exGrades3 = {Integer.parseInt(data[4]), Integer.parseInt(data[5]), Integer.parseInt(data[6]), Integer.parseInt(data[7]), Integer.parseInt(data[8]), Integer.parseInt(data[9])}; addGrade(studentID, studentName, courseName, exGrades3); break; case 7: int[] exGrades4 = {Integer.parseInt(data[4]), Integer.parseInt(data[5]), Integer.parseInt(data[6]), Integer.parseInt(data[7]), Integer.parseInt(data[8]), Integer.parseInt(data[9]), Integer.parseInt(data[10])}; addGrade(studentID, studentName, courseName, exGrades4); break; case 8: int[] exGrades5 = {Integer.parseInt(data[4]), Integer.parseInt(data[5]), Integer.parseInt(data[6]), Integer.parseInt(data[7]), Integer.parseInt(data[8]), Integer.parseInt(data[9]), Integer.parseInt(data[10]), Integer.parseInt(data[11])}; addGrade(studentID, studentName, courseName, exGrades5); break; case 9: int[] exGrades6 = {Integer.parseInt(data[4]), Integer.parseInt(data[5]), Integer.parseInt(data[6]), Integer.parseInt(data[7]), Integer.parseInt(data[8]), Integer.parseInt(data[9]), Integer.parseInt(data[10]), Integer.parseInt(data[11]), Integer.parseInt(data[12])}; addGrade(studentID, studentName, courseName, exGrades6); break; default: System.out.println("wrong format"); } } } } else { System.out.println("wrong format"); } }else { System.out.println("wrong format"); } }else { System.out.println("wrong format"); } } } // 输出结果 outputStudentGradeAverage(); outputCourseGradeAverage(); outputClassGradeAverage(); } /** * 添加课程信息 */ /** * 添加课程信息 */ private static void addCourse(String courseName, String courseType, String accessMode) { if (courses.containsKey(courseName)) { }else { boolean isExam = "考试".equals(accessMode); boolean isRequired = "必修".equals(courseType); if (isRequired && !isExam) { System.out.println(courseName + " : course type & access mode mismatch"); }else{ Course course = new Course(courseName, isRequired, isExam); courses.put(courseName, course); } } } /** * 添加成绩信息 */ private static void addGrade(String studentID, String studentName, String courseName, int dailyGrade, int finalGrade) { int flag1 = 0; for(int i = 0; i < courses.get(courseName).getGrades().size(); i++) { if (courses.get(courseName).getGrades().get(i).getStudentID().equals(studentID)){ flag1 = 1; break; } } if(flag1 == 0) { if ((!courses.get(courseName).isExam() && courses.get(courseName).isRequired())) { // 课程不存在,输出错误信息 System.out.println(courseName + " does not exist"); } Course course = courses.get(courseName); if ((dailyGrade == -1) == course.isExam()) { // 成绩数量和考核方式不匹配,输出错误信息 System.out.println(studentID + " " + studentName + " : access mode mismatch"); finalGrade = -1; } if (!course.isExam() && course.isRequired()) { finalGrade = -1; } if (finalGrade > 100 || dailyGrade > 100 ) { System.out.println("wrong format"); } else { Grade grade = new Grade(studentID, studentName, courseName, dailyGrade, finalGrade,null); grades.add(grade); courses.get(courseName).addGrade(grade); } } } private static void addGrade(String studentID, String studentName, String courseName, int[] exGrades) { int flag1 = 0; for(int i = 0; i < courses.get(courseName).getGrades().size(); i++) { if (courses.get(courseName).getGrades().get(i).getStudentID().equals(studentID)){ flag1 = 1; break; } } if(flag1 == 0) { if ((!courses.get(courseName).isExam() && courses.get(courseName).isRequired())) { // 课程不存在,输出错误信息 System.out.println(courseName + " does not exist"); } Course course = courses.get(courseName); for (int i:exGrades) { if (i < 0 || i > 100) { System.out.println("wrong format"); return; } } Grade grade = new Grade(studentID, studentName, courseName, -1, -2,exGrades); grades.add(grade); courses.get(courseName).addGrade(grade); } } /** * 输出学生所有课程总成绩的平均分 */ private static void outputStudentGradeAverage() { // 将grades按学号从小到大排序 Collections.sort(grades, Comparator.comparing(Grade::getStudentID)); // 使用TreeMap保存学生信息并排序 Map<String, Student> students = new TreeMap<>(); for (Grade grade : grades) { String studentID = grade.getStudentID(); if (!students.containsKey(studentID)) { students.put(studentID, new Student(studentID, grade.getStudentName())); } Student student = students.get(studentID); student.addGrade(grade); } // 遍历并输出每个学生的平均分 for (String studentID : students.keySet()) { Student student = students.get(studentID); double averageGrade = student.getAverageGrade(); if (averageGrade == -1) { System.out.println(studentID + " " + student.getStudentName() + " did not take any exams"); } else { System.out.println(studentID + " " + student.getStudentName() + " " + (int) averageGrade); } } } /** * 输出单门课程成绩平均分 */ private static void outputCourseGradeAverage() { // 按课程名称的字母顺序排序 List<String> courseNames = new ArrayList<>(courses.keySet()); // 使用 Collator 比较字符串的大小,实现按照汉字字母顺序排序 Collator collator = Collator.getInstance(Locale.CHINA); Collections.sort(courseNames, collator::compare); for (String courseName : courseNames) { Course course = courses.get(courseName); if(!grades.isEmpty()){ for(int i=0;i<grades.size();i++) course.addGrade(grades.get(i)); } if(!course.isExam() && course.isRequired()) { }else{ if (course.isExam()) { // 考试课程,需要计算平时成绩和总成绩平均分 double dailyAverage = course.getDailyAverage(); double finalAverage = course.getFinalAverage(); double totalAverage = course.getTotalAverage(); if(totalAverage == -1||totalAverage == 0) { System.out.println(courseName + " has no grades yet"); } else { System.out.println(courseName + " " + (int) dailyAverage + " " + (int) finalAverage + " " + (int) totalAverage); } } else { // 考察课程,只需要计算期末成绩平均分 double finalAverage = course.getFinalAverage(); double totalAverage = course.getTotalAverage(); if (finalAverage == -1) { System.out.println(courseName + " has no grades yet"); } else if (finalAverage == -2) { System.out.println(courseName + " " + (int) totalAverage); }else { System.out.println(courseName + " " + (int) finalAverage + " " + (int) finalAverage); } } } } } /** * 输出班级所有课程总成绩平均分 */ private static void outputClassGradeAverage() { Map<String, List<Grade>> classGrades = new HashMap<>(); for (Grade grade : grades) { String studentID = grade.getStudentID(); String classID = studentID.substring(0, 6); if (!classGrades.containsKey(classID)) { classGrades.put(classID, new ArrayList<>()); } classGrades.get(classID).add(grade); } List<String> classIDs = new ArrayList<>(classGrades.keySet()); // 按班级号从小到大排序 Collections.sort(classIDs); for (String classID : classIDs) { List<Grade> classGradeList = classGrades.get(classID); double totalGradeSum = 0; int totalGradeCount = 0; for (Grade grade : classGradeList) { double totalGrade = grade.getTotalGrade(); if (!Double.isNaN(totalGrade)) { totalGradeSum += totalGrade; totalGradeCount++; } } if (totalGradeSum == -1) { System.out.println(classID + " has no grades yet"); } else { double totalAverageGrade = totalGradeSum / totalGradeCount; System.out.println(classID + " " + (int) totalAverageGrade); } } } } class Course { String courseName; // 课程名称 boolean isRequired; // 是否必修 boolean isExam; // 是否考试 List<Grade> grades = new ArrayList<>(); // 成绩列表 public Course(String courseName, boolean isRequired, boolean isExam) { this.courseName = courseName; this.isRequired = isRequired; this.isExam = isExam; } public boolean isExam() { return isExam; } public boolean isRequired() { return isRequired; } /** * 添加成绩到该课程 */ public void addGrade(Grade grade) { if (grade.getCourseName().equals(courseName)) { grades.add(grade); } } /** * 计算平时成绩平均分 */ public double getDailyAverage() { int dailyGradeSum = 0; int dailyGradeCount = 0; for (Grade grade : grades) { int dailyGrade = grade.getDailyGrade(); if (dailyGrade != -1) { dailyGradeSum += dailyGrade; dailyGradeCount++; } } if (dailyGradeCount == 0) { return 0; } return (double) dailyGradeSum / dailyGradeCount; } /** * 计算期末成绩平均分 */ public double getFinalAverage() { int finalGradeSum = 0; int finalGradeCount = 0; for (Grade grade : grades) { int finalGrade = grade.getFinalGrade(); finalGradeSum += finalGrade; finalGradeCount++; } if (finalGradeCount == 0) { return -1; } return (double) finalGradeSum / finalGradeCount; } /** * 计算总成绩平均分 */ public double getTotalAverage() { int totalGradeSum = 0; int totalGradeCount = 0; for (Grade grade : grades) { double totalGrade = grade.getTotalGrade(); if (!Double.isNaN(totalGrade)) { totalGradeSum += totalGrade; totalGradeCount++; } } if (totalGradeCount == 0) { return 0; } return (double) totalGradeSum / totalGradeCount; } public List<Grade> getGrades(){ return grades; } } class Grade { private String studentID; // 学号 private String studentName; // 姓名 private String courseName; // 课程名称 private int dailyGrade; // 平时成绩,如果没有则为-1 private int finalGrade; // 期末成绩 private int[] exGrades; // 实验成绩 public Grade(String studentID, String studentName, String courseName, int dailyGrade, int finalGrade, int[] exGrades) { this.studentID = studentID; this.studentName = studentName; this.courseName = courseName; this.dailyGrade = dailyGrade; this.finalGrade = finalGrade; this.exGrades = exGrades; } public String getStudentID() { return studentID; } public String getStudentName() { return studentName; } public String getCourseName() { return courseName; } public int getDailyGrade() { return dailyGrade; } public int getFinalGrade() { return finalGrade; } /** * 计算总成绩 */ public double getTotalGrade() { if(dailyGrade == -1 && finalGrade == -2){ int sum = 0; int count = 0; for (int i:exGrades) { sum+=i; count++; } return (int)sum / count; } else if (dailyGrade == -1) { return finalGrade; } else if (finalGrade == -1){ return finalGrade; } else { return dailyGrade * 0.3 + finalGrade * 0.7; } } } class Student { private List<Grade> grades = new ArrayList<>(); // 成绩列表 private String studentID; // 学号 private String studentName; // 姓名 public Student(String studentID, String studentName) { this.studentID = studentID; this.studentName = studentName; } public String getStudentName() { return studentName; } public void addGrade(Grade grade) { if (grade.getStudentID().equals(studentID)) { grades.add(grade); } } /** * 计算该学生所有课程的总成绩平均分 */ public double getAverageGrade() { int totalGradeSum = 0; int totalGradeCount = 0; for (Grade grade : grades) { double totalGrade = grade.getTotalGrade(); if (!Double.isNaN(totalGrade)) { totalGradeSum += totalGrade; totalGradeCount++; } } if (totalGradeCount == 0) { return -1; } else { return (double) totalGradeSum / totalGradeCount; } } }
设计与分析:
该代码主要实现了一个学生成绩管理系统。主要包括以下功能:
1. 解析输入的数据:通过输入一系列课程信息和成绩信息,将其解析为对应的课程对象和成绩对象,并存储在相应的数据结构中(courses和grades)。
2. 添加课程:根据输入的课程信息,创建课程对象,并添加到课程列表(courses)中。
3. 添加成绩:根据输入的成绩信息,创建成绩对象,并添加到成绩列表(grades)中。同时更新对应课程的成绩信息。
4. 输出学生平均分:按学生ID升序输出每个学生的平均分。
5. 输出课程平均分:按课程名称升序输出每个课程的平均分。
6. 输出班级平均分:计算所有学生的平均分,并输出。
7. 错误格式处理:对于输入的错误格式,输出相应错误信息。
代码中使用了Map和List来存储课程和成绩信息,通过循环和条件判断进行解析和处理。同时使用了正则表达式对输入进行格式匹配。最后根据要求输出相应的结果。
添加成绩信息: 该方法用于添加成绩信息,根据输入的参数判断课程是否存在以及成绩的格式是否正确,如果课程不存在则输出错误信息,如果成绩的格式不正确则输出错误信息,否则创建成绩对象并添加到成绩列表中。
添加课程信息: 该方法用于添加课程信息,根据输入的参数判断课程是否已经存在,如果课程已经存在则不做处理,否则根据输入的参数创建课程对象并添加到课程列表中。
输出学生所有课程总成绩的平均分: 该方法用于输出学生所有课程总成绩的平均分,先按照学生ID升序对成绩列表进行排序,然后遍历成绩列表,计算每个学生的总成绩并输出。
在添加成绩信息的方法中,有两个重载的方法,一个是根据每次的考试成绩和平时成绩添加成绩信息,另一个是根据考试成绩列表添加成绩信息。在添加成绩信息的方法中,还判断了课程的考核方式和所需成绩数量是否匹配,如果不匹配则输出错误信息。
输出学生所有课程总成绩的平均分: 该方法首先对成绩列表按学号从小到大进行排序,然后使用TreeMap保存学生信息,并根据学号对学生信息进行排序。接着遍历成绩列表,如果学生信息中不存在该学号,则创建学生对象并添加到学生信息中,然后将成绩添加到学生的成绩列表中。最后遍历学生信息,计算每个学生的平均成绩并输出。
输出单门课程成绩平均分: 该方法首先将课程名称按字母顺序排序,然后遍历课程列表。如果成绩列表不为空,将成绩列表中的成绩添加到课程中。根据课程的考核方式和是否必修判断是否需要计算平时成绩和总成绩平均分或只需要计算期末成绩平均分。然后根据计算结果输出相应信息。
输出班级所有课程总成绩平均分: 该方法首先根据成绩列表将成绩按班级号进行分组,然后对班级号进行排序。接着遍历班级号列表,计算每个班级的总成绩和总成绩数量,如果总成绩和总成绩数量不存在或为-1,则输出相应信息,否则计算班级的平均成绩并输出。
Course类表示课程,包括课程名称、是否必修、是否考试和成绩列表。该类提供了添加成绩、计算平时成绩平均分、计算期末成绩平均分和计算总成绩平均分的方法。
Grade类表示某个学生的某门课程的成绩,包括学号、姓名、课程名称、平时成绩、期末成绩和实验成绩。该类提供了计算总成绩的方法。
Student类表示学生,包括成绩列表、学号和姓名。该类提供了添加成绩和计算该学生所有课程的总成绩平均分的方法。
由于第八次PTA内的成绩计算系统我为完成要求的功能,所以无法给出相应的分析与总结