首页 > 编程语言 >对第三阶段PTA集训及Java课程的分析与反思

对第三阶段PTA集训及Java课程的分析与反思

时间:2023-06-27 21:22:21浏览次数:35  
标签:Java String int PTA public new return 集训 name

前言:

本阶段PTA集训共有8-11题目集,涵盖了很多知识点,尤其是成绩计算系列题目,几乎包含了Java目前所学的所有内容,写下来非常不容易(可能对于我这种小菜鸡来说很难)。涵盖的知识点包括对Stirng类型的处理,对象数组的创建与处理,抽象类的使用,异常的处理,逻辑的训练,设计模式的实操。题量不大但是糅合的知识点非常多,再加上还有PTA和实验的时间一起截止,瞬间就感觉压力巨大,特别是第一次写成绩计算题的时候,那时候正好和实验的截止日期相同,为了赶作业,甚至好几天都熬夜熬到凌晨一两点,第二天还得爬起床上早八呜呜呜。难度也是对我来说比较大,因为前面学的并不扎实,好几次PTA因为觉得太难所以放弃了,但是老师说这几次PTA是给我们这些前面学的不好的同学一个改过自新的机会,如果还不能把握住的话就真的要挂了,所以决定直面困难克服这次挑战。在写这个程序这个过程中遇到了很多困难,不过通过自己摸索,查阅资料,请教同学等方式解决了不少。所以通过这次题目集,我的能力应该比之前没有认真写过的样子好很多。

设计与分析:

7-1 课程成绩统计程序-1

 

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

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

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

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

1、输入:

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

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

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

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

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

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

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

以上信息的相关约束:

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

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

3)学号由8位数字组成

4)姓名不超过10个字符

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

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

2、输出:

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

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

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

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

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

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

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

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

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

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

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

异常情况:

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

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

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

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

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

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

信息约束:

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

参考类图:


image.png

输入样例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 张三 java 20
end
 

输出样例4:

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

20201103 张三 : access mode mismatch
20201103 张三 did not take any exams
java has no grades yet
202011 has no grades yet
 

输入样例5:

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

java 必修 考察
20201103 张三 java 40
end
 

输出样例5:

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

java : course type & access mode mismatch
java does not exist
20201103 张三 did not take any exams
202011 has no grades yet
 

输入样例6:

单门课程,多个学生。例如:

java 选修 考察
20201103 李四 java 60
20201104 王五 java 60
20201101 张三 java 40
end
 

输出样例6:

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

20201101 张三 40
20201103 李四 60
20201104 王五 60
java 53 53
202011 53
 

输入样例7:

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

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

输出样例7:

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

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

输入样例8:

单门课程,单个学生,成绩越界。例如:

数据结构 选修 考察
20201103 李四 数据结构 101
end
 

输出样例8:

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

wrong format
数据结构 has no grades yet
 

输入样例9:

多门课程,多个学生,多个成绩。例如:

形式与政治 必修 考试
数据库 选修 考试
java 选修 考察
数据结构 选修 考察
20201205 李四 数据结构 70
20201103 李四 形式与政治 80 90
20201102 王五 java 60
20201211 张三 数据库 70 78
end
 

输出样例9:

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

20201102 王五 60
20201103 李四 87
20201205 李四 70
20201211 张三 75
java 60 60
数据结构 70 70
数据库 70 78 75
形式与政治 80 90 87
202011 73
202012 72
 
import java.text.Collator;
import java.util.*;
public class Main{
    @SuppressWarnings("unused")
    public static void main(String[] args){
        Scanner input = new Scanner(System.in);
        ArrayList<Course> course = new ArrayList<Course>();
        ArrayList<Selection> selection = new ArrayList<Selection>();
        ArrayList<AClass> aclass = new ArrayList<AClass>();
        ArrayList<Courseout> courseout = new ArrayList<Courseout>();
        ArrayList<Studentout> studentout = new ArrayList<Studentout>();
        int classaver = 0,stuaver = 0,count = 0,aver = 0,averd = 0,avere = 0,avera = 0;
        int sum = 0,sumd = 0,sume = 0,suma = 0,i = 0,k = 0,m = 0;
        while(true) {
             String str = input.nextLine();
            String[] temp = str.split(" ");
            if(str.equals("end"))
                break;
            count = temp.length;
            switch(count) {
                case 3:{
                    if(temp[0].length()<=8) {
                        if(temp[1].equals("必修")&&temp[2].equals("考察")) 
                            System.out.println(temp[0] + " : course type & access mode mismatch");
                        else 
                            course.add(new Course(temp[0],temp[1],temp[2]));
                    }
                    else {
                        System.out.println("wrong format");
                    }
                    break;
                }
                case 4:{
                    try{
                    if(temp[0].length()==8&&temp[1].length()<=10&&temp[2].length()<=10
                       &&Integer.parseInt(temp[3])<=100&&Integer.parseInt(temp[3])>=0) {
                        Course course1 = searchCourse(course,temp[2]);                    
                        if(course1==null) {
                            System.out.println(temp[2] + " does not exist");
                            studentout.add(new Studentout(temp[0],temp[1]));
                        }
                        else {
                            if(course1.getexaway().equals("考试")) {
                                System.out.println(temp[0] + " " + temp[1] + " : access mode mismatch");
                                studentout.add(new Studentout(temp[0],temp[1]));
                                selection.add(new Selection(temp[0],temp[1],temp[0].substring(0,6),-1));
                            }
                            else 
                                selection.add(new Selection(temp[0],temp[1],temp[2],Integer.parseInt(temp[3])));
                        }
                    }
                    else {
                       
                        System.out.println("wrong format");
                    }
                    }
                    catch(Exception err){
                        System.out.println("wrong format");
                    }
                    break;
                }
                case 5:{
                    try {
                    if(temp[0].length()==8&&temp[1].length()<=10&&temp[2].length()<=10&&
                            Integer.parseInt(temp[3])<=100&&Integer.parseInt(temp[3])>=0
                            &&Integer.parseInt(temp[4])<=100&&Integer.parseInt(temp[4])>=0) {
                        Course course1 = searchCourse(course,temp[2]);
                        if(course1==null) 
                            System.out.println(temp[0] + " does not exist");
                        else 
                                selection.add(new Selection(temp[0],temp[1],temp[2]
                                        ,Integer.parseInt(temp[3]),Integer.parseInt(temp[4])));
                    }
                    
                    else {
                      
                        System.out.println("wrong format");
                    }
                    }
                    catch(Exception err){
                        System.out.println("wrong format");
                    }
                    
                    break;
                }
                default:System.out.println("wrong format");
            }
        }  
            
        for(Selection selection1:selection) {
            AClass aclass1 = searchAClass(aclass,(selection1.getstudent().getID()).substring(0,6));
            if(aclass1==null) {
                aclass.add(new AClass((selection1.getstudent().getID()).substring(0,6),selection1));               
            }
            else {
                aclass1.setselection(selection1);
            }
        }
        
        for(AClass aclass2:aclass) {
            i = 0;
            sum = 0;
            for(Selection selection2:aclass2.getselection()) {
                selection2.settotalscore();
                sum += selection2.gettotalscore();
                i++;
            }
            classaver = (int)(sum/i);
            aclass2.setclassaver(classaver);
        }
      
        Collections.sort(selection,new Comparator<Selection>() {
            @Override
            public int compare(Selection a1,Selection a2) {
                return a1.getstudent().getIDnumber()-a2.getstudent().getIDnumber();
            }
        });
        

        for(Selection selection2:selection) {
            Studentout studentout2 = searchStudentout(studentout,selection2.getstudent().getID());
            if(studentout2==null) {
                studentout.add(new Studentout(selection2.getstudent().getID(),selection2.getstudent().getstuname()));
            }
            sum = 0;
            i = 0;
            Studentout studentout3 = searchStudentout(studentout,selection2.getstudent().getID());
            for(Selection selection3:selection) {
                selection3.settotalscore();
                if(selection3.getstudent().getstuname().equals(studentout3.getname())&&selection3.getstudent().getID().equals(studentout3.getID())) {
                    sum += selection3.gettotalscore();
                    i++;
                }
            }
            aver = (int)(sum/i);
            studentout3.setaveragescore(aver);
        }
        
        for(Studentout studentout4:studentout) {
            if(studentout4.getaveragescore()<0) {
                System.out.println(studentout4.getIDnumber()+" "+studentout4.getname()+" did not take any exams");
            }
            
            else
            System.out.println(studentout4.getIDnumber() + " " + studentout4.getname() + " " +studentout4.getaveragescore());
            
        }
        
        for(Course course4:course) {
            Selection selection7 = searchselection(selection,course4.getname());
            if(selection7!=null) {
                sumd = 0;
                sume = 0;
                suma = 0;
                sum = 0;
                i = 0;
                for(Selection selection4:selection) {
                    if(course4.getname().equals(selection4.getcourse().getname())) {
                        sumd += selection4.getdailyscore().getscore();
                        sume += selection4.getexascore().getscore();
                        suma += selection4.getassscore().getscore();
                        sum += selection4.gettotalscore();
                        i++;
                    }
                }
                averd = (int)(sumd/i);
                avere = (int)(sume/i);
                avera = (int)(suma/i);
                aver = (int)(sum/i);
                Courseout courseout1 = searchCourseout(courseout,course4.getname());
                if(courseout1==null)
                    courseout.add(new Courseout(course4.getname(),averd,avere,avera,aver));
            }
        }
        for(Course course3:course) {
            Selection selection7 = searchselection(selection,course3.getname());
            if(selection7==null)
                System.out.println(course3.getname()+" has no grades yet");
            else {
                Comparator<Object> comparator = Collator.getInstance(Locale.CHINA);
                Collections.sort(courseout,(p1,p2) ->{
                    return comparator.compare(p1.getname(), p2.getname());
                });
            }
        }
           
        for(Courseout courseout1:courseout) {;
            if(courseout1.getaaver()<0)
                System.out.println(courseout1.getname()+" "+courseout1.getdaver()+" "+courseout1.geteaver()+" "+courseout1.getaveragescore());
            else
                System.out.println(courseout1.getname()+" "+courseout1.getaaver()+" "+courseout1.getaveragescore());
        }
    
        Collections.sort(aclass,new Comparator<AClass>() {
            @Override
            public int compare(AClass a1,AClass a2) {
                return a1.getclassnumber()-a2.getclassnumber();
            }
        });
        
        for(AClass aclass3:aclass) {
            if(aclass3.getclassaver()<0)
                System.out.println(aclass3.getclassnum() + " has no grades yet");
            else
                System.out.println(aclass3.getclassnum() + " " + aclass3.getclassaver());
        }
       
    }    
    
    
    public static Course searchCourse(ArrayList<Course> course,String name) {
        for(Course course1:course) {
            if(course1==null) 
                return null;
            
            if(name.equals(course1.getname()))
                return course1;
        }
        return null;
    }
    
