blog3

一、前言

第七次题目集, 主要是对于继承的应用,在课程成绩统计程序-1的基础上做了小小的提升,总体难度不大

第八次题目集, 主要是对于组合的应用,在课程成绩统计程序-2的基础上做了小小的改变,要注意精度问题总体难度也不大

期末考试题,继承和接口的应用,以及面向对象的程序设计,难度也不大

二、设计与分析

第七次题目集7-3课程成绩统计程序-2:

import java.util.*;

public class Main {
    public static void main(String[] args) {
        Scanner scanner = new Scanner(System.in);
        StudentScoreSystem stuSS = new StudentScoreSystem();
        while(scanner.hasNext()){
            String input = scanner.nextLine();
            if(input.equals("end")){
                break;
            }
            if(isCourseInput(input)){
                if(isCourseMatch(input)){
                    stuSS.addCourseInfo(input);
                }else{//课程性质和课程的考核方式不匹配
                    String[] str = input.split(" ");
                    System.out.println(str[0] + " : course type & access mode mismatch");
                }
            }else if(isScoreInput(input)){
                stuSS.addScoreInfo(input);
            }else {
                System.out.println("wrong format");
            }
        }
        stuSS.output();
    }
    public static boolean isCourseInput(String input){
        if(input.matches("^\\S{1,10} (必修|选修|实验) (考试|考察|实验)$")){
            return true;
        }
        return false;
    }
    public static boolean isCourseMatch(String input){
        if(input.matches("^\\S{1,10} 必修 考试$")){
            return true;
        } else if (input.matches("^\\S{1,10} 选修 (考试|考察)$")) {
            return true;
        } else if (input.matches("^\\S{1,10} 实验 实验$")) {
            return true;
        }else {
            return false;
        }
    }
    public static boolean isScoreInput(String input){
        if(input.matches("^\\d{8} \\S{1,10} \\S{1,10} (100|\\d{1,2}) (100|\\d{1,2})$")){
            return true;
        }else if(input.matches("^\\d{8} \\S{1,10} \\S{1,10} (100|\\d{1,2})$")){
            return true;
        }else if(input.matches("^\\d{8} \\S{1,10} \\S{1,10} [4-9] (\\d{1,2}|100)( (\\d{1,2}|100))+$")){
            return true;
        }
        return false;
    }
}
//课程信息
class Course {
    private String courseName;//课程名称
    private String courseProperty;//课程性质
    private String assessmentMethod;//考核方式

    public Course(String courseName, String courseProperty, String assessmentMethod) {
        this.courseName = courseName;
        this.courseProperty = courseProperty;
        this.assessmentMethod = assessmentMethod;
    }

    public String getCourseName() {
        return courseName;
    }
    public void setCourseName(String courseName) {
        this.courseName = courseName;
    }
    public String getCourseProperty() {
        return courseProperty;
    }
    public void setCourseProperty(String courseProperty) {
        this.courseProperty = courseProperty;
    }
    public String getAssessmentMethod() {
        return assessmentMethod;
    }
    public void setAssessmentMethod(String assessmentMethod) {
        this.assessmentMethod = assessmentMethod;
    }
}
//成绩信息
class Score {
    private String studentId;
    private String studentName;
    public Score(String studentId, String studentName) {
        this.studentId = studentId;
        this.studentName = studentName;
    }
    public int getGrade(){
        return -1;
    }
    public String getStudentId() {
        return studentId;
    }
    public void setStudentId(String studentId){
        this.studentId = studentId;
    }
    public String getStudentName() {
        return studentName;
    }
    public void setCourseName(String courseName) {

    }
    public String getCourseName() {
        return null;
    }
    public void setStudentName(String studentName) {
        this.studentName = studentName;
    }
    public int getDailyScore() {
        return 0;
    }
    public void setDailyScore(int dailyScore) {

    }
    public int getFinalScore() {
        return 0;
    }
    public void setFinalScore(int finalScore) {

    }
    public List<Integer> getExperimentScore() {
        return new ArrayList<>();
    }
    public void setExperimentScore(int experimentScore) {

    }
}
class ExamScore extends Score{
    private String courseName;
    private int dailyScore;//
    private int finalScore;
    public ExamScore(String studentId, String studentName, String courseName, int dailyScore, int finalScore) {
        super(studentId, studentName);
        this.courseName = courseName;
        this.dailyScore = dailyScore;
        this.finalScore = finalScore;
    }
    public int getGrade(){
        return (int)(0.7*finalScore+0.3*dailyScore);
    }

    @Override
    public String getCourseName() {
        return courseName;
    }
    @Override
    public void setCourseName(String courseName) {
        this.courseName = courseName;
    }

    public int getDailyScore() {
        return dailyScore;
    }
    public void setDailyScore(int dailyScore) {
        this.dailyScore = dailyScore;
    }
    public int getFinalScore() {
        return finalScore;
    }
    public void setFinalScore(int finalScore) {
        this.finalScore = finalScore;
    }
}
class InspectScore extends Score{
    private String courseName;
    private int finalScore;
    public InspectScore(String studentId, String studentName, String courseName, int finalScore) {
        super(studentId, studentName);
        this.courseName = courseName;
        this.finalScore = finalScore;
    }
    public int getGrade(){
        return (int) Math.round(finalScore);
    }
    @Override
    public String getCourseName() {
        return courseName;
    }
    @Override
    public void setCourseName(String courseName) {
        this.courseName = courseName;
    }
    public int getFinalScore() {
        return finalScore;
    }
    public void setFinalScore(int finalScore) {
        this.finalScore = finalScore;
    }
}
class ExperimentScore extends Score{
    private String courseName;
    private List<Integer> experimentScore;
    public ExperimentScore(String studentId, String studentName, String courseName, List<Integer> experimentScore) {
        super(studentId, studentName);
        this.courseName = courseName;
        this.experimentScore = experimentScore;
    }
    public int getGrade(){
        int total = 0;
        for(int grade : experimentScore){
            total += grade;
        }
        return total/experimentScore.size();
    }
    @Override
    public String getCourseName() {
        return courseName;
    }
    @Override
    public void setCourseName(String courseName) {
        this.courseName = courseName;
    }
    public List<Integer> getExperimentScore() {
        return experimentScore;
    }
    public void setExperimentScore(List<Integer> experimentScore) {
        this.experimentScore = experimentScore;
    }
}
//选课系统
class StudentScoreSystem{
    private Map<String, Course> courseMap;
    private Map<String, List<Score>> scoreMap;

    public StudentScoreSystem() {
        courseMap = new HashMap<>();
        scoreMap = new HashMap<>();
    }
    public void addCourseInfo(String courseInfo) {
        String[] courseStr = courseInfo.split(" ");
        String courseName = courseStr[0];
        String courseProperty = courseStr[1];
        String assessmentMethod = null;
        if(courseProperty.equals("必修")){
            assessmentMethod = "考试";
        }else{
            assessmentMethod = courseStr[2];
        }
        if(courseMap.get(courseName)!=null){
            return;
        }
        Course course = new Course(courseName, courseProperty, assessmentMethod);
        courseMap.put(courseName, course);
    }

    public void addScoreInfo(String scoreInfo) {
        String[] scoreArr = scoreInfo.split(" ");
        String studentId = scoreArr[0];
        String studentName = scoreArr[1];
        String courseName = scoreArr[2];
        int dailyScore = 0;
        int finalScore = 0;
        if (!scoreMap.containsKey(studentId)) {//没有该同学信息就创建一个新表
            scoreMap.put(studentId, new ArrayList<>());//同一个学生的成绩存入同一个表中
            Score stu = new Score(studentId,studentName);
            scoreMap.get(studentId).add(stu);//在第一个位置添加学生基本信息
        }
        List<Score> scoreList = scoreMap.get(studentId);
        for(Score score : scoreList){
            if(score.getCourseName()!=null&&score.getCourseName().equals(courseName)){
                return;
            }
        }
        if (!courseMap.containsKey(courseName)) {//未找到对应课程
            System.out.println(courseName + " does not exist");
            return;
        }
        Course course = courseMap.get(courseName);//获取该课程对应信息
        if (scoreArr.length == 5 && course.getAssessmentMethod().equals("考试")) {//考试成绩
            dailyScore = Integer.parseInt(scoreArr[3]);//考试有期中和期末成绩
            finalScore = Integer.parseInt(scoreArr[4]);
            Score score = new ExamScore(studentId, studentName, courseName, dailyScore, finalScore);
            scoreList.add(score);
        }else if (scoreArr.length == 4 && course.getAssessmentMethod().equals("考察")) {//考察成绩
            finalScore = Integer.parseInt(scoreArr[3]);//考察只有期末成绩
            Score score = new InspectScore(studentId, studentName, courseName, finalScore);
            scoreList.add(score);
        } else if(scoreArr.length == 4+Integer.parseInt(scoreArr[3]) && course.getAssessmentMethod().equals("实验")){//实验成绩
            List<Integer> experimentScore = new ArrayList<>();
            for(int i=4;i<scoreArr.length;i++){//把多次实验的成绩存入一个表
                experimentScore.add(Integer.parseInt(scoreArr[i]));
            }
            Score score = new ExperimentScore(studentId, studentName, courseName, experimentScore);
            scoreList.add(score);
        }else {//成绩数量和课程的考核方式不匹配
            System.out.println(studentId + " " + studentName + " : access mode mismatch");
        }
    }

    public void output() {
        // 计算学生课程总成绩平均分
        List<String[]> studentScoreList = new ArrayList<>();
        for (String studentId : scoreMap.keySet()) {
            List<Score> scoreList = scoreMap.get(studentId);//该学生所有课程成绩信息
            if (scoreList.size()==1) {//只有基本信息
                //System.out.println(studentId + " " + scoreList.get(0).getStudentName() +" did not take any exams");
                String[] studentScoreArr = new String[3];
                studentScoreArr[0] = studentId;//学号
                studentScoreArr[1] = scoreList.get(0).getStudentName();//姓名
                studentScoreArr[2] = "did not take any exams";
                studentScoreList.add(studentScoreArr);//把学号 姓名 平均分为一组加入List
                continue;
            }
            double totalScore = 1;//去除基本信息的干扰
            for (Score score : scoreList) {
                totalScore += score.getGrade();
            }
            int averageScore = (int) (totalScore/(scoreList.size()-1));//平均成绩
            String[] studentScoreArr = new String[3];
            studentScoreArr[0] = studentId;//学号
            studentScoreArr[1] = scoreList.get(0).getStudentName();//姓名
            studentScoreArr[2] = Integer.toString(averageScore);
            studentScoreList.add(studentScoreArr);//把学号 姓名 平均分为一组加入List
        }
        if(!studentScoreList.isEmpty()){
            Collections.sort(studentScoreList, new Comparator<String[]>() {
                @Override
                public int compare(String[] o1, String[] o2) {
                    return o1[0].compareTo(o2[0]);
                }
            });//学号升序排列
            for (String[] studentScoreArr : studentScoreList) {// 输出学生课程总成绩平均分
                System.out.println(studentScoreArr[0] + " " + studentScoreArr[1] + " " + studentScoreArr[2]);
            }
        }


        // 计算单门课程成绩平均分
        Set<String> courseNameSet = new TreeSet<>();
        for (String courseName : courseMap.keySet()) {
            courseNameSet.add(courseName);//把获取到的课程名加入到TreeSet里,自然排序好
        }
        for (String courseName : courseNameSet) {
            double totalDailyScore = 0;
            double totalFinalScore = 0;
            double totalScore = 0;
            int count = 0;
            for (String studentId : scoreMap.keySet()) {
                List<Score> scoreList = scoreMap.get(studentId);
                for (Score score : scoreList) {
                    if (score.getCourseName()!=null&&score.getCourseName().equals(courseName)) {
                        if(courseMap.get(courseName).getAssessmentMethod().equals("考试")){
                            totalDailyScore += score.getDailyScore();
                            totalFinalScore += score.getFinalScore();
                            totalScore += score.getGrade();
                            count++;
                        }else if(courseMap.get(courseName).getAssessmentMethod().equals("考察")){
                            totalFinalScore += score.getFinalScore();
                            totalScore += score.getGrade();
                            count++;
                        }else{
                            totalScore += score.getGrade();
                            count++;
                        }
                    }
                }
            }
            if (count == 0) {
                System.out.println(courseName + " has no grades yet");
                continue;
            }
            if(courseMap.get(courseName).getAssessmentMethod().equals("考试")){
                System.out.println(courseName + " " + (int)(totalDailyScore/count) + " " +
                        (int)(totalFinalScore/count) + " " +
                        (int)(totalScore/count));
            }else if(courseMap.get(courseName).getAssessmentMethod().equals("考察")){
                System.out.println(courseName + " " + (int)(totalFinalScore/count) + " " +
                        (int)(totalScore/count));
            }else{
                System.out.println(courseName + " " + (int)(totalScore/count));
            }
        }

        // 计算班级所有课程总成绩平均分
        Map<String, List<Double>> classScoreMap = new HashMap<>();
        for (String studentId : scoreMap.keySet()) {
            String classId = studentId.substring(0, 6);
            if (!classScoreMap.containsKey(classId)) {//没有该班级信息
                classScoreMap.put(classId, new ArrayList<>());
            }
            List<Score> scoreList = scoreMap.get(studentId);
            if (scoreList.size()==1) {
                continue;
            }
            double totalScore = 1;
            for (Score score : scoreList) {
                totalScore += score.getGrade();
            }
            classScoreMap.get(classId).add(totalScore / (scoreList.size()-1));
        }
        List<String[]> classScoreList = new ArrayList<>();//存入班级和班级平均分
        for (String classId : classScoreMap.keySet()) {
            List<Double> scoreList = classScoreMap.get(classId);
            if (scoreList.isEmpty()) {
                classScoreList.add(new String[]{classId, "has no grades yet"});
                continue;
            }
            double totalScore = 0;
            for (double score : scoreList) {
                totalScore += score;
            }
            String[] classScoreArr = new String[2];
            classScoreArr[0] = classId;
            classScoreArr[1] = Integer.toString((int)(totalScore / scoreList.size()));//平均分
            classScoreList.add(classScoreArr);
        }
        Collections.sort(classScoreList, new Comparator<String[]>() {
            @Override
            public int compare(String[] o1, String[] o2) {
                return o1[0].compareTo(o2[0]);
            }
        });//根据班级排序
        for (String[] classScoreArr : classScoreList) {
            System.out.println(classScoreArr[0] + " " + classScoreArr[1]);
        }
    }
}

 

代码分析

这段代码是一个学生成绩管理系统,主要功能是录入课程信息和成绩信息,并输出学生和班级的平均成绩。系统分为课程类(Course)、成绩类(Score)和学生成绩系统类(StudentScoreSystem)。

在 Main 类中,通过输入流读取数据,根据输入的内容判断是课程信息还是成绩信息,并调用 StudentScoreSystem 中的方法进行处理。课程信息和成绩信息的格式通过正则表达式进行匹配。

在 Course 类中表示课程的信息,包括课程名称、性质和考核方式。

成绩信息分为三种:考试成绩(ExamScore)、考察成绩(InspectScore)和实验成绩(ExperimentScore),每种成绩根据不同的计算方式计算学生的总成绩。

StudentScoreSystem 类是整个系统的核心,包含了课程信息的存储和成绩信息的处理,最后输出学生和班级的平均成绩。

整体来说,这个系统是一个简单的学生成绩管理系统,能够有效地处理输入的课程信息和成绩信息,并输出相应的统计结果。

第八次题目集7-1课程成绩统计程序-3:

import java.util.*;

public class Main {
    public static void main(String[] args) {
        Scanner scanner = new Scanner(System.in);
        StudentScoreSystem stuSS = new StudentScoreSystem();
        while(scanner.hasNext()){
            String input = scanner.nextLine();
            if(input.equals("end")){
                break;
            }
            if(isCourseInput(input)){
                stuSS.addCourseInfo(input);
            }else if(isScoreInput(input)){
                stuSS.addScoreInfo(input);
            }else {
                System.out.println("wrong format");
            }
        }
        stuSS.output();
    }
    public static boolean isCourseInput(String input){
        if(input.matches("^\\S{1,10} (必修|选修|实验) (考试|考察|实验)( [4-9])?( \\d+\\.\\d+)*$")){
            return true;
        }
        return false;
    }
    public static boolean isScoreInput(String input){
        if(input.matches("^\\d{8} \\S{1,10} \\S{1,10} (100|\\d{1,2}) (100|\\d{1,2})$")){
            return true;
        }else if(input.matches("^\\d{8} \\S{1,10} \\S{1,10} (100|\\d{1,2})$")){
            return true;
        }else if(input.matches("^\\d{8} \\S{1,10} \\S{1,10} (\\d{1,2}|100)( (\\d{1,2}|100))+$")){
            return true;
        }
        return false;
    }
}
//课程信息
class Course {
    private String courseName;//课程名称
    private String courseProperty;//课程性质
    private String assessmentMethod;//考核方式
    private List<Double> pro;//权重

    public Course(String courseName, String courseProperty, String assessmentMethod, List<Double> pro) {
        this.courseName = courseName;
        this.courseProperty = courseProperty;
        this.assessmentMethod = assessmentMethod;
        this.pro = pro;
    }

    public String getCourseName() {
        return courseName;
    }
    public void setCourseName(String courseName) {
        this.courseName = courseName;
    }
    public String getCourseProperty() {
        return courseProperty;
    }
    public void setCourseProperty(String courseProperty) {
        this.courseProperty = courseProperty;
    }
    public String getAssessmentMethod() {
        return assessmentMethod;
    }
    public void setAssessmentMethod(String assessmentMethod) {
        this.assessmentMethod = assessmentMethod;
    }
    public List<Double> getPro() {
        return pro;
    }
}
//成绩信息
class Score {
    private String studentId;
    private String studentName;
    private Course course;
    private List<Integer> grade;//
    public Score(String studentId, String studentName) {
        this.studentId = studentId;
        this.studentName = studentName;
        this.course = null;
        this.grade = new ArrayList<>();
        grade.add(0);
    }
    public Score(String studentId, String studentName, Course course, List<Integer> grade) {
        this.studentId = studentId;
        this.studentName = studentName;
        this.course = course;
        this.grade = grade;
    }
    public double getGrade(){
        int total = 0;
        int i = 0;
        for(int grade : grade){
            if(course==null){
                return 0;
            }
            total += (int)(grade*course.getPro().get(i)*10);
            i++;
        }
        return (double)(total/10);
    }
    public String getStudentId() {
        return studentId;
    }
    public String getStudentName() {
        return studentName;
    }
    public Course getCourse() {
        return course;
    }
}
//选课系统
class StudentScoreSystem{
    private Map<String, Course> courseMap;
    private Map<String, List<Score>> scoreMap;

    public StudentScoreSystem() {
        courseMap = new HashMap<>();
        scoreMap = new HashMap<>();
    }
    public void addCourseInfo(String courseInfo) {
        String[] courseStr = courseInfo.split(" ");
        String courseName = courseStr[0];
        String courseProperty = courseStr[1];
        String assessmentMethod = courseStr[2];
        double one = 0;
        List<Double> pro = new ArrayList<>();
        if(courseMap.get(courseName)!=null){
            return;
        }
        if(!isCourseMatch(courseInfo)){//课程性质和课程的考核方式不匹配
            System.out.println(courseName + " : course type & access mode mismatch");
            return;
        }
        if(assessmentMethod.equals("考试")){
            pro.add(Double.parseDouble(courseStr[3]));//期中占比
            pro.add(Double.parseDouble(courseStr[4]));//期末占比
            one = Double.parseDouble(courseStr[3]) + Double.parseDouble(courseStr[4]);
        }else if(assessmentMethod.equals("实验")){
            if(courseStr.length!=Integer.parseInt(courseStr[3])+4){//实验次数与权重数不匹配
                System.out.println(courseName + " : number of scores does not match");
                return;
            }
            for(int i=4;i<courseStr.length;i++){
                pro.add(Double.parseDouble(courseStr[i]));
                one += Double.parseDouble(courseStr[i]);
            }
        }else{
            pro.add(1.0);
            one = 1.0;
        }
        //权重和不等于1
        if(one > 1.0001||one < 0.9999){
            System.out.println(courseName + " : weight value error");
            return;
        }
        Course course = new Course(courseName, courseProperty, assessmentMethod, pro);
        courseMap.put(courseName, course);
    }
    public boolean isCourseMatch(String input){
        String[] str = input.split(" ");
        if(str[1].equals("必修")&&str[2].equals("考试")){
            return true;
        } else if ((str[1].equals("选修")&&str[2].equals("考试"))||(str[1].equals("选修")&&str[2].equals("考察"))) {
            return true;
        } else if (str[1].equals("实验")&&str[2].equals("实验")) {
            return true;
        }else {
            return false;
        }
    }

