加载中...

对第六至八次pta作业进行总结

前言:

不出意外这应该是最后一次写博客了,同时也代表着一学期的java学习之旅也将告一段落,回想起来,虽然比较困难,但是收获还蛮大的,接下来就让我为最后一次博客做个总结吧,此次针对的是对第六,七,八当中遇到的知识点进行总结和分析。

1.题量:

  • (1).第六次大作业:

和之前的一样,还是仅有的一道题,100分,因为要体现一定的难度,所以就没有了那种用来拿分的小题目了

  • (2).第七次大作业:

第七次大作业中和第六次不太一样因为老师可能考虑到要结课了,所以就改变了之前的计划,把那一道很难的题目改成40分了,加了三道分值低的小题目,从而让同学们得一些分。

  • (3).:第八次大作业

第八次大作业,和上次的差不多,多了一道题而已,一共有五道题,还是有计算成绩的延续-3,然后也有一些容易得分的题目,方便同学们得分。

2.难度:

  • (1).第六次大作业:

第六次大作业的难度,我认为不能说太简单,也不能说太难吧,难度适中,但是相比于之前的菜单系列,其实已经算是比较的简单了,但是即使是这样,我仍然是卡了有好一会的,那些测试点确实是不太的好找,但是好在最后也是找到了吧,主要那个四舍五入,还有一个当他们的分数是0时,其实是不能算的,需要仍然输出成绩为0,其他要注意的点可能没有了吧。

  • (2).第七次大作业:

在第七次大作业中,怎么说呢,按照剧情的发展难度应该是随着次数的增加而增加的,但是第七次大作业反而没有第六次大作业难了,当然了,这也仅仅是我个人的看法而已,因为他只是在第六次大作业之后做了一个实验课的叠加,其他的其实原封不动的输出就好了,难度适中吧。

  • (3).第次八大作业:

第次八大作业的难度的话应该是不太难的,但是有比第七次难度少加了一点点吧,因为这个实验课的成绩不是固定的了,变成可以有4-9个部分组成了,是一个由自己控制的,然后就是老师另外加的那些比如说栈的进出其实还是有一定的难度的,我那道题卡了好久,才算是把他给弄会了。

3.知识点:

  • (1).第六次大作业:

我认为第六次大作业学到的知识点集中起来的除了正则表达式就是Hashmap的用法,的代码如下

   HashMap<String,Class> 班级=new HashMap<>();
        HashMap<String,Course> 课程=new HashMap<>();
        HashMap<String,Student>学生=new HashMap<>();

Hashmap就相当于一个地图,地图上有你存储的东西,但是呢,每当你存储一个东西的时候,相应的也会存储进去一个key也就是索引,可以一键的找到你所需要的东西,我认为是非常的方便的。下面是Hashmap的一些基本用法

Iterator <String> iterator=班级.keySet().iterator();
        while (iterator.hasNext()){
            String key=iterator.next();
            学生.putAll(班级.get(key).Stu);}
        Set set=学生.keySet();
        Object []arr=set.toArray();
        Arrays.sort(arr);

这个相当于找了一个Hashmap的迭代器,然后对数组一直将里面的元素一个个取出来,Set一个key的数组,然后再将set数组转换为Object类,用方法sort进行排序。
还有一些就是一些细节上的技巧比如用正则表达式的时候