    public static AClass searchAClass(ArrayList<AClass> aclass,String classnum) {
        for(AClass aclass1:aclass) {
            if(aclass1==null)
                return null;
            if(classnum.equals(aclass1.getclassnum()))
                return aclass1;
        }
        return null;
    }
    
    public static Courseout searchCourseout(ArrayList<Courseout> courseout,String name) {
        for(Courseout courseout1:courseout) {
            if(courseout1==null) 
                return null;
            
            if(name.equals(courseout1.getname()))
                return courseout1;
        }
        return null;
    }
    
    public static Selection searchselection(ArrayList<Selection> selection,String name) {
        for(Selection selection5:selection) {
            if(selection5==null) 
                return null;
            
            if(name.equals(selection5.getcourse().getname()))
                return selection5;
        }
        return null;
    }
    
    public static Studentout searchStudentout(ArrayList<Studentout> studentout,String ID) {
        for(Studentout studentout1:studentout) {
            if(studentout1==null) 
                return null;
                
            if(ID.equals(studentout1.getID()))
                return studentout1;
        }
        return null;
    }
}

class Studentout{
    private String ID;
    private String name;
    private int averagescore = -1;
    
    public Studentout(String ID,String name) {
        this.ID = ID;
        this.name = name;
    }
    public int getIDnumber() {
            return Integer.parseInt(this.ID);
    }
    
    public String getID() {
        return this.ID;
    }
    
    public String getname() {
        return this.name;
    }
    
    public void setaveragescore(int averagescore) {
        this.averagescore = averagescore;
    }
    
    public int getaveragescore() {
        return this.averagescore;
    }
}

class Courseout{
    private String name;
    private int daver = -1;
    private int eaver = -1;
    private int aaver = -1;
    private int averagescore = -1;
    
    public Courseout(String name,int daver,int eaver,int aaver,int averagescore) {
        this.name = name;
        this.daver = daver;
        this.eaver = eaver;
        this.aaver = aaver;
        this.averagescore = averagescore;
    }
    
    public String getname() {
        return this.name;
    }
    
    public void setdaver(int dscore) {
        this.daver = dscore;
    }
    public int getdaver() {
        return this.daver;
    }
    
    public void seteaver(int escore) {
        this.eaver = escore;
    }
    public int geteaver() {
        return this.eaver;
    }
    
    public void setaaver(int ascore) {
        this.aaver = ascore;
    }
    public int getaaver() {
        return this.aaver;
    }
    
    public void setaveragescore(int score) {
        this.averagescore = score;
    }
    public int getaveragescore() {
        return this.averagescore;
    }
    
}

class Allscore{
    Exascore exascore = new Exascore();
    Dailyscore dailyscore = new Dailyscore();
    Assscore assscore = new Assscore();
    
    public Allscore(int dscore,int escore,int ascore) {
        dailyscore = new Dailyscore(dscore);
        exascore = new Exascore(escore);
        assscore = new Assscore(ascore);
    }
}

class Selection{
    Course course = new Course();
    Student student = new Student();
    Exascore exascore = new Exascore();
    Dailyscore dailyscore = new Dailyscore();
    Assscore assscore = new Assscore();
    private int totalscore;
    
    public Selection(String ID,String name,String coursename,int dscore,int escore) {
        student = new Student(ID,name);
        course = new Course(coursename);
        dailyscore = new Dailyscore(dscore);
        exascore = new Exascore(escore);
        
    }
    
    public Selection(String ID,String name,String coursename,int ascore) {
        student = new Student(ID,name);
        course = new Course(coursename);
        assscore = new Assscore(ascore);
        
    }
    
    public Student getstudent() {
        return this.student;
    }
    
    public Course getcourse() {
        return this.course;
    }
    
    public Dailyscore getdailyscore() {
        return this.dailyscore;
    }
    
    public Exascore getexascore() {
        return this.exascore;
    }
    
    public Assscore getassscore() {
        return this.assscore;
    }

    public void settotalscore() {
        if(this.assscore.getscore()==-1) {
            this.totalscore = (int)(this.exascore.getscore()*0.7+this.dailyscore.getscore()*0.3);
        }
        else
            this.totalscore = this.assscore.getscore();
    }
    public int gettotalscore() {
        return this.totalscore;
    }
    
}

class Course{
    private String name;
    private String property;
    private String exaway;
   
    public Course() {
        
    }
    
    public Course(String name) {
        this.name = name;
    }
    
    public Course(String name, String property, String exaway) {
        this.name = name;
        this.property = property;
        this.exaway = exaway;
    }
    
    public void setname(String name) {
        this.name = name;
    }
    public String getname() {
        return this.name;
    }
  
    public void setemaway(String exaway) {
        this.exaway = exaway;
    }
    public String getexaway() {
        return this.exaway;
    }
    
    public void setproperty(String property) {
        this.property = property;
    }
    public String getproperty() {
        return this.property;
    }
}

class Student{
    private String ID;
    private String stuname;
    
    public Student() {
        
    }
    
    public Student(String ID,String stuname) {
        this.ID = ID;
        this.stuname = stuname;        
    }
    
    public void setstuname(String stuname) {
        this.stuname = stuname;
    }
    public String getstuname() {
        return this.stuname;
    }
    
    public void setID(String ID) {
        this.ID = ID;
    }
    public String getID() {
        return this.ID;
    }
    public int getIDnumber() {
        return Integer.parseInt(this.ID);
    }
}

class AClass{
    private String classnum;
    ArrayList<Selection> studentsel = new ArrayList<Selection>();
    private int classaver = -1;
    public AClass(){
    }
    public AClass(String num) {
        this.classnum = num;
    }
    
    public AClass(String classnum,Selection selection) {
        this.classnum = classnum;
        if(selection.getassscore().getscore()==-1)
            studentsel.add(new Selection(selection.getstudent().getID(),selection.getstudent().getstuname(),
                selection.getcourse().getname(),selection.getdailyscore().getscore(),selection.getexascore().getscore()));
        else
            studentsel.add(new Selection(selection.getstudent().getID(),selection.getstudent().getstuname(),
                    selection.getcourse().getname(),selection.getassscore().getscore()));
    }
    
    public void setselection(Selection selection) {
        if(selection.getassscore().getscore()==-1)
            studentsel.add(new Selection(selection.getstudent().getID(),selection.getstudent().getstuname(),
                selection.getcourse().getname(),selection.getdailyscore().getscore(),selection.getexascore().getscore()));
        else
            studentsel.add(new Selection(selection.getstudent().getID(),selection.getstudent().getstuname(),
                selection.getcourse().getname(),selection.getassscore().getscore()));
    }
    
    public ArrayList<Selection> getselection(){
        return this.studentsel;
    }
    
    public void setclassnum(String classnum) {
        this.classnum = classnum;
    }
    public String getclassnum() {
        return this.classnum;
    }
    
    public int getclassnumber() {
        return Integer.parseInt(this.classnum);
    }
    
    public void setclassaver(int classaver) {
        this.classaver = classaver;
    }
    public int getclassaver() {
        return this.classaver;
    }
}

abstract class Score{
    protected int score = -1;
    
    public Score() {
        
    }
    
    public void setscore(int score) {
        this.score = score;
    }
    public int getscore() {
        return this.score;
    }
    
}

class Dailyscore extends Score{
    private int wscore;
    
    public Dailyscore() {
        
    }
    
    public Dailyscore(int score) {
        super.setscore(score);
    }
    
    public void setwscore() {
        this.wscore = (int)(super.score*0.3);
    }
    public int getwscore() {
        return this.wscore;
    }
}

class Exascore extends Score{
    private int wscore;
    public Exascore() {
    }
    
    public Exascore(int score) {
        super.setscore(score);
    }
    
    public void setwscore() {
        this.wscore = (int)(super.score*0.7);
    }
    public int getwscore() {
        return this.wscore;
    }
}

class Assscore extends Score{
    public Assscore() {    
    }
    public Assscore(int score) {
        super.setscore(score);
    }    
}

 看到题目的第一感觉是自己要寄了,因为题目太过复杂,和之前的菜单计价程序有很大的相似度,但是又比最后一次菜单计价程序更简单一点,所以还是痛苦面具呜呜呜。而且只有四天时间给我们写,实在是太赶了,但是又不能不写,所以还是硬着头皮把题目分析了一遍。发现其实输入的字符串,如果用String里面的split方法按照空格分隔形成字符串数组,其实情况不是特别复杂,所以就尝试着构思这样写的可行性。按照题目要求把需要的类和结构大致整理好了就开始动工主类主方法。还在题目基础上增加了一个selection类用于储存输入的课程信息及成绩信息方便后续处理。

类图都密密麻麻错综复杂,自己也感觉脑袋里面一团浆糊,不过还好交上去有74分,其中还有好多课程信息出现错误的测试点过不了,暂时不知道是哪里出了问题。同时这次由于代码复杂度过高,出现了好几次“代码长度超过限制”的问题导致代码交不上去,删去了很多东西才交上去,不过也提醒了我写了太多无用的废物代码,下一次PTA题目如果还有这个题目应该先检查一下代码再动手做新的功能。

7-3 课程成绩统计程序-2

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

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

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

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

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

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

1、输入:

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

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

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

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

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

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

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

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

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

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

以上信息的相关约束:

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

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

3)学号由8位数字组成

4)姓名不超过10个字符

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

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

2、输出:

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

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

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

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

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

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

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

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

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

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

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

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

异常情况:

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

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

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

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

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

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

信息约束:

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

参考类图(与第一次相同,其余内容自行补充):


e724fa4193aa9ee32e78a68cd96fd6df_22401e04-c501-4b28-bb65-dabe39d374e7.png

 

输入样例1:

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

java 实验 实验
20201103 张三 java 4 70 80 90
end
 

输出样例1:

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

20201103 张三 : access mode mismatch
20201103 张三 did not take any exams
java has no grades yet
202011 has no grades yet
 

输入样例2:

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

java 实验 实验
20201103 张三 java 3 70 80 90
end
 

输出样例2:

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

wrong format
java has no grades yet
 

输入样例3:

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

java 必修 实验
20201103 张三 java 3 70 80 90 100
end
 

输出样例3:

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

java : course type & access mode mismatch
wrong format
 

输入样例4:

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

java 必修 实验
20201103 张三 java 4 70 80 90 105
end
 

输出样例4:

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

java : course type & access mode mismatch
wrong format
 

 

输入样例5:

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

java 选修 考察
C语言 选修 考察
java实验 实验 实验
编译原理 必修 考试
20201101 王五 C语言 76
20201216 李四 C语言 78
20201307 张少军 编译原理 82 84
20201103 张三 java实验 4 70 80 90 100
20201118 郑觉先 java 80
20201328 刘和宇 java 77
20201220 朱重九 java实验 4 60 60 80 80
20201132 王萍 C语言 40
20201302 李梦涵 C语言 68
20201325 崔瑾 编译原理 80 84
20201213 黄红 java 82
20201209 赵仙芝 java 76
end
 

输出样例5:

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

20201101 王五 76
20201103 张三 85
20201118 郑觉先 80
20201132 王萍 40
20201209 赵仙芝 76
20201213 黄红 82
20201216 李四 78
20201220 朱重九 70
20201302 李梦涵 68
20201307 张少军 83
20201325 崔瑾 82
20201328 刘和宇 77
C语言 65 65
java 78 78
java实验 77
编译原理 81 84 82
202011 70
202012 76
202013 77
import java.text.Collator;
import java.util.*;
public class Main{
    @SuppressWarnings("unused")
    public static void main(String[] args){
        Scanner input = new Scanner(System.in);
        ArrayList<Course> course = new ArrayList<Course>();
        ArrayList<Selection> selection = new ArrayList<Selection>();
        ArrayList<AClass> aclass = new ArrayList<AClass>();
        ArrayList<Courseout> courseout = new ArrayList<Courseout>();
        ArrayList<Studentout> studentout = new ArrayList<Studentout>();
        int classaver = 0,stuaver = 0,count = 0,aver = 0,averd = 0,avere = 0,avera = 0;
        int sum = 0,sumd = 0,sume = 0,suma = 0,i = 0,k = 0,m = 0;
        while(true) {
             String str = input.nextLine();
            String[] temp = str.split(" ");
            if(str.equals("end"))
                break;
            count = temp.length;
            switch(count) {
                case 3:{
                    if (temp[0].length() <= 10 && (temp[1].equals("必修") || temp[1].equals("选修")||temp[1].equals("实验"))
                            && (temp[2].equals("考察") || temp[2].equals("考试")||temp[2].equals("实验"))) {
                        if ((temp[1].equals("必修") &&( temp[2].equals("考察")||temp[2].equals("实验")))||(temp[1].equals("选修")&&temp[2].equals("实验"))) { 
                            System.out.println(temp[0] + " : course type & access mode mismatch");
                        }
                        else 
                            course.add(new Course(temp[0],temp[1],temp[2]));
                    }
                    else {
                        System.out.println("wrong format");
                    }
                    break;
                }
                case 4:{
                    try{
                    if(temp[0].length()==8&&temp[1].length()<=10&&temp[2].length()<=10
                       &&Integer.parseInt(temp[3])<=100&&Integer.parseInt(temp[3])>=0) {
                        Course course1 = searchCourse(course,temp[2]);                    
                        if(course1==null) {
                            System.out.println(temp[2] + " does not exist");
                            studentout.add(new Studentout(temp[0],temp[1]));
                        }
                        else {
                            if(course1.getexaway().equals("考试")) {
                                System.out.println(temp[0] + " " + temp[1] + " : access mode mismatch");
                                studentout.add(new Studentout(temp[0],temp[1]));
                                selection.add(new Selection(temp[0],temp[1],temp[0].substring(0,6),-1));
                            }
                            else 
                                selection.add(new Selection(temp[0],temp[1],temp[2],Integer.parseInt(temp[3])));
                        }
                    }
                    else {
                        System.out.println("wrong format");
                    }
                    }catch(Exception err){
                        System.out.println("wrong format");
                    }
                    break;
                }
                case 5:{
                    try {
                    if((temp[0].length()==8&&temp[1].length()<=10&&temp[2].length()<=10&&
                            Integer.parseInt(temp[3])<=100&&Integer.parseInt(temp[3])>=0
                            &&Integer.parseInt(temp[4])<=100&&Integer.parseInt(temp[4])>=0)) {
                        Course course1 = searchCourse(course,temp[2]);
                        if(course1==null) 
                            System.out.println(temp[2] + " does not exist");
                        else {
                            if(course1.getproperty().equals("实验"))
                                System.out.println("wrong format");
                            else
                                selection.add(new Selection(temp[0],temp[1],temp[2]
                                        ,Integer.parseInt(temp[3]),Integer.parseInt(temp[4])));
                        }
                    }
                    else {
                        System.out.println("wrong format");
                    }
                    }catch(Exception err){
                        System.out.println("wrong format");
                    }
                    break;
                }
                default:{
                        count -= 4;
                        if(count<Integer.parseInt(temp[3])) {
                            System.out.println(temp[0] + " " + temp[1] + " : access mode mismatch");
                            studentout.add(new Studentout(temp[0],temp[1]));
                            selection.add(new Selection(temp[0],temp[1],temp[0].substring(0,6),-1));
                        }
                        else if(count==Integer.parseInt(temp[3])) {
                            if(count<=3)
                                System.out.println("wrong format");
                            else {
                                sum = 0;
                                for(i=0;i<count;i++) {
                                    if(Integer.parseInt(temp[4+i])<0||Integer.parseInt(temp[4+i])>100) {
                                        System.out.println("wrong format");
                                        sum = -1;
                                        break;}
                                    else
                                    sum += Integer.parseInt(temp[4+i]);
                                }
                                if(sum!=-1){                                 
                                    selection.add(new Selection(temp[0],temp[1],temp[2],sum/count));                                    
                                }
                            }
                        }                                
                        else
                            System.out.println("wrong format");  
                        break;
                }                    
            }
        }  
        for(Selection selection1:selection) {//创建班级,如果班级存在则将这条记录传入那个班级
            AClass aclass1 = searchAClass(aclass,(selection1.getstudentout().getID()).substring(0,6));
            if(aclass1==null) {
                aclass.add(new AClass((selection1.getstudentout().getID()).substring(0,6),selection1));               
            }
            else {
                aclass1.setselection(selection1);
            }
        }        
        for(AClass aclass2:aclass) {//遍历所有班级
            i = 0;
            sum = 0;
            for(Selection selection2:aclass2.getselection()) {//查找每个班级里面的selection
                selection2.settotalscore();//得到每条记录里面的总分数,用selection类里面的方法
                sum += selection2.gettotalscore();//计算班级总分
                i++;//计算班级所有的记录条数
            }
            classaver = (int)(sum/i);//班级平均分
            aclass2.setclassaver(classaver);
        }     
        Collections.sort(selection,new Comparator<Selection>() {//排序
            @Override
            public int compare(Selection a1,Selection a2) {
                return a1.getstudentout().getIDnumber()-a2.getstudentout().getIDnumber();
            }
        });
        for(Selection selection2:selection) {//studentout类创建,如果有则传入信息
            Studentout studentout2 = searchStudentout(studentout,selection2.getstudentout().getID());
            if(studentout2==null) {
                studentout.add(new Studentout(selection2.getstudentout().getID(),selection2.getstudentout().getname()));
            }
            sum = 0;
            i = 0;
            Studentout studentout3 = searchStudentout(studentout,selection2.getstudentout().getID());
            for(Selection selection3:selection) {
                selection3.settotalscore();
                if(selection3.getstudentout().getname().equals(studentout3.getname())&&selection3.getstudentout().getID().equals(studentout3.getID())) {
                    sum += selection3.gettotalscore();//上面这个if是匹配学号姓名,计算这个学生总分
                    i++;//与这个学生相关的有效的所有课程数
                }
            }
            aver = (int)(sum/i);
            studentout3.setaveragescore(aver);//得到学生所有课程的平均分
        }        
        for(Studentout studentout4:studentout) {//输出学生信息
            if(studentout4.getaveragescore()<0) {//判断这个学生是否有成绩
                System.out.println(studentout4.getIDnumber()+" "+studentout4.getname()+" did not take any exams");
            }
            else//有就输出
            System.out.println(studentout4.getIDnumber() + " " + studentout4.getname() + " " +studentout4.getaveragescore());
            
        }        
        for(Course course4:course) {//计算单门课程的平均分
            Selection selection7 = searchselection(selection,course4.getname());
            if(selection7!=null) {
                sumd = 0;
                sume = 0;
                suma = 0;
                sum = 0;
                i = 0;
                for(Selection selection4:selection) {
                    if(course4.getname().equals(selection4.getcourse().getname())) {
                        sumd += selection4.getdailyscore().getscore();//平时成绩和
                        sume += selection4.getexascore().getscore();//考试
                        suma += selection4.getassscore().getscore();//考察
                        sum += selection4.gettotalscore();//这门课程总分和
                        i++;//记录的条数
                    }
                }
                //分别是这门课程的平时成绩,考试成绩,考察成绩,总分成绩的平均分
                averd = (int)(sumd/i);
                avere = (int)(sume/i);
                avera = (int)(suma/i);
                aver = (int)(sum/i);
                Courseout courseout1 = searchCourseout(courseout,course4.getname());
                if(courseout1==null)
                    courseout.add(new Courseout(course4.getname(),averd,avere,avera,aver));
            }
        }
        for(Course course3:course) {
            Selection selection7 = searchselection(selection,course3.getname());
            if(selection7==null)//如果这个课程没有输入成绩的输出
                System.out.println(course3.getname()+" has no grades yet");
            else {//课程按照课程名排序
                Comparator<Object> comparator = Collator.getInstance(Locale.CHINA);
                Collections.sort(courseout,(p1,p2) ->{
                    return comparator.compare(p1.getname(), p2.getname());
                });
            }
        }          
        for(Courseout courseout1:courseout) {//输出课程信息,包括平时成绩平均分考试成绩平均分总成绩平均分
            Course course1 = searchCourse(course,courseout1.getname());
            if(course1!=null&&course1.getproperty().equals("实验")) {
                System.out.println(courseout1.getname()+" "+courseout1.getaaver());
                continue;
            }
            if(courseout1.getaaver()<0)
                System.out.println(courseout1.getname()+" "+courseout1.getdaver()+" "+courseout1.geteaver()+" "+courseout1.getaveragescore());
            else
                System.out.println(courseout1.getname()+" "+courseout1.getaaver()+" "+courseout1.getaveragescore());
        }  
        Collections.sort(aclass,new Comparator<AClass>() {//班级按照班级号排序
            @Override
            public int compare(AClass a1,AClass a2) {
                return a1.getclassnumber()-a2.getclassnumber();
            } 
        });       
        for(AClass aclass3:aclass) {//输出班级信息
            if(aclass3.getclassaver()<0)
                System.out.println(aclass3.getclassnum() + " has no grades yet");
            else
                System.out.println(aclass3.getclassnum() + " " + aclass3.getclassaver());
        }
       
    }        
    public static Course searchCourse(ArrayList<Course> course,String name) {
        for(Course course1:course) {
            if(course1==null) 
                return null;
            
            if(name.equals(course1.getname()))
                return course1;
        }
        return null;
    }   
    public static AClass searchAClass(ArrayList<AClass> aclass,String classnum) {
        for(AClass aclass1:aclass) {
            if(aclass1==null)
                return null;
            if(classnum.equals(aclass1.getclassnum()))
                return aclass1;
        }
        return null;
    }   
    public static Courseout searchCourseout(ArrayList<Courseout> courseout,String name) {
        for(Courseout courseout1:courseout) {
            if(courseout1==null) 
                return null;
            
            if(name.equals(courseout1.getname()))
                return courseout1;
        }
        return null;
    }   
    public static Selection searchselection(ArrayList<Selection> selection,String name) {
        for(Selection selection5:selection) {
            if(selection5==null) 
                return null;           
            if(name.equals(selection5.getcourse().getname()))
                return selection5;
        }
        return null;
    }   
    public static Studentout searchStudentout(ArrayList<Studentout> studentout,String ID) {
        for(Studentout studentout1:studentout) {
            if(studentout1==null) 
                return null;                
            if(ID.equals(studentout1.getID()))
                return studentout1;
        }
        return null;
    }
}
class Studentout{
    private String ID;
    private String name;
    private int averagescore = -1;
    
    public Studentout(String ID,String name) {
        this.ID = ID;
        this.name = name;
    }
    public Studentout() {
        // TODO Auto-generated constructor stub
    }
    public int getIDnumber() {
        return Integer.parseInt(this.ID);
    }    
    public String getID() {
        return this.ID;
    }    
    public String getname() {
        return this.name;
    }    
    public void setaveragescore(int averagescore) {
        this.averagescore = averagescore;
    }    
    public int getaveragescore() {
        return this.averagescore;
    }
}
class Courseout{
    private String name;
    private int daver = -1;
    private int eaver = -1;
    private int aaver = -1;
    private int averagescore = -1;
    
    public Courseout(String name,int daver,int eaver,int aaver,int averagescore) {
        this.name = name;
        this.daver = daver;
        this.eaver = eaver;
        this.aaver = aaver;
        this.averagescore = averagescore;
    }    
    public String getname() {
        return this.name;
    }    
    public void setdaver(int dscore) {
        this.daver = dscore;
    }
    public int getdaver() {
        return this.daver;
    }    
    public void seteaver(int escore) {
        this.eaver = escore;
    }
    public int geteaver() {
        return this.eaver;
    }
    
    public void setaaver(int ascore) {
        this.aaver = ascore;
    }
    public int getaaver() {
        return this.aaver;
    }    
    public void setaveragescore(int score) {
        this.averagescore = score;
    }
    public int getaveragescore() {
        return this.averagescore;
    }    
}
class Selection{
    Course course = new Course();
    Studentout studentout = new Studentout();
    Exascore exascore = new Exascore();
    Dailyscore dailyscore = new Dailyscore();
    Assscore assscore = new Assscore();
    private int totalscore;
    
    public Selection(String ID,String name,String coursename,int dscore,int escore) {
        studentout = new Studentout(ID,name);
        course = new Course(coursename);
        dailyscore = new Dailyscore(dscore);
        exascore = new Exascore(escore);
    }
    public Selection(String ID,String name,String coursename,int ascore) {
        studentout = new Studentout(ID,name);
        course = new Course(coursename);
        assscore = new Assscore(ascore);
    }
    public Studentout getstudentout() {
        return this.studentout;
    }
    public Course getcourse() {
        return this.course;
    }
    public Dailyscore getdailyscore() {
        return this.dailyscore;
    }
    public Exascore getexascore() {
        return this.exascore;
    }
    public Assscore getassscore() {
        return this.assscore;
    }
    public void settotalscore() {
        if(this.assscore.getscore()==-1) {
            this.totalscore = (int)(this.exascore.getscore()*0.7+this.dailyscore.getscore()*0.3);
        }
        else
            this.totalscore = this.assscore.getscore();
    }
    public int gettotalscore() {
        return this.totalscore;
    }
}
class Course{
    private String name;
    private String property;
    private String exaway;
   
    public Course() {
    }
    public Course(String name) {
        this.name = name;
    }
    public Course(String name, String property, String exaway) {
        this.name = name;
        this.property = property;
        this.exaway = exaway;
    }
    public void setname(String name) {
        this.name = name;
    }
    public String getname() {
        return this.name;
    } 
    public void setemaway(String exaway) {
        this.exaway = exaway;
    }
    public String getexaway() {
        return this.exaway;
    }
    public void setproperty(String property) {
        this.property = property;
    }
    public String getproperty() {
        return this.property;
    }
}
class AClass{
    private String classnum;
    ArrayList<Selection> studentsel = new ArrayList<Selection>();
    private int classaver = -1;
    public AClass(){
    }
    public AClass(String num) {
        this.classnum = num;
    }
    public AClass(String classnum,Selection selection) {
        this.classnum = classnum;
        if(selection.getassscore().getscore()==-1)
            studentsel.add(new Selection(selection.getstudentout().getID(),selection.getstudentout().getname(),
                selection.getcourse().getname(),selection.getdailyscore().getscore(),selection.getexascore().getscore()));
        else
            studentsel.add(new Selection(selection.getstudentout().getID(),selection.getstudentout().getname(),
                    selection.getcourse().getname(),selection.getassscore().getscore()));
    }    
    public void setselection(Selection selection) {
        if(selection.getassscore().getscore()==-1)
            studentsel.add(new Selection(selection.getstudentout().getID(),selection.getstudentout().getname(),
                selection.getcourse().getname(),selection.getdailyscore().getscore(),selection.getexascore().getscore()));
        else
            studentsel.add(new Selection(selection.getstudentout().getID(),selection.getstudentout().getname(),
                selection.getcourse().getname(),selection.getassscore().getscore()));
    }    
    public ArrayList<Selection> getselection(){
        return this.studentsel;
    }    
    public void setclassnum(String classnum) {
        this.classnum = classnum;
    }
    public String getclassnum() {
        return this.classnum;
    }   
    public int getclassnumber() {
        return Integer.parseInt(this.classnum);
    }  
    public void setclassaver(int classaver) {
        this.classaver = classaver;
    }
    public int getclassaver() {
        return this.classaver;
    }
}
abstract class Score{
    protected int score = -1;
    public Score() {
    }
    public void setscore(int score) {
        this.score = score;
    }
    public int getscore() {
        return this.score;
    }  
}
class Dailyscore extends Score{
    public Dailyscore() {
    }
    public Dailyscore(int score) {
        super.setscore(score);
    }
}
class Exascore extends Score{
    public Exascore() {
    }
    public Exascore(int score) {
        super.setscore(score);
    }
}
class Assscore extends Score{
    public Assscore() {    
    }
    public Assscore(int score) {
        super.setscore(score);
    }    
}

在动手写这次实验之前,对前一次的代码进行了整改,发现好多类是重复了其他类的操作,所以对整个程序进行了删改使其变得更加精简。同时过了一遍整个代码的逻辑,发现了一些小的bug,改掉了,应该可以过掉很多错误的成绩信息的测试点。于是开始写这次的题目,这次相较于上次多了一个非常麻烦的实验课程,不过还好在输入课程信息的时候还是可以用字符串长度为三的情况输入。由于实验不少于4次,不多于九次,所以就把实验成绩信息的输入放到了switch语句里面的defult情况去处理,在输入成绩信息的时候,由于会输入具体的实验次数,所以用了一个循环记录下所有的实验成绩相加再除以总的次数,得出实验的成绩,再保存在了selection类里面。后续的排序,输出还是按照原来的情况。 

这次的类图依旧比较复杂,但是相对于上一次PTA的类图已经好很多了,至少大致能看懂了,清晰了一些。虽然过了很多测试点,但是那两个测试点是真的很奇怪啊,尤其是样例三,明明在测试用例输出的和输出样例一模一样,但是就是不给过,我看了两天也没看出个所以然来,所以只能含泪拿52分。还有case14这个测试点到底是什么意思也没有整明白,是有重复的课程名还是什么,不知道。

                 

 这个猜想不知道对不对,但是我的这个程序是这样输出的,不知道为什么还是不让过。

7-2 课程成绩统计程序-3

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

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

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

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

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

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

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

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

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

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

1、输入:

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

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

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

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

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

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

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

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

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

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

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

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

以上信息的相关约束:

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

2)学号由8位数字组成

3)姓名不超过10个字符

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

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

2、输出:

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

为避免四舍五入误差,

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

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

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

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

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

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

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

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

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

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

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

异常情况:

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

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

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

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

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

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

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

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

信息约束:

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

参考类图(与第一次相同,其余内容自行补充):

fdada4ca193119ee30531ab82ffebbfa_9dbcf4e8-1627-4cf6-8764-cccf44947e2a.png

输入样例1:

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

java 实验 实验 4 0.2 0.3 0.2 0.3
end
 

输出样例1:

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

java has no grades yet
 

输入样例2:

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

java 实验 实验 4 0.2 0.3 0.2
end
 

输出样例2:

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

java : number of scores does not match
 

输入样例3:

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

java 实验 实验 4 0.2 0.3 0.2 0.1
end
 

输出样例3:

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

java : weight value error
 

输入样例4:

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

java 实验 实验 4 0.2 0.3 0.2 0.3
20201116 张三 java 70 80 90 100
end
 

输出样例4:

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

20201116 张三 86
java 86
202011 86
 

输入样例5:

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

java 实验 实验 4 0.2 0.3 0.2 0.3
20201116 张三 java 70 80 90 100 80
end
 

输出样例5:

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

20201116 张三 : access mode mismatch
20201116 张三 did not take any exams
java has no grades yet
202011 has no grades yet

import java.text.Collator;
import java.util.*;
public class Main{
    @SuppressWarnings("unused")
    public static void main(String[] args){
        Scanner input = new Scanner(System.in);
        ArrayList<Course> course = new ArrayList<Course>();
        ArrayList<Selection> selection = new ArrayList<Selection>();
        ArrayList<AClass> aclass = new ArrayList<AClass>();
        ArrayList<Courseout> courseout = new ArrayList<Courseout>();
        ArrayList<Studentout> studentout = new ArrayList<Studentout>();
        int classaver = 0,stuaver = 0,count = 0,aver = 0,averd = 0,avere = 0,avera = 0;
        int sum = 0,sumd = 0,sume = 0,suma = 0,i = 0,k = 0,m = 0;
        while(true) {
             String str = input.nextLine();
            String[] temp = str.split(" ");
            if(str.equals("end"))
                break;
            count = temp.length;
            switch(count) {
                case 3:{
                    if (temp[0].length() <= 10 && (temp[1].equals("必修") || temp[1].equals("选修")||temp[1].equals("实验"))
                            && (temp[2].equals("考察") || temp[2].equals("考试")||temp[2].equals("实验"))) {
                        if (temp[1].equals("必修") &&( temp[2].equals("考察")||temp[2].equals("实验"))) { 
                            System.out.println(temp[0] + " : course type & access mode mismatch");
                        }
                        else{ 
                            if(searchCourse(course,temp[0])==null)
                                course.add(new Course(temp[0],temp[1],temp[2]));
                        }
                    }
                    else {
                        System.out.println("wrong format");
                    }
                    break;
                }
                case 4:{
                    try{
                    if(temp[0].length()==8&&temp[1].length()<=10&&temp[2].length()<=10
                       &&Integer.parseInt(temp[3])<=100&&Integer.parseInt(temp[3])>=0) {
                        Course course1 = searchCourse(course,temp[2]);                    
                        if(course1==null) {
                            System.out.println(temp[2] + " does not exist");
                            studentout.add(new Studentout(temp[0],temp[1]));
                        }
                        else {
                            if(course1.getexaway().equals("考试")) {
                                System.out.println(temp[0] + " " + temp[1] + " : access mode mismatch");
                                studentout.add(new Studentout(temp[0],temp[1]));
                                selection.add(new Selection(temp[0],temp[1],temp[0].substring(0,6),-1));
                            }
                            else 
                                if(course1.getproperty().equals("实验"))
                                    System.out.println("wrong format");
                                else
                                selection.add(new Selection(temp[0],temp[1],temp[2],Integer.parseInt(temp[3])));
                        }
                    }
                    else {
                        System.out.println("wrong format");
                    }
                    }catch(Exception err){
                        System.out.println("wrong format");
                    }
                    break;
                }
                case 5:{
                    try {
                        if(temp[0].length() <= 10 && (temp[2].equals("考试"))){
                            if (temp[1].equals("实验")) { 
                                System.out.println(temp[0] + " : course type & access mode mismatch");
                            }
                            else {
                                    if((int)(Double.parseDouble(temp[3])+Double.parseDouble(temp[4]))!=1.0)
                                        System.out.println(temp[0]+" : weight value error");
                                    else {
                                        if(searchCourse(course,temp[0])==null){
                                            course.add(new Course(temp[0],temp[1],temp[2]));
                                            Course course1 = searchCourse(course,temp[0]);
                                            course1.subscore.weight[0] = Double.parseDouble(temp[3]);
                                            course1.subscore.weight[1] = Double.parseDouble(temp[4]);
                                        }
                                    }
                                }
                            }
                    if(temp[0].length() <= 10 &&temp[1].equals("实验")) {
                            System.out.println("wrong format");
                        }
                    if((temp[0].length()==8&&temp[1].length()<=10&&temp[2].length()<=10&&
                            Integer.parseInt(temp[3])<=100&&Integer.parseInt(temp[3])>=0
                            &&Integer.parseInt(temp[4])<=100&&Integer.parseInt(temp[4])>=0)) {
                        Course course1 = searchCourse(course,temp[2]);
                        if(course1==null) 
                            System.out.println(temp[2] + " does not exist");
                        else {
                            if(course1.getproperty().equals("实验"))
                                System.out.println("wrong format");
                            else
                                selection.add(new Selection(temp[0],temp[1],temp[2]
                                        ,Integer.parseInt(temp[3]),Integer.parseInt(temp[4])));
                        }
                    }
                    }catch(Exception err){
                        System.out.println("wrong format");
                    }
                    break;
                }
                default:{
                    if(temp[0].length()<=10&&(temp[1].equals("必修")||temp[1].equals("选修"))&&temp[2].equals("实验"))
                        System.out.println(temp[0]+" : course type & access mode mismatch");
                    if(temp[0].length()<=10&&temp[1].equals("实验")&&temp[2].equals("实验")){
                        m = count-4;
                        if(m!=Integer.parseInt(temp[3])) 
                            System.out.println(temp[0]+" : number of scores does not match");
                        else {
                            if(Integer.parseInt(temp[3])<4||Integer.parseInt(temp[3])>9) {
                                System.out.println("wrong format");
                                course.add(new Course(temp[0],temp[1],temp[2]));
                                break;
                            }
                                double sum1 = 0;
                                for(i=0;i<m;i++) {
                                    sum1 += Double.parseDouble(temp[4+i]);
                                }
                                if((int)sum1!=1.0)
                                    System.out.println(temp[0]+" : weight value error");
                                else {
                                    if(searchCourse(course,temp[0])==null){
                                        course.add(new Course(temp[0],temp[1],temp[2]));
                                        Course course1 = searchCourse(course,temp[0]);
                                        for(i=0;i<m;i++) {
                                            course1.subscore.weight[i] = Double.parseDouble(temp[4+i]);
                                            course1.subscore.wnum = i+1;
                                    }
                                    }
                                }
                            }
                        }
                        else {
                            m = count-3;
                        if(temp[0].length()==8&&temp[1].length()<=10&&m<=9&&m>=4){
                            Course course1 = searchCourse(course,temp[2]);
                            if(course1==null) {
                                System.out.println(temp[2] + " does not exist");
                            }
                            else {
                                if(m!=course1.subscore.wnum) {
                                    System.out.println(temp[0] + " " + temp[1] + " : access mode mismatch");
                                    studentout.add(new Studentout(temp[0],temp[1]));
                                    selection.add(new Selection(temp[0],temp[1],temp[0].substring(0,6),-1));
                                }
                                else {
                                    double    sum1 = 0;
                                    for(i=0;i<m;i++) {
                                    if(Integer.parseInt(temp[3+i])<0||Integer.parseInt(temp[3+i])>100) {
                                        System.out.println("wrong format");
                                        sum1 = -1;
                                        break;}
                                    else 
                                        sum1 += Integer.parseInt(temp[3+i])*course1.subscore.weight[i];
                                    }
                                    if(sum1!=-1) {
                                        selection.add(new Selection(temp[0],temp[1],temp[2],(int)sum1));
                                    }
                                }
                            }  
                        }    
                        }
                        if(count<3||count>13)
                            System.out.println("wrong format"); 
                        break;
                    }
                }
            }
         
        for(Selection selection1:selection) {//创建班级,如果班级存在则将这条记录传入那个班级
            AClass aclass1 = searchAClass(aclass,(selection1.getstudentout().getID()).substring(0,6));
            if(aclass1==null) {
                aclass.add(new AClass((selection1.getstudentout().getID()).substring(0,6),selection1));               
            }
            else {
                aclass1.setselection(selection1);
            }
        }        
        for(AClass aclass2:aclass) {//遍历所有班级
            i = 0;
            sum = 0;
            for(Selection selection2:aclass2.getselection()) {//查找每个班级里面的selection
                selection2.settotalscore();//得到每条记录里面的总分数,用selection类里面的方法
                sum += selection2.gettotalscore();//计算班级总分
                i++;//计算班级所有的记录条数
            }
            classaver = (int)(sum/i);//班级平均分
            aclass2.setclassaver(classaver);
        }     
        Collections.sort(selection,new Comparator<Selection>() {//排序
            @Override
            public int compare(Selection a1,Selection a2) {
                return a1.getstudentout().getIDnumber()-a2.getstudentout().getIDnumber();
            }
        });
        for(Selection selection2:selection) {//studentout类创建,如果有则传入信息
            Studentout studentout2 = searchStudentout(studentout,selection2.getstudentout().getID());
            if(studentout2==null) {
                studentout.add(new Studentout(selection2.getstudentout().getID(),selection2.getstudentout().getname()));
            }
            sum = 0;
            i = 0;
            Studentout studentout3 = searchStudentout(studentout,selection2.getstudentout().getID());
            for(Selection selection3:selection) {
                selection3.settotalscore();
                if(selection3.getstudentout().getname().equals(studentout3.getname())&&selection3.getstudentout().getID().equals(studentout3.getID())) {
                    sum += selection3.gettotalscore();//上面这个if是匹配学号姓名,计算这个学生总分
                    i++;//与这个学生相关的有效的所有课程数
                }
            }
            aver = (int)(sum/i);
            studentout3.setaveragescore(aver);//得到学生所有课程的平均分
        }        
        for(Studentout studentout4:studentout) {//输出学生信息
            if(studentout4.getaveragescore()<0) {//判断这个学生是否有成绩
                System.out.println(studentout4.getIDnumber()+" "+studentout4.getname()+" did not take any exams");
            }
            else//有就输出
            System.out.println(studentout4.getIDnumber() + " " + studentout4.getname() + " " +studentout4.getaveragescore());
            
        }        
        for(Course course4:course) {//计算单门课程的平均分
            Selection selection7 = searchselection(selection,course4.getname());
            if(selection7!=null) {
                sumd = 0;
                sume = 0;
                suma = 0;
                sum = 0;
                i = 0;
                for(Selection selection4:selection) {
                    if(course4.getname().equals(selection4.getcourse().getname())) {
                        sumd += selection4.getdailyscore().getscore();//平时成绩和
                        sume += selection4.getexascore().getscore();//考试
                        suma += selection4.getassscore().getscore();//考察
                        sum += selection4.gettotalscore();//这门课程总分和
                        i++;//记录的条数
                    }
                }
                //分别是这门课程的平时成绩,考试成绩,考察成绩,总分成绩的平均分
                averd = (int)(sumd/i);
                avere = (int)(sume/i);
                avera = (int)(suma/i);
                aver = (int)(sum/i);
                Courseout courseout1 = searchCourseout(courseout,course4.getname());
                if(courseout1==null)
                    courseout.add(new Courseout(course4.getname(),averd,avere,avera,aver));
            }
        }
        for(Course course3:course) {
            Selection selection7 = searchselection(selection,course3.getname());
            if(selection7==null)//如果这个课程没有输入成绩的输出
                System.out.println(course3.getname()+" has no grades yet");
            else {//课程按照课程名排序
                Comparator<Object> comparator = Collator.getInstance(Locale.CHINA);
                Collections.sort(courseout,(p1,p2) ->{
                    return comparator.compare(p1.getname(), p2.getname());
                });
            }
        }          
        for(Courseout courseout1:courseout) {//输出课程信息,包括平时成绩平均分考试成绩平均分总成绩平均分
            Course course1 = searchCourse(course,courseout1.getname());
            if(course1!=null&&course1.getproperty().equals("实验")) {
                System.out.println(courseout1.getname()+" "+courseout1.getaaver());
                continue;
            }
            if(courseout1.getaaver()<0)
                System.out.println(courseout1.getname()+" "+courseout1.getdaver()+" "+courseout1.geteaver()+" "+courseout1.getaveragescore());
            else
                System.out.println(courseout1.getname()+" "+courseout1.getaaver()+" "+courseout1.getaveragescore());
        }  
        Collections.sort(aclass,new Comparator<AClass>() {//班级按照班级号排序
            @Override
            public int compare(AClass a1,AClass a2) {
                return a1.getclassnumber()-a2.getclassnumber();
            } 
        });       
        for(AClass aclass3:aclass) {//输出班级信息
            if(aclass3.getclassaver()<0)
                System.out.println(aclass3.getclassnum() + " has no grades yet");
            else
                System.out.println(aclass3.getclassnum() + " " + aclass3.getclassaver());
        }
       
    }        
    public static Course searchCourse(ArrayList<Course> course,String name) {
        for(Course course1:course) {
            if(course1==null) 
                return null;
            
            if(name.equals(course1.getname()))
                return course1;
        }
        return null;
    }   
    public static AClass searchAClass(ArrayList<AClass> aclass,String classnum) {
        for(AClass aclass1:aclass) {
            if(aclass1==null)
                return null;
            if(classnum.equals(aclass1.getclassnum()))
                return aclass1;
        }
        return null;
    }   
    public static Courseout searchCourseout(ArrayList<Courseout> courseout,String name) {
        for(Courseout courseout1:courseout) {
            if(courseout1==null) 
                return null;
            
            if(name.equals(courseout1.getname()))
                return courseout1;
        }
        return null;
    }   
    public static Selection searchselection(ArrayList<Selection> selection,String name) {
        for(Selection selection5:selection) {
            if(selection5==null) 
                return null;           
            if(name.equals(selection5.getcourse().getname()))
                return selection5;
        }
        return null;
    }   
    public static Studentout searchStudentout(ArrayList<Studentout> studentout,String ID) {
        for(Studentout studentout1:studentout) {
            if(studentout1==null) 
                return null;                
            if(ID.equals(studentout1.getID()))
                return studentout1;
        }
        return null;
    }
}
class Studentout{
    private String ID;
    private String name;
    private int averagescore = -1;
    
