最新要闻

广告

手机

iphone11大小尺寸是多少?苹果iPhone11和iPhone13的区别是什么?

iphone11大小尺寸是多少?苹果iPhone11和iPhone13的区别是什么?

警方通报辅警执法直播中被撞飞:犯罪嫌疑人已投案

警方通报辅警执法直播中被撞飞:犯罪嫌疑人已投案

家电

第三次博客:PTA题目集6-8总结-当前信息

来源:博客园

第三次博客:PTA题目集6-8总结

前言:菜单系列终于结束了,但是接踵而至的是全新的选课系列,明明JAVA课都已经上完了,但是大作业的更新却并没有停止,由此可见蔡老师真的太爱我们了。

这次的选课系统个人感觉是和点菜大同小异的,菜单==课表,选课==点菜,算价钱==算分。

题目概述:

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

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


(资料图片仅供参考)

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

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

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

1、输入:

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

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

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

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

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

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

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

因为是第一次,所以并没有太难,而且老师在上课时已经为我们讲解过了,也特别贴心的给出了类图,

所以我们只需要按照类图写代码就可以了

这里因为各种原因自己添加了几个类,

1,DATA类,用于储存所有数据,所有的班级,学生,课程,选课信息都会储存于此,为了方便使用(不用传参,就可以直接使用)将里面所有属性改为static这样子在其他地方就可以直接通过类名调用,其属性

class Data//数据库{static Map grades = new TreeMap<>(new Comparator() { @Override public int compare(String o1, String o2) { return o1.compareTo(o2); } });//所有班级,按班级号排序,键为班级号,static Map students = new TreeMap<>(new Comparator() { @Override public int compare(String o1, String o2) { return o1.compareTo(o2); } });//所有学生,键为学号static All_course all_course=new All_course();//所有课程static List scs=new ArrayList();}

2,课程表类,用于储存所有课程,(类似于之前的menu类)里面有存课,和找课方法

class All_course//课程表{Map courses = new TreeMap<>(new Comparator() { @Override public int compare(String o1, String o2) { try { Comparator compator = Collator.getInstance(Locale.CHINA); if (compator.compare(o1, o2) < 0) { return -1; } else if (compator.compare(o1, o2) > 0) { return 1; } } catch (Exception e) { } return 0; } });//所有课程,键为课程名,按课程名排序void addcourse(String name,String kind,String e_way)//添加课程{if(findcourse(name)==null){if(kind.equals("必修")&&e_way.equals("考试"))//根据课程总类添加课程courses.put(name, new Requireed_course(name,kind,e_way));else if(kind.equals("选修")){courses.put(name, new Elective_course(name,kind,e_way));}else{System.out.println(name+" : course type & access mode mismatch");}}}Course findcourse(String name){if(courses.containsKey(name)){return courses.get(name);}elsereturn null; }}

3,输入类,与菜单不同的是,这次我的输入与输出并没有写在主函数里面,而是专门有一个输入类,里面有输入和输入判断方法