else if(s.matches("[0-9]{8}[ ][\u4E00-\u9FA5]{1,10}[ ]([\u4E00-\u9FA5]|[a-z]|[A-Z]){1,10}[ ]([0-9]|[1-9][0-9]|100)[ ]([0-9]|[1-9][0-9]|100)")) {
                String tokens[] = s.split(" ");

还是用split将字符串分割储存起来。其他等等的小细节和之前的差不多没有什么新奇的改变。

  • (2).第七次大作业:

我在这次大作业中学到多态的好处
代码如下

public class Main{
    public static void main(String[] args) {
        Cat cat = new Cat();
        Dog dog = new Dog();
        Goat goat = new Goat();
        speak(cat);
        speak(dog);
        speak(goat);
    }
    //定义静态方法speak()
    static void speak(Animal animal){
      animal.shout();
    }

}

其实在有些情况下,使用多态真的可以很好的解决一些繁琐的东西,但是不能用多态而滥用的话就会使之变得很麻烦,所以也还是要看清楚怎么用,该不该用之后更好。

  • (3).第八次大作业:

在第八次大作业中前面三道题目其实没什么好讲的,重点就在于成绩分析系统3和那个出栈入栈的使用我认为有的一定的难度先对成绩分析系统3进行总结。其实在之前,从一开始我的代码写得就不是那么的好,但是我总是喜欢拖延,喜欢将就,就导致其实这次写的代码很烂很烂,以至于到了成绩分析系统3里面干脆就长度超过了限制,于是我就弄了一个静态的方法来减少我的代码量,代码如下

public static void cun(HashMap<String,Class>班级,HashMap<String,Student>学生,String[] tokens){
        if (班级.containsKey(tokens[0].substring(0, 6))) {
            if (!班级.get(tokens[0].substring(0, 6)).Stu.containsKey(tokens[0])) {
                Student student = new Student(tokens[0], tokens[1]);
                班级.get(tokens[0].substring(0, 6)).Stu.put(tokens[0], student);
                学生.put(tokens[0], student);
                学生.get(tokens[0]).kecheng.add(tokens[2]);
            }
        } 

经过这样的一系列操作,代码也终于是不超限了。

4.我的看法:

关于我自己的看法,我对于这三次最后的大作业的看法是,通过这三次大作业,我们从中获得了许许多多的收获,比如对类的概念和语法的使用更加完善,对一些容器的用法也更加的熟知,如Hashmap,set sort等方法,对一些新奇的算法所吸引同时,我们也在一次次的失败中吸取经验,更加的细心,获得成长,在一次次分数积累的过程中,便是我们成长的见证,所以我认为这最后的大作业是对我们非常有益的,所以希望我们以后要一定要更加认真去自己探索java,因为以后就要靠自学了,所以我们必须要更加努力的学习!行文至此,还有许多想说的,但还是一句话,希望大家都可以热爱自己的专业课,可以有所收获
以上便是我对这次blog的前言做出的分析。

设计与分析:

我将会以三道菜单计价程序展开着重的分析,另外再对一些第三次作业中出现的新颖算法中出适当分析

  • 成绩分析系统(1):

题目如下:


7-1 课程成绩统计程序-1
分数 100
作者 蔡轲
单位 南昌航空大学
某高校课程从性质上分为:必修课、选修课,从考核方式上分为:考试、考察。

考试的总成绩由平时成绩、期末成绩分别乘以权重值得出,比如平时成绩权重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)成绩平均分只取整数部分,小数部分丢弃

输入样例1:

在这里给出一组输入。例如:

java 必修 考试
数据结构 选修 考试
形式与政治 选修 考察
end
输出样例1:

仅有课程。例如:

java has no grades yet
数据结构 has no grades yet
形式与政治 has no grades yet
输入样例2:

单门考试课程 单个学生。例如:

java 必修 考试
20201103 张三 java 20 40
end
输出样例2:

在这里给出相应的输出。例如:

20201103 张三 34
java 20 40 34
202011 34
输入样例3:

单门考察课程 单个学生。例如:

java 选修 考察
20201103 张三 java 40
end
输出样例3:

在这里给出相应的输出。例如:

20201103 张三 40
java 40 40
202011 40
输入样例4:

单门课程,单个学生,课程类型与考核类型不匹配。例如:

形式与政治 必修 考试
数据库 选修 考试
java 选修 考察
数据结构 选修 考察
20201103 李四 数据结构 70
20201103 李四 形式与政治 80 90
20201103 李四 java 60
20201103 李四 数据库 70 78
end
输出样例4:

在这里给出相应的输出。例如:

20201103 李四 73
java 60 60
数据结构 70 70
数据库 70 78 75
形式与政治 80 90 87
202011 73

其中还有许多的样例输入,这里就不一一赘述了。

我的源码如下:

import java.text.Collator;
import java.util.*;

public class Main {
    public static void main(String[] args) {
        Scanner scanner = new Scanner(System.in);
        HashMap<String,Class> 班级=new HashMap<>();
        HashMap<String,Course> 课程=new HashMap<>();
        HashMap<String,Student>学生=new HashMap<>();
        while(true) {
            String s = scanner.nextLine();
            if (s.equals("end"))
                break;
            else if (s.matches("([\u4E00-\u9FA5]|[a-z]|[A-Z]){1,10}[ ](必修|选修)")) {
                String tokens[] = s.split(" ");
                if (!课程.containsKey(tokens[0])) {
                    if(tokens[1].equals("选修"))
                        System.out.println(tokens[0] + " : course type & access mode mismatch");
                    else {
                        Course course = new Course();
                        course.方式 = 1;
                        course.性质 = 1;
                        course.name = tokens[0];
                        课程.put(tokens[0], course);}
                }
            } else if (s.matches("([\u4E00-\u9FA5]|[a-z]|[A-Z]){1,10}[ ](必修|选修)[ ](考试|考察)")) {
                String tokens[] = s.split(" ");
                if (!课程.containsKey(tokens[0])) {
                    Course course = new Course();
                    if (tokens[1].equals("必修") && tokens[2].equals("考察"))
                        System.out.println(tokens[0] + " : course type & access mode mismatch");
                    else {
                        if (tokens[1].equals("必修"))
                            course.性质 = 1;
                        else
                            course.性质 = 0;
                        if (tokens[2].equals("考试"))
                            course.方式 = 1;
                        else
                            course.方式 = 0;
                        course.name = tokens[0];
                        课程.put(tokens[0], course);
                    }
                }
            } else if (s.matches("[0-9]{8}[ ][\u4E00-\u9FA5]{1,10}[ ]([\u4E00-\u9FA5]|[a-z]|[A-Z]){1,10}[ ]([0-9]|[1-9][0-9]|100)")) {
                String tokens[] = s.split(" ");
                if (课程.containsKey(tokens[2]) == false) {
                    System.out.println(tokens[2] + " " + "does not exist");
                    if (班级.containsKey(tokens[0].substring(0, 6))) {
                        if (!班级.get(tokens[0].substring(0, 6)).Stu.containsKey(tokens[0])) {
                            Student student = new Student(tokens[0], tokens[1]);
                            班级.get(tokens[0].substring(0, 6)).Stu.put(tokens[0], student);
                            学生.put(tokens[0], student);
                            学生.get(tokens[0]).kecheng.add(tokens[2]);
                        }
                    } else {
                        Class c = new Class();
                        Student student = new Student(tokens[0], tokens[1]);
                        student.score = 0;
                        c.Stu.put(tokens[0], student);
                        c.banjihao=tokens[0].substring(0,6);
                        学生.put(tokens[0], student);
                        学生.get(tokens[0]).kecheng.add(tokens[2]);
                        班级.put(tokens[0].substring(0, 6), c);
                    }
                } else {
                    if (课程.get(tokens[2]).方式 == 1) {
                        System.out.println(tokens[0] + " " + tokens[1] + " " + ": access mode mismatch");
                        if (班级.containsKey(tokens[0].substring(0, 6))) {
                            if (!班级.get(tokens[0].substring(0, 6)).Stu.containsKey(tokens[0])) {
                                Student student = new Student(tokens[0], tokens[1]);
                                班级.get(tokens[0].substring(0, 6)).Stu.put(tokens[0], student);
                                学生.put(tokens[0], student);
                                学生.get(tokens[0]).kecheng.add(tokens[2]);
                            }
                        } else {
                            Class c = new Class();
                            Student student = new Student(tokens[0], tokens[1]);
                            student.score = 0;
                            c.Stu.put(tokens[0], student);
                            c.banjihao=tokens[0].substring(0,6);
                            学生.put(tokens[0], student);
                            学生.get(tokens[0]).kecheng.add(tokens[2]);
                            班级.put(tokens[0].substring(0, 6), c);
                        }
                    } else {
                        if (!(学生.containsKey(tokens[0]) && 学生.get(tokens[0]).kecheng.contains(tokens[2]))) {
                            课程.get(tokens[2]).num++;
                            课程.get(tokens[2]).scoreB.Sumscore += 课程.get(tokens[2]).scoreB.Calculatescore(Integer.parseInt(tokens[3]));
                            课程.get(tokens[2]).flag=1;
                            if (班级.containsKey(tokens[0].substring(0, 6))) {
                                if (!班级.get(tokens[0].substring(0, 6)).Stu.containsKey(tokens[0])) {
                                    Student student = new Student(tokens[0], tokens[1]);
                                    student.score = 课程.get(tokens[2]).scoreB.Calculatescore(Integer.parseInt(tokens[3]));
                                    班级.get(tokens[0].substring(0, 6)).Stu.put(tokens[0], student);
                                    学生.put(tokens[0], student);
                                    学生.get(tokens[0]).kecheng.add(tokens[2]);
                                    班级.get(tokens[0].substring(0, 6)).num++;
                                    班级.get(tokens[0].substring(0, 6)).Stu.get(tokens[0]).scorenum++;
                                    班级.get(tokens[0].substring(0, 6)).Stu.get(tokens[0]).kecheng.add(tokens[2]);
                                } else {
                                    班级.get(tokens[0].substring(0, 6)).Stu.get(tokens[0]).score += 课程.get(tokens[2]).scoreB.Calculatescore(Integer.parseInt(tokens[3]));
                                    班级.get(tokens[0].substring(0, 6)).Stu.get(tokens[0]).scorenum++;
                                    班级.get(tokens[0].substring(0, 6)).Stu.get(tokens[0]).kecheng.add(tokens[2]);
                                }
                            } else {
                                Class c = new Class();
                                Student student = new Student(tokens[0], tokens[1]);
                                student.score = 课程.get(tokens[2]).scoreB.Calculatescore(Integer.parseInt(tokens[3]));
                                c.Stu.put(tokens[0], student);
                                c.banjihao=tokens[0].substring(0,6);
                                学生.put(tokens[0], student);
                                学生.get(tokens[0]).kecheng.add(tokens[2]);
                                c.num++;
                                c.Stu.get(tokens[0]).scorenum++;
                                班级.put(tokens[0].substring(0, 6), c);
                                班级.get(tokens[0].substring(0, 6)).Stu.get(tokens[0]).kecheng.add(tokens[2]);
                            }
                        }
                    }
                }
            }
            else if(s.matches("[0-9]{8}[ ][\u4E00-\u9FA5]{1,10}[ ]([\u4E00-\u9FA5]|[a-z]|[A-Z]){1,10}[ ]([0-9]|[1-9][0-9]|100)[ ]([0-9]|[1-9][0-9]|100)")) {
                String tokens[] = s.split(" ");
                if (课程.containsKey(tokens[2]) == false) {
                    System.out.println(tokens[2] + " " + "does not exist");
                    if (班级.containsKey(tokens[0].substring(0, 6))) {
                        if (!班级.get(tokens[0].substring(0, 6)).Stu.containsKey(tokens[0])) {
                            Student student = new Student(tokens[0], tokens[1]);
                            班级.get(tokens[0].substring(0, 6)).Stu.put(tokens[0], student);
                            学生.put(tokens[0], student);
                            学生.get(tokens[0]).kecheng.add(tokens[2]);//加课.
                        }
                    } else {
                        Class c = new Class();
                        Student student = new Student(tokens[0], tokens[1]);
                        student.score = 0;
                        c.Stu.put(tokens[0], student);
                        c.banjihao=tokens[0].substring(0,6);
                        学生.put(tokens[0], student);
                        学生.get(tokens[0]).kecheng.add(tokens[2]);
                        班级.put(tokens[0].substring(0, 6), c);
                    }
                } else {
                    if (课程.get(tokens[2]).方式 == 0) {
                        System.out.println(tokens[0] + " " + tokens[1] + " " + ": access mode mismatch");
                        if (班级.containsKey(tokens[0].substring(0, 6))) {
                            if (!班级.get(tokens[0].substring(0, 6)).Stu.containsKey(tokens[0])) {
                                Student student = new Student(tokens[0], tokens[1]);
                                班级.get(tokens[0].substring(0, 6)).Stu.put(tokens[0], student);
                                学生.put(tokens[0], student);
                                学生.get(tokens[0]).kecheng.add(tokens[2]);
                            }
                        } else {
                            Class c = new Class();
                            Student student = new Student(tokens[0], tokens[1]);
                            student.score = 0;
                            c.Stu.put(tokens[0], student);
                            c.banjihao=tokens[0].substring(0,6);
                            学生.put(tokens[0], student);
                            学生.get(tokens[0]).kecheng.add(tokens[2]);
                            班级.put(tokens[0].substring(0, 6), c);
                        }
                    } else {
                        if (!(学生.containsKey(tokens[0]) && 学生.get(tokens[0]).kecheng.contains(tokens[2]))) {
                            课程.get(tokens[2]).num++;
                            课程.get(tokens[2]).scoreA.Sumscore += 课程.get(tokens[2]).scoreA.Calculatescore(Integer.parseInt(tokens[3]), Integer.parseInt(tokens[4]));
                            课程.get(tokens[2]).scoreA.平时成绩 += Integer.parseInt(tokens[3]);
                            课程.get(tokens[2]).scoreA.期末成绩 += Integer.parseInt(tokens[4]);
                            if (班级.containsKey(tokens[0].substring(0, 6))) {
                                //班级.get(tokens[0].substring(0, 6)).Sumscore += 课程.get(tokens[2]).scoreA.Calculatescore(Integer.parseInt(tokens[3]), Integer.parseInt(tokens[4]));
                                if (!班级.get(tokens[0].substring(0, 6)).Stu.containsKey(tokens[0])) {
                                    Student student = new Student(tokens[0], tokens[1]);
                                    student.score = 课程.get(tokens[2]).scoreA.Calculatescore(Integer.parseInt(tokens[3]), Integer.parseInt(tokens[4]));
                                    班级.get(tokens[0].substring(0, 6)).Stu.put(tokens[0], student);
                                    学生.put(tokens[0], student);
                                    学生.get(tokens[0]).kecheng.add(tokens[2]);
                                    班级.get(tokens[0].substring(0, 6)).num++;
                                    班级.get(tokens[0].substring(0, 6)).Stu.get(tokens[0]).scorenum++;
                                    班级.get(tokens[0].substring(0, 6)).Stu.get(tokens[0]).kecheng.add(tokens[2]);
                                } else {
                                    班级.get(tokens[0].substring(0, 6)).Stu.get(tokens[0]).score += 课程.get(tokens[2]).scoreA.Calculatescore(Integer.parseInt(tokens[3]), Integer.parseInt(tokens[4]));
                                    班级.get(tokens[0].substring(0, 6)).Stu.get(tokens[0]).scorenum++;
                                    班级.get(tokens[0].substring(0, 6)).Stu.get(tokens[0]).kecheng.add(tokens[2]);
                                }
                            } else {
                                Class c = new Class();
                                Student student = new Student(tokens[0], tokens[1]);
                                student.score = 课程.get(tokens[2]).scoreA.Calculatescore(Integer.parseInt(tokens[3]), Integer.parseInt(tokens[4]));
                                c.Stu.put(tokens[0], student);
                                c.banjihao=tokens[0].substring(0,6);
                                学生.put(tokens[0], student);
                                学生.get(tokens[0]).kecheng.add(tokens[2]);
                                c.num++;//youyongrenshu;
                                c.Stu.get(tokens[0]).scorenum++;
                                班级.put(tokens[0].substring(0, 6), c);
                                班级.get(tokens[0].substring(0, 6)).Stu.get(tokens[0]).kecheng.add(tokens[2]);
                            }
                        }
                    }
                }
            }
            else
                System.out.println("wrong format");



        }
        Iterator <String> iterator=班级.keySet().iterator();
        while (iterator.hasNext()){
            String key=iterator.next();
            学生.putAll(班级.get(key).Stu);}
        Set set=学生.keySet();
        Object []arr=set.toArray();
        Arrays.sort(arr);
        for (Object key:arr){
            if(学生.get(key).score==0&&学生.get(key).scorenum==0)
                System.out.println(学生.get(key).xuehao+" "+学生.get(key).name+" "+"did not take any exams");
            else
                System.out.println(key+" "+学生.get(key).name+" "+学生.get(key).score/学生.get(key).scorenum);
        }
        Set set1=课程.keySet();
        Comparator<Object>comparator= Collator.getInstance(Locale.CHINA);
        Object []arr1= set1.toArray();
        Arrays.sort(arr1,comparator);
        for(Object key:arr1){
            if(课程.get(key).方式==1){
                if(课程.get(key).scoreA.Sumscore==0&&课程.get(key).flag==0)
                    System.out.println(课程.get(key).name+" "+"has no grades yet");
                else
                    System.out.println(key+" "+课程.get(key).scoreA.平时成绩/课程.get(key).num+" "+课程.get(key).scoreA.期末成绩/课程.get(key).num+" "+课程.get(key).scoreA.Sumscore/课程.get(key).num);
            }
            else{
                if(课程.get(key).scoreB.Sumscore==0&&课程.get(key).flag==0)
                    System.out.println(课程.get(key).name+" "+"has no grades yet");
                else
                    System.out.println(key+" "+课程.get(key).scoreB.Sumscore/课程.get(key).num+" "+课程.get(key).scoreB.Sumscore/课程.get(key).num);
            }
        }
        Iterator <String> iterator1=班级.keySet().iterator();
        while (iterator1.hasNext()){
            String key=iterator1.next();
            Iterator <String> iterator2=班级.get(key).Stu.keySet().iterator();
            while (iterator2.hasNext()){
                String key1=iterator2.next();
                if(!(班级.get(key).Stu.get(key1).scorenum==0))
                    班级.get(key).Sumscore+=班级.get(key).Stu.get(key1).score/班级.get(key).Stu.get(key1).scorenum;
            }
            班级.get(key).averscore=班级.get(key).Sumscore/班级.get(key).Stu.size();
        }
        Object []arr2=班级.keySet().toArray();
        Arrays.sort(arr2);
        for(Object o:arr2){
            if(班级.get(o).averscore==0&&班级.get(o).num==0)
                System.out.println(班级.get(o).banjihao+" "+"has no grades yet");
            else
                System.out.println(班级.get(o).banjihao+" "+班级.get(o).averscore);
        }
    }
}


class Class{
    int Sumscore=0;
    int averscore=0;
    int num;//有用的人数;
    HashMap<String,Student> Stu=new HashMap<>();
    String banjihao;
}
class  Student{
    Student(String a,String b){
        this.name=b;
        this.xuehao=a;
    }
    Set<String>kecheng=new HashSet<>();
    String xuehao;
    String name;
    int score;
    int scorenum=0;
}
class Course{
    ScoreA scoreA=new ScoreA();
    ScoreB scoreB=new ScoreB();
    int flag=0;

    String name;
    int 性质;
    int 方式;
    int num;
}
class Score{
    int Sumscore;
    Score(){

    }
}
class ScoreA extends Score{
    int 平时成绩;
    int 期末成绩;
    int Calculatescore(int a,int b) {
        return (int)(a*0.3+b*0.7);
    }
}
class ScoreB extends Score{
    int Calculatescore(int a){
        return a;
    }
}




设计思路:

我的设计思路是,因为又是一道新的系列题,我打算就是先区分是输入课程,还是课程信息,然后利用正则表达式来做限制。

if(s.matches("[0-9]{8}[ ][\u4E00-\u9FA5]{1,10}[ ]([\u4E00-\u9FA5]|[a-z]|[A-Z]){1,10}[ ]([0-9]|[1-9][0-9]|100)[ ]([0-9]|[1-9][0-9]|100)"))

再比如这个是用来判断是否是输入课程成绩的判断:

else if (s.matches("[0-9]{8}[ ][\u4E00-\u9FA5]{1,10}[ ]([\u4E00-\u9FA5]|[a-z]|[A-Z]){1,10}[ ]([0-9]|[1-9][0-9]|100)")) {
                String tokens[] = s.split(" ");

还有许许多多类似的判断,其实都大同小异,这里便不再赘述。
然后呢分好类之后,就要根据不同的部分进行相应的操作,输入课程这块的话,需要先用split方法将字符串以空格分隔,然后将分好的存进一个数组当中,接着把成绩和分数存进已经new好的Hashmap课程数组和Hashmap学生数组当中,这就是课程的存储方法,接着就是像一个学生成绩的啊之类的操作。其实和这个都有所相似,细节不同而已。
然后将不匹配的成绩和课程的操作完成之后,删除的代码也补上,就到了最后的计算总平均分的环节了,这里要注意时间不同的课程的不同性质,对应的的计算分数方式也不同,所以还要进行区别课程性质的操作,然后根据学生,课程,数组的顺序,依次输出每个课程,每个学生的总平均分,就大功告成了。

类图如下:

关系报表图如下:

对类图报表及代码的分析与解释:

类图分析:
可以从类图看出,此题我使用了六个类,分别是score类,scoreA类,scoreB类,Course类和Class类,还有一个Student的类。
报表分析
Lines: 指的是代码总行数
Statements:语句的行数,语句是以分号结尾的。这个C中有所不同。
Percent Branch Statement:分支数占总语句数的百分比
Method Call Statement:方法调用语句数
Percent Lines with Comments:注释语句占总语句数的百分比
Classes and Interfaces:类和接口数
Methods per Class:每个类平均包含函数个数
Average Statements per Method:每个函数平均包含的语句个数
函数复杂度(Function Complexity)复杂
所以从图中不难看出,在这几个方面中,达到绿色的是比较良好的代码,而红色超出绿色范围的则是不太良好的代码,我的这个大部分不在范围内,所以说我这次写的代码其实是不太好的,class类可能不太妥当,然后红色的范围是比较不合格的,另外圈复杂度也控制在了平均10的一个数据,最高的圈复杂度是有点高超出了红色范围不少,这是我认为我需要改进的地方,比较高,总体的话还行,以后写代码的时候要尽可能地去降低自己代码的复杂度才可以实现代码更好的可维护性和可移植性。

  • 成绩分析2:

题目的话我就不写了太长了,其实和上次的差不多就多了一个实验课而已,其他的几乎是一模一样下面只给出我的源代码吧。

我的源码如下:

import java.text.Collator;
import java.util.*;

public class Main {
    public static void main(String[] args) {
        Scanner scanner = new Scanner(System.in);
        HashMap<String,Class> 班级=new HashMap<>();
        HashMap<String,Course> 课程=new HashMap<>();
        HashMap<String,Student>学生=new HashMap<>();
        while(true) {
            String s = scanner.nextLine();
            if (s.equals("end"))
                break;
            else if (s.matches("([\u4E00-\u9FA5]|[a-z]|[A-Z]){1,10}[ ](必修|选修)")) {
                String tokens[] = s.split(" ");
                if (!课程.containsKey(tokens[0])) {
                    if(tokens[1].equals("选修"))
                        System.out.println(tokens[0] + " : course type & access mode mismatch");
                    else {
                        Course course = new Course();
                        course.方式 = 1;
                        course.性质 = 1;
                        course.name = tokens[0];
                        课程.put(tokens[0], course);}
                }
            } else if (s.matches("([\u4E00-\u9FA5]|[a-z]|[A-Z]){1,10}[ ](必修|选修|实验)[ ](考试|考察|实验)")) {
                String tokens[] = s.split(" ");
                if (!课程.containsKey(tokens[0])) {
                    Course course = new Course();
                    if (tokens[1].equals("必修") && (tokens[2].equals("考察")||tokens[2].equals("实验")))
                        System.out.println(tokens[0] + " : course type & access mode mismatch");
                    else if(tokens[1].equals("选修")&&tokens[2].equals("实验"))
                        System.out.println(tokens[0] + " : course type & access mode mismatch");
                    else if(tokens[1].equals("实验")&&(tokens[2].equals("考试")||tokens[2].equals("考察")))
                        System.out.println(tokens[0] + " : course type & access mode mismatch");
                    else {
                        if (tokens[1].equals("必修"))
                            course.性质 = 1;
                        else if(tokens[1].equals("选修"))
                            course.性质 = 0;
                        else
                            course.性质=2;
                        if (tokens[2].equals("考试"))
                            course.方式 = 1;
                        else if(tokens[2].equals("考察"))
                            course.方式 = 0;
                        else
                            course.方式=2;
                        course.name = tokens[0];
                        课程.put(tokens[0], course);
                    }
                }
            } else if (s.matches("[0-9]{8}[ ][\u4E00-\u9FA5]{1,10}[ ]([\u4E00-\u9FA5]|[a-z]|[A-Z]){1,10}[ ]([0-9]|[1-9][0-9]|100)")) {
                String tokens[] = s.split(" ");
                if (课程.containsKey(tokens[2]) == false) {
                    System.out.println(tokens[2] + " " + "does not exist");
                    if (班级.containsKey(tokens[0].substring(0, 6))) {
                        if (!班级.get(tokens[0].substring(0, 6)).Stu.containsKey(tokens[0])) {
                            Student student = new Student(tokens[0], tokens[1]);
                            班级.get(tokens[0].substring(0, 6)).Stu.put(tokens[0], student);
                            学生.put(tokens[0], student);
                            学生.get(tokens[0]).kecheng.add(tokens[2]);
                        }
                    } else {
                        Class c = new Class();
                        Student student = new Student(tokens[0], tokens[1]);
                        student.score = 0;
                        c.Stu.put(tokens[0], student);
                        c.banjihao=tokens[0].substring(0,6);
                        学生.put(tokens[0], student);
                        学生.get(tokens[0]).kecheng.add(tokens[2]);
                        班级.put(tokens[0].substring(0, 6), c);
                    }
                } else {
                    if (课程.get(tokens[2]).方式 == 1) {
                        System.out.println(tokens[0] + " " + tokens[1] + " " + ": access mode mismatch");
                        if (班级.containsKey(tokens[0].substring(0, 6))) {
                            if (!班级.get(tokens[0].substring(0, 6)).Stu.containsKey(tokens[0])) {
                                Student student = new Student(tokens[0], tokens[1]);
                                班级.get(tokens[0].substring(0, 6)).Stu.put(tokens[0], student);
                                学生.put(tokens[0], student);
                                学生.get(tokens[0]).kecheng.add(tokens[2]);
                            }
                        } else {
                            Class c = new Class();
                            Student student = new Student(tokens[0], tokens[1]);
                            student.score = 0;
                            c.Stu.put(tokens[0], student);
                            c.banjihao=tokens[0].substring(0,6);
                            学生.put(tokens[0], student);
                            学生.get(tokens[0]).kecheng.add(tokens[2]);
                            班级.put(tokens[0].substring(0, 6), c);
                        }
                    } else {
                        if (!(学生.containsKey(tokens[0]) && 学生.get(tokens[0]).kecheng.contains(tokens[2]))) {
                            课程.get(tokens[2]).num++;
                            课程.get(tokens[2]).scoreB.Sumscore += 课程.get(tokens[2]).scoreB.Calculatescore(Integer.parseInt(tokens[3]));
                            课程.get(tokens[2]).flag=1;
                            if (班级.containsKey(tokens[0].substring(0, 6))) {
                                if (!班级.get(tokens[0].substring(0, 6)).Stu.containsKey(tokens[0])) {
                                    Student student = new Student(tokens[0], tokens[1]);
                                    student.score = 课程.get(tokens[2]).scoreB.Calculatescore(Integer.parseInt(tokens[3]));
                                    班级.get(tokens[0].substring(0, 6)).Stu.put(tokens[0], student);
                                    学生.put(tokens[0], student);
                                    学生.get(tokens[0]).kecheng.add(tokens[2]);
                                    班级.get(tokens[0].substring(0, 6)).num++;
                                    班级.get(tokens[0].substring(0, 6)).Stu.get(tokens[0]).scorenum++;
                                    班级.get(tokens[0].substring(0, 6)).Stu.get(tokens[0]).kecheng.add(tokens[2]);
                                } else {
                                    班级.get(tokens[0].substring(0, 6)).Stu.get(tokens[0]).score += 课程.get(tokens[2]).scoreB.Calculatescore(Integer.parseInt(tokens[3]));
                                    班级.get(tokens[0].substring(0, 6)).Stu.get(tokens[0]).scorenum++;
                                    班级.get(tokens[0].substring(0, 6)).Stu.get(tokens[0]).kecheng.add(tokens[2]);
                                }
                            } else {
                                Class c = new Class();
                                Student student = new Student(tokens[0], tokens[1]);
                                student.score = 课程.get(tokens[2]).scoreB.Calculatescore(Integer.parseInt(tokens[3]));
                                c.Stu.put(tokens[0], student);
                                c.banjihao=tokens[0].substring(0,6);
                                学生.put(tokens[0], student);
                                学生.get(tokens[0]).kecheng.add(tokens[2]);
                                c.num++;
                                c.Stu.get(tokens[0]).scorenum++;
                                班级.put(tokens[0].substring(0, 6), c);
                                班级.get(tokens[0].substring(0, 6)).Stu.get(tokens[0]).kecheng.add(tokens[2]);
                            }
                        }
                    }
                }
            }
            else if(s.matches("[0-9]{8}[ ][\u4E00-\u9FA5]{1,10}[ ]([\u4E00-\u9FA5]|[a-z]|[A-Z]){1,10}[ ]([0-9]|[1-9][0-9]|100)[ ]([0-9]|[1-9][0-9]|100)")) {
                String tokens[] = s.split(" ");
                if (课程.containsKey(tokens[2]) == false) {
                    System.out.println(tokens[2] + " " + "does not exist");
                    if (班级.containsKey(tokens[0].substring(0, 6))) {
                        if (!班级.get(tokens[0].substring(0, 6)).Stu.containsKey(tokens[0])) {
                            Student student = new Student(tokens[0], tokens[1]);
                            班级.get(tokens[0].substring(0, 6)).Stu.put(tokens[0], student);
                            学生.put(tokens[0], student);
                            学生.get(tokens[0]).kecheng.add(tokens[2]);//加课.
                        }
                    } else {
                        Class c = new Class();
                        Student student = new Student(tokens[0], tokens[1]);
                        student.score = 0;
                        c.Stu.put(tokens[0], student);
                        c.banjihao=tokens[0].substring(0,6);
                        学生.put(tokens[0], student);
                        学生.get(tokens[0]).kecheng.add(tokens[2]);
                        班级.put(tokens[0].substring(0, 6), c);
                    }
                } else {
                    if (课程.get(tokens[2]).方式 == 0) {
                        System.out.println(tokens[0] + " " + tokens[1] + " " + ": access mode mismatch");
                        if (班级.containsKey(tokens[0].substring(0, 6))) {
                            if (!班级.get(tokens[0].substring(0, 6)).Stu.containsKey(tokens[0])) {
                                Student student = new Student(tokens[0], tokens[1]);
                                班级.get(tokens[0].substring(0, 6)).Stu.put(tokens[0], student);
                                学生.put(tokens[0], student);
                                学生.get(tokens[0]).kecheng.add(tokens[2]);
                            }
                        } else {
                            Class c = new Class();
                            Student student = new Student(tokens[0], tokens[1]);
                            student.score = 0;
                            c.Stu.put(tokens[0], student);
                            c.banjihao=tokens[0].substring(0,6);
                            学生.put(tokens[0], student);
                            学生.get(tokens[0]).kecheng.add(tokens[2]);
                            班级.put(tokens[0].substring(0, 6), c);
                        }
                    } else {
                        if (!(学生.containsKey(tokens[0]) && 学生.get(tokens[0]).kecheng.contains(tokens[2]))) {
                            课程.get(tokens[2]).num++;
                            课程.get(tokens[2]).scoreA.Sumscore += 课程.get(tokens[2]).scoreA.Calculatescore(Integer.parseInt(tokens[3]), Integer.parseInt(tokens[4]));
                            课程.get(tokens[2]).scoreA.平时成绩 += Integer.parseInt(tokens[3]);
                            课程.get(tokens[2]).scoreA.期末成绩 += Integer.parseInt(tokens[4]);
                            if (班级.containsKey(tokens[0].substring(0, 6))) {
                                //班级.get(tokens[0].substring(0, 6)).Sumscore += 课程.get(tokens[2]).scoreA.Calculatescore(Integer.parseInt(tokens[3]), Integer.parseInt(tokens[4]));
                                if (!班级.get(tokens[0].substring(0, 6)).Stu.containsKey(tokens[0])) {
                                    Student student = new Student(tokens[0], tokens[1]);
                                    student.score = 课程.get(tokens[2]).scoreA.Calculatescore(Integer.parseInt(tokens[3]), Integer.parseInt(tokens[4]));
                                    班级.get(tokens[0].substring(0, 6)).Stu.put(tokens[0], student);
                                    学生.put(tokens[0], student);
                                    学生.get(tokens[0]).kecheng.add(tokens[2]);
                                    班级.get(tokens[0].substring(0, 6)).num++;
                                    班级.get(tokens[0].substring(0, 6)).Stu.get(tokens[0]).scorenum++;
                                    班级.get(tokens[0].substring(0, 6)).Stu.get(tokens[0]).kecheng.add(tokens[2]);
                                } else {
                                    班级.get(tokens[0].substring(0, 6)).Stu.get(tokens[0]).score += 课程.get(tokens[2]).scoreA.Calculatescore(Integer.parseInt(tokens[3]), Integer.parseInt(tokens[4]));
                                    班级.get(tokens[0].substring(0, 6)).Stu.get(tokens[0]).scorenum++;
                                    班级.get(tokens[0].substring(0, 6)).Stu.get(tokens[0]).kecheng.add(tokens[2]);
                                }
                            } else {
                                Class c = new Class();
                                Student student = new Student(tokens[0], tokens[1]);
                                student.score = 课程.get(tokens[2]).scoreA.Calculatescore(Integer.parseInt(tokens[3]), Integer.parseInt(tokens[4]));
                                c.Stu.put(tokens[0], student);
                                c.banjihao=tokens[0].substring(0,6);
                                学生.put(tokens[0], student);
                                学生.get(tokens[0]).kecheng.add(tokens[2]);
                                c.num++;//youyongrenshu;
                                c.Stu.get(tokens[0]).scorenum++;
                                // c.Sumscore = 课程.get(tokens[2]).scoreA.Calculatescore(Integer.parseInt(tokens[3]),Integer.parseInt(tokens[4]));
                                班级.put(tokens[0].substring(0, 6), c);
                                班级.get(tokens[0].substring(0, 6)).Stu.get(tokens[0]).kecheng.add(tokens[2]);
                            }
                        }
                    }
                }
            }
            else if(s.matches("[0-9]{8}[ ][\u4E00-\u9FA5]{1,10}[ ]([\u4E00-\u9FA5]|[a-z]|[A-Z]){1,10}[ ][4-9]([ ]([0-9]|[1-9][0-9]|100))+"))
            {
                String []tokens=s.split(" ");
                if(!课程.containsKey(tokens[2])){
                    System.out.println(tokens[2] + " " + "does not exist");
                    if (班级.containsKey(tokens[0].substring(0, 6))) {
                        if (!班级.get(tokens[0].substring(0, 6)).Stu.containsKey(tokens[0])) {
                            Student student = new Student(tokens[0], tokens[1]);
                            班级.get(tokens[0].substring(0, 6)).Stu.put(tokens[0], student);
                            学生.put(tokens[0], student);
                            学生.get(tokens[0]).kecheng.add(tokens[2]);//加课.
                        }
                    } else {
                        Class c = new Class();
                        Student student = new Student(tokens[0], tokens[1]);
                        student.score = 0;
                        c.Stu.put(tokens[0], student);
                        c.banjihao=tokens[0].substring(0,6);
                        学生.put(tokens[0], student);
                        学生.get(tokens[0]).kecheng.add(tokens[2]);
                        班级.put(tokens[0].substring(0, 6), c);
                    }


                }
                else {
                    if (课程.get(tokens[2]).性质 == 0||课程.get(tokens[2]).性质==1||!(Integer.parseInt(tokens[3])+4==tokens.length)) {
                        System.out.println(tokens[0] + " " + tokens[1] + " " + ": access mode mismatch");
                        if (班级.containsKey(tokens[0].substring(0, 6))) {
                            if (!班级.get(tokens[0].substring(0, 6)).Stu.containsKey(tokens[0])) {
                                Student student = new Student(tokens[0], tokens[1]);
                                班级.get(tokens[0].substring(0, 6)).Stu.put(tokens[0], student);
                                学生.put(tokens[0], student);
                                学生.get(tokens[0]).kecheng.add(tokens[2]);
                            }
                        } else {
                            Class c = new Class();
                            Student student = new Student(tokens[0], tokens[1]);
                            student.score = 0;
                            c.Stu.put(tokens[0], student);
                            c.banjihao=tokens[0].substring(0,6);
                            学生.put(tokens[0], student);
                            学生.get(tokens[0]).kecheng.add(tokens[2]);
                            班级.put(tokens[0].substring(0, 6), c);
                        }
                    }
                    else {
                        if (!(学生.containsKey(tokens[0]) && 学生.get(tokens[0]).kecheng.contains(tokens[2]))) {
                            课程.get(tokens[2]).num++;
                            int 实验成绩=0;
                            for(int j=0;j<Integer.parseInt(tokens[3]);j++)
                                实验成绩 += Integer.parseInt(tokens[4+j]);
                            实验成绩/=Integer.parseInt(tokens[3]);
                            课程.get(tokens[2]).scoreC.Sumscore+=实验成绩;
                            //int 实验成绩=课程.get(tokens[2]).scoreC.Sumscore;
                            if (班级.containsKey(tokens[0].substring(0, 6))) {
                                //班级.get(tokens[0].substring(0, 6)).Sumscore += 课程.get(tokens[2]).scoreA.Calculatescore(Integer.parseInt(tokens[3]), Integer.parseInt(tokens[4]));
                                if (!班级.get(tokens[0].substring(0, 6)).Stu.containsKey(tokens[0])) {
                                    Student student = new Student(tokens[0], tokens[1]);
                                    student.score = 实验成绩;
                                    班级.get(tokens[0].substring(0, 6)).Stu.put(tokens[0], student);
                                    学生.put(tokens[0], student);
                                    学生.get(tokens[0]).kecheng.add(tokens[2]);
                                    班级.get(tokens[0].substring(0, 6)).num++;
                                    班级.get(tokens[0].substring(0, 6)).Stu.get(tokens[0]).scorenum++;
                                    班级.get(tokens[0].substring(0, 6)).Stu.get(tokens[0]).kecheng.add(tokens[2]);
                                } else {
                                    班级.get(tokens[0].substring(0, 6)).Stu.get(tokens[0]).score += 实验成绩;
                                    班级.get(tokens[0].substring(0, 6)).Stu.get(tokens[0]).scorenum++;
                                    班级.get(tokens[0].substring(0, 6)).Stu.get(tokens[0]).kecheng.add(tokens[2]);
                                }
                            } else {
                                Class c = new Class();
                                Student student = new Student(tokens[0], tokens[1]);
                                student.score = 实验成绩;
                                c.Stu.put(tokens[0], student);
                                c.banjihao=tokens[0].substring(0,6);
                                学生.put(tokens[0], student);
                                学生.get(tokens[0]).kecheng.add(tokens[2]);
                                c.num++;//youyongrenshu;
                                c.Stu.get(tokens[0]).scorenum++;
                                // c.Sumscore = 课程.get(tokens[2]).scoreA.Calculatescore(Integer.parseInt(tokens[3]),Integer.parseInt(tokens[4]));
                                班级.put(tokens[0].substring(0, 6), c);
                                班级.get(tokens[0].substring(0, 6)).Stu.get(tokens[0]).kecheng.add(tokens[2]);
                            }
                        }
                    }

                }
            }
            else
                System.out.println("wrong format");



        }
        Iterator <String> iterator=班级.keySet().iterator();
        while (iterator.hasNext()){
            String key=iterator.next();
            学生.putAll(班级.get(key).Stu);}
        Set set=学生.keySet();
        Object []arr=set.toArray();
        Arrays.sort(arr);
        for (Object key:arr){
            if(学生.get(key).score==0&&学生.get(key).scorenum==0)
                System.out.println(学生.get(key).xuehao+" "+学生.get(key).name+" "+"did not take any exams");
            else
                System.out.println(key+" "+学生.get(key).name+" "+学生.get(key).score/学生.get(key).scorenum);
        }
        Set set1=课程.keySet();
        Comparator<Object>comparator= Collator.getInstance(Locale.CHINA);
        Object []arr1= set1.toArray();
        Arrays.sort(arr1,comparator);
        for(Object key:arr1){
            if(课程.get(key).方式==1){
                if(课程.get(key).scoreA.Sumscore==0&&课程.get(key).flag==0)
                    System.out.println(课程.get(key).name+" "+"has no grades yet");
                else
                    System.out.println(key+" "+课程.get(key).scoreA.平时成绩/课程.get(key).num+" "+课程.get(key).scoreA.期末成绩/课程.get(key).num+" "+课程.get(key).scoreA.Sumscore/课程.get(key).num);
            }
            else if(课程.get(key).方式==0){
                if(课程.get(key).scoreB.Sumscore==0&&课程.get(key).flag==0)
                    System.out.println(课程.get(key).name+" "+"has no grades yet");
                else
                    System.out.println(key+" "+课程.get(key).scoreB.Sumscore/课程.get(key).num+" "+课程.get(key).scoreB.Sumscore/课程.get(key).num);
            }
            else {
                if(课程.get(key).scoreC.Sumscore==0&&课程.get(key).flag==0)
                    System.out.println(课程.get(key).name+" "+"has no grades yet");
                else
                    System.out.println(key+" "+课程.get(key).scoreC.Sumscore/课程.get(key).num);
            }
        }
        Iterator <String> iterator1=班级.keySet().iterator();
        while (iterator1.hasNext()){
            String key=iterator1.next();
            Iterator <String> iterator2=班级.get(key).Stu.keySet().iterator();
            while (iterator2.hasNext()){
                String key1=iterator2.next();
                if(!(班级.get(key).Stu.get(key1).scorenum==0))
                    班级.get(key).Sumscore+=班级.get(key).Stu.get(key1).score/班级.get(key).Stu.get(key1).scorenum;
            }
            if(班级.get(key).num==0)
                班级.get(key).averscore=0;
            else
                班级.get(key).averscore=班级.get(key).Sumscore/班级.get(key).num;
        }
        Object []arr2=班级.keySet().toArray();
        Arrays.sort(arr2);
        for(Object o:arr2){
            if(班级.get(o).averscore==0&&班级.get(o).num==0)
                System.out.println(班级.get(o).banjihao+" "+"has no grades yet");
            else
                System.out.println(班级.get(o).banjihao+" "+班级.get(o).averscore);
        }
    }
}


class Class{
    int Sumscore=0;
    int averscore=0;
    int num;//有用的人数;
    HashMap<String,Student> Stu=new HashMap<>();
    String banjihao;
}
class  Student{
    Student(String a,String b){
        this.name=b;
        this.xuehao=a;
    }
    Set<String>kecheng=new HashSet<>();
    String xuehao;
    String name;
    int score;
    int scorenum=0;
}
class Course{
    ScoreA scoreA=new ScoreA();
    ScoreB scoreB=new ScoreB();
    ScoreC scoreC=new ScoreC();
    int flag=0;

    String name;
    int 性质;
    int 方式;
    int num;
}
class Score{
    int Sumscore;
    Score(){

    }
}
class ScoreA extends Score{
    ScoreA(){

    }
    int 平时成绩;
    int 期末成绩;
    int Calculatescore(int a,int b) {
        return (int)(a*0.3+b*0.7);
    }
}
class ScoreB extends Score{
    ScoreB(){

    }
    int Calculatescore(int a){
        return a;
    }
}
class ScoreC extends Score{
    ScoreC(){

    }
    int Calculatescore(int a){
        return a;
    }
}

设计与分析如下:

嗯,这一题的输入方面的处理其实和成绩分析1没什么太大的差距,都是使用正则表达式来控制区分输入的是哪一种处理,但是成绩分析2多了一个新的课程,就是增加了一个实验课特色,在课程的增加方面,其实和成绩分析1是一样的,就是对实验课的分析不一样了,实验课还要把次数控制在4-9次之中,否则的话要输出wrang format,另外我该多加了一个score C类类用来对实验课进行分析,其他的和成绩分析1一样,代码太长了,所以我就把和成绩分析1不一样的部分弄上去,代码如下:

 if (!(学生.containsKey(tokens[0]) && 学生.get(tokens[0]).kecheng.contains(tokens[2]))) {
                            课程.get(tokens[2]).num++;
                            int 实验成绩=0;
                            for(int j=0;j<Integer.parseInt(tokens[3]);j++)
                                实验成绩 += Integer.parseInt(tokens[4+j]);
                            实验成绩/=Integer.parseInt(tokens[3]);
                            课程.get(tokens[2]).scoreC.Sumscore+=实验成绩;
                            //int 实验成绩=课程.get(tokens[2]).scoreC.Sumscore;
                            if (班级.containsKey(tokens[0].substring(0, 6))) {
                                //班级.get(tokens[0].substring(0, 6)).Sumscore += 课程.get(tokens[2]).scoreA.Calculatescore(Integer.parseInt(tokens[3]), Integer.parseInt(tokens[4]));
                                if (!班级.get(tokens[0].substring(0, 6)).Stu.containsKey(tokens[0])) {
                                    Student student = new Student(tokens[0], tokens[1]);
                                    student.score = 实验成绩;
                                    班级.get(tokens[0].substring(0, 6)).Stu.put(tokens[0], student);
                                    学生.put(tokens[0], student);
                                    学生.get(tokens[0]).kecheng.add(tokens[2]);
                                    班级.get(tokens[0].substring(0, 6)).num++;
                                    班级.get(tokens[0].substring(0, 6)).Stu.get(tokens[0]).scorenum++;
                                    班级.get(tokens[0].substring(0, 6)).Stu.get(tokens[0]).kecheng.add(tokens[2]);
                                } else {
                                    班级.get(tokens[0].substring(0, 6)).Stu.get(tokens[0]).score += 实验成绩;
                                    班级.get(tokens[0].substring(0, 6)).Stu.get(tokens[0]).scorenum++;
                                    班级.get(tokens[0].substring(0, 6)).Stu.get(tokens[0]).kecheng.add(tokens[2]);
                                }
                            } else {
                                Class c = new Class();
                                Student student = new Student(tokens[0], tokens[1]);
                                student.score = 实验成绩;
                                c.Stu.put(tokens[0], student);
                                c.banjihao=tokens[0].substring(0,6);
                                学生.put(tokens[0], student);
                                学生.get(tokens[0]).kecheng.add(tokens[2]);
                                c.num++;//youyongrenshu;
                                c.Stu.get(tokens[0]).scorenum++;
                                // c.Sumscore = 课程.get(tokens[2]).scoreA.Calculatescore(Integer.parseInt(tokens[3]),Integer.parseInt(tokens[4]));
                                班级.put(tokens[0].substring(0, 6), c);
                                班级.get(tokens[0].substring(0, 6)).Stu.get(tokens[0]).kecheng.add(tokens[2]);
                            }
                        }
                    }

                }