    public Studentout(String ID,String name) {
        this.ID = ID;
        this.name = name;
    }
    public Studentout() {
        // TODO Auto-generated constructor stub
    }
    public int getIDnumber() {
        return Integer.parseInt(this.ID);
    }    
    public String getID() {
        return this.ID;
    }    
    public String getname() {
        return this.name;
    }    
    public void setaveragescore(int averagescore) {
        this.averagescore = averagescore;
    }    
    public int getaveragescore() {
        return this.averagescore;
    }
}
class Courseout{
    private String name;
    private int daver = -1;
    private int eaver = -1;
    private int aaver = -1;
    private int averagescore = -1;
    
    public Courseout(String name,int daver,int eaver,int aaver,int averagescore) {
        this.name = name;
        this.daver = daver;
        this.eaver = eaver;
        this.aaver = aaver;
        this.averagescore = averagescore;
    }    
    public String getname() {
        return this.name;
    }    
    public void setdaver(int dscore) {
        this.daver = dscore;
    }
    public int getdaver() {
        return this.daver;
    }    
    public void seteaver(int escore) {
        this.eaver = escore;
    }
    public int geteaver() {
        return this.eaver;
    }
    
    public void setaaver(int ascore) {
        this.aaver = ascore;
    }
    public int getaaver() {
        return this.aaver;
    }    
    public void setaveragescore(int score) {
        this.averagescore = score;
    }
    public int getaveragescore() {
        return this.averagescore;
    }    
}
class Selection{
    Course course = new Course();
    Studentout studentout = new Studentout();
    Exascore exascore = new Exascore();
    Dailyscore dailyscore = new Dailyscore();
    Assscore assscore = new Assscore();
    private int totalscore;
    
    public Selection(String ID,String name,String coursename,int dscore,int escore) {
        studentout = new Studentout(ID,name);
        course = new Course(coursename);
        dailyscore = new Dailyscore(dscore);
        exascore = new Exascore(escore);
    }
    public Selection(String ID,String name,String coursename,int ascore) {
        studentout = new Studentout(ID,name);
        course = new Course(coursename);
        assscore = new Assscore(ascore);
    }
    public Studentout getstudentout() {
        return this.studentout;
    }
    public Course getcourse() {
        return this.course;
    }
    public Dailyscore getdailyscore() {
        return this.dailyscore;
    }
    public Exascore getexascore() {
        return this.exascore;
    }
    public Assscore getassscore() {
        return this.assscore;
    }
    public void settotalscore() {
        if(this.assscore.getscore()==-1) {
            this.totalscore =(int)(this.exascore.getscore()*0.7+this.dailyscore.getscore()*0.3);
        }
        else
            this.totalscore = this.assscore.getscore();
    }
    public int gettotalscore() {
        return this.totalscore;
    }
}
class Course{
    private String name;
    private String property;
    private String exaway;
    SubScore subscore = new SubScore();
    public Course() {
    }
    public Course(String name) {
        this.name = name;
    }
    public Course(String name, String property, String exaway) {
        this.name = name;
        this.property = property;
        this.exaway = exaway;
    }
    public void setname(String name) {
        this.name = name;
    }
    public String getname() {
        return this.name;
    } 
    public void setemaway(String exaway) {
        this.exaway = exaway;
    }
    public String getexaway() {
        return this.exaway;
    }
    public void setproperty(String property) {
        this.property = property;
    }
    public String getproperty() {
        return this.property;
    }
}
class AClass{
    private String classnum;
    ArrayList<Selection> studentsel = new ArrayList<Selection>();
    private int classaver = -1;
    public AClass(){
    }
    public AClass(String num) {
        this.classnum = num;
    }
    public AClass(String classnum,Selection selection) {
        this.classnum = classnum;
        if(selection.getassscore().getscore()==-1)
            studentsel.add(new Selection(selection.getstudentout().getID(),selection.getstudentout().getname(),
                selection.getcourse().getname(),selection.getdailyscore().getscore(),selection.getexascore().getscore()));
        else
            studentsel.add(new Selection(selection.getstudentout().getID(),selection.getstudentout().getname(),
                    selection.getcourse().getname(),selection.getassscore().getscore()));
    }    
    public void setselection(Selection selection) {
        if(selection.getassscore().getscore()==-1)
            studentsel.add(new Selection(selection.getstudentout().getID(),selection.getstudentout().getname(),
                selection.getcourse().getname(),selection.getdailyscore().getscore(),selection.getexascore().getscore()));
        else
            studentsel.add(new Selection(selection.getstudentout().getID(),selection.getstudentout().getname(),
                selection.getcourse().getname(),selection.getassscore().getscore()));
    }    
    public ArrayList<Selection> getselection(){
        return this.studentsel;
    }    
    public void setclassnum(String classnum) {
        this.classnum = classnum;
    }
    public String getclassnum() {
        return this.classnum;
    }   
    public int getclassnumber() {
        return Integer.parseInt(this.classnum);
    }  
    public void setclassaver(int classaver) {
        this.classaver = classaver;
    }
    public int getclassaver() {
        return this.classaver;
    }
}
abstract class Score{
    protected int score = -1;
    public Score() {
    }
    public void setscore(int score) {
        this.score = score;
    }
    public int getscore() {
        return this.score;
    }  
}
class Dailyscore extends Score{
    public Dailyscore() {
    }
    public Dailyscore(int score) {
        super.setscore(score);
    }
}
class Exascore extends Score{
    public Exascore() {
    }
    public Exascore(int score) {
        super.setscore(score);
    }
}
class Assscore extends Score{
    public Assscore() {    
    }
    public Assscore(int score) {
        super.setscore(score);
    }    
}
class SubScore{
    int wnum = 0;
    double[] weight = new double[9];
    int[] ascore = new int[9];
    public SubScore() {
    }
    public double[] getWeight() {
        return this.weight;
    }
    public int[] getSubScore() {
        return this.ascore;
    }
}

 类图依旧复杂,不过这次写的比第二次痛苦多了,不知道怎么回事,一开始到截止时间之前很长的一段时间只能过五个样例,其他一个测试点都过不去,后来经过同学的点拨,我发现了一个bug,就是String类型转换为double类型的时候,有误差,而且double类型的两个数不能直接相等,有误差,所以,在计算权重和的时候,可以选择把计算出来的权重和转换为整型,再和1进行比较,或者用计算出来的权重和减去1.0得到的结果和0.01进行比较。选择的是第一种方法,比较懒不想去设置比较数值。这个代码还有其他的很多bug,不过当时没时间改了,现在来分析一下:

 由得分结果来看,含错误的课程信息和错误的成绩信息这些测试点没过可能是因为再接收到错误的信息输出相应的结果之后,又将错误的课程信息记录在了selection类里面,导致后面输入错误的课程信息之后还是可以用与创建错误的学生信息然后输出。还有考试成绩信息的权重在我的代码里面是固定0.3和0.7的因为题目给出说是固定的,但是可能在测试点测试整个代码的时候,改变了考试信息的权重,所以过不去考试成绩信息的测试点。而且感觉整个代码又像第一次写的时候一样,写的太复杂导致整个逻辑比较混乱,加上时间比较短,再想改好已经来不及了,类结构也有问题,首先没有按照老师的标准让成绩类都变成组合关系,而且在记录成绩信息的时候,没有用到新建权重成绩类里面的数组,这是不足的地方,下次写程序应该考虑清楚,而不应该贪快去省略一些必要的操作。

7-5 jmu-Java-03面向对象基础-05-覆盖 分数 5 作者 郑如滨 单位 集美大学

Java每个对象都继承自Object,都有equals、toString等方法。
现在需要定义PersonOverride类并覆盖其toStringequals方法。

1. 新建PersonOverride类

a. 属性:String nameint ageboolean gender,所有的变量必须为私有(private)。

b. 有参构造方法,参数为name, age, gender

c. 无参构造方法,使用this(name, age,gender)调用有参构造方法。参数值分别为"default",1,true

d.toString()方法返回格式为:name-age-gender

e. equals方法需比较name、age、gender,这三者内容都相同,才返回true.

2. main方法

2.1 输入n1,使用无参构造方法创建n1个对象,放入数组persons1。
2.2 输入n2,然后指定name age gender。每创建一个对象都使用equals方法比较该对象是否已经在数组中存在,如果不存在,才将该对象放入数组persons2。
2.3 输出persons1数组中的所有对象
2.4 输出persons2数组中的所有对象
2.5 输出persons2中实际包含的对象的数量
2.5 使用System.out.println(Arrays.toString(PersonOverride.class.getConstructors()));输出PersonOverride的所有构造方法。

提示:使用ArrayList代替数组大幅复简化代码,请尝试重构你的代码。

输入样例:

1
3
zhang 10 true
zhang 10 true
zhang 10 false

 

输出样例:

default-1-true
zhang-10-true
zhang-10-false
2
[public PersonOverride(), public PersonOverride(java.lang.String,int,boolean)]
 
import java.util.*;

public class Main {
    public static void main(String[] args) {
        Scanner s = new Scanner(System.in);
        int n = s.nextInt();
        int m = s.nextInt();
        ArrayList<PersonOverride> person1 = new ArrayList<>();
        ArrayList<PersonOverride> person2 = new ArrayList<>();
        for (int i = 0; i < n; i++) {
            person1.add(new PersonOverride());
        }
        for (int i = 0; i < m; i++) {
            String name = s.next();
            int age = s.nextInt();
            boolean gender = "".equals(s.next());
            PersonOverride temp = new PersonOverride(name,age,gender);
        if(Exists(person2,temp)){
            person2.add(temp);
        }
    }
    for (PersonOverride o : person1) {
        System.out.println(o.toString());
    }
    for (PersonOverride p : person2) {
        System.out.println(p.toString());
    }
    System.out.println(person2.size());
    System.out.println(Arrays.toString(PersonOverride.class.getConstructors()));

}
private static boolean Exists(ArrayList<PersonOverride> person2, PersonOverride temp) {
    for (PersonOverride personOverride : person2) {
        if(personOverride.equals(temp)){
            return false;
        }
    }
    return true;
}

}
class PersonOverride{
    private String name;
    private int age;
    private boolean gender;

public PersonOverride() {
    this("default",1,true);
}

public PersonOverride(String name, int age, boolean gender) {
    this.name = name;
    this.age = age;
    this.gender = gender;
}

public String getName() {
    return name;
}

public void setName(String name) {
    this.name = name;
}

public int getAge() {
    return age;
}

public void setAge(int age) {
    this.age = age;
}

public boolean isGender() {
    return gender;
}

public void setGender(boolean gender) {
    this.gender = gender;
}
@Override
public boolean equals(Object obj) {
    PersonOverride p = (PersonOverride)obj;
    if(this.name.equals(p.getName())&&this.age==p.getAge()&&this.gender==p.isGender()){
        return true;
    }
    return false;
}


public String toString() {
    return name+"-"+age+"-"+gender;
}

}

本题虽然简单,但是我改动了很久很久,不知道为什么总是有一个对象加入不了数组里面,输出总是少一个对象,我现在暂时没有找到解决办法,不过先把这题记录下来以免丢失,打算去问问同学。

7-4 jmu-Java-04面向对象进阶-03-接口-自定义接口ArrayIntegerStack 分数 10 作者 郑如滨 单位 集美大学

定义IntegerStack接口,用于声明一个存放Integer元素的栈的常见方法:

 
public Integer push(Integer item);
//如果item为null,则不入栈直接返回null。如果栈满,也返回null。如果插入成功,返回item。

public Integer pop();   //出栈,如果为空,则返回null。出栈时只移动栈顶指针,相应位置不置为null
public Integer peek();  //获得栈顶元素,如果为空,则返回null.
public boolean empty(); //如果为空返回true
public int size();      //返回栈中元素个数
 

定义IntegerStack的实现类ArrayIntegerStack,内部使用数组实现。创建时,可指定内部数组大小。

main方法说明

  1. 输入n,建立可包含n个元素的ArrayIntegerStack对象
  2. 输入m个值,均入栈。每次入栈均打印入栈返回结果。
  3. 输出栈顶元素,输出是否为空,输出size
  4. 使用Arrays.toString()输出内部数组中的值。
  5. 输入x,然后出栈x次,每次出栈均打印。
  6. 输出栈顶元素,输出是否为空,输出size
  7. 使用Arrays.toString()输出内部数组中的值。

思考

如果IntegerStack接口的实现类内部使用ArrayList来存储元素,怎么实现?测试代码需要进行什么修改?

输入样例

5
3
1 2 3
2

 

输出样例

1
2
3
3,false,3
[1, 2, 3, null, null]
3
2
1,false,1
[1, 2, 3, null, null]
 
import java.util.*;
public class Main{
    public static void main(String[] args){
        Scanner input = new Scanner(System.in);
        int n = input.nextInt();
        ArrayIntegerStack stack = new ArrayIntegerStack(n);
        int m = input.nextInt();
        Integer a;
        for(int i=0;i<m;i++){
            a = input.nextInt();
            System.out.println(stack.push(a));
        }
        System.out.println(stack.peek()+","+stack.empty()+","+stack.size());
        System.out.println(Arrays.toString(stack.num));
        int x = input.nextInt();
        for(int i=0;i<x;i++){
            System.out.println(stack.pop());
        }
        System.out.println(stack.peek()+","+stack.empty()+","+stack.size());
        System.out.println(Arrays.toString(stack.num));
    }
}
interface IntegerStack{
    public Integer push(Integer item);//如果item为null,则不入栈直接返回null。如果栈满,也返回null。如果插入成功,返回item。
    public Integer pop();   //出栈,如果为空,则返回null。出栈时只移动栈顶指针,相应位置不置为null
    public Integer peek();  //获得栈顶元素,如果为空,则返回null.
    public boolean empty(); //如果为空返回true
    public int size();      //返回栈中元素个数
}
class ArrayIntegerStack implements IntegerStack{
    Integer[] num;
    int i = -1,size = 0;
    public ArrayIntegerStack(Integer n){
        this.num = new Integer[n];
        this.size = n;
    }
    public Integer push(Integer a){
        if(this.i==this.size-1||a==null)
            return null;
        else{
            num[++i] = a;
        } 
        return a;
    }
    public Integer pop(){
        if(this.empty())
            return null;
        else
            return num[i--];
    }
    public Integer peek(){
        if(this.empty())
            return null;
        else
            return num[i];
    }
    public boolean empty(){
        if(i==-1)
            return true;
        else
            return false;
    }
    public int size(){
        return this.i+1;
    }
}

 

 本题是设计栈,对于栈还不是很熟悉,只知道元素是先进后出的模式,具体的内存处理详见数据结构(数据结构听说是用C语言,C没学好的菜狗瑟瑟发抖),那我们就详见数据结构吧,这个程序按照他的要求走还是比较容易拿分的,就是不知道数据结构是不是也这样啊期待住!

7-3 jmu-Java-02基本语法-03-身份证排序 分数 9 作者 郑如滨 单位 集美大学
  1. 输入n,然后连续输入n个身份证号。
  2. 然后根据输入的是sort1还是sort2,执行不同的功能。输入的不是sort1或sort2,则输出exit并退出。
    输入sort1,将每个身份证的年月日抽取出来,按年-月-日格式组装,然后对组装后的年-月-日升序输出。
    输入sort2,将所有身份证按照里面的年月日升序输出。

注意:处理输入的时候,全部使用ScannernextLine()方法,以免出错。

输入样例:

6
410425198309308225
320203197206115011
431227196108033146
330226196605054190
34080019810819327X
320111197112301539
sort1
sort2
e

 

输出样例:

1961-08-03
1966-05-05
1971-12-30
1972-06-11
1981-08-19
1983-09-30
431227196108033146
330226196605054190
320111197112301539
320203197206115011
34080019810819327X
410425198309308225
exit
 
import java.util.*;
public class Main{
    public static void main(String[] args){
        Scanner input = new Scanner(System.in);
        ArrayList<People> list = new ArrayList<People>();
        String str;
        int n = Integer.parseInt(input.nextLine());
        for(int i=0;i<n;i++){
            str = input.nextLine();
            list.add(new People(str,str.substring(6,14)));
        }
        Collections.sort(list,new Comparator<People>() {//排序
            @Override
            public int compare(People a1,People a2) {
                return Integer.parseInt(a1.getBirth())-Integer.parseInt(a2.getBirth());
            }
        });
        while(true){
            str = input.nextLine();
            if(str.equals("sort1")){
                for(People s:list){
                    System.out.println(s.getBirth().substring(0,4)+"-"+s.getBirth().substring(4,6)+"-"+s.getBirth().substring(6,8));
                }
            }
            else if(str.equals("sort2")){
                for(People s:list){
                    System.out.println(s.getNumber());
                }
            }
            else{
                System.out.println("exit");
                break;
            }
    }
    }
}
class People{
    String number;
    String birth;
    public People(String num,String birth){
        this.number = num;
        this.birth = birth;
    }
    public String getNumber(){
        return this.number;
    }
    public String getBirth(){
        return this.birth;
    }
}

排序题一直不会,只会自己用手写,但是Java其实有很多排序的好东西,最近发现一个容器特别好用,叫Collections,虽然对他的原理有些迷惑,但是貌似能排序所有能排的东西比如Strinng类型,比如double,float,int等等,最重要的是连对象都能排序,相当好用,直接背下来哈哈哈(笨蛋只能用本方法咯)

7-1 统计Java程序中关键词的出现次数 分数 100 作者 段喜龙 单位 南昌航空大学

编写程序统计一个输入的Java源码中关键字(区分大小写)出现的次数。说明如下:

  • Java中共有53个关键字(自行百度)
  • 从键盘输入一段源码,统计这段源码中出现的关键字的数量
  • 注释中出现的关键字不用统计
  • 字符串中出现的关键字不用统计
  • 统计出的关键字及数量按照关键字升序进行排序输出
  • 未输入源码则认为输入非法

输入格式:

输入Java源码字符串,可以一行或多行,以exit行作为结束标志

输出格式:

  • 当未输入源码时,程序输出Wrong Format
  • 当没有统计数据时,输出为空
  • 当有统计数据时,关键字按照升序排列,每行输出一个关键字及数量,格式为数量\t关键字

输入样例:

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

//Test public method
public HashMap(int initialCapacity) {
        this(initialCapacity, DEFAULT_LOAD_FACTOR);
    }
    public HashMap(int initialCapacity, float loadFactor) {
        if (initialCapacity < 0)
            throw new IllegalArgumentException("Illegal initial capacity: " +
                                               initialCapacity);
        if (initialCapacity > MAXIMUM_CAPACITY)
            initialCapacity = MAXIMUM_CAPACITY;
        if (loadFactor <= 0 || Float.isNaN(loadFactor))
            throw new IllegalArgumentException("Illegal load factor: " +
                                               loadFactor);
        this.loadFactor = loadFactor;
        this.threshold = tableSizeFor(initialCapacity);
    }
exit
 

输出样例:

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

1	float
3	if
2	int
2	new
2	public
3	this
2	throw

import java.util.*;
public class Main {
    public static void main(String[] args) {
        Scanner input = new Scanner(System.in);
        TreeMap<String, Integer> map = new TreeMap<>();
        String[] regstr = new String[]{"abstract", "assert", "boolean", "break", "byte", "case", "catch", "char", "class", "continue", "default", "do", "double", "else", "enum", "extends", "final", "finally", "float", "for", "if", "implements", "import", "int", "interface", "instanceof", "long", "native", "new", "package", "private", "protected", "public", "return", "short", "static", "strictfp", "super", "switch", "synchronized", "this", "throw", "throws", "transient", "try", "void", "volatile", "while", "goto", "const", "true", "false", "null"};
        Set<String> set = new HashSet<>(Arrays.asList(regstr));
        String str = "";
        String str1 ="";
        while(true) {
            str1 = input.nextLine();
            if (str1.equals("exit")){
                break;
            }
            str += str1 + '\n';
        }
        if(str.equals(""))
            System.out.println("Wrong Format");
        else {
            str = str.replaceAll("(//.*)|(/\\*[\\s\\S]*?\\*/)","");//删掉注释
            str = str.replaceAll("\"[^\"]*\"","*");//替换字符串
            str = str.replaceAll("[^+\\-*/=\\w]"," ");//找出关键字左右有+-*/的
            str = str.replaceAll("[+\\-*/=]","*");//关键字左右有符号的,替换
            String[] result = str.split("[\\s]+");//按空格把所有关键字断开
            for(String s:result){
                if(set.contains(s)){
                    if(map.containsKey(s))
                        map.put(s,map.get(s)+1);
                    else
                        map.put(s,1);
                }
            }
            for(Map.Entry<String, Integer> entry:map.entrySet()){//找出键值对
                System.out.println(entry.getValue() + "\t" + entry.getKey());
            }
        }
    }
}

只觉得,正则表达式真的很好用啊,短短的几行处理了很多问题,同时还学会了巧妙利用hashset和hashmap之间的关系找出键值对直接输出

踩坑心得:

1,String类型转换为double 类型有误差,两个浮点型数据不能用等号比较他们的大小关系

2,设计类结构的时候应该考虑清楚,按照面向对象的设计原则来设计,多考虑多态和开闭原则,而不是目光短浅地认为能省的操作都省掉。

改进建议:

希望可以多给一些时间给我们慢慢思考,而不是永远截止日期之前紧赶慢赶,而且还和实验一起截止,简直就是要我狗命呜呜呜

总结:

本阶段pta学到了很多东西,比如根据对象的某一属性排序;类间关系,正则表达式,HashSet,HashMap等等。

客观性评价:

感觉老师的教学方法很好,就是学习通的教学视频可不可以不要关闭第一节啊,没及时看的人真的会谢,后面连补救机会都不给真的好吗。我还记得有一次上课老师说正则表达式很重要,然后下课之后反手就把学习通里面关于正则表达式的慕课全关了,虽然后面也开了,但是心脏真的经不起这惊吓。老师教的很好,只是我自己太菜了。

 

标签:Java,String,int,PTA,public,new,return,集训,name
From: https://www.cnblogs.com/acmsss/p/17500917.html

相关文章

  • java-集合类学习
    LinkedHashMapAspecialconstructorisprovidedtocreatealinkedhashmapwhoseorderofiterationistheorderinwhichitsentrieswerelastaccessed,fromleast-recentlyaccessedtomost-recently(access-order).Thiskindofmapiswell-suitedtobu......
  • pta第三部分总结oop训练集09-11
    一,前言:oop09:7-1统计Java程序中关键词的出现次数:对Java中字符串,元字符,正则表达式的应用。oop10:7-1容器-HashMap-检索:对Java程序中HashMap的特性对输入内容进行检索的应用。7-2容器-HashMap-排序:对Java升序中HashMap的无序性的应用将其排序。7-3课程成绩......
  • JAVA判断是否是IDEA里启动
      /***判断是否是idea里面启动*@returntrue:是false:否*/privatestaticbooleancheckRunInIDEA(){try{Class.forName("com.intellij.rt.execution.application.AppMainV2");returntrue;}cat......
  • java8多线程使用示例
    使用CompletableFuture.allOf实现异步执行同步搜集结果/***@authorwjq*@create2022-03-1216:19*/publicclassTestCompleteFuture{privatestaticfinalintcorePoolSize=10;//核心线程数privatestaticfinalint......
  • Java第三阶段题目集总结
    一、前言这一阶段的题目集主要课程成绩设计的迭代,在这一题目里主要用到了正则表达式,准确来说正则表达式在这一题里占据十分重要的位置。这一阶段还考查到了数据结构的内容,像是栈和队列的使用。同时还涉及到了map和set数组的使用。在这一阶段我学到了许多新的知识,也对前面所学的内......
  • 第三阶段PTA题目集
    oop题目集合7菜单计价程序-5oop题目集合87-1课程成绩统计程序-1oop题目集合97-1统计Java程序中关键词的出现次数oop题目集合107-1容器-HashMap-检索  7-2容器-HashMap-排序  7-3课程成绩统计程序-2  7-4动物发声模拟器(多态)oop题目集合117-1容器-Array......
  • Maven构建项目后项目报Error错误Java compiler level does not match the version of
     Maven构建项目后项目报Error错误JavacompilerleveldoesnotmatchtheversionoftheinstalledJavaprojectfac 项目->右键->Properties->ProjectFacets->修改facets中Java版本(下拉箭头出)为要用的版本Maven构建项目需注意1.项目右键->Properties->buildpath->jdk2.项......
  • Java静态导入(import static)需谨慎
    从Java5开始引入了静态导入语法(importstatic),其目是为了减少字符输入量,提高代码的可阅读性,以便更好地理解程序。我们先来看一个不使用静态导入的例子,也就是一般导入:publicclassMathUtils{//计算圆面积publicstaticdoublecalCircleArea(doubler){ret......
  • Java 方法的使用
    Java方法的使用1.方法的调用在main方法中调用了某个方法,在栈里会开辟对应的方法栈,根据代码执行到最后或者返回出去后,这个方法的栈就结束并返回到原来调用方法的地方。继续执行main方法的代码,直到最后main方法栈也结束了。2.方法的好处使用方法可以极大程度减少使用相同......
  • OOP第三阶段PTA题目集总结
    一、前言  在本次Blog要分析的是OOP第三阶段PTA题目集。对于OOP第三阶段PTA题目集,我个人认为难度还是较大的,每次一看到有新的题目集更新了,就心里一颤,因为难度较大耗时长。但是,正因为难度高,本人也从中踩了很多的坑,学到了很多编程思想和更加熟悉了JAVA的语法,对我本人的帮忙还是......