    public void addScoreInfo(String scoreInfo) {
        String[] scoreArr = scoreInfo.split(" ");
        String studentId = scoreArr[0];
        String studentName = scoreArr[1];
        String courseName = scoreArr[2];
        if (!scoreMap.containsKey(studentId)) {//没有该同学信息就创建一个新表
            scoreMap.put(studentId, new ArrayList<>());//同一个学生的成绩存入同一个表中
            Score stu = new Score(studentId,studentName);
            scoreMap.get(studentId).add(stu);//在第一个位置添加学生基本信息
        }
        List<Score> scoreList = scoreMap.get(studentId);
        for(Score score : scoreList){
            if(score.getCourse()==null){
                break;
            }
            //成绩不重复记录
            if(score.getCourse().getCourseName()!=null&&score.getCourse().getCourseName().equals(courseName)){
                return;
            }
        }
        if (!courseMap.containsKey(courseName)) {//未找到对应课程
            System.out.println(courseName + " does not exist");
            return;
        }
        Course course = courseMap.get(courseName);//获取该课程对应信息
        if (!isModeMatch(scoreArr,course)) {//成绩数量和课程的考核方式不匹配
            System.out.println(studentId + " " + studentName + " : access mode mismatch");
            return;
        }
        List<Integer> grade = new ArrayList<>();
        for(int i=3;i<scoreArr.length;i++){//把成绩存入一个表
            grade.add(Integer.parseInt(scoreArr[i]));
        }
        Score score = new Score(studentId, studentName, course, grade);
        scoreList.add(score);
    }
    public boolean isModeMatch(String[] scoreArr,Course course){
        if(scoreArr.length == 5 && course.getAssessmentMethod().equals("考试")){
            return true;
        } else if (scoreArr.length == 4 && course.getAssessmentMethod().equals("考察")) {
            return true;
        } else if (scoreArr.length == 3+course.getPro().size() && course.getAssessmentMethod().equals("实验")) {
            return true;
        }else{
            return false;
        }
    }
    public void output() {
        // 计算学生课程总成绩平均分
        List<String[]> studentScoreList = new ArrayList<>();
        for (String studentId : scoreMap.keySet()) {
            List<Score> scoreList = scoreMap.get(studentId);//该学生所有课程成绩信息
            if (scoreList.size()==1) {//只有基本信息
                String[] studentScoreArr = new String[3];
                studentScoreArr[0] = studentId;//学号
                studentScoreArr[1] = scoreList.get(0).getStudentName();//姓名
                studentScoreArr[2] = "did not take any exams";
                studentScoreList.add(studentScoreArr);//把学号 姓名 平均分为一组加入List
                continue;
            }
            double totalScore = 0;//去除基本信息的干扰
            for (Score score : scoreList) {
                if(score.getCourse()!=null){
                    totalScore += score.getGrade();
                }
            }
            int averageScore = (int) Math.floor(totalScore/(scoreList.size()-1));//平均成绩
            String[] studentScoreArr = new String[3];
            studentScoreArr[0] = studentId;//学号
            studentScoreArr[1] = scoreList.get(0).getStudentName();//姓名
            studentScoreArr[2] = Integer.toString(averageScore);
            studentScoreList.add(studentScoreArr);//把学号 姓名 平均分为一组加入List
        }
        if(!studentScoreList.isEmpty()){
            Collections.sort(studentScoreList, new Comparator<String[]>() {
                @Override
                public int compare(String[] o1, String[] o2) {
                    return o1[0].compareTo(o2[0]);
                }
            });//学号升序排列
            for (String[] studentScoreArr : studentScoreList) {// 输出学生课程总成绩平均分
                System.out.println(studentScoreArr[0] + " " + studentScoreArr[1] + " " + studentScoreArr[2]);
            }
        }


        // 计算单门课程成绩平均分
        //把courseMap中获取到的课程名加入到TreeSet里,自然排序好
        Set<String> courseNameSet = new TreeSet<>(courseMap.keySet());
        for (String courseName : courseNameSet) {
            double totalScore = 0;
            int count = 0;
            for (String studentId : scoreMap.keySet()) {
                List<Score> scoreList = scoreMap.get(studentId);
                for (Score score : scoreList) {
                    if (score.getCourse()!=null) {
                        Course course = score.getCourse();
                        if(course.getCourseName()!=null&&course.getCourseName().equals(courseName)){
                            totalScore += score.getGrade();
                            count++;
                        }
                    }
                }
            }
            if (count == 0) {
                System.out.println(courseName + " has no grades yet");
                continue;
            }
            System.out.println(courseName + " " + (int)(totalScore/count));
        }

        // 计算班级所有课程总成绩平均分
        Map<String, List<Integer>> classScoreMap = new HashMap<>();
        for (String studentId : scoreMap.keySet()) {//按学号遍历
            String classId = studentId.substring(0, 6);
            if (!classScoreMap.containsKey(classId)) {//没有该班级信息
                classScoreMap.put(classId, new ArrayList<>());
            }
            List<Score> scoreList = scoreMap.get(studentId);
            if (scoreList.size()==1) {
                continue;
            }
            double totalScore = 0;
            for (Score score : scoreList) {
                totalScore += score.getGrade();
            }
            classScoreMap.get(classId).add((int)Math.floor(totalScore / (scoreList.size()-1)));
        }
        List<String[]> classScoreList = new ArrayList<>();//存入班级和班级平均分
        for (String classId : classScoreMap.keySet()) {
            List<Integer> scoreList = classScoreMap.get(classId);
            if (scoreList.isEmpty()) {
                classScoreList.add(new String[]{classId, "has no grades yet"});
                continue;
            }
            double totalScore = 0;
            for (double score : scoreList) {
                totalScore += score;
            }
            String[] classScoreArr = new String[2];
            classScoreArr[0] = classId;
            classScoreArr[1] = Integer.toString((int)Math.floor(totalScore / scoreList.size()));//平均分
            classScoreList.add(classScoreArr);
        }
        Collections.sort(classScoreList, new Comparator<String[]>() {
            @Override
            public int compare(String[] o1, String[] o2) {
                return o1[0].compareTo(o2[0]);
            }
        });//根据班级排序
        for (String[] classScoreArr : classScoreList) {
            System.out.println(classScoreArr[0] + " " + classScoreArr[1]);
        }
    }
}

代码分析

这是一个学生成绩管理系统,主要实现了课程信息的录入、学生成绩的记录以及成绩统计和输出功能。

Main 类是程序的入口,其中使用 Scanner 读取输入,然后根据输入的内容判断是添加课程信息还是添加成绩信息,然后调用相应的方法进行处理。

Course 类表示课程信息,包括课程名称、课程性质、考核方式和权重等信息。

Score 类表示学生成绩信息,包括学生学号、姓名、所选课程和对应的成绩。

StudentScoreSystem 类实现了选课系统的相关功能,包括添加课程信息、添加成绩信息以及输出成绩统计等功能。

addCourseInfo 方法用于添加课程信息,检查输入的课程信息的格式和正确性,并将课程信息存储在 courseMap 中。

addScoreInfo 方法用于添加学生成绩信息,检查输入的成绩信息的格式和正确性,然后将成绩信息存储在 scoreMap 中。

output 方法用于输出成绩统计信息,包括计算学生成绩平均分、单门课程成绩平均分和班级所有课程总成绩平均分等内容。在 output 方法中,使用各种数据结构和算法实现了成绩统计和输出的功能,包括遍历 scoreMap 和 courseMap、计算平均分、排序输出等。

期末考试:

7-1求得正方体和正三棱锥的表面积和体积,要求必须体现扩展性(继承)和多态性。

7-2魔方问题

 

实现了一个简单的魔方类层次结构,包括一个抽象类RubikCube和两个具体子类SquareCube和RegularPyramidCube。RubikCube类是一个抽象类,定义了魔方的抽象方法calculateSurfaceArea()和calculateVolume(),分别用于计算魔方的表面积和体积。

SquareCube类继承自RubikCube类,并实现了父类中的抽象方法。它包含一个私有成员变量unitCube表示魔方的基本小立方体,通过计算每个小立方体的表面积和体积,从而得到整个魔方的表面积和体积。

RegularPyramidCube类也继承自RubikCube类,并实现了父类中的抽象方法。它包含一个私有成员变量unitPyramid表示魔方的基本四棱锥,同样通过计算每个四棱锥的表面积和体积,从而得到整个魔方的表面积和体积。

在Main类中,首先通过Scanner类获取用户输入的颜色、层数和边长,然后创建SquareCube和RegularPyramidCube对象,并调用display()方法打印魔方的颜色、表面积和体积。

