当前位置: 首页 >> 资讯 > > 正文

天天报道:BLOG-3----22206117

2023-06-23 17:22:39博客园

这次博客主要讨论3个成绩课程成绩成绩系统:


(资料图片仅供参考)

由于这几次基本都是满分,所以只是简单讨论讨论我的踩坑心得和代码思路!

分别是1-2-3,这一次依旧是以一为主,二和三的难度都是在1的程度上进行增加的.

这是成绩统计系统1的题目和代码:

某高校课程从性质上分为:必修课、选修课,从考核方式上分为:考试、考察。

考试的总成绩由平时成绩、期末成绩分别乘以权重值得出,比如平时成绩权重0.3,期末成绩权重0.7,总成绩=平时成绩*0.3+期末成绩*0.7。

考察的总成绩直接等于期末成绩

必修课的考核方式必须为考试,选修课可以选择考试、考察任一考核方式。

1、输入:

包括课程、课程成绩两类信息。

课程信息包括:课程名称、课程性质、考核方式(可选,如果性质是必修课,考核方式可以没有)三个数据项。

课程信息格式:课程名称+英文空格+课程性质+英文空格+考核方式

课程性质输入项:必修、选修

考核方式输入选项:考试、考察

课程成绩信息包括:学号、姓名、课程名称、平时成绩(可选)、期末成绩

课程信息格式:学号+英文空格+姓名+英文空格+课程名称+英文空格+平时成绩+英文空格+期末成绩

以上信息的相关约束:

1)平时成绩和期末成绩的权重默认为0.3、0.7

2)成绩是整数,不包含小数部分,成绩的取值范围是【0,100】

3)学号由8位数字组成

4)姓名不超过10个字符

5)课程名称不超过10个字符

6)不特别输入班级信息,班级号是学号的前6位。

2、输出:

输出包含三个部分,包括学生所有课程总成绩的平均分、单门课程成绩平均分、单门课程总成绩平均分、班级所有课程总成绩平均分。

为避免误差,平均分的计算方法为累加所有符合条件的单个成绩,最后除以总数。

1)学生课程总成绩平均分按学号由低到高排序输出

格式:学号+英文空格+姓名+英文空格+总成绩平均分

如果某个学生没有任何成绩信息,输出:学号+英文空格+姓名+英文空格+"did not take any exams"

2)单门课程成绩平均分分为三个分值:平时成绩平均分(可选)、期末考试平均分、总成绩平均分,按课程名称的字符顺序输出

格式:课程名称+英文空格+平时成绩平均分+英文空格+期末考试平均分+英文空格+总成绩平均分

如果某门课程没有任何成绩信息,输出:课程名称+英文空格+"has no grades yet"

3)班级所有课程总成绩平均分按班级由低到高排序输出

格式:班级号+英文空格+总成绩平均分

如果某个班级没有任何成绩信息,输出:班级名称+英文空格+ "has no grades yet"

异常情况:

1)如果解析某个成绩信息时,课程名称不在已输入的课程列表中,输出:学号+英文空格+姓名+英文空格+":"+课程名称+英文空格+"does not exist"

2)如果解析某个成绩信息时,输入的成绩数量和课程的考核方式不匹配,输出:学号+英文空格+姓名+英文空格+": access mode mismatch"

以上两种情况如果同时出现,按第一种情况输出结果。

3)如果解析某个课程信息时,输入的课程性质和课程的考核方式不匹配,输出:课程名称+" : course type & access mode mismatch"

4)格式错误以及其他信息异常如成绩超出范围等,均按格式错误处理,输出"wrong format"

5)若出现重复的课程/成绩信息,只保留第一个课程信息,忽略后面输入的。

信息约束:

1)成绩平均分只取整数部分,小数部分丢弃

代码:

package 课程成绩统计分析系统;import java.util.ArrayList;import java.util.List;import java.util.Scanner;import java.util.concurrent.atomic.AtomicInteger;import java.util.Collections;import java.util.Comparator;public class Main {    public static void main(String[] args) {        Scanner in = new Scanner(System.in);        int juddgeexist=0;        Course cou__cou = new Course(null, null, null);        Student stu__stu = new Student(null, null);        grade gra_gra=new grade(null);        String five="^(\\d{8})\\s+([\\u4e00-\\u9fa5a-zA-Z0-9_]{1,10})\\s+([\\u4e00-\\u9fa5a-zA-Z0-9_]{1,10})\\s+([0-9]|[1-9][0-9]|100)\\s+([0-9]|[1-9][0-9]|100)$";        String four="^(\\d{8})\\s+([\\u4e00-\\u9fa5a-zA-Z0-9_]{1,10})\\s+([\\u4e00-\\u9fa5a-zA-Z0-9_]{1,10})\\s+([0-9]|[1-9][0-9]|100)$";        Chosecoure date = new Chosecoure();        int cont = 0;        while (in.hasNextLine()) {            String a = in.nextLine().trim();            String[] b = a.split(" ");            int length = b.length;            int iq = 0;            if (a.equals("end"))                break;            else {                if (length == 2) {                    Course c = new Course(b[0], b[1]);                    if (c.课程性质和课程的考核方式匹配()) {                        for (Course e : date.course) {                            if (e.name.equals(b[0]) && e.nature.equals(b[1])) {                                iq=1;                                break;                            }                            else{                                iq=0;                            }                        }                        if(iq==0)                        {                            date.course.add(c);                        }                    }                }                if (length == 3) {                    Course c = new Course(b[0], b[1], b[2]);                    if (c.课程性质和课程的考核方式匹配()) {                        for (Course e : date.course) {                            if (e.name.equals(b[0]) && e.nature.equals(b[1])&&e.assessment.equals(b[3])) {                                iq=1;                                break;                            }                            else{                                iq=0;                            }                        }                        if(iq==0)                        {                            date.course.add(c);                        }                    }                }                if (length == 4 || length == 5) {                    if (length == 4) {                        Score sco = new Score(b[0], b[1], b[2], -1, Integer.parseInt(b[3]));                        Student stu = new Student(b[0],b[1]);                        if (sco.存在这个课程(b[2], date.course) == true && sco.成绩数量匹配考核方式(b[2], date.course) == true&&a.matches(four))//判断数据是否合法                        {                            if(cont==0)                        {                            sco.dailyScore=0;                            sco.decidecourse(date.course);                            date.score.add(sco);                            sco.dailyScore=-1;                            date.student.add(stu);                            date.grades.add(new grade(gra_gra.getgradenumber(b[0])));                            cont++;                        }                            for (Score e : date.score) {                                if (e.number.equals(b[0]) && e.name.equals(b[1]) && e.course.name.equals(b[2]) && e.dailyScore == -1&&e.examScore == Integer.parseInt(b[3])) {                                 break;                                }                                else {                                    sco.dailyScore=0;                                    sco.decidecourse(date.course);                                    date.score.add(sco);//将学生的成绩存入数据库成绩                                    // stu.student_score.add(sco);//存储数据将学生的成绩存到学生里面                                    date.student.add(stu);//存储数据将学生存入数据库                                    for (grade m : date.grades) {                                        if (m.gradenumber.equals(gra_gra.getgradenumber(b[0])))                                            {                                                juddgeexist=1;                                                break;                                            }                                            else{                                                juddgeexist=0;                                            }                                        }                                    if(juddgeexist==0)                                        date.grades.add(new grade(gra_gra.getgradenumber(b[0])));                                    break;                                    }                                }                        } else if (!sco.存在这个课程(b[2], date.course) && !sco.成绩数量匹配考核方式(b[2], date.course)) {                            System.out.println(b[2] + " does not exist");                            date.student.add(stu);                            date.grades.add(new grade(gra_gra.getgradenumber(b[0])));                        } else if (!sco.存在这个课程(b[2], date.course)) {                            System.out.println(b[2] + " does not exist");                            date.student.add(stu);                            date.grades.add(new grade(gra_gra.getgradenumber(b[0])));                        } else if (!sco.成绩数量匹配考核方式(b[2], date.course)) {                            System.out.println(b[0] + " " + b[1] + " : access mode mismatch");                            date.grades.add(new grade(gra_gra.getgradenumber(b[0])));                            date.student.add(stu);                        }                        else if(!a.matches(four))                        {                            System.out.println("wrong format");                        }                    }                    if (length == 5)                     {                        Score sco = new Score(b[0], b[1], b[2], Integer.parseInt(b[3]), Integer.parseInt(b[4]));                        Student stu = new Student(b[0],b[1]);                        if (sco.存在这个课程(b[2], date.course) == true && sco.成绩数量匹配考核方式(b[2], date.course) == true&&a.matches(five))//判断数据是否合法                        {                            if(cont==0)                            {                                sco.decidecourse(date.course);                                date.score.add(sco);                                date.student.add(stu);                                date.grades.add(new grade(gra_gra.getgradenumber(b[0])));                                cont++;                            }                            for (Score e : date.score) {                                if (e.number.equals(b[0]) && e.name.equals(b[1]) && e.course.name.equals(b[2]) && e.dailyScore == Integer.parseInt(b[3])&&e.examScore == Integer.parseInt(b[4])) {                                    break;                                }                                else {                                    date.score.add(sco);//将学生的成绩存入数据库成绩                                    sco.decidecourse(date.course);                                    // stu.student_score.add(sco);//存储数据将学生的成绩存到学生里面                                    date.student.add(stu);//存储数据将学生存入数据库                                    for (grade m : date.grades) {                                        if (m.gradenumber.equals(gra_gra.getgradenumber(b[0])))                                        {                                            juddgeexist=1;                                            break;                                        }                                        else{                                            juddgeexist=0;                                        }                                    }                                    if(juddgeexist==0)                                        date.grades.add(new grade(gra_gra.getgradenumber(b[0])));                                    break;                                }                            }                        } else if (!sco.存在这个课程(b[2], date.course) && !sco.成绩数量匹配考核方式(b[2], date.course)) {                            System.out.println(b[2] + " does not exist");                            date.grades.add(new grade(gra_gra.getgradenumber(b[0])));                            date.student.add(stu);                        } else if (!sco.存在这个课程(b[2], date.course)) {                            date.student.add(stu);                            date.grades.add(new grade(gra_gra.getgradenumber(b[0])));                            System.out.println(b[2] + " does not exist");                        } else if (!sco.成绩数量匹配考核方式(b[2], date.course)) {                            date.student.add(stu);                            date.grades.add(new grade(gra_gra.getgradenumber(b[0])));                            System.out.println(b[0] + " " + b[1] + " : access mode mismatch");                        }                        else if(!a.matches(five))                        {                            System.out.println("wrong format");                        }                    }                }            }        }//开始进行数据的处理了        for (Student e : date.student) {               e.getStudenttotol(date.score);        }            int flag = 0;            String num = "000";            for (Student q : date.student) {                flag = 0;                if(!num.equals(q.number))                    flag = 1;                num = q.number;                if(flag == 1)                {                    if (q.JudgeEmpty())                         System.out.println(q.number + " " + q.name + " " + q.student_score);                    else                        System.out.println(q.number+" "+q.name+" "+"did not take any exams");                }            }                           date.Course_and_Score();             date.output();             date.grade_score(date.score);             date.grades.forEach((e)->{                 if(e.size!=0)                     System.out.println(e.gradenumber+" "+e.grade_score);             });        }}class Course{   String name;   String nature;   String assessment;   int course_score=0;   int course_dailyscore=0;   int course_finalscore=0;   int found=0;   Course(String name,String nature,String assessment)   {       this.assessment=assessment;       this.nature=nature;       this.name=name;   }    Course(String name,String nature)   {       this.name=name;       this.nature=nature;       this.assessment="考试";   }   boolean 课程性质和课程的考核方式匹配()   {       if(nature.equals("必修")&&assessment.equals("考察"))       {           System.out.println(name+" : course type & access mode mismatch");           return false;       }       else           return true;   }}class Score{    String number;    String name;    Course course = new Course(null,null,null);    int dailyScore;    int examScore;    int flag=-1;    Score(String number, String name, String coursename, int dailyScore, int examScore)    {        this.number=number;        this.dailyScore=dailyScore;        this.examScore=examScore;        this.course.name=coursename;        this.name=name;        if(dailyScore==-1)        this.flag=0;        else        {            this.flag=1;        }    }    void decidecourse(List course){        course.forEach((e)->{            if(e.name.equals(this.course.name))            {                this.course=e;            }        });    }     int getFinalScore()    {        if(course.assessment.equals("考察")&&course.nature.equals("选修"))            return examScore;        else if(course.nature.equals("必修"))        {            return (int)(examScore*0.7+dailyScore*0.3);        }        else if(course.assessment.equals("考试")&&course.nature.equals("选修"))        {            return (int)(examScore*0.7+dailyScore*0.3);        }        else        {            return -1;        }    }    boolean 存在这个课程(String name,List course){        boolean a=false;        for (Course e : course) {            if (name.equals(e.name)) {                a = true;                return a;            }        }        return a;    }    boolean 成绩数量匹配考核方式(String name,List course){        boolean b = true;        for (Course e : course) {            if(e.name.equals(name)) {                if (((e.assessment.equals("考察") && flag == 1) || (e.assessment.equals("考试") && flag == 0) || (e.nature.equals("必修") && flag == 0)) && (!e.assessment.equals("考察") && !e.nature.equals("考试"))) {                    b = false;                    break;                } else {                    b = true;                    break;                }            }        }        return b;    }}class Chosecoure {    List score = new ArrayList<>();    List course = new ArrayList<>();//    Map mp_student = new TreeMap<>(new Comparator() {//        @Override//           public int compare(String o1, String o2) {//               return o1.compareTo(o2);//           }//    });    List student = new ArrayList<>();//    Collections.sort(student, new Comparator() {//        @Override//        public int compare(Student s1, Student s2) {//            return s2.getAge() - s1.getAge();//        }//    });    List grades=new ArrayList<>();    grade lmlm=new grade(null);    int m = 0;    void Course_and_Score() {        for (Course f : course) {            m = 0;            for (Score e : score) {                if (e.course.name.equals(f.name)) {                    f.course_score += e.getFinalScore();                    f.course_dailyscore += e.dailyScore;                    f.course_finalscore += e.examScore;                    m++;                }            }            if (m != 0) {                f.course_score = f.course_score / m;//计算总成绩                f.course_finalscore = f.course_finalscore / m;//计算期末成绩平均分                f.course_dailyscore = f.course_dailyscore / m;//计算平时成绩平均分            } else {                System.out.println(f.name + " has no grades yet");                f.found=1;            }        }    }//课程的成绩,也就是把各科目的成绩先统一计算出来   void grade_score(List e)   {       grades.forEach((q)->{           e.forEach((p)->{               if(q.gradenumber.equals(lmlm.getgradenumber(p.number)))               {                   q.grade_score+=p.getFinalScore();                   q.size++;               }           });           if(q.size != 0)               q.grade_score/=q.size;               if(q.size==0)                   System.out.println(q.gradenumber+" has no grades yet");       });   }    void output() {            course.forEach((e) -> {                {                        if ((e.assessment.equals("考试") || e.nature.equals("必修"))&&e.found==0)                            System.out.println(e.name + " " + e.course_dailyscore + " " + e.course_finalscore + " " + e.course_score);                        if (e.assessment.equals("考察")&&e.found==0) {                            System.out.println(e.name + " " + e.course_finalscore + " " + e.course_finalscore);                        }                    }            });    }}class Student{    String number;    String name;    int student_score = 0;    int student_score_size=0;    Student(String number,String name)    {        this.number=number;        this.name=name;    }    boolean JudgeEmpty(){        if(student_score_size==0)        {            return false;        }        else        {            return true;        }    }    int getStudenttotol(List e){        e.forEach((f)->{            if(f.name.equals(name)&&f.number.equals(number))            {                student_score+=f.getFinalScore();                student_score_size++;            }        });        if(student_score_size != 0)        student_score=student_score/student_score_size;        return student_score;    }}class grade{   String gradenumber;   grade(String gradenumber){       this.gradenumber=gradenumber;   }   int grade_score = 0;   int size=0;   String getgradenumber(String number){       this.gradenumber=number.substring(0,6);       return gradenumber;   }}

Parameter Value========= =====Project Directory C:\Users\Lenovo\IdeaProjects\untitled17\src\Project Name 5Checkpoint Name BaselineFile Name Main.javaLines 341Statements 139Percent Branch Statements 29.5Method Call Statements 50Percent Lines with Comments 35.2Classes and Interfaces 1Methods per Class 4.00Average Statements per Method 26.75Line Number of Most Complex Method 125Name of Most Complex Method Main.main()Maximum Complexity 38Line Number of Deepest Block 152Maximum Block Depth 6Average Block Depth 2.27Average Complexity 38.00

--------------------------------------------------------------------------------------------Most Complex Methods in 1 Class(es): Complexity, Statements, Max Depth, Calls

Main.main() 38, 67, 6, 33

--------------------------------------------------------------------------------------------Block Depth Statements

0 441 202 153 124 225 146 127 08 09+ 0

--------------------------------------------------------------------------------------------

这里我的代码分为5个类

分别是

Student类:Student类主要用来接收学生的信息,譬如学生学号和学生姓名同时还有学生的成绩.为什么会有学生的成绩呢?主要是我利用传进来的LIst成绩类来对比学号来进行成绩的添加,索性直接统计在学生类.

Course类:课程类,作为课程类,不仅要有存储课程信息的功能还要有判断是否合法,是否可以存入的判断方法,这里我是利用成绩数量来标记0-1在进行判断从而区分开必修和必修考试等的课程.

Score类:Score类也是成绩类,是我用来存储各种成绩的一个类,其作为成绩类不只是存储成绩,更应该算出学生的单科成绩.我还用了继承和多态的方法来区分不同的成绩存储.我Score类里面也有课程类,但是课程类主要用来存储课程信息的功能,从而达到计算学生成绩的方法.也就是来分权重.

grade类:grade类是班级类,班级定有班级号,我在里面创建了get班级号的方法,而这个方法我传进去的是number也就是学号,我利用substring(0.6)来截取出学号.同时我在里面也创建了int类型的grade_score也就是班级的成绩.这样子做的目的是到时候我只需遍历grade的list就可以实现输出.

Chosecourse类:Chosecourse类作为选课类是本次代码最为重要的部分.可以说其作为中枢的形式存在,为什么这样子说,因为选课本就和学生和课程和成绩都存在关系.这里我创建了3个list链表来存储信息,这里我发昏了,应该是hashmap类应该更为轻松,因为重复数据不会存储进去,但是list就不是都i要存进去,至于什么时候存进去什么时候不存进去就需要你自己来进行判断了.

这次代码加深了我对list包的理解和使用,比如List<类> list = new ArrayList<>();这里考的list的数字排序和汉字排序,就是用接口的办法来解决排序问题。这里接口:Comparable接口 接口中的方法为int compareTo(Shape);接口传入目标类来进行排序。而这次成绩统计系统更是考察对错误情况的检查,主要是对正则表达式的熟练应用来区分输入的错误和如何将他输出出来在哪里输出,这是我两个正则表达式:

String five="^(\\d{8})\\s+([\\u4e00-\\u9fa5a-zA-Z0-9_]{1,10})\\s+([\\u4e00-\\u9fa5a-zA-Z0-9_]{1,10})\\s+([0-9]|[1-9][0-9]|100)\\s+([0-9]|[1-9][0-9]|100)$";String four="^(\\d{8})\\s+([\\u4e00-\\u9fa5a-zA-Z0-9_]{1,10})\\s+([\\u4e00-\\u9fa5a-zA-Z0-9_]{1,10})\\s+([0-9]|[1-9][0-9]|100)$";真是越写越能感觉到正则表达式的好用,直接就可以干掉wrong format 这一个测试点.接下来是成绩系统-2:

课程成绩统计程序-2在第一次的基础上增加了实验课,以下加粗字体显示为本次新增的内容。

某高校课程从性质上分为:必修课、选修课、实验课,从考核方式上分为:考试、考察、实验。

考试的总成绩由平时成绩、期末成绩分别乘以权重值得出,比如平时成绩权重0.3,期末成绩权重0.7,总成绩=平时成绩*0.3+期末成绩*0.7。

考察的总成绩直接等于期末成绩

实验的总成绩等于课程每次实验成绩的平均分

必修课的考核方式必须为考试,选修课可以选择考试、考察任一考核方式。实验课的成绩必须为实验。

1、输入:

包括课程、课程成绩两类信息。

课程信息包括:课程名称、课程性质、考核方式(可选,如果性质是必修课,考核方式可以没有)三个数据项。

课程信息格式:课程名称+英文空格+课程性质+英文空格+考核方式

课程性质输入项:必修、选修、实验

考核方式输入选项:考试、考察、实验

考试/考查课程成绩信息包括:学号、姓名、课程名称、平时成绩(可选)、期末成绩

考试/考查课程信息格式:学号+英文空格+姓名+英文空格+课程名称+英文空格+平时成绩+英文空格+期末成绩

实验课程成绩信息包括:学号、姓名、课程名称、实验次数、每次成绩

实验次数至少4次,不超过9次

实验课程信息格式:学号+英文空格+姓名+英文空格+课程名称+英文空格+实验次数+英文空格+第一次实验成绩+...+英文空格+最后一次实验成绩

以上信息的相关约束:

1)平时成绩和期末成绩的权重默认为0.3、0.7

2)成绩是整数,不包含小数部分,成绩的取值范围是【0,100】

3)学号由8位数字组成

4)姓名不超过10个字符

5)课程名称不超过10个字符

6)不特别输入班级信息,班级号是学号的前6位。