。以上便是我的大概设计与分析了。

类图如下:

关系报表图如下:

对类图报表及代码的分析与解释:

类图分析:
可以从类图看出,此题我使用了除了Main类的七个类,分别是score类,scoreB类,scoreA类,scoreC类和Class类,Course类及Student类,因为是对成绩分析1的拓展,与成绩分析1不同的是,在成绩分析2里,增加了计算实验课分数的要求,其他考试课和考察课与第一题无差别,仍然是有平时分有总平均分。
报表分析
还是那几个数据
Lines: 指的是代码总行数
Statements:语句的行数,语句是以分号结尾的。这个C中有所不同。
Percent Branch Statement:分支数占总语句数的百分比
Method Call Statement:方法调用语句数
Percent Lines with Comments:注释语句占总语句数的百分比
Classes and Interfaces:类和接口数
Methods per Class:每个类平均包含函数个数
Average Statements per Method:每个函数平均包含的语句个数
函数复杂度(Function Complexity)复杂
还是老样子,在这几个方面中,达到绿色的是比较良好的代码,而红色超出绿色范围的则是不太良好的代码,我的这个大部分在范围内,相比于上次来讲,这次的平均圈复杂度是7.25,比成绩分析1又上升了一个点,最大圈复杂度是是15,我才是由于加入了实验课,所以导致圈复杂度有上升了一个难度,希望可以有所改进。

  • 成绩分析3:


题目还是不写了,太长了,代码入下:

import java.text.Collator;
import java.util.*;

public class Main {
    public static void cun(HashMap<String,Class>班级,HashMap<String,Student>学生,String[] tokens){
        if (班级.containsKey(tokens[0].substring(0, 6))) {
            if (!班级.get(tokens[0].substring(0, 6)).Stu.containsKey(tokens[0])) {
                Student student = new Student(tokens[0], tokens[1]);
                班级.get(tokens[0].substring(0, 6)).Stu.put(tokens[0], student);
                学生.put(tokens[0], student);
                学生.get(tokens[0]).kecheng.add(tokens[2]);
            }
        } else {
            Class c = new Class();
            Student student = new Student(tokens[0], tokens[1]);
            student.score = 0;
            c.Stu.put(tokens[0], student);
            c.banjihao=tokens[0].substring(0,6);
            学生.put(tokens[0], student);
            学生.get(tokens[0]).kecheng.add(tokens[2]);
            班级.put(tokens[0].substring(0, 6), c);
        }
    }
    public static void main(String[] args) {
        Scanner scanner = new Scanner(System.in);
        HashMap<String,Class> 班级=new HashMap<>();
        HashMap<String,Course> 课程=new HashMap<>();
        HashMap<String,Student>学生=new HashMap<>();
        while(true) {
            String s = scanner.nextLine();
            if (s.equals("end"))
                break;
            else if (s.matches("([\u4E00-\u9FA5]|[a-z]|[A-Z]){1,10}[ ](必修|选修)[ ]([0-9]+([.]{1}[0-9]+){0,1})[ ]([0-9]+([.]{1}[0-9]+){0,1})")) {
                String tokens[] = s.split(" ");
                if (!课程.containsKey(tokens[0])) {
                    if(tokens[1].equals("选修"))
                        System.out.println(tokens[0] + " : course type & access mode mismatch");
                    else {
                        if((Float.parseFloat(tokens[2])+Float.parseFloat(tokens[3]))<0.95||(Float.parseFloat(tokens[2])+Float.parseFloat(tokens[3]))>1.05){
                            System.out.println(tokens[0]+" : weight value error");
                        }
                        else {
                        Course course = new Course();
                        course.方式 = 1;
                        course.性质 = 1;
                        course.scorecount=new float[2];
                        course.scorecount[0]=Float.parseFloat(tokens[2]);
                        course.scorecount[1]=Float.parseFloat(tokens[3]);
                        course.name = tokens[0];
                        课程.put(tokens[0], course);}
                    }
                }
            }
            else if (s.matches("([\u4E00-\u9FA5]|[a-z]|[A-Z]){1,10}[ ](必修|选修|实验)[ ](考试|考察|实验)")) {
                String tokens[] = s.split(" ");
                if (!课程.containsKey(tokens[0])) {
                    Course course = new Course();
                    if(tokens[1].equals("选修")&&tokens[2].equals("考察")) {
                            course.性质 = 0;
                            course.方式 = 0;
                        course.name = tokens[0];
                        课程.put(tokens[0], course);
                    }
                    else
                        System.out.println(tokens[0] + " : course type & access mode mismatch");
                }
            }
            else if (s.matches("([\u4E00-\u9FA5]|[a-z]|[A-Z]){1,10}[ ](必修|选修|实验)[ ](考试|考察|实验)[ ]([0-9]+([.]{1}[0-9]+){0,1})[ ]([0-9]+([.]{1}[0-9]+){0,1})")) {
                String tokens[] = s.split(" ");
                if (!课程.containsKey(tokens[0])) {
                    Course course = new Course();

                   if(!((tokens[1].equals("必修")&&tokens[2].equals("考试"))||(tokens[1].equals("选修")&&tokens[2].equals("考试"))))
                       System.out.println(tokens[0] + " : course type & access mode mismatch");
                     else{
                       if((Float.parseFloat(tokens[4])+Float.parseFloat(tokens[3]))<0.95||(Float.parseFloat(tokens[4])+Float.parseFloat(tokens[3]))>1.05){
                           System.out.println(tokens[0]+" : weight value error");
                       }
                       else {
                       if (tokens[1].equals("必修"))
                            course.性质 = 1;
                        else
                            course.性质 = 0;

                            course.方式 = 1;
                            course.scorecount=new float[2];
                           course.scorecount[0]=Float.parseFloat(tokens[3]);
                           course.scorecount[1]=Float.parseFloat(tokens[4]);
                        course.name = tokens[0];
                        课程.put(tokens[0], course);}
                    }

                }
            }
            else if (s.matches("([\u4E00-\u9FA5]|[a-z]|[A-Z]){1,10}[ ](必修|选修|实验)[ ](考试|考察|实验)[ ][4-9]([ ][0-9]+([.]{1}[0-9]+){0,1})+")) {
                String tokens[] = s.split(" ");
                if (!课程.containsKey(tokens[0])) {
                    Course course = new Course();
                    if(!(tokens[1].equals("实验")&&tokens[2].equals("实验")))
                        System.out.println(tokens[0] + " : course type & access mode mismatch");
                      else {
                          if(Integer.parseInt(tokens[3])+4!=tokens.length)
                              System.out.println(tokens[0]+" : number of scores does not match");
                         else {
                             float b=0;
                             for(int p=4;p<tokens.length;p++)
                                 b+=Float.parseFloat(tokens[p]);
                             if(b<0.95||b>1.05)
                                 System.out.println(tokens[0]+" : weight value error");
                        else {
                            course.scorecount=new float[Integer.parseInt(tokens[3])];
                                 for(int j=0;j<Integer.parseInt(tokens[3]);j++)
                                     course.scorecount[j]=Float.parseFloat(tokens[j+4]);
                                 course.性质 = 2;
                                 course.方式 = 2;
                                 course.name = tokens[0];
                                 课程.put(tokens[0], course);
                             }
                         }
                    }
                }
            }
            else if (s.matches("[0-9]{8}[ ][\u4E00-\u9FA5]{1,10}[ ]([\u4E00-\u9FA5]|[a-z]|[A-Z]){1,10}[ ]([0-9]|[1-9][0-9]|100)")) {
                String tokens[] = s.split(" ");
                if (课程.containsKey(tokens[2]) == false) {
                    System.out.println(tokens[2] + " " + "does not exist");
                    cun(班级,学生,tokens);
                } else {
                    if (课程.get(tokens[2]).方式 == 1||课程.get(tokens[2]).方式==2) {
                        System.out.println(tokens[0] + " " + tokens[1] + " " + ": access mode mismatch");
                        cun(班级,学生,tokens);
                    } else {
                        if (!(学生.containsKey(tokens[0]) && 学生.get(tokens[0]).kecheng.contains(tokens[2]))) {
                            课程.get(tokens[2]).num++;
                            课程.get(tokens[2]).scoreB.Sumscore += 课程.get(tokens[2]).scoreB.Calculatescore(Integer.parseInt(tokens[3]));
                            课程.get(tokens[2]).flag=1;
                            if (班级.containsKey(tokens[0].substring(0, 6))) {
                                if (!班级.get(tokens[0].substring(0, 6)).Stu.containsKey(tokens[0])) {
                                    Student student = new Student(tokens[0], tokens[1]);
                                    student.score = 课程.get(tokens[2]).scoreB.Calculatescore(Integer.parseInt(tokens[3]));
                                    班级.get(tokens[0].substring(0, 6)).Stu.put(tokens[0], student);
                                    学生.put(tokens[0], student);
                                    学生.get(tokens[0]).kecheng.add(tokens[2]);
                                    班级.get(tokens[0].substring(0, 6)).num++;
                                    班级.get(tokens[0].substring(0, 6)).Stu.get(tokens[0]).scorenum++;
                                    班级.get(tokens[0].substring(0, 6)).Stu.get(tokens[0]).kecheng.add(tokens[2]);
                                } else {
                                    班级.get(tokens[0].substring(0, 6)).Stu.get(tokens[0]).score += 课程.get(tokens[2]).scoreB.Calculatescore(Integer.parseInt(tokens[3]));
                                    班级.get(tokens[0].substring(0, 6)).Stu.get(tokens[0]).scorenum++;
                                    班级.get(tokens[0].substring(0, 6)).Stu.get(tokens[0]).kecheng.add(tokens[2]);
                                }
                            } else {
                                Class c = new Class();
                                Student student = new Student(tokens[0], tokens[1]);
                                student.score = 课程.get(tokens[2]).scoreB.Calculatescore(Integer.parseInt(tokens[3]));
                                c.Stu.put(tokens[0], student);
                                c.banjihao=tokens[0].substring(0,6);
                                学生.put(tokens[0], student);
                                学生.get(tokens[0]).kecheng.add(tokens[2]);
                                c.num++;
                                c.Stu.get(tokens[0]).scorenum++;
                                班级.put(tokens[0].substring(0, 6), c);
                                班级.get(tokens[0].substring(0, 6)).Stu.get(tokens[0]).kecheng.add(tokens[2]);
                            }
                        }
                    }
                }
            }
            else if(s.matches("[0-9]{8}[ ][\u4E00-\u9FA5]{1,10}[ ]([\u4E00-\u9FA5]|[a-z]|[A-Z]){1,10}[ ]([0-9]|[1-9][0-9]|100)[ ]([0-9]|[1-9][0-9]|100)")) {
                String tokens[] = s.split(" ");
                if (课程.containsKey(tokens[2]) == false) {
                    System.out.println(tokens[2] + " " + "does not exist");
                    cun(班级,学生,tokens);
                } else {
                    if (课程.get(tokens[2]).方式 == 0||课程.get(tokens[2]).方式==2) {
                        System.out.println(tokens[0] + " " + tokens[1] + " " + ": access mode mismatch");
                        cun(班级,学生,tokens);
                    } else {
                        if (!(学生.containsKey(tokens[0]) && 学生.get(tokens[0]).kecheng.contains(tokens[2]))) {
                            课程.get(tokens[2]).num++;
                            课程.get(tokens[2]).scoreA.Sumscore += 课程.get(tokens[2]).scoreA.Calculatescore(Integer.parseInt(tokens[3]), Integer.parseInt(tokens[4]),课程.get(tokens[2]).scorecount);
                            课程.get(tokens[2]).scoreA.平时成绩 += Integer.parseInt(tokens[3]);
                            课程.get(tokens[2]).scoreA.期末成绩 += Integer.parseInt(tokens[4]);
                            if (班级.containsKey(tokens[0].substring(0, 6))) {
                                if (!班级.get(tokens[0].substring(0, 6)).Stu.containsKey(tokens[0])) {
                                    Student student = new Student(tokens[0], tokens[1]);
                                    student.score = 课程.get(tokens[2]).scoreA.Calculatescore(Integer.parseInt(tokens[3]), Integer.parseInt(tokens[4]),课程.get(tokens[2]).scorecount);
                                    班级.get(tokens[0].substring(0, 6)).Stu.put(tokens[0], student);
                                    学生.put(tokens[0], student);
                                    学生.get(tokens[0]).kecheng.add(tokens[2]);
                                    班级.get(tokens[0].substring(0, 6)).num++;
                                    班级.get(tokens[0].substring(0, 6)).Stu.get(tokens[0]).scorenum++;
                                    班级.get(tokens[0].substring(0, 6)).Stu.get(tokens[0]).kecheng.add(tokens[2]);
                                } else {
                                    班级.get(tokens[0].substring(0, 6)).Stu.get(tokens[0]).score += 课程.get(tokens[2]).scoreA.Calculatescore(Integer.parseInt(tokens[3]), Integer.parseInt(tokens[4]),课程.get(tokens[2]).scorecount);
                                    班级.get(tokens[0].substring(0, 6)).Stu.get(tokens[0]).scorenum++;
                                    班级.get(tokens[0].substring(0, 6)).Stu.get(tokens[0]).kecheng.add(tokens[2]);
                                }
                            } else {
                                Class c = new Class();
                                Student student = new Student(tokens[0], tokens[1]);
                                student.score = 课程.get(tokens[2]).scoreA.Calculatescore(Integer.parseInt(tokens[3]), Integer.parseInt(tokens[4]),课程.get(tokens[2]).scorecount);
                                c.Stu.put(tokens[0], student);
                                c.banjihao=tokens[0].substring(0,6);
                                学生.put(tokens[0], student);
                                学生.get(tokens[0]).kecheng.add(tokens[2]);
                                c.num++;//youyongrenshu;
                                c.Stu.get(tokens[0]).scorenum++;
                                // c.Sumscore = 课程.get(tokens[2]).scoreA.Calculatescore(Integer.parseInt(tokens[3]),Integer.parseInt(tokens[4]));
                                班级.put(tokens[0].substring(0, 6), c);
                                班级.get(tokens[0].substring(0, 6)).Stu.get(tokens[0]).kecheng.add(tokens[2]);
                            }
                        }
                    }
                }
            }
            else if(s.matches("[0-9]{8}[ ][\u4E00-\u9FA5]{1,10}[ ]([\u4E00-\u9FA5]|[a-z]|[A-Z]){1,10}([ ]([0-9]|[1-9][0-9]|100))+"))
            {
                   String []tokens=s.split(" ");
                   if(!课程.containsKey(tokens[2])){
                       System.out.println(tokens[2] + " " + "does not exist");
                       cun(班级,学生,tokens);
                   }
                   else {
                       if (课程.get(tokens[2]).性质 == 0||课程.get(tokens[2]).性质==1||!(课程.get(tokens[2]).scorecount.length+3==tokens.length)) {
                           System.out.println(tokens[0] + " " + tokens[1] + " " + ": access mode mismatch");
                           cun(班级,学生,tokens);
                       }
                       else {
                           if (!(学生.containsKey(tokens[0]) && 学生.get(tokens[0]).kecheng.contains(tokens[2]))) {
                               课程.get(tokens[2]).num++;
                               float 实验成绩=0;
                               for(int j=0;j<课程.get(tokens[2]).scorecount.length;j++)
                                实验成绩 += Integer.parseInt(tokens[3+j])*课程.get(tokens[2]).scorecount[j];
                               课程.get(tokens[2]).scoreC.Sumscore+=(int)实验成绩;
                               if (班级.containsKey(tokens[0].substring(0, 6))) {
                                   if (!班级.get(tokens[0].substring(0, 6)).Stu.containsKey(tokens[0])) {
                                       Student student = new Student(tokens[0], tokens[1]);
                                       student.score = (int)实验成绩;
                                       班级.get(tokens[0].substring(0, 6)).Stu.put(tokens[0], student);
                                       学生.put(tokens[0], student);
                                       学生.get(tokens[0]).kecheng.add(tokens[2]);
                                       班级.get(tokens[0].substring(0, 6)).num++;
                                       班级.get(tokens[0].substring(0, 6)).Stu.get(tokens[0]).scorenum++;
                                       班级.get(tokens[0].substring(0, 6)).Stu.get(tokens[0]).kecheng.add(tokens[2]);
                                   } else {
                                       班级.get(tokens[0].substring(0, 6)).Stu.get(tokens[0]).score += (int)实验成绩;
                                       班级.get(tokens[0].substring(0, 6)).Stu.get(tokens[0]).scorenum++;
                                       班级.get(tokens[0].substring(0, 6)).Stu.get(tokens[0]).kecheng.add(tokens[2]);
                                   }
                               } else {
                                   Class c = new Class();
                                   Student student = new Student(tokens[0], tokens[1]);
                                   student.score = (int)实验成绩;
                                   c.Stu.put(tokens[0], student);
                                   c.banjihao=tokens[0].substring(0,6);
                                   学生.put(tokens[0], student);
                                   学生.get(tokens[0]).kecheng.add(tokens[2]);
                                   c.num++;//youyongrenshu;
                                   c.Stu.get(tokens[0]).scorenum++;
                                   // c.Sumscore = 课程.get(tokens[2]).scoreA.Calculatescore(Integer.parseInt(tokens[3]),Integer.parseInt(tokens[4]));
                                   班级.put(tokens[0].substring(0, 6), c);
                                   班级.get(tokens[0].substring(0, 6)).Stu.get(tokens[0]).kecheng.add(tokens[2]);
                               }
                           }
                       }

                   }
            }
            else
                System.out.println("wrong format");



        }
        Iterator <String> iterator=班级.keySet().iterator();
        while (iterator.hasNext()){
            String key=iterator.next();
            学生.putAll(班级.get(key).Stu);}
        Set set=学生.keySet();
        Object []arr=set.toArray();
        Arrays.sort(arr);
        for (Object key:arr){
            if(学生.get(key).score==0&&学生.get(key).scorenum==0)
                System.out.println(学生.get(key).xuehao+" "+学生.get(key).name+" "+"did not take any exams");
            else
                System.out.println(key+" "+学生.get(key).name+" "+学生.get(key).score/学生.get(key).scorenum);
        }
        Set set1=课程.keySet();
        Comparator<Object>comparator= Collator.getInstance(Locale.CHINA);
        Object []arr1= set1.toArray();
        Arrays.sort(arr1,comparator);
        for(Object key:arr1){
            if(课程.get(key).方式==1){
                if(课程.get(key).scoreA.Sumscore==0&&课程.get(key).flag==0)
                    System.out.println(课程.get(key).name+" "+"has no grades yet");
                else
                    System.out.println(key+" "+课程.get(key).scoreA.Sumscore/课程.get(key).num);
            }
            else if(课程.get(key).方式==0){
                if(课程.get(key).scoreB.Sumscore==0&&课程.get(key).flag==0)
                    System.out.println(课程.get(key).name+" "+"has no grades yet");
                else
                    System.out.println(key+" "+课程.get(key).scoreB.Sumscore/课程.get(key).num);
            }
            else {
                if(课程.get(key).scoreC.Sumscore==0&&课程.get(key).flag==0)
                    System.out.println(课程.get(key).name+" "+"has no grades yet");
                else
                    System.out.println(key+" "+课程.get(key).scoreC.Sumscore/课程.get(key).num);
            }
        }
        Iterator <String> iterator1=班级.keySet().iterator();
        while (iterator1.hasNext()){
            String key=iterator1.next();
            Iterator <String> iterator2=班级.get(key).Stu.keySet().iterator();
            while (iterator2.hasNext()){
                String key1=iterator2.next();
                if(!(班级.get(key).Stu.get(key1).scorenum==0))
                    班级.get(key).Sumscore+=班级.get(key).Stu.get(key1).score/班级.get(key).Stu.get(key1).scorenum;
            }
            if(班级.get(key).num==0)
                班级.get(key).averscore=0;
            else
            班级.get(key).averscore=班级.get(key).Sumscore/班级.get(key).num;
        }
        Object []arr2=班级.keySet().toArray();
        Arrays.sort(arr2);
        for(Object o:arr2){
            if(班级.get(o).averscore==0&&班级.get(o).num==0)
                System.out.println(班级.get(o).banjihao+" "+"has no grades yet");
            else
                System.out.println(班级.get(o).banjihao+" "+班级.get(o).averscore);
        }
    }
}