总体来说,这段代码实现了一个简单的魔方类层次结构,并提供了计算魔方表面积和体积的功能。

7-3魔方排序

 

实现了一个简单的魔方类层次结构,包括一个抽象类RubikCube和两个具体子类SquareCube和RegularPyramidCube。RubikCube类是一个抽象类,定义了魔方的抽象方法calculateSurfaceArea()和calculateVolume(),分别用于计算魔方的表面积和体积。此外,RubikCube类实现了Comparable接口,通过重写compareTo方法,实现了对魔方按照体积升序排序。

SquareCube类继承自RubikCube类,并实现了父类中的抽象方法。它包含一个私有成员变量unitCube表示魔方的基本小立方体,通过计算每个小立方体的表面积和体积,从而得到整个魔方的表面积和体积。

RegularPyramidCube类也继承自RubikCube类,并实现了父类中的抽象方法。它包含一个私有成员变量unitPyramid表示魔方的基本四棱锥,同样通过计算每个四棱锥的表面积和体积,从而得到整个魔方的表面积和体积。

在Main类中,首先通过Scanner类获取用户输入的颜色、层数和边长,然后根据用户输入的选择创建SquareCube和RegularPyramidCube对象,并将它们添加到ArrayList中。随后对ArrayList进行排序,并打印出每个魔方的颜色、表面积和体积。

7-3销售步枪问题

实现了一个简单的销售订单系统。首先定义了SalesOrder类,包括私有成员变量gunCount、stockCount和barrelCount分别表示枪支数量、库存数量和枪管数量。构造函数SalesOrder用于初始化销售订单对象,而calculateSalesAmount方法用于计算销售总额,calculateCommission方法用于计算佣金。

在Main类的main方法中,通过Scanner获取用户输入的枪支数量、库存数量和枪管数量,并根据输入创建SalesOrder对象。然后调用calculateSalesAmount和calculateCommission方法计算销售总额和佣金,并将结果进行格式化输出。

另外,代码中还包含了一个isWrongFormate方法用于检查输入的数量是否符合格式要求,如果不符合要求则输出"Wrong Format"。

三、踩坑心得

第七次题目集

7-3: 在处理输入数据时,格式错误是直接输出Wrong Format,如果是数据不符合实际或者是不符合题目要求的异常提示还是要按题目要求排序之后输出,不能直接输出

第八次题目集

7-2: 这题有大量的double类型数据计算,需要考虑在计算过程中的数据丢失而造成的输出错误

四、改进意见

主要困难

对输入格式进行正确解析,并根据输入的数据计算出所需的平均分和总成绩。在解析过程中需要注意处理异常情况,例如输入格式错误、课程信息不匹配、成绩超出范围等。另外,还需要正确处理班级总成绩平均分的排序输出。

改进意见

在输入解析和数据处理中,需要添加异常处理机制,比如对于非法输入或无效操作进行适当的处理。考虑使用面向对象设计原则,将代码中的一些逻辑提取出来,形成更具体的类和方法,以实现代码的模块化和可维护性。一些方法中包含过多的逻辑,可以考虑将其拆分成更小的方法,提高代码的可读性。一些重复的逻辑可以提取出来,避免代码冗余。

五、总结

在完成作业的过程中,我遇到了一些困难和踩过的坑。例如,在处理输入数据时,需要注意对输入格式进行正确解析,并处理异常情况,如输入格式错误或数据不符合要求等。另外,在涉及到大量的浮点数计算时,需要考虑数据精度丢失而造成的输出错误。针对这些困难和问题,我总结了一些改进的意见。首先,在输入解析和数据处理中,应添加异常处理机制,以处理非法输入或无效操作。其次,可以考虑使用面向对象设计原则,提取出一些具体的类和方法,提高代码的模块化和可维护性。此外,对于一些逻辑较为复杂的方法,可以考虑拆分成更小的方法,提高代码的可读性。最后,还应注意避免代码冗余,提取出重复的逻辑。总的来说,通过完成这次作业,我对学生成绩管理系统和魔方类层次结构有了更深入的理解,并且在实践中也遇到了一些问题和困难,但通过总结和改进,我相信可以不断提高自己的编程能力。

posted @ 2023-12-06 18:51  IT精英888  阅读(30)  评论(0)    收藏  举报