首页 > 其他分享 >6-8题目集

6-8题目集

时间:2023-06-28 20:56:49浏览次数:28  
标签:arr 题目 value course 课程 成绩 Data

前言:

在这个六到八次题目集中,主要用课程管理系统来考察以下的知识点,:输入输出、字符串处理、数据结构(HashMap、ArrayList、List、Set)、循环、条件判断、类与对象、继承与多态、异常处理等。题量从小变大,难度大的也主要是那些学生课程成绩管理系统的解决,输入信息的解析和存储、成绩计算、信息展示,这些都是比较难的地方。

 

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

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

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

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

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

1、输入:

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

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

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

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

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

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

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

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

 

 

 

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

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

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

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

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

class All_course//课程表
{
Map<String,Course> courses = new TreeMap<>(new Comparator<String>() {
@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);
}
else
return 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 张三 34
if(value.x!=0)
System.out.println(value.number+" "+value.name+" "+value.sum);
else
System.out.println(value.number+" "+value.name+" did not take any exams");
});
Data.all_course.courses.forEach((key,value)->{
//java 20 40 34
if(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);
}
else
System.out.println(value.name+" has no grades yet");
});
Data.grades.forEach((key,value)->{
//202011 34
if(value.x!=0)
System.out.println(value.number+" "+value.Gscore.end);
else
System.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 100
if(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<len-3;i++)
{
if(!arr[3+i].matches("^[0-9]{1,2}|100$"))
{
flag=false;
break;
}
}
if(flag)
return 2;
}//实验课
System.out.println("wrong format");
return 0;
}
}

  类图:

 

踩坑心得:

由于限制条件没用到正则表达式导致会有特殊情况没考虑到从而导致非零返回:

 

 后来将代码改成正则表达式测试点就过了有的例子会出现多种错误,而错误提示便是难点,我在后面改错误报错顺序就调了好久。还有个就是有几次测试点出现运行超时,后面只是多提交了几次,才得以满分。

 

困难与建议:

感觉自己的代码逻辑性还有很大的进步空间,以及自己对Java的理解还不够透彻,还有很多需要学的东西,发现很多知识自己都只是记得,但不会用,所以我还需要锻炼自己写代码的逻辑能力,尽量在每次写代码之前脑子里都要有一个自己的基本框架,不要急于求成,静下心来学会解决问题。

 总结:

  通过这两次PTA大作业,我深刻感受到了,面向对象与面向过程的差别,对类有了一定的认识,题目都不算特别难,但是每一个题目都是一个知识点。

通过这几次pta学到了对类的设计有了一定的了解、对集合有了一定的认知、对类的封装性有了概念、学习了正则表达式的基本使用、合理使用各种泛型可以大大缩减代码量,而且非常高端。通过这三次题集的训练,让我对面向对象程序设计有了更深层面的领悟,尤其是对抽象概念的理解,还有就是对正则表达式更熟练地掌握。编码能力和自学能力提高了不少,相信我可以学好这门语言!

标签:arr,题目,value,course,课程,成绩,Data
From: https://www.cnblogs.com/jdrmy/p/17512547.html

相关文章

  • 第六到第八次题目集总结
    第六到第八次题目集总结一、题目集六课程成绩统计程序-1第一题题目内容:课程成绩统计程序-1publicclassGrade{privatefinalCourseGradecourseGrade;privatefinalSubGradesubGrade;publicGrade(CourseGradecourseGrade,SubGradesubGrade){......
  • 6-8次PTA题目总结blog
    前言:题目集1~3的知识点、题量、难度等情况如下:知识点:JAVA基础,基础算法,面向对象程序设计题量:共计3道题目难度:题目从易到难,逐层递进,分别为考察Java容器的理解、掌握与运用。设计与分析: 1importjava.util.*;2importjava.util.regex.Pattern;3impo......
  • PTA题目集6-8总结
    (1)前言题目集6只有一个课程成绩统计程序-1,难点总体来说中等,考察的也是对java类的定义和使用,以及如何设计能使程序往后修改方便,可以根据给出的类图来进行设计。题目集7中有上一次程序的进阶版课程成绩统计程序-2,相比于之前添加了实验这一课程性质,总的来说改变不大,只需要在......
  • PTA题目集6~8
    (1)前言前面的点菜系统结束后,以为终于解脱了,没想到是另一个噩梦。以下是PTA6到8的相关问题。题目集6,只有一题,课程成绩统计程序-1,难度嘛,中等偏上吧,至少对我来说,因为我接口基本没学懂。题目集7,有四题,容器-HashMap-检索,容器-HashMap-排序,课程成绩统计程序-2,动物发声模拟器(多态)。前面......
  • pta题目集6~8次总结性blog
    一、前言总结三次题目集的知识点、题量、难度等情况第六次题目集开始了新的迭代系统,万恶的点菜系统终于结束了,取而代之的是课程成绩统计程序,虽说更换了迭代系统但是感觉换汤不换药,很多要用到的知识点和内容和菜单非常类似,甚至是比点菜系统要简单很多(听说是不让平时分那么难看),万......
  • 面向对象程序编程6-8次PTA题目集(成绩计算系列)的总结性Blog
    1.对之前发布的6-8次PTA题目集(成绩计算系列),内容要求如下:(1)前言:总结之前所涉及到的知识点、题量、难度等情况第六次PTA题目集:知识点:此次PTA题目仅只有这一个题目,主要考的内容就是对类的使用(类似现实,对有关联的各个数据合并在一起,便于一起使用),运用正则表达式(比较苦难使用,要记住那......
  • 6-8次PTA题目集总结
    6-8次PTA题目集总结前言第6次题目集知识点:对象和类的创建和应用,字符串的创建和应用。总共有1题,难度偏低,比较基础。第7次题目集知识点:HashMap的创建和使用,多态,对象和类的创建和应用,字符串的创建和应用。总共有4题,难度中等。第8次题目集知识点:ArrayList的创建和使用,接口的......
  • 6-8次PTA题目集(成绩计算系列)分析
      前言知识点:类和对象:定义班级、学生和课程等类,并创建相应的对象;封装和访问控制:使用private、public等关键字对类的字段进行封装和访问控制;集合类:使用ArrayList或者其他集合类存储学生和课程信息;输入输出:通过控制台或者文件读写来输入和输出学生课程成绩信息;循环和条......
  • 关于6-8次PTA题目集总结
    (1)前言在这6-8次PTA作业中,我们没有继续进行点菜的题目练习,而是从新开始了一个关于成绩管理系统的相关练习,而在这三次练习中,我觉得第一次是最具有难度的,因为后两次的成绩系统都是在前一次的基础上进行改进,所以在第一次作业中构建好一个合理的类是尤为重要的,因为一个合理的类可以大......
  • 6-8次PTA题目集(成绩计算系列)BLOG-3
    1.前言对题目集的总结:1.知识点第6次:6-1课程成绩计价程序-1锻炼学生自主构建类(maybe,如果是完全参考题目给的那当我没说),实现继承,组合关系的能力。第7次:或许是上次作业有些学生不太理想,所有第七次出了几个小题去让学生了解一些知识点:7-1 容器-HashMap-检索(相当于利用HashMap......