2、输出:

输出包含三个部分,包括学生所有课程总成绩的平均分、单门课程成绩平均分、单门课程总成绩平均分、班级所有课程总成绩平均分。

为避免误差,平均分的计算方法为累加所有符合条件的单个成绩,最后除以总数。

1)学生课程总成绩平均分按学号由低到高排序输出

格式:学号+英文空格+姓名+英文空格+总成绩平均分

如果某个学生没有任何成绩信息,输出:学号+英文空格+姓名+英文空格+"did not take any exams"

2)单门课程成绩平均分分为三个分值:平时成绩平均分(可选)、期末考试平均分、总成绩平均分,按课程名称的字符顺序输出

考试/考察课程成绩格式:课程名称+英文空格+平时成绩平均分+英文空格+期末考试平均分+英文空格+总成绩平均分

实验课成绩格式:课程名称+英文空格+总成绩平均分

如果某门课程没有任何成绩信息,输出:课程名称+英文空格+"has no grades yet"

3)班级所有课程总成绩平均分按班级由低到高排序输出

格式:班级号+英文空格+总成绩平均分

如果某个班级没有任何成绩信息,输出:班级名称+英文空格+ "has no grades yet"

异常情况:

1)如果解析某个成绩信息时,课程名称不在已输入的课程列表中,输出:学号+英文空格+姓名+英文空格+":"+课程名称+英文空格+"does not exist"

2)如果解析某个成绩信息时,输入的成绩数量和课程的考核方式不匹配,输出:学号+英文空格+姓名+英文空格+": access mode mismatch"

以上两种情况如果同时出现,按第一种情况输出结果。

3)如果解析某个课程信息时,输入的课程性质和课程的考核方式不匹配,输出:课程名称+" : course type & access mode mismatch"

4)格式错误以及其他信息异常如成绩超出范围等,均按格式错误处理,输出"wrong format"

5)若出现重复的课程/成绩信息,只保留第一个课程信息,忽略后面输入的。

信息约束:

1)成绩平均分只取整数部分,小数部分丢弃

import java.text.Collator;import java.util.ArrayList;import java.util.List;import java.util.Locale;import java.util.Scanner;import java.util.concurrent.atomic.AtomicInteger;import javax.xml.crypto.Data;import java.util.Collections;import java.util.Comparator;public class Main {    public static void main(String[] args) {        Scanner in = new Scanner(System.in);        int juddgeexist=0;        int uu=0;        Course cou__cou = new Course(null, null, null);        Student stu__stu = new Student(null, null);        grade gra_gra=new grade(null);        List mis=new ArrayList<>();        int qq=0;        String five="^(\\d{8})\\s+([\\u4e00-\\u9fa5a-zA-Z0-9_]{1,10})\\s+([\\u4e00-\\u9fa5a-zA-Z0-9_]{1,10})\\s+([0-9]|[1-9][0-9]|100)\\s+([0-9]|[1-9][0-9]|100)$";        String four="^(\\d{8})\\s+([\\u4e00-\\u9fa5a-zA-Z0-9_]{1,10})\\s+([\\u4e00-\\u9fa5a-zA-Z0-9_]{1,10})\\s+([0-9]|[1-9][0-9]|100)$";        Chosecoure date = new Chosecoure();        int cont = 0;        int sin=0;        int run;        while (in.hasNextLine()) {            run=0;            String a = in.nextLine().trim();            String[] b = a.split(" ");            int length = b.length;            int iq = 0;            if (a.equals("end"))                break;            else {                if (length == 2) {                    Course c = new Course(b[0], b[1]);                    if (c.课程性质和课程的考核方式匹配()) {                        for (Course e : date.course) {                            if (e.name.equals(b[0])) {                                iq = 1;                                break;                            } else {                                iq = 0;                            }                        }                        if (iq == 0) {                            date.course.add(c);                        }                    }                    else{                        mis.add(c);                    }                }                if (length == 3) {                    Course c = new Course(b[0], b[1], b[2]);                    if (c.课程性质和课程的考核方式匹配()) {                        for (Course e : date.course) {                            if (e.name.equals(b[0])) {                                iq = 1;                                break;                            } else {                                iq = 0;                            }                        }                        if (iq == 0) {                            date.course.add(c);                        }                    }                    else{                        mis.add(c);                    }                }                date.course.forEach((e)->{                    e.decidemark();                });                for(Course e: date.course){                    if(e.name.equals(b[2]))                    {                        run=e.mark;                    }                }                if ((length == 4 || length == 5)&&run!=3) {                    if (length == 4) {                        Score sco = new Score(b[0], b[1], b[2], -1, Integer.parseInt(b[3]));                        Student stu = new Student(b[0], b[1]);                        if (sco.存在这个课程(b[2], date.course) == true && sco.成绩数量匹配考核方式(b[2], date.course) == true && a.matches(four))//判断数据是否合法                        {                            for(Course e: date.course){                                if(e.name.equals(b[2])&&e.mark==1)                                    sin=1;                            }                            if (cont == 0&&sin==1) {                                sco.dailyScore = 0;                                sco.decidecourse(date.course);                                date.score.add(sco);                                sco.dailyScore = -1;                                date.student.add(stu);                                date.grades.add(new grade(gra_gra.getgradenumber(b[0])));                                cont++;                            }                            for (Score e : date.score) {                                if (e.number.equals(b[0]) && e.name.equals(b[1]) && e.course.name.equals(b[2]) && e.dailyScore == -1 && e.examScore == Integer.parseInt(b[3])&&sin==1) {                                    break;                                } else {                                    sco.dailyScore = 0;                                    sco.decidecourse(date.course);                                    date.score.add(sco);//将学生的成绩存入数据库成绩                                    // stu.student_score.add(sco);//存储数据将学生的成绩存到学生里面                                    date.student.add(stu);//存储数据将学生存入数据库                                    for (grade m : date.grades) {                                        if (m.gradenumber.equals(gra_gra.getgradenumber(b[0]))) {                                            juddgeexist = 1;                                            break;                                        } else {                                            juddgeexist = 0;                                        }                                    }                                    if (juddgeexist == 0)                                        date.grades.add(new grade(gra_gra.getgradenumber(b[0])));                                    break;                                }                            }                        } else if (!sco.存在这个课程(b[2], date.course) && !sco.成绩数量匹配考核方式(b[2], date.course)) {                            System.out.println(b[2] + " does not exist");                            date.student.add(stu);                            date.grades.add(new grade(gra_gra.getgradenumber(b[0])));                        } else if (!sco.存在这个课程(b[2], date.course)) {                            System.out.println(b[2] + " does not exist");                            date.student.add(stu);                            date.grades.add(new grade(gra_gra.getgradenumber(b[0])));                        } else if (!sco.成绩数量匹配考核方式(b[2], date.course)) {                            System.out.println(b[0] + " " + b[1] + " : access mode mismatch");                            date.grades.add(new grade(gra_gra.getgradenumber(b[0])));                            date.student.add(stu);                        } else if (!a.matches(four)) {                            System.out.println("wrong format");                        }                    }                    if (length == 5) {                        uu=0;                        Score sco = new Score(b[0], b[1], b[2], Integer.parseInt(b[3]), Integer.parseInt(b[4]));                        Student stu = new Student(b[0], b[1]);                        for(Course e: date.course){                            if(e.name.equals(b[2])&&e.mark==2)                                sin=2;                        }                        if (sco.存在这个课程(b[2], date.course) == true && sco.成绩数量匹配考核方式(b[2], date.course) == true && a.matches(five)&&sin==2)//判断数据是否合法                        {                            if (cont == 0&&sin==2) {                                sco.decidecourse(date.course);                                date.score.add(sco);                                date.student.add(stu);                                date.grades.add(new grade(gra_gra.getgradenumber(b[0])));                                cont++;                            }                            for (Score e : date.score) {                                if (e.number.equals(b[0]) && e.name.equals(b[1]) && e.course.name.equals(b[2]) && e.dailyScore == Integer.parseInt(b[3]) && e.examScore == Integer.parseInt(b[4])&&sin==2) {                                    uu=1;                                }                            } if(uu==0&&sco.存在这个课程(b[2], date.course) == true && sco.成绩数量匹配考核方式(b[2], date.course) == true && a.matches(five)&&sin==2) {                            date.score.add(sco);//将学生的成绩存入数据库成绩                            sco.decidecourse(date.course);                            // stu.student_score.add(sco);//存储数据将学生的成绩存到学生里面                            date.student.add(stu);//存储数据将学生存入数据库                            for (grade m : date.grades) {                                if (m.gradenumber.equals(gra_gra.getgradenumber(b[0]))) {                                    juddgeexist = 1;                                    break;                                } else {                                    juddgeexist = 0;                                }                            }                            if (juddgeexist == 0)                                date.grades.add(new grade(gra_gra.getgradenumber(b[0])));                        }                        } else if (!sco.存在这个课程(b[2], date.course) && !sco.成绩数量匹配考核方式(b[2], date.course)) {                            System.out.println(b[2] + " does not exist");                            date.grades.add(new grade(gra_gra.getgradenumber(b[0])));                            date.student.add(stu);                        } else if (!sco.存在这个课程(b[2], date.course)) {                            date.student.add(stu);                            date.grades.add(new grade(gra_gra.getgradenumber(b[0])));                            System.out.println(b[2] + " does not exist");                        } else if (!sco.成绩数量匹配考核方式(b[2], date.course)) {                            date.student.add(stu);                            date.grades.add(new grade(gra_gra.getgradenumber(b[0])));                            System.out.println(b[0] + " " + b[1] + " : access mode mismatch");                        } else if (!a.matches(five)) {                            System.out.println("wrong format");                        }                    }                }                if (length > 5||run==3) {                    Student stu = new Student(b[0], b[1]);                    Score sco = new Score(b[0], b[1], b[2], Integer.parseInt(b[3]), -1, -1, -1, -1, -1, -1, -1, -1, -1);                    if (length == 8) {                        sco = new Score(b[0], b[1], b[2], Integer.parseInt(b[3]), Integer.parseInt(b[4]), Integer.parseInt(b[5]), Integer.parseInt(b[6]), Integer.parseInt(b[7]), -1, -1, -1, -1, -1);                    }                    if (length == 9) {                        sco = new Score(b[0], b[1], b[2], Integer.parseInt(b[3]), Integer.parseInt(b[4]), Integer.parseInt(b[5]), Integer.parseInt(b[6]), Integer.parseInt(b[7]), Integer.parseInt(b[8]), -1, -1, -1, -1);                    }                    if (length == 10) {                        sco = new Score(b[0], b[1], b[2], Integer.parseInt(b[3]), Integer.parseInt(b[4]), Integer.parseInt(b[5]), Integer.parseInt(b[6]), Integer.parseInt(b[7]), Integer.parseInt(b[8]), Integer.parseInt(b[9]), -1, -1, -1);                    }                    if (length == 11) {                        sco = new Score(b[0], b[1], b[2], Integer.parseInt(b[3]), Integer.parseInt(b[4]), Integer.parseInt(b[5]), Integer.parseInt(b[6]), Integer.parseInt(b[7]), Integer.parseInt(b[8]), Integer.parseInt(b[9]), Integer.parseInt(b[10]), -1, -1);                    }                    if (length == 12) {                        sco = new Score(b[0], b[1], b[2], Integer.parseInt(b[3]), Integer.parseInt(b[4]), Integer.parseInt(b[5]), Integer.parseInt(b[6]), Integer.parseInt(b[7]), Integer.parseInt(b[8]), Integer.parseInt(b[9]), Integer.parseInt(b[10]), Integer.parseInt(b[11]), -1);                    }                    if (length == 13) {                        sco = new Score(b[0], b[1], b[2], Integer.parseInt(b[3]), Integer.parseInt(b[4]), Integer.parseInt(b[5]), Integer.parseInt(b[6]), Integer.parseInt(b[7]), Integer.parseInt(b[8]), Integer.parseInt(b[9]), Integer.parseInt(b[10]), Integer.parseInt(b[11]), Integer.parseInt(b[12]));                    }                    sco.getlength(length);                    for(Course e: date.course){                        if(e.name.equals(b[2])&&e.mark==3)                            sin=3;                    }                    if (sco.存在这个课程(b[2], date.course) == true && sco.成绩数量匹配考核方式(b[2], date.course) == true&& sco.是否合法()&&sin==3) {                        sco.decidecourse(date.course);                        date.score.add(sco);                        date.student.add(stu);                        for (grade m : date.grades) {                            if (m.gradenumber.equals(gra_gra.getgradenumber(b[0]))) {                                juddgeexist = 1;                                break;                            } else {                                juddgeexist = 0;                            }                        }                        if (juddgeexist == 0)                            date.grades.add(new grade(gra_gra.getgradenumber(b[0])));                        cont++;                    }                    else if (!sco.存在这个课程(b[2], date.course) && !sco.成绩数量匹配考核方式(b[2], date.course)&& sco.是否合法()) {                        System.out.println(b[2] + " does not exist");                        date.grades.add(new grade(gra_gra.getgradenumber(b[0])));                        date.student.add(stu);                    } else if (!sco.存在这个课程(b[2], date.course)&& sco.是否合法()) {                        date.student.add(stu);                        date.grades.add(new grade(gra_gra.getgradenumber(b[0])));                        System.out.println(b[2] + " does not exist");                    } else if (!sco.成绩数量匹配考核方式(b[2], date.course)&&sco.是否合法()) {                        date.student.add(stu);                        date.grades.add(new grade(gra_gra.getgradenumber(b[0])));                        System.out.println(b[0] + " " + b[1] + " : access mode mismatch");                    }                    else if(!sco.是否合法())                    {                        System.out.println("wrong format");                    }                }            }        }//开始进行数据的处理了        for (Student e : date.student) {            e.getStudenttotol(date.score);        }        int flag = 0;        int flag1=0;        String num = "000";        Collections.sort(date.student);        for (Student q : date.student) {            flag = 0;            if(!num.equals(q.number))                flag = 1;            num = q.number;            if(flag == 1)            {                if (q.JudgeEmpty())                    System.out.println(q.number + " " + q.name + " " + q.student_score);                else                    System.out.println(q.number+" "+q.name+" "+"did not take any exams");            }        }        date.Course_and_Score();        Collections.sort(date.grades);        Collections.sort(date.course);        date.output();        date.grade_score(date.score);        String num1="000";        for(grade e : date.grades){            flag1=0;            if(!num1.equals(e.gradenumber))            {                flag1=1;                num1=e.gradenumber;            }            if(flag1==1)            {                if(e.size!=0)                    System.out.println(e.gradenumber+" "+e.grade_score);            }        }    }}class Course implements Comparable{    String name;    String nature;    String assessment;    int course_score=0;    int course_dailyscore=0;    int course_finalscore=0;    int found=0;    int mark=0;    Course(String name,String nature,String assessment)    {        this.assessment=assessment;        this.nature=nature;        this.name=name;    }    Course(String name,String nature)    {        this.name=name;        this.nature=nature;        this.assessment="考试";    }    boolean 课程性质和课程的考核方式匹配()    {        if((nature.equals("必修")&&assessment.equals("考察"))||(nature.equals("实验")&&assessment.equals("考试"))||(nature.equals("实验")&&assessment.equals("考察"))||(nature.equals("必修")&&assessment.equals("实验"))||(nature.equals("选修")&&assessment.equals("实验")))        {            System.out.println(name+" : course type & access mode mismatch");            return false;        }        else            return true;    }    @Override    public int compareTo(Course o) {        try {            Comparator compator = Collator.getInstance(Locale.CHINA);            if (compator.compare(this.name, o.name) < 0) {                return -1;            } else if (compator.compare(this.name, o.name) > 0) {                return 1;            }        } catch (Exception e) {        }        return 0;    }    @Override    public String toString() {        return name;    }    //    boolean 输入数据合法(String a){//        if()//    }    void decidemark(){        if(nature.equals("必修")||assessment.equals("考试"))            this.mark=2;        if(assessment.equals("考察"))            this.mark=1;        if(assessment.equals("实验")&&nature.equals("实验"))            this.mark=3;    }}class Score{    String number;    String name;    Course course = new Course(null,null,null);    int dailyScore;    int examScore;    int flag=-1;    int chengji1=0;    int chengji2=0;    int chengji3=0;    int chengji4=0;    int chengji5=0;    int chengji6=0;    int chengji7=0;    int chengji8=0;    int chengji9=0;    int size=0;    int mark=0;    int length;    Score(String number, String name, String coursename, int dailyScore, int examScore)    {        this.number=number;        this.dailyScore=dailyScore;        this.examScore=examScore;        this.course.name=coursename;        this.name=name;        if(dailyScore==-1)            this.flag=0;        else        {            this.flag=1;        }    }    void  getlength(int length){        this.length=length;    }    Score(String number, String name ,String coursename,int size,int chengji1,int chengji2,int chengji3,int chengji4,int chengji5,int chengji6,int chengji7,int chengji8,int chengji9)    {        this.number=number;        this.dailyScore=dailyScore;        this.examScore=examScore;        this.course.name=coursename;        this.name=name;        this.chengji1=chengji1;        this.chengji2=chengji2;        this.chengji3=chengji3;        this.chengji4=chengji4;        this.chengji5=chengji5;        this.chengji6=chengji6;        this.chengji7=chengji7;        this.chengji8=chengji8;        this.chengji9=chengji9;        this.size=size;        int coo=9;        if(chengji1==-1)        {            coo--;            this.chengji1=0;        }        if(chengji2==-1)        {            coo--;            this.chengji2=0;        }        if(chengji3==-1)        {            coo--;            this.chengji3=0;        }        if(chengji4==-1)        {            coo--;            this.chengji4=0;        }        if(chengji5==-1)        {            coo--;            this.chengji5=0;        }        if(chengji6==-1)        {            coo--;            this.chengji6=0;        }        if(chengji7==-1)        {            coo--;            this.chengji7=0;        }        if(chengji8==-1)        {            coo--;            this.chengji8=0;        }        if(chengji9==-1)        {            coo--;            this.chengji9=0;        }    }    void decidecourse(List course){        course.forEach((e)->{            if(e.name.equals(this.course.name))            {                this.course=e;            }        });    }    boolean 是否合法(){        if(size<4||size>9)            return false;        else if(chengji1<0||chengji1>100)            return false;        else if(chengji2<0||chengji2>100)            return false;        else if(chengji3<0||chengji3>100)            return false;        else if(chengji4<0||chengji4>100)            return false;        else if(chengji5<0||chengji5>100)            return false;        else if(chengji6<0||chengji6>100)            return false;        else if(chengji7<0||chengji7>100)            return false;        else if(chengji8<0||chengji8>100)            return false;        else if(chengji9<0||chengji9>100)            return false;        else            return true;    }    int getFinalScore()    {        if(course.assessment.equals("考察")&&course.nature.equals("选修"))            return examScore;        else if(course.nature.equals("必修")&&!course.assessment.equals("实验"))        {            return (int)(examScore*0.7+dailyScore*0.3);        }        else if(course.assessment.equals("考试")&&course.nature.equals("选修"))        {            return (int)(examScore*0.7+dailyScore*0.3);        }        else if(course.assessment.equals("实验")&&course.nature.equals("实验"))            return (int)((chengji1+chengji2+chengji3+chengji4+chengji5+chengji6+chengji7+chengji8+chengji9)/size);        else            return 0;    }    boolean 存在这个课程(String name,List course){        boolean a=false;        for (Course e : course) {            if (name.equals(e.name)) {                a = true;                return a;            }        }        return a;    }    boolean 成绩数量匹配考核方式(String name,List course){        boolean b = true;        for (Course e : course) {            if(e.name.equals(name)) {                if (((e.assessment.equals("考察") && flag == 1&&mark!=2) || (e.assessment.equals("考试") && flag == 0&&mark!=1) || (e.nature.equals("必修") && flag == 0&&mark!=1)||(e.nature.equals("实验")&&length-4!=size))) {//                if (((e.assessment.equals("考察") && flag == 1) || (e.assessment.equals("考试") && flag == 0) || ((e.nature.equals("必修") && flag == 0)) && (!e.assessment.equals("考察") && !e.nature.equals("考试"))||size!=coo)) {                    b = false;                    break;                } else {                    b = true;                    break;                }            }        }        return b;    }}class Chosecoure {    List score = new ArrayList<>();    List course = new ArrayList<>();    //    Map mp_student = new TreeMap<>(new Comparator() {//        @Override//           public int compare(String o1, String o2) {//               return o1.compareTo(o2);//           }//    });    List student = new ArrayList<>();//    Collections.sort(student, new Comparator() {//        @Override//        public int compare(Student s1, Student s2) {//            return s2.getAge() - s1.getAge();//        }//    });    List grades=new ArrayList<>();    grade lmlm=new grade(null);    int m = 0;    void Course_and_Score() {        for (Course f : course) {            m = 0;            for (Score e : score) {                if (e.course.name.equals(f.name)) {                    f.course_score += e.getFinalScore();                    f.course_dailyscore += e.dailyScore;                    f.course_finalscore += e.examScore;                    m++;                }            }            if (m != 0) {                f.course_score = f.course_score / m;//计算总成绩                f.course_finalscore = f.course_finalscore / m;//计算期末成绩平均分                f.course_dailyscore = f.course_dailyscore / m;//计算平时成绩平均分            } else {                System.out.println(f.name + " has no grades yet");                f.found=1;            }        }    }//课程的成绩,也就是把各科目的成绩先统一计算出来    void grade_score(List e)    {        grades.forEach((q)->{            e.forEach((p)->{                if(q.gradenumber.equals(lmlm.getgradenumber(p.number)))                {                    q.grade_score+=p.getFinalScore();                    q.size++;                }            });            if(q.size != 0)                q.grade_score/=q.size;            if(q.size==0)                System.out.println(q.gradenumber+" has no grades yet");        });    }    void output() {        course.forEach((e) -> {            {                if ((e.assessment.equals("考试") || e.nature.equals("必修"))&&e.found==0)                    System.out.println(e.name + " " + e.course_dailyscore + " " + e.course_finalscore + " " + e.course_score);                if (e.assessment.equals("考察")&&e.found==0) {                    System.out.println(e.name + " " + e.course_finalscore + " " + e.course_finalscore);                }                if(e.assessment.equals("实验")&&e.nature.equals("实验")&&e.found==0)                {                    System.out.println(e.name+ " " + e.course_score);                }            }        });    }}class Student implements Comparable{    String number;    String name;    int student_score = 0;    int student_score_size=0;    Student(String number,String name)    {        this.number=number;        this.name=name;    }    boolean JudgeEmpty(){        if(student_score_size==0)        {            return false;        }        else        {            return true;        }    }    int getStudenttotol(List e){        e.forEach((f)->{            if(f.name.equals(name)&&f.number.equals(number))            {                student_score+=f.getFinalScore();                student_score_size++;            }        });        if(student_score_size != 0)            student_score=student_score/student_score_size;        return student_score;    }    @Override    public int compareTo(Student o) {        //比较条件我们定的是按照age升序//        int s = this.age - o.age;        return this.number.compareTo(o.number);    }    @Override    public String toString() {        return number;    }}class grade implements Comparable{    String gradenumber;    grade(String gradenumber){        this.gradenumber=gradenumber;    }    int grade_score = 0;    int size=0;    String getgradenumber(String number){        this.gradenumber=number.substring(0,6);        return gradenumber;    }    @Override    public int compareTo(grade o) {        //比较条件我们定的是按照age升序//        int s = this.age - o.age;        return this.gradenumber.compareTo(o.gradenumber);    }    @Override    public String toString() {        return gradenumber;    }}

这里我用了很笨的办法,即利用chengji1-9来记录实验的成绩,如果没有则成绩设为0;并且利用size来确定成绩i的个数

这里用的最多的还是继承和多态.尤其是course类,同时我也利用了大量的方法在类里面,利用数据的传输来达到我想要的目的,比如获得学生成绩,获得班级成绩,判断实验数据是否合法

以下是我的派坑顺序

首先是这个,我当时就发懵了,为什么回过不去,我发现12-14-15的测试点为什么会过不去呢.我就一直测试一直找测试点,我还和我身边满分的同学一直对比测试点,发现一直是一样的,就打算放弃的时候,打游戏的时候突然灵感来了.猛干代码找到了测试点,原来是错误信息的输入,比如含有重名的班级我存储了两次,这里很明显就对比出了list的弊端和hashmap的优势,但是已经写到这里了,在改也来不及了,就在主函数里加了好多判断的语句最后过了.

还有就是这个点卡了我一整天

测试点2我当时就发懵了,为什么我能拿到大部分的分44.但是2却过不了,我还是同样的操作找测试点,发现是有一种及其挑剔的情况没有考虑到,最后通过调试的方法才找到了这个测试点.

总结这次代码:

在上次代码基础上改正总耗时3天:

它使用了面向对象的编程思想,将课程,成绩,学生和班级封装成类,方便管理和操作。它使用了集合类,如List,ArrayList等,来存储和处理数据以及排序,提高了效率和灵活性。它使用了异常处理,我用了在类里定义方法的方法(不会try-catch很难过),来捕获和处理可能出现的错误,增强了程序的健壮性。

成绩统计系统-3:

课程成绩统计程序-3在第二次的基础上修改了计算总成绩的方式,

要求:修改类结构,将成绩类的继承关系改为组合关系,成绩信息由课程成绩类和分项成绩类组成,课程成绩类组合分项成绩类,分项成绩类由成绩分值和权重两个属性构成。

完成课程成绩统计程序-2、3两次程序后,比较继承和组合关系的区别。思考一下哪一种关系运用上更灵活,更能够适应变更。

题目最后的参考类图未做修改,大家根据要求自行调整,以下内容加粗字体显示的内容为本次新增的内容。

某高校课程从性质上分为:必修课、选修课、实验课,从考核方式上分为:考试、考察、实验。

考试的总成绩由平时成绩、期末成绩分别乘以权重值得出,比如平时成绩权重0.3,期末成绩权重0.7,总成绩=平时成绩*0.3+期末成绩*0.7。

考察的总成绩直接等于期末成绩

实验的总成绩等于课程每次实验成绩乘以权重后累加而得。

课程权重值在录入课程信息时输入。(注意:所有分项成绩的权重之和应当等于1)

必修课的考核方式必须为考试,选修课可以选择考试、考察任一考核方式。实验课的成绩必须为实验。

1、输入:

包括课程、课程成绩两类信息。

课程信息包括:课程名称、课程性质、考核方式、分项成绩数量、每个分项成绩的权重。

考试课信息格式:课程名称+英文空格+课程性质+英文空格+考核方式+英文空格+平时成绩的权重+英文空格+期末成绩的权重

考察课信息格式:课程名称+英文空格+课程性质+英文空格+考核方式

实验课程信息格式:课程名称+英文空格+课程性质+英文空格+考核方式+英文空格+分项成绩数量n+英文空格+分项成绩1的权重+英文空格+。。。+英文空格+分项成绩n的权重

实验次数至少4次,不超过9次

课程性质输入项:必修、选修、实验

考核方式输入选项:考试、考察、实验

考试/考查课程成绩信息包括:学号、姓名、课程名称、平时成绩(可选)、期末成绩

考试/考查课程成绩信息格式:学号+英文空格+姓名+英文空格+课程名称+英文空格+平时成绩+英文空格+期末成绩

实验课程成绩信息包括:学号、姓名、课程名称、每次成绩{在系列-2的基础上去掉了(实验次数),实验次数要和实验课程信息中输入的分项成绩数量保持一致}

实验课程信息格式:学号+英文空格+姓名+英文空格+课程名称+英文空格+第一次实验成绩+...+英文空格+最后一次实验成绩

以上信息的相关约束:

1)成绩是整数,不包含小数部分,成绩的取值范围是【0,100】

2)学号由8位数字组成

3)姓名不超过10个字符

4)课程名称不超过10个字符

5)不特别输入班级信息,班级号是学号的前6位。

2、输出:

输出包含三个部分,包括学生所有课程总成绩的平均分、单门课程总成绩平均分、班级所有课程总成绩平均分。

为避免四舍五入误差,

计算单个成绩时,分项成绩乘以权重后要保留小数位,计算总成绩时,累加所有分项成绩的权重分以后,再去掉小数位。

学生总成绩/整个班/课程平均分的计算方法为累加所有符合条件的单个成绩,最后除以总数。

1)学生课程总成绩平均分按学号由低到高排序输出