class Class{
    int Sumscore=0;
    int averscore=0;
    int num;//有用的人数;
    HashMap<String,Student> Stu=new HashMap<>();
    String banjihao;
}
class  Student{
    Student(String a,String b){
        this.name=b;
        this.xuehao=a;
    }
    Set<String>kecheng=new HashSet<>();
    String xuehao;
    String name;
    int score;
    int scorenum=0;
}
class Course{
    float []scorecount;
    ScoreA scoreA=new ScoreA();
    ScoreB scoreB=new ScoreB();
    ScoreC scoreC=new ScoreC();
    int flag=0;

    String name;
    int 性质;
    int 方式;
    int num;
}
class Score{
    int Sumscore;
    Score(){

    }
}
class ScoreA extends Score{
    ScoreA(){

    }
    int 平时成绩;
    int 期末成绩;
    int Calculatescore(int a,int b,float []tokens) {
        return (int)(a*tokens[0]+b*tokens[1]);
    }
}
class ScoreB extends Score{
    ScoreB(){

    }
    int Calculatescore(int a){
        return a;
    }
}
class ScoreC extends Score{
    ScoreC(){

    }
    int Calculatescore(int a){
        return a;
    }
}

设计分析:

成绩分析3加了许许多多的内容比如说,实验课可以选择输入几个,但是必须相加等于1考试课也可以靠自己输入,并且可以选择输入的值,但是在其他的方面,还是和之前的差不多,所以我就,把之前的成绩录入的代码做了调整,其余的思路还是那样。

类图如下:

对类图报表及代码的分析与解释:

类图分析:
类还是成绩分析2的那七个,只是我改变了一下他们的关系,这里就不做说明了。

踩坑心得:

其实对于这三道系列题,刚开始做的时候我踩得坑还不少,以下便是我在做这些道题的时候所踩得坑,希望以后可以不再犯,也希望对大家有所帮助。

  • 1:

我始终认为java中传参是非常重要的,如图在添加课程的时候

上面我就踩了许许多多的坑,忘记传参导致数组课程一直为空,所以说像以上这几种情况,大家更应该多多注意,以后尽量杜绝这些情况
想用实例变量却在main函数外定义了变量:

关于这个情况就需要大家对实例变量和静态变量以及静态方法有一个较为清晰的认知。

  • 2:

在比较排序学生和班级成绩的时候,最后死活一直报错,原来是,Comparable是java库函数里面的,我自己去写了一个,怪不得不行

以上就是我的踩坑心得。

主要困难及改进建议

通过这最后三次的的大作业来看,我认为成绩分析系列题还是有难度的,这三次作业的话,每一次都特别的做的特别的时间之长,才勉强拿到分数
,差不多基本到了后面一道题基本要花一天甚至两天的时间才有可能写完,并且还可能得不到全部的分数,另外就是我觉得在一些算法之类的题,也有一些难度,这也可能是做题少的原因吧!然后就我个人代码改进建议的话,我觉得我的代码行数还是有一点多的,这其中可能就是有一些地方做的不太周到,还可以减少更多的if else嵌套句的循环之类的,另外一点就是要多多的写累,这样的话可以做到自己代码更加的可持续性和可维护性,希望在下次大作业的时候可能更好的提前着手思考写什么样的框架,因为框架就像是一座房子的基石,基石搭不好,再多的努力也是白费,所以一定要先想好具体的框架,这样可以使自己在之后的代码之路上走的更远更轻松。

总结

历经了两三天之久,终于终于终于来到了最后的总结环节,可把我累坏了,接下来就让我对这最后一次博客进行一个总结,首先,最后的博客是进行在最后的三次大作业的总结上的,也就是说,以后再也没有博客的总结了,如果让我比较这个博客和大作业的话,我觉得这个博客总结会比较更加的累,因为他需要打的字非常非常的多,需要了解一些新的东西,也非常非常非常的多,但是意义上来讲,这个博客要比大作业的意义更加的好。
1:在最后的几周的时间里,主要大作业上的话就是对成绩分析进行不断的改进和整合,然后还有实验课的话,就是对农夫过河不断的利用新的方法,比如说继承或者接口来改进之前的代码,让游戏都变得更加完善,后来又让我们用fx可视化,这些的话是自己在课余时间学到的东西,当然也不排除一直在学习通上听网课里面讲的这些重要的知识点,然后就是在上课的时候学到的东西上课,我觉得老师偏重于讲解怎样设计类画出类图理解清楚关系,而不是一味的只会让学生们写代码,注重提高学生们的思维通过课上的学习,我不再是就只会单纯的敲写代码,而是更多的会理解的要首先在一开始就要有一个清晰的框架,然后有了大框架之后去写代码,才会更加的流畅和顺利。
2在一方面的话,如果是自己,哪一方面没有学习好,或者需要更加进一步探究的话,我认为我在继承组合和聚集以及依赖这几个关系当中模糊不清,不能理解他们的真正界限,我觉得这是我接下来需要改进和完善的地方,其他方面的话还是要多多自己下功夫才行,但是以后的路也要自己一个人走了,希望大家可以多花一点时间在java学习上。
总之拥有一颗谦卑的态度和积极上进的决心可以帮助我们在程序员这条道路上走的更远,希望大家有问题就要多去探索自己的问题,只有这样,我们每个人才会变得更加的优秀,所以我们仍然在路上,我们每个人都需要更加的努力,努力吧!以上的全部内容就是我对最后一次博客的全部分析,如果有写的不周到的地方,敬请谅解,同时,也希望大家不被困在原地,勇敢的去追逐自己的天空,我们的人生才刚刚开始,加油吧!

posted @ 2023-06-23 01:20  hattyyyy  阅读(36)  评论(0)    收藏  举报