class input//输入{void inputing()//输入{Scanner in = new Scanner(System.in);String a="";a=in.nextLine();while(!a.equals("end"))//判断结束标志{if(judge(a))input_operate(a);a=in.nextLine();}}void input_operate(String a)//输入处理{String[]arr=a.split(" ");//分割int len=arr.length;//根据长度判断输入类型Student std;Score s;Course c;switch(len){case 2:Data.all_course.addcourse(arr[0],arr[1],"考试");break;case 3:Data.all_course.addcourse(arr[0],arr[1],arr[2]);break;case 4:std=new Student(arr[0],arr[1]);Grade.addgrade(arr[0].substring(0,6));//创建班级Data.grades.get(arr[0].substring(0,6)).addstudent(arr[0]);//将学生加入班级Data.students.put(arr[0],std);//加入学生s=new Score(Integer.parseInt(arr[3]));//临时成绩c=Data.all_course.findcourse(arr[2]);if(c==null)c=new Course(arr[2],null,null);if(student_course.findstudent_course(c,std)) { Data.scs.add(new student_course(Data.students.get(arr[0]),c,s)); Data.scs.get(Data.scs.size()-1).judge(); student_course it=Data.scs.get(Data.scs.size()-1);if(!it.flag){if(it.cou.kind!=null)System.out.println(it.std.number+" "+it.std.name+" : access mode mismatch");else //学号+英文空格+姓名+英文空格+":"+课程名称+英文空格+"does not exist"System.out.println(it.cou.name+" does not exist");} }break;case 5:std=new Student(arr[0],arr[1]);Grade.addgrade(arr[0].substring(0,6));//创建班级Data.grades.get(arr[0].substring(0,6)).addstudent(arr[0]);//将学生加入班级Data.students.put(arr[0],std);//加入学生s=new Score(Integer.parseInt(arr[3]),Integer.parseInt(arr[4]));//临时成绩c=Data.all_course.findcourse(arr[2]);if(c==null)c=new Course(arr[2],null,null);if(student_course.findstudent_course(c,std)) { Data.scs.add(new student_course(Data.students.get(arr[0]),c,s)); Data.scs.get(Data.scs.size()-1).judge(); student_course it=Data.scs.get(Data.scs.size()-1);if(!it.flag){if(it.cou.kind!=null)System.out.println(it.std.number+" "+it.std.name+" : access mode mismatch");else //学号+英文空格+姓名+英文空格+":"+课程名称+英文空格+"does not exist"System.out.println(it.cou.name+" does not exist");} }break;}}boolean judge(String a)//错误输入判断{String[]arr=a.split(" ");//分割int len=arr.length;//根据长度判断输入类型switch(len){case 2:if(arr[0].length()<=10&&arr[1].matches("^(必修)|(选修)$"))return true;else break;case 3:if(arr[0].length()<=10&&(arr[1].equals("必修")&&arr[2].matches("^(考试)|(考察)$")||arr[1].equals("选修")&&arr[2].matches("^(考试)|(考察)$")))return true;else break;case 4:if(arr[0].matches("^[0-9]{8}$")&&arr[1].length()<=10&&arr[2].length()<=10&&arr[3].matches("^[0-9]{1,2}|(100)$"))return true;else break;case 5:if(arr[0].matches("^[0-9]{8}$")&&arr[1].length()<=10&&arr[2].length()<=10&&arr[3].matches("^[0-9]{1,2}|(100)$")&&arr[4].matches("^[0-9]{1,2}|(100)$"))return true;else break;//default:System.out.println("wrong format");}System.out.println("wrong format");return false;}}

4,计算类,在输入完毕后,计算所有分数

class calculate{void calculateing()//计算所有成绩{Data.scs.forEach(t->{if(t.flag)t.cou.getfinalScore(t.sco);});//计算单门课程最终成绩Data.students.forEach((key,value)->{ value.getScore();});//计算学生最终成绩Data.grades.forEach((key,value)->{ value.getScore();});//计算班级最终成绩Data.all_course.courses.forEach((key,value)->{ value.getScore();});//计算课程最终成绩}}

5,输出类,进行统一输出

class output//输出{void outputing(){Data.students.forEach((key,value)->{ //20201103 张三 34if(value.x!=0)System.out.println(value.number+" "+value.name+" "+value.sum);elseSystem.out.println(value.number+" "+value.name+" did not take any exams");});Data.all_course.courses.forEach((key,value)->{ //java 20 40 34if(value.x!=0){System.out.print(value.name+" ");if(value.e_way.equals("考试"))System.out.print(value.Cscore.usual+" ");System.out.println(value.Cscore.last+" "+value.Cscore.end);}elseSystem.out.println(value.name+" has no grades yet");});Data.grades.forEach((key,value)->{ //202011 34if(value.x!=0)System.out.println(value.number+" "+value.Gscore.end);elseSystem.out.println(value.number+" has no grades yet");});}}

个人对自己的设计特别满意,虽然和老师设计的有所不同

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

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

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

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

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

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

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

相对于上一次并没有特别大的改动,只是增加了实验课。

所以代码并没有特别的改动,只需要增加一个实验类

class experimental_course extends Course//实验课{//int frequency=0;experimental_course(String name, String kind, String e_way) {super(name, kind, e_way);// TODO Auto-generated constructor stub}void getfinalScore(Score s)//计算成绩{s.end=s.end;//表示一下}}

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

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

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

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

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

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

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

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

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

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

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

这次改动较大,并且要求更改类间关系,对输入与输出都做了较大的更改,

输入:

class input//输入{void inputing()//输入{Scanner in = new Scanner(System.in);String a="";a=in.nextLine();while(!a.equals("end"))//判断结束标志{int mode=0;mode=judge(a);if(mode!=0)input_operate(a,mode);a=in.nextLine();}}void input_operate(String a,int mode)//输入处理{String[]arr=a.split(" ");//分割int len=arr.length;//根据长度判断输入类型Student std;Score s;Course c;double power[]=new double[10];int n=0;if(mode==1)//课程信息{if(len>=6){n=Integer.parseInt(arr[3]);if(len-4!=n){}}Data.all_course.addcourse(arr);}else if(mode==2)//成绩信息{std=new Student(arr[0],arr[1]);if(!Data.students.containsKey(arr[0])){Grade.addgrade(arr[0].substring(0,6));//创建班级Data.grades.get(arr[0].substring(0,6)).addstudent(arr[0]);//将学生加入班级Data.students.put(arr[0],std);//加入学生}s=new Score(arr);//临时成绩c=Data.all_course.findcourse(arr[2]);if(c==null)c=new Course(arr[2],null,null,0,null);if(student_course.findstudent_course(c,std)){Data.scs.add(new student_course(Data.students.get(arr[0]),c,s));Data.scs.get(Data.scs.size()-1).judge();student_course it=Data.scs.get(Data.scs.size()-1);if(arr.length-3!=c.n)it.flag=false;if(!it.flag){if(it.cou.kind!=null)System.out.println(it.std.number+" "+it.std.name+" : access mode mismatch");else//学号+英文空格+姓名+英文空格+":"+课程名称+英文空格+"does not exist"System.out.println(it.cou.name+" does not exist");}}}}int judge(String a)//错误输入判断,顺便判断输入模式{String[]arr=a.split(" ");//分割int len=arr.length;//根据长度判断输入类型//java 实验 实验 4 0.2 0.3 0.2 0.3//20201116 张三 java 70 80 90 100if(len==3&&arr[0].length()<=10&&arr[1].matches("^(必修)|(选修)|(实验)$")&&arr[2].matches("^(考试)|(考察)|(实验)$"))return 1;else if(arr[0].length()<=10&&arr[1].matches("^(必修)|(选修)|(实验)$")&&arr[2].matches("^(考试)|(考察)|(实验)$")&&arr[3].matches("^[4-9]$")){boolean flag=true;if(flag)return 1;}else if(len==5&&arr[0].length()<=10&&arr[1].matches("^(必修)|(选修)|(实验)$")&&arr[2].matches("^(考试)|(考察)|(实验)$")){boolean flag=true;if(flag)return 1;}else if(arr[0].matches("^[0-9]{8}$")&&arr[1].length()<=10&&arr[2].length()<=10){boolean flag=true;for(int i=0;i

类图:

菜单系列踩坑心得(这世上本没有坑,踩的人多了就成了坑)

1.可以去elicpice上测试,但是搞完复制回PTA一定一定要把package删了,以及主类改为Main,会非零返回。

2.使用容器一定要根据题目要求重构排序规则,如按中文拼音排序

Map courses = new TreeMap<>(new Comparator() { @Override public int compare(String o1, String o2) { try { Comparator compator = Collator.getInstance(Locale.CHINA); if (compator.compare(o1, o2) < 0) { return -1; } else if (compator.compare(o1, o2) > 0) { return 1; } } catch (Exception e) { } return 0; } });

3.对象第一次new了之后,无论在那都不要再new了不然会变成null

4.访问数组不能越界,会有段错误

5.只要不是void类型的方法一定要保证所有情况都有返回值,会非零返回

6.要注意不同容器的特性,使用合理容器储存数据

7.可以建立数据库用于统一管理数据

8.一些超时可能是圈复杂度过高,或循环没有出口下面是我的的圈复杂度

总结:

通过这两次PTA大作业,我深刻感受到了,面向对象与面向过程的差别,对类有了一定的认识,题目都不算特别难,但是每一个题目都是一个知识点,特别是菜单系列刚开始的时候无从下手做完后再看看感慨万分,虽然类是老师设计的,但是其中的交流是自己打的,熬了几天大夜虽然很累但是拿满分的那一刻成就感满满。

学到了什么:

1.对类的设计有了一定的了解。

2.对集合有了一定的认知。

3.体会到优秀的框架设计的好处(优秀的架构与细节设计。优秀的含义很广泛,清晰、可读、易维护、易扩展的设计往往是鲁棒的,这样的设计往往很难出现严重的纰漏,因为很多错误已经被规避掉了,即使有错误,发现、纠正的难度也不会太大

4.对JAVA报错的修改更加得心应手。

5.对类的封装性有了概念

6.学习了正则表达式的基本使用

7.合理使用各种泛型可以大大缩减代码量,而且非常高端

对课程的建议

1.每次作业截止之后可以出一下不计分的补题,可以让没有及时解决问题的同学继续尝试。

关键词: