题目集7-11次总结
1.
(1)前言
对于第七次题目集,只有一道题,菜单设计5,是在之前的菜单设计的基础上进行改变,我认为难度较大,之前的菜单设计也没有完成好,这次的完成度也很低。它比上一次菜单设计增加了甜度辣度酸度的,以及增加用户的信息输出,且有一定限制条件。对于第八次题目集,只有一道题,是关于一个成绩设计,由于是1,我认为难度不会太大,比菜单设计的完成度高了很多,主要考察我们对一个问题,如何去设计一些相关类和属性。对于第九次题目集,只有一道题,难度不大,考察我们如何用split这个函数去切割字符串,以及一些简单的set和map应用,例如输入输出。对于第十次题目集,有四道题,其中成绩设计2有一定的难度,其他题目都适中,像第一道题和第二道题主要考察我们对于HashMap的输入输出,以及一些简单的排序,第四道题以及给了我们基本框架,需要去构造哪些类,我们只需要将这些类补充完成就好了,成绩设计2比之前的1的课程类型多了一种实验课,其中课程分数也和之前的不太一样。对于第十一次题目集,有5道题目,难度适中,第一题和第三题主要考察我们对容器的使用,例如list数组,hash,以及set的区分输入输出应用,第四题和第五题主要考察我们对于自定义接口的使用,第二题就是成绩设计3,我完成度不高,其中成绩课程错误信息的结果的输出有些把握不住。
(2)设计与分析
对于成绩设计1,因为要考虑人有几门课程,课程里面有多少学生,一个班级班级里面有多少学生,所以在定义学生类时,加了一个课程数组,输入该学生所参加的课程信息以及它的分数,而在课程类中加了一个学生数组,放入了该门课程所有的学生信息,而在课程类时同理创建了学生数组,里面放入参加该课程的所有学生信息。
学生类的属性:
String number; String name; int score = -1; ArrayList<Course> courses = new ArrayList<Course>() ; //学生课程列表
班级类的属性:
String Number; int score = 0; ArrayList<Student> students = new ArrayList<Student>() ; //学生列表
课程类的属性:
String name; String type; String way; int sumScore; int courseSumScore; int courseAssScose; int courseExamScore; List<Integer> studentList; //学生的分数 boolean isTrue2 = true; //课程类型和考核方式不对 boolean isTrue = true; //输入的分数和方式不一样 boolean isExit = false; //学生是否考核该课程 boolean scoreYet = false;//分数越界或实验分数与项目不一致或实验课程不符合要求 ArrayList<Student> students = new ArrayList<Student>() ; //课程学生列表
我在整个课程计算的类中先创建了3个方法,一个输入及传入信息的方法,一个计算分数的方法,一个输出结果的方法
输入及传入数据的方法:
public void printIn() { String line = null; Scanner input = new Scanner(System.in); while(!(line = input.nextLine()).equals("end")) { String[] strArr = line.split(" "); if(strArr.length == 3) { AddArray0(course,strArr[0],strArr[1],strArr[2]); sortCourseArray(course); } if(strArr.length == 4) { int assess = Integer.parseInt(strArr[3]); Course acourse = new Course(strArr[2],"考察",assess); AddArray1(student,strArr[1],strArr[0],acourse,assess); sortStudentArray(student); } if(strArr.length == 5) { int aexam = Integer.parseInt(strArr[3]); int assess = Integer.parseInt(strArr[4]); Course acourse = new Course(strArr[2],"考试",aexam,assess); AddArray2(student,strArr[1],strArr[0],acourse,assess,aexam); sortStudentArray(student); } else if(strArr.length > 5) { int aexam = Integer.parseInt(strArr[3]); int assess = Integer.parseInt(strArr[4]); Course acourse = new Course(strArr[2],"错误",aexam,assess); AddArray2(student,strArr[1],strArr[0],acourse,assess,aexam); sortStudentArray(student); } } }
我是按照给出的数据的长度来判断给出的是成绩信息还是课程信息,同时还将成绩信息划分为选修成绩信息和必修成绩信息。同时将传入的数据都创建相应的课程对象和学生对象,因为要判断一个课程信息是否正确以及课程信息是否重复,学生信息也是同理,不过还要加上判断是不是同一个学生,这样这门课程也要加入之前学生的课程列表之中。所以创建了2个方法(AddArray0,AddArray1,AddArray2),将正确的信息传入,同时由于输出的结果需要按照一定的规律排序输出,所以我创建了2个(sortCourseArray,sortStudentArray)方法分别将传入的课程和学生信息进行一个排序,具体的方法内容如下:
//课程加入课程数组 public void AddArray0(ArrayList<Course> course ,String name,String type ,String way) { int a = 0; for(Course acourse : course) { if(acourse.name.equals(name)&&acourse.isTrue2 == true){ a = 1; break; } if(acourse.name.equals(name)&&acourse.isTrue2 == false){ course.remove(acourse); break; } } if(a == 0) { Course acourse = new Course(name,type,way); if(type.equals("必修")&&way.equals("考察")) { acourse.isTrue2 = false; } course.add(acourse);} } //学生加入学生数组 public void AddArray1(ArrayList<Student> student , String name ,String number ,Course course ,int assess) { int j = 0; for(Student astudent : student) { if(number.equals(astudent.number)) { j = 1; if(assess > 100 || assess < 0) astudent.scoreYet = true; if(!SameSore(astudent.courses,course.name)) astudent.courses.add(course); } } if(j == 0) { Student bstudent = new Student(number,name,course); if(assess > 100 || assess < 0 ) bstudent.scoreYet = true; student.add(bstudent); } } public void AddArray2(ArrayList<Student> student , String name ,String number ,Course course ,int assess , int aexam) { int j = 0; for(Student astudent : student) { if(number.equals(astudent.number)) { j = 1; if(assess > 100 || assess < 0) astudent.scoreYet = true; if(!SameSore(astudent.courses,course.name)) astudent.courses.add(course); } } if(j == 0) { Student bstudent = new Student(number,name,course); if(assess > 100 || assess < 0 || aexam > 100 || aexam < 0) bstudent.scoreYet = true; student.add(bstudent); } } //判断学生成绩是否重复 public boolean SameSore(ArrayList<Course> course,String name) { for(Course acourse : course) { if(acourse.name.equals(name)) { return true; } } return false; } //学生列表排序 public void sortStudentArray(ArrayList<Student> student){ student.sort(new NumberComparator()); } class NumberComparator implements Comparator<Student> { @Override public int compare(Student s1, Student s2) { return s1.getNumber().compareTo(s2.getNumber()); } } //课程列表排序 public void sortCourseArray(ArrayList<Course> course) { Collections.sort(course, comparator); } Comparator<Course> comparator = new Comparator<Course>() { Collator collator = Collator.getInstance(Locale.CHINA); @Override public int compare(Course o1, Course o2) { return collator.compare(o1.getName(), o2.getName()); } }; }
对于计算分数我也是创建了一个计算分数的方法:
//计算平均分 public void calculate() { int i = 1; for(Course acourse : course) { for(Student astudent : student) { for(Course stucourse : astudent.courses) { if(stucourse.name.equals(acourse.name)) { stucourse.isExit = true; if((acourse.way.equals("考察")&&acourse.type.equals("必修")) ) { stucourse.isTrue2 = false; acourse.isTrue2 = false; acourse.students.add(astudent); } else if(!acourse.way.equals(stucourse.way) ) { stucourse.isTrue = false; // acourse.students.add(astudent); } else if(acourse.way.equals("考察")) { AbstractScore score = new AssessmentScore(stucourse.ExamScore); score.CalculateScores(); stucourse.sumScore = score.sumScore; acourse.courseSumScore = (acourse.courseSumScore + score.sumScore) / i; acourse.courseExamScore = (acourse.courseExamScore + stucourse.ExamScore) / i; acourse.students.add(astudent); } else if(acourse.way.equals("考试")) { AbstractScore score = new ExamScore(stucourse.ExamScore,stucourse.AssScose); score.CalculateScores(); stucourse.sumScore = score.sumScore; acourse.courseSumScore = (acourse.courseSumScore + score.sumScore) / i; acourse.courseExamScore = (acourse.courseExamScore + stucourse.ExamScore) / i; acourse.courseAssScose = (acourse.courseAssScose + stucourse.AssScose) / i; acourse.students.add(astudent); } } } } } for(Student astudent : student) { int j = 0; String num = astudent.number.substring(0,6); for(Class aclass : classes) { if(aclass.Number.equals(num)){ j=1; aclass.students.add(astudent); } } if(j == 0) { Class aclass = new Class(num); aclass.students.add(astudent); classes.add(aclass); } } }
首先我是将输入的数据做一个处理,判断输入的数据是否符合题目要求,例如这个学生学到课程类型和这们课程给的考试方式是否一致,将判断的结果传入这个学生的课程数组中,如何分别将课程的类型化为考察和考试2钟方式计算平均分,之后再将学生的平均分,课程的平均分计算好。由于需要创建一个班级,所以在后面加了一个创建班级数组的方法,一次根据学号来创建方法,之后将将创建的班级进行排序。
在输出结果也创建了一个方法,其中按照题目的要求输出结果:
//输出结果 public void printOut() { int a = 0; for(Student astudent : student) { if(astudent.scoreYet == true) { System.out.println("wrong format"); a=1; } else { for(Course acourse : astudent.courses) { if(acourse.isExit == false) { System.out.println( acourse.name+ " " +"does not exist"); } else if(acourse.isTrue2 == false) { System.out.println(acourse.name +" "+":"+" "+"course type & access mode mismatch"); System.out.println(acourse.name +" "+"does not exist"); } else if(acourse.isTrue == false) { System.out.println(astudent.number + " " + astudent.name +" "+": "+ "access mode mismatch"); } } astudent.calculateScore(); if(astudent.score == -1 ) { System.out.println(astudent.number + " " + astudent.name +" "+ "did not take any exams"); } else System.out.println(astudent.number + " " +astudent.name + " " + astudent.score); } } for(Course acourse : course) { if(acourse.students.isEmpty()&&acourse.isTrue2 == false) { System.out.println(acourse.name +" "+":"+" "+"course type & access mode mismatch"); System.out.println(acourse.name +" "+"does not exist"); } } for(Course acourse : course) { if(acourse.isTrue2 == true) { if(acourse.students.isEmpty() || acourse.courseSumScore == -1 || a == 1) { System.out.println(acourse.name +" "+ "has no grades yet"); }else if(acourse.way.equals("考试")){ System.out.println(acourse.name +" "+ acourse.courseAssScose + " " + acourse.courseExamScore + " "+ acourse.courseSumScore); }else System.out.println(acourse.name +" "+ acourse.courseExamScore / acourse.students.size()+ " "+ acourse.courseSumScore / acourse.students.size()); } } for(Class aclass : classes) { if(a == 1) { } else { aclass.CalculateScore(); if(aclass.students.isEmpty() || aclass.score == -1 ) { System.out.println(aclass.Number +" "+ "has no grades yet"); }else { System.out.println(aclass.Number +" "+ aclass.score); } } } }
成绩分析1的类图:

成绩分析2在成绩分析1的基础上加了一个实验课,所以在计算方法上需要加一个方法用于计算实验成绩:
class experimentScore extends AbstractScore{ public experimentScore(List<Integer> list) { super(list); // TODO 自动生成的构造函数存根 } @Override void CalculateScores() { // TODO 自动生成的方法存根 super.studentList = super.studentList; int a = studentList.size(); int sum = 0; for(int i = 0 ; i < a ; i ++) { sum += studentList.get(i); } super.sumScore = sum / a; } }
同时在输入及传入数据的方法中加入一个判断是否为实验成绩信息后传入的if语句:
else if(acourse.way.equals("实验")) { AbstractScore score = new experimentScore(stucourse.studentList); score.CalculateScores(); stucourse.sumScore = score.sumScore; acourse.courseSumScore = (acourse.courseSumScore + score.sumScore) / i; acourse.students.add(astudent); }
因为由于实验有多个课程我将课程的分数改成了一个分数数组,这样在整个自己分数的方法都需要修改,不过大致的思路不变:
abstract class AbstractScore { int sumScore; int examScore; int regularScore; List<Integer> studentList = new ArrayList<>(); abstract void CalculateScores(); public AbstractScore(List<Integer> list) { super(); this.studentList = list; } public int getSumScore() { return sumScore; } public void setSumScore(int sumScore) { this.sumScore = sumScore; } } class ExamScore extends AbstractScore{ public ExamScore(List<Integer> studentList) { super(studentList); // TODO 自动生成的构造函数存根 } @Override void CalculateScores() { // TODO 自动生成的方法存根 super.studentList = super.studentList; super.regularScore = studentList.get(0); super.examScore = studentList.get(1); super.sumScore = (3*super.regularScore +7*super.examScore)/10; } }class AssessmentScore extends AbstractScore{ public AssessmentScore(List<Integer> studentList) { super(studentList); // TODO 自动生成的构造函数存根 } @Override void CalculateScores() { // TODO 自动生成的方法存根 super.studentList = super.studentList; super.sumScore = studentList.get(0); super.examScore = studentList.get(0); } }
在计算平均分时,也独自加了一个计算实验的分数if语句,其他的不变:
else if(acourse.way.equals("实验")) { AbstractScore score = new experimentScore(stucourse.studentList); score.CalculateScores(); stucourse.sumScore = score.sumScore; acourse.courseSumScore = (acourse.courseSumScore + score.sumScore) / i; acourse.students.add(astudent); }
然后在输出结果方面需要修改的,需要额外加入实验是否符合标准,其他的也是一样不变:
public void printOut() { int a = 0; for(Student astudent : student) { for(Course acourse : astudent.courses) { if(acourse.isExit == false) { System.out.println(astudent.number + " " +astudent.name+" " + acourse.name +" : " +"does not exist"); } else if(acourse.isTrue2 == false) { System.out.println(acourse.name +" "+":"+" "+"course type & access mode mismatch"); if(acourse.isTrue == false) { System.out.println(acourse.name +" "+"does not exist"); } } else if(acourse.isTrue == false) { System.out.println(astudent.number + " " + astudent.name +" "+":"+" "+ "access mode mismatch"); } if(acourse.scoreYet == false) { System.out.println("wrong format"); a=1; } } astudent.calculateScore(); if(a==0) { if(astudent.score == -1 ) { System.out.println(astudent.number + " " + astudent.name +" "+ "did not take any exams"); } else System.out.println(astudent.number + " " +astudent.name + " " + astudent.score); } } for(Course acourse : course) { if(acourse.students.isEmpty()&&acourse.isTrue2 == false) { System.out.println(acourse.name +" "+":"+" "+"course type & access mode mismatch"); System.out.println(acourse.name +" "+"does not exist"); } } for(Course acourse : course) { if(acourse.isTrue2 == true) { if(acourse.students.isEmpty() || acourse.courseSumScore == -1 || a == 1) { System.out.println(acourse.name +" "+ "has no grades yet"); }else if(acourse.way.equals("考试")){ System.out.println(acourse.name +" "+ acourse.courseAssScose/ acourse.students.size() + " " + acourse.courseExamScore/ acourse.students.size() + " "+ acourse.courseSumScore/ acourse.students.size()); }else if(acourse.way.equals("考试")) { System.out.println(acourse.name +" "+ acourse.courseExamScore / acourse.students.size()+ " "+ acourse.courseSumScore / acourse.students.size()); } else if(acourse.way.equals("实验")) { System.out.println(acourse.name +" "+ acourse.courseSumScore / acourse.students.size()); } } } for(Class aclass : classes) { if(a == 1) { } else { aclass.CalculateScore(); if(aclass.students.isEmpty() || aclass.score == -1 ) { System.out.println(aclass.Number +" "+ "has no grades yet"); }else { System.out.println(aclass.Number +" "+ aclass.score); } } } }
成绩设计2的类图:

成绩设计3因为修改不当,导致没有完成也就没有得分,在重建分数计算设计的反面方面没有完善。
(3)采坑心得
在统计Java程序中关键词的出现次数这个问题时,我遇到2个很大的问题,在一开始因为是直接用了一个输入字符串的方法,有一个测试点是在不输入字符串时,输出Wrong Format,其实我一开始时理解为输入字符串为空,这样就也会是输入了一个字符串,只不过没有东西,和不输入有很大区别,这样会直接导致错误,然后我使用了一个input.hasNextLine()这个函数来判断是否输入:
if(!input.hasNextLine()) { System.out.print("Wrong Format"); return; }
其次在将字符串字符串切割一开始我在考虑将[]切割的是直接用[],后来发现不可以要加上//;
错误:
String[] words = line.split("[\\s[],.;(){}<>]"
正确:
String[] words = line.split("[\\s\\[\\],.;(){}<>]"
在设计成绩时,因为我在3个类(学生、课程、班级)各自定义了一个对应的数组,这样在输出结果上用了3个大的循环,这样会导致结果输出顺序不一样或者错误,所以在一开始创建类属性是就要考虑清楚,而且麻烦起来可能会导致错误。在3次的成绩设计上我都是用了这个方法,所以3次我的错误成绩和课程信息输出,的测试点都没过。
(4)改进建议
在这几次的实验中我我没玩全部完成的题目都是成绩设计,其中对于分数的计算,课程和班级的人数、平均分的计算都算是完成度高的,但是对于后面错误的成绩信息和课程信息的结果输出没有对几个,到后面我也不太确定错误的地方在哪,我认为可以加测试点加一点提示。其他的方面,我认为都挺好的。
(5)总结
<1>.我认识到了排序在日常应用广泛,也深刻认识到comparable接口对于排序的重要性,它定义了一个compareTo()方法,用于比较两个对象的大小关系。通过实现Comparable接口,可以使对象具有可比较性,从而可以进行排序和比较操作,用于排序一些简单的排序还是很不错的。
<2>.我学习到了如何将汉字按照拼音排序,通过调用Collator.getInstance()获取默认的Collator实例,然后使用Arrays.sort()对字符串数组进行排序。由于Collator类使用设置好的语言环境设置来确定排序顺序,因此可以得到按照拼音排序的结果。
<3>.同时学习了Hash类型和Set类型的区别以及各自的使用方法。Hash是以Hash Table作为底层数据结构,通过散列函数将键转换为数组的索引,以实现高效的查找和插入操作。而Set的储存方式与集合差不多。所以将一样的数据存进去,用hash和set取出来的顺序可能是不一样的。同时也学会了3种读取数据的方法,我认为我会更加喜欢加强for循环。
<4>.通过这几次题目集,相较于之前,我可以更加熟练的运用正则表达式,去切割或者判断一个给定的字符串。
我认为我在面对一个问题,或者一个对象,去思考需要去创建哪些类或者哪些属性需要加强训练,在正则表达式的运用方面,虽然比之前更加了解和运用更加熟练,但还是需要加强的空间还要很大。
2.
对于本门课程的教学理念(OBE),我认为它注重培养我们的能力和素质,强调学习成果和实际应用能力,这一理念在培养我们综合能力方面有很大的意义。然而,这个可能需要更加具体明确的目标和指导,这样我们才可以更好地理解和融入这一教学理念。
关于教学方法(边讲边练),我认为这是一个非常有效的方法,让我们在课堂上进行实践操作,老师在上面讲一段,然后我们第二小节课,根据所讲的内容立马去训练,这样提高学习效果。但是,有时候可能需要更多的时间给我们进行练习和反馈,这样我们可以更加全面理解和掌握知识。
对于教学组织(线上线下混合式教学),这是一个适应现代化教育发展的方式,可以充分利用线上资源和线下实践相结合的优势。我们也可以更加深刻的了解所需要的内容,
关于教学过程(PTA题目集驱动),这是一种很好的方法,我认为我们很大一部分人私底下不会刻意的去找题目去训练我们的编程能力,可能只靠老师讲的还有老师课堂上限时给出的题目去提高我们这一方面的能力。但是,在使用题目集的同时,也需要让我们进行深度思考和理解,而不仅仅停留在简单的答题环节。
对于教学模式(BOPPPS),我认为这是一个很实用的模式,它能帮助教师组织好课堂教学的各个环节,并提供了一种交互式的教学方式。然而,在使用BOPPPS模式时,需要确保每个环节都能够充分体现学生参与和互动的机会,避免单纯的传统教学方式。

浙公网安备 33010602011771号