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

Posted hatt的博客

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了对第六至八次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)复杂
还是老样子,在这几个方面中,达到绿色的是比较良好的代码,而红色超出绿色范围的则是不太良好的代码,我的这个大部分在范围内,相比于上次来讲,这次的平均圈复杂

以上是关于对第六至八次pta作业进行总结的主要内容,如果未能解决你的问题,请参考以下文章

oo第八次作业

OO第八次作业

oo第八次作业

第八次团队作业:总结博客

第六周PTA作业

第八次团队作业:汇总博客