格式:学号+英文空格+姓名+英文空格+总成绩平均分

如果某个学生没有任何成绩信息,输出:学号+英文空格+姓名+英文空格+"did not take any exams"

2)单门课程成绩按课程名称的字符顺序输出

课程成绩输出格式:课程名称+英文空格+总成绩平均分

如果某门课程没有任何成绩信息,输出:课程名称+英文空格+"has no grades yet"

3)班级所有课程总成绩平均分按班级由低到高排序输出

格式:班级号+英文空格+总成绩平均分

如果某个班级没有任何成绩信息,输出:班级名称+英文空格+ "has no grades yet"

异常情况:

1)如果解析某个成绩信息时,课程名称不在已输入的课程列表中,输出:学号+英文空格+姓名+英文空格+":"+课程名称+英文空格+"does not exist"

2)如果解析某个成绩信息时,输入的成绩数量和课程的考核方式不匹配,输出:学号+英文空格+姓名+英文空格+": access mode mismatch"

以上两种情况如果同时出现,按第一种情况输出结果。

3)如果解析某个课程信息时,输入的课程性质和课程的考核方式不匹配,输出:课程名称+" : course type & access mode mismatch"

4)格式错误以及其他信息异常如成绩超出范围等,均按格式错误处理,输出"wrong format"

5)若出现重复的课程/成绩信息,只保留第一个课程信息,忽略后面输入的。

6)如果解析实验课程信息时,输入的分项成绩数量值和分项成绩权重的个数不匹配,输出:课程名称+" : number of scores does not match"

7)如果解析考试课、实验课时,分项成绩权重值的总和不等于1,输出:课程名称+" : weight value error"

信息约束:

1)成绩平均分只取整数部分,小数部分丢弃

import java.text.Collator;import java.util.ArrayList;import java.util.List;import java.util.Locale;import java.util.Scanner;import java.util.Collections;import java.util.Comparator;public class Main {    public static void main(String[] args) {        Scanner in = new Scanner(System.in);        int juddgeexist=0;        int uu;        int ss=0;        grade gra_gra=new grade(null);        String five="^(\\d{8})\\s+([\\u4e00-\\u9fa5a-zA-Z0-9_]{1,10})\\s+([\\u4e00-\\u9fa5a-zA-Z0-9_]{1,10})\\s+([0-9]|[1-9][0-9]|100)\\s+([0-9]|[1-9][0-9]|100)$";        String four="^(\\d{8})\\s+([\\u4e00-\\u9fa5a-zA-Z0-9_]{1,10})\\s+([\\u4e00-\\u9fa5a-zA-Z0-9_]{1,10})\\s+([0-9]|[1-9][0-9]|100)$";        Chosecoure date = new Chosecoure();        int cont = 0;        int sin=0;        int run;        int ie=0;        while (in.hasNextLine()) {            run=0;            String a = in.nextLine().trim();            String[] b = a.split(" ");            int length = b.length;            ss=0;            int iq = 0;            if (a.equals("end"))                break;            else {                if (length == 3&&(b[1].equals("必修")||b[1].equals("选修")||b[1].equals("实验"))) {                    ie=1;                    int su=0;                    float []fll = new float[2];                    fll[0]=1;                    Course c = new Course(b[0],b[1],b[2],1,fll);                    if (c.课程性质和课程的考核方式匹配(su)) {                        if(c.权重之和是否为1()){                            for (Course e : date.course) {                                if (e.name.equals(b[0])) {                                    iq = 1;                                    break;                                } else                                    iq = 0;                            }                            if (iq == 0)                            date.course.add(c);                        }                        else{                            System.out.println(b[0] + " : weight value error");                        }                    }                    else {                        System.out.println(b[0]+" : course type & access mode mismatch");                    }                }                else if ((length == 6||length==5)&&(b[1].equals("必修")||b[1].equals("选修")||b[1].equals("实验"))) {                    ie=1;                    int su=0;                    float []fll = new float[2];                     Course c = new Course(b[0], b[1], b[2],2,fll);                    if(length==6){                        fll[0]=Float.parseFloat(b[4]);                        fll[1]=Float.parseFloat(b[5]);                         c = new Course(b[0], b[1], b[2],2,fll);                    }                    if(length==5)                    {                        fll[0]=Float.parseFloat(b[3]);;                        fll[1]=Float.parseFloat(b[4]);                         c = new Course(b[0], b[1],"no",2,fll);                    }                    if (c.课程性质和课程的考核方式匹配(su)) {                        if(c.权重之和是否为1()){                        for (Course e : date.course) {                            if (e.name.equals(b[0])) {                                iq = 1;                                break;                            } else                                iq = 0;                        }                        if (iq == 0)                        date.course.add(c);                    }                        else{                            System.out.println(b[0] + " : weight value error");                        }                    }                    else {                        System.out.println(b[0]+" : course type & access mode mismatch");                    }                }                else if(length>6&&(b[2].equals("实验")||b[2].equals("考察")||b[2].equals("考试"))) {                    int su=1;                        float[] fll = new float[length - 4];                        for (int i = 0; i < length - 4; i++) {                            fll[i] = Float.parseFloat(b[i+4]);                        }                        Course c = new Course(b[0], b[1], b[2], Integer.parseInt(b[3]), fll);                    if (c.合法()) {                        if (c.课程性质和课程的考核方式匹配(su))                            if(length - 4 == Integer.parseInt(b[3])){                            if (c.权重之和是否为1()) {                                for (Course e : date.course) {                                    if (e.name.equals(b[0])) {                                        iq = 1;                                        break;                                    } else                                        iq = 0;                                }                                if (iq == 0)                                    date.course.add(c);                            }                            else{                                System.out.println(b[0] + " : weight value error");                            }                        }                            else if(!c.课程性质和课程的考核方式匹配(su)){                                System.out.println(b[0]+" : course type & access mode mismatch");                            }                        else {                            System.out.println(b[0]+" : number of scores does not match");                        }                    }                    else{                        System.out.println("wrong format");                    }                }                date.course.forEach((e)->{                    e.decidemark();                });                for(Course e: date.course){                    if(e.name.equals(b[2]))                        run=e.mark;                }                if ((length == 4 || length == 5)&&run!=3&&ie!=1) {                    if (length == 4) {                        if (!a.matches(four)) {                            System.out.println("wrong format");                        }else{                            int []fll = new int[9];                           fll[0]=-1;                           fll[1]=Integer.parseInt(b[3]);                        Score sco = new Score(b[0], b[1],b[2],fll);                        Student stu = new Student(b[0], b[1]);                        date.student.add(stu);                        date.grades.add(new grade(gra_gra.getgradenumber(b[0])));                            for(Course e: date.course)                            {                                if (e.name.equals(b[2]) && e.mark == 1)                                    sin = 1;                                if(e.name.equals(b[2]))                                {                                    sco.getweight(e.weight);                                    sco.getsize(e.size);                                }                            }                        if (sco.存在这个课程(b[2], date.course) && sco.成绩数量匹配考核方式(b[2], date.course))                        {                            //if (cont == 0&&sin==1) {                            //    sco.dailyScore = 0;                            //    sco.decidecourse(date.course);                             //   date.score.add(sco);                            //    sco.dailyScore = -1;                             //   cont++;                            //}                            for (Score e : date.score) {                                if (e.number.equals(b[0]) && e.name.equals(b[1]) && e.course.name.equals(b[2]) && e.dailyScore == -1 && e.examScore == Integer.parseInt(b[3])&&sin==1)                                    break;                                    else {                                    sco.dailyScore = 0;                                    sco.decidecourse(date.course);                                    date.score.add(sco);                                    for (grade m : date.grades) {                                        if (m.gradenumber.equals(gra_gra.getgradenumber(b[0]))) {                                            juddgeexist = 1;                                            break;                                        } else                                            juddgeexist = 0;                                    }                                    if (juddgeexist == 0)                                        date.grades.add(new grade(gra_gra.getgradenumber(b[0])));                                    break;                                }                            }                        } else if (!sco.存在这个课程(b[2], date.course) && !sco.成绩数量匹配考核方式(b[2], date.course))                            System.out.println(b[2] + " does not exist");                         else if (!sco.存在这个课程(b[2], date.course))                            System.out.println(b[2] + " does not exist");                         else if (!sco.成绩数量匹配考核方式(b[2], date.course))                            System.out.println(b[0] + " " + b[1] + " : access mode mismatch");                    }                    }                    if (length == 5) {                        if (!a.matches(five)) {                            System.out.println("wrong format");                        }                        else{                        uu=0;                        int []fll=new int [9];                           fll[0]= Integer.parseInt(b[3]);                           fll[1]= Integer.parseInt(b[4]);                        Score sco = new Score(b[0],b[1],b[2],fll);                        Student stu = new Student(b[0], b[1]);                        date.student.add(stu);                        date.grades.add(new grade(gra_gra.getgradenumber(b[0])));                        for(Course e: date.course){                            if(e.name.equals(b[2])&&e.mark==2)                                sin=2;                            if(e.name.equals(b[2]))                            {                                sco.getweight(e.weight);                                sco.getsize(e.size);                            }                        }                        if (sco.存在这个课程(b[2], date.course) && sco.成绩数量匹配考核方式(b[2], date.course) && a.matches(five)&&sin==2)//判断数据是否合法                        {                            // if (cont == 0&&sin==2) {                         //       sco.decidecourse(date.course);                            //    date.score.add(sco);                          //      cont++;                        //    }                            for (Score e : date.score) {                                if (e.number.equals(b[0]) && e.name.equals(b[1]) && e.course.name.equals(b[2]) && e.dailyScore == Integer.parseInt(b[3]) && e.examScore == Integer.parseInt(b[4])&&sin==2) {                                    uu=1;                                }                            }  if(uu==0&& sco.存在这个课程(b[2], date.course) && sco.成绩数量匹配考核方式(b[2], date.course) && a.matches(five)&&sin==2) {                               sco.decidecourse(date.course);                                date.score.add(sco);                            for (grade m : date.grades) {                                if (m.gradenumber.equals(gra_gra.getgradenumber(b[0]))) {                                    juddgeexist = 1;                                    break;                                } else {                                    juddgeexist = 0;                                }                            }                            if (juddgeexist == 0)                                date.grades.add(new grade(gra_gra.getgradenumber(b[0])));                        }                        } else if (!sco.存在这个课程(b[2], date.course) && !sco.成绩数量匹配考核方式(b[2], date.course)) {                            System.out.println(b[2] + " does not exist");                        } else if (!sco.存在这个课程(b[2], date.course)) {                            System.out.println(b[2] + " does not exist");                        } else if (!sco.成绩数量匹配考核方式(b[2], date.course)) {                            System.out.println(b[0] + " " + b[1] + " : access mode mismatch");                        }                    }                }                }                if ((length > 5||run==3)&&!b[2].equals("实验")&&!b[2].equals("考察")&&!b[2].equals("考试")&&ie!=1) {                    int []fll = new int[9];                    for(int i=0;i<9;i++)                        fll[i]=-1;                    for(int i=0;i{    String name;    String nature;    String assessment="no";    int size=0;    int course_score=0;    int course_dailyscore=0;    int course_finalscore=0;    float []weight=new float[9];    int found=0;    int mark=0;    float sum=0;    Course(String name,String nature,String assessment,int size,float fll[])    {        this.assessment=assessment;        this.nature=nature;        this.name=name;        this.size=size;        this.weight=fll;    }    boolean  课程性质和课程的考核方式匹配(int su)    {        if((nature.equals("必修")&&assessment.equals("考试")&&su==0)||(nature.equals("必修")&&assessment.equals("no")&&su==0)||(nature.equals("实验")&&assessment.equals("实验")&&su==1)||(nature.equals("必修")&&assessment.equals(null)&&su==0)||(nature.equals("选修")&&assessment.equals("考试")&&su==0)||(nature.equals("选修")&&assessment.equals("考察")&&su==0))        {            return true;        }        else        return false;    }    public int compareTo(Course o) {        try {            Comparator compator = Collator.getInstance(Locale.CHINA);            if (compator.compare(this.name, o.name) < 0) {                return -1;            } else if (compator.compare(this.name, o.name) > 0) {                return 1;            }        } catch (Exception e) {        }        return 0;    }    @Override    public String toString() {        return name;    }    void decidemark(){        if(nature.equals("必修")||assessment.equals("考试"))            this.mark=2;        if(assessment.equals("考察"))            this.mark=1;        if(assessment.equals("实验")&&nature.equals("实验"))            this.mark=3;    }    boolean 权重之和是否为1(){        for(int i=0;i9)            return false;        else            return true;    }}class Score{    String number;    String name;    Course course = new Course(null,null,"no",0,null);    int dailyScore;    int examScore;    int flag=-1;   int[] chengji=new int[9];   float [] weight=new float[9];    int size=0;    int mark=0;    int length;    void getsize(int size){        this.size=size;    }    void getweight(float weight[]){        this.weight=weight;    }    void  getlength(int length){        this.length=length;    }    Score(String number, String name ,String coursename,int chengji[])    {        this.number=number;        this.course.name=coursename;        this.name=name;        this.chengji=chengji;        for(int i=0;i<9;i++)         {             if(chengji[i]==-1)                 this.chengji[i]=0;         }    }    void decidecourse(List course){        course.forEach((e)->{            if(e.name.equals(this.course.name))            {                this.course=e;            }        });    }    boolean 是否合法(){        if(size<4||size>9)            return false;        for(int i=0;i<9;i++)        {            if(chengji[i]<0||chengji[i]>100)                return false;        }        return true;    }    int getFinalScore()    {        float sum=0;        if(course.assessment.equals("考察")&&course.nature.equals("选修"))            return chengji[1];        else if(course.nature.equals("必修")&&!course.assessment.equals("实验"))        {            return (int)(chengji[0]*weight[0]+chengji[1]*weight[1]);        }        else if(course.assessment.equals("考试")&&course.nature.equals("选修"))        {            return (int)(chengji[0]*weight[0]+chengji[1]*weight[1]);        }        else if(course.assessment.equals("实验") && course.nature.equals("实验")){            for(int q=0;q course){        boolean a=false;        for (Course e : course) {            if (name.equals(e.name)) {                a = true;                return a;            }        }        return a;    }    boolean 成绩数量匹配考核方式(String name,List course){        boolean b = true;        for (Course e : course) {            if(e.name.equals(name)) {                b = (!e.assessment.equals("考察") || flag != 1 || mark == 2) && (!e.assessment.equals("考试") || flag != 0 || mark == 1) && (!e.nature.equals("必修") || flag != 0 || mark == 1) && (!e.nature.equals("实验") || length - 3 == size);                break;            }        }        return b;    }}class Chosecoure {    List score = new ArrayList<>();    List course = new ArrayList<>();    List student = new ArrayList<>();    List grades=new ArrayList<>();    grade lmlm=new grade(null);    int m = 0;    void Course_and_Score() {        for (Course f : course) {            m = 0;            for (Score e : score) {                if (e.course.name.equals(f.name)) {                    f.course_score += e.getFinalScore();                    f.course_dailyscore += e.chengji[0];                    f.course_finalscore += e.chengji[1];                    m++;                }            }            if (m != 0) {                f.course_score = f.course_score / m;                f.course_finalscore = f.course_finalscore / m;                f.course_dailyscore = f.course_dailyscore / m;            } else {                System.out.println(f.name + " has no grades yet");                f.found=1;            }        }    }    void grade_score(List e)    {        grades.forEach((q)->{            e.forEach((p)->{                if(q.gradenumber.equals(lmlm.getgradenumber(p.number)))                {                    q.grade_score+=p.getFinalScore();                    q.size++;                }            });            if(q.size != 0)                q.grade_score/=q.size;        });    }    void output() {        course.forEach((e) -> {            {                if ((e.assessment.equals("考试") || e.nature.equals("必修"))&&e.found==0)                    System.out.println(e.name + " "+ e.course_score);                if (e.assessment.equals("考察")&&e.found==0) {                    System.out.println(e.name +" " + e.course_finalscore);                }                if(e.assessment.equals("实验")&&e.nature.equals("实验")&&e.found==0)                {                    System.out.println(e.name+ " " + e.course_score);                }            }        });    }}class Student implements Comparable{    String number;    String name;    float student_score = 0;    int student_score_size=0;    Student(String number,String name)    {        this.number=number;        this.name=name;    }    boolean JudgeEmpty(){        return student_score_size != 0;    }    int getStudenttotol(List e){        e.forEach((f)->{            if(f.number.equals(number))            {               student_score+=f.getFinalScore();                student_score_size++;            }        });        if(student_score_size != 0)            student_score=student_score/student_score_size;        return (int)student_score;    }    public int compareTo(Student o) {        return this.number.compareTo(o.number);    }    public String toString() {        return number;    }}class grade implements Comparable{    String gradenumber;    grade(String gradenumber){        this.gradenumber=gradenumber;    }    int grade_score = 0;    int size=0;    String getgradenumber(String number){        this.gradenumber=number.substring(0,6);        return gradenumber;    }    public int compareTo(grade o) {        return this.gradenumber.compareTo(o.gradenumber);    }    public String toString() {        return gradenumber;    }}

让我没想到的是这一次老师竟然设置了内存限制,导致我代码超出限度,无法提交,我只好先花一天的时间对我之前的代码进行修改,删减,削减注释,才交上去.哭.jpg........

这一次相对上一次则加了权重,这意味着考试这个权重得进行修改还有实验也得进行修改.

以下是我大改的代码:

void Course_and_Score() {        for (Course f : course) {            m = 0;            for (Score e : score) {                if (e.course.name.equals(f.name)) {                    f.course_score += e.getFinalScore();                    f.course_dailyscore += e.chengji[0];                    f.course_finalscore += e.chengji[1];                    m++;                }            }            if (m != 0) {                f.course_score = f.course_score / m;                f.course_finalscore = f.course_finalscore / m;                f.course_dailyscore = f.course_dailyscore / m;            } else {                System.out.println(f.name + " has no grades yet");                f.found=1;            }        }    }int getFinalScore(){float sum=0;if(course.assessment.equals("考察")&&course.nature.equals("选修"))return chengji[1];else if(course.nature.equals("必修")&&!course.assessment.equals("实验")){return (int)(chengji[0]*weight[0]+chengji[1]*weight[1]);}else if(course.assessment.equals("考试")&&course.nature.equals("选修")){return (int)(chengji[0]*weight[0]+chengji[1]*weight[1]);}else if(course.assessment.equals("实验") && course.nature.equals("实验")){for(int q=0;q9)return false;for(int i=0;i<9;i++){if(chengji[i]<0||chengji[i]>100)return false;}return true;}boolean 权重之和是否为1(){for(int i=0;i

因为课程的存储方式改变了不仅仅需要改成绩类,还要改课程类,相对于第二次可谓是大改了.难度确实比第一次到第二次难

这里最坑的一个点是这个

这里考的点竟然是数据的精度计算我真的就没想到,你敢信0.2+0.3+0.4+0.1!=1???????

实际上确实不等于1.这里只能进行精度计算

真的是给我整吐了,找这两个测试点.

这个点能过我找到的测试点是比如

java实验实验40.20.30.20.3c语言必修考试20.40.6ma实验实验40.20.30.20.20.120201116张三java7080901008022060002流啊c语言809030615250阿斯顿ma10090808070end

这个无疑是对代码进行最大的检查,基本包括了所有的情况.包括了异常情况.

然后是到满分的突破

java必修20.60.4jaca必修考试20.60.4jump实验实验40.20.30.20.3acp选修考察mup选修考试20.60.422206117刘何java10010022206017刘俊何jaca10010030202050lljump85951006514561565ppacp10045648994oomup9595end

你敢信java必修20.60.4和java必修 考试 20.60.4是一样的,这无疑在课程上又是一大难关.经过调试和改正最后也是过了,我主要用的是在判断上下了狠功夫.

最后总结一下:

一个困难是写出来的程序总是编译不过去,有时候会出一些很奇怪的报错,找不到原因在哪,我用了IDEA,但有时候就是找不到出错原因在哪可能有结构上的问题,另外一个困难是有时候不知道该怎么实现题目要求的功能,不知道怎么办,题目要求的功能用代码实现出来,并与以前的代码相契合,我经常会加了某一个功能之后就代码运行不了,要么是编译错误,要么是逻辑错误。好在现在我已经优化了一些地方,弥补了一些遗憾,正如上面展示的代码和分析一样。

在日常编码中,充分利用Java自带的函数库可以使我们更加高效地解决一些问题,避免不必要的麻烦,并且让我们的代码更具优雅性。因此,我们需要注重学习Java标准库中提供的各种方法和类,这些方法和类通常都有详细的文档说明,对于快速解决实际应用问题非常有帮助。最终,我们应该力求让自己的代码既能表达自己的意图,又能为其他人所理解,这也是一个好的编程习惯,就比如list和hashmap的对比,

我觉得产生以上问题的主要原因应该是我对应用JAVA编程不够熟练,各种语法不能够全面的了解,熟练的运用。

为使我们的代码更加易读易维护,我们需要在对类名、对象名的取名以及注释中注重见名知义的原则。这一点会变得更加明显,尤其是当我们写了很长的代码后,回忆前面写的内容也会变得困难。Java语言提供了许多文档和类库,通过熟练掌握这些文档和库函数,既可以减少不必要的工作量,又可以提高代码效率和质量,让我们的代码更加整洁易懂。

还要代码非常需要封装性,包装起来,如果能做到主函数仅仅几行,我觉得这就是代码面向对象的最高境界了............................

最重要的是其实如果记不过来英文名字用中文也可以.....

最后各位大哥大姐高抬贵手

标签: