前言

面向对象程序设计已经结课。通过这门课,我学习了一门新的计算机语——Java。在我学习Java的过程中,我将其比喻成攀登一座高山,一开始充满了热情和信心,但很快就遭遇到了挫折和困难。我意识到学习Java是一个漫长而艰辛的过程,但只要坚持下去,就能够取得不错的成果。在学习Java的过程中,我也充分体会到了“不抛弃,不放弃”的精神。尽管我遭遇到了很多的困难和挫折,但我依然坚定地去做,并且不断地进行练习和打磨。在这个过程中,我发现了量的积累确实会引起质的变化。Java语言中,万物皆对象。我开始学习Java的三周中,我逐渐掌握了其语法和规则,并逐步理解了面向对象的设计思想。在此过程中,我学会了封装、继承、多态等的使用,这些都围绕着对象的抽象体现,让我对Java的魅力有了更深层次的认识。在接下来的三周中,我学会了类与类之间的关系设计,能够熟悉类图,并且掌握了编程思维的训练和提升。我了解到开闭原则、继承和多态的使用,并开始注重代码书写习惯。在学习的深入过程中,我渐渐掌握了异常处理、输入输出流等知识,也对面向课程设计这门课程有了更深层次的认识和理解。尽管我之前没有C++的经验,只有C语言的经验,但我还是努力理解和掌握了这些概念和知识。在这个过程中,蔡老师一直以认真教学为标准,先让学生通过作业了解课程大纲,再在课程中教授主要知识。每周的测验和PTA测试使得我能够更好地巩固知识,也让我更加高效地学习。虽然有时候会觉得时间紧张,但是这些措施都是为了让我们取得更好的学习效果。总的来说,学习Java是一条漫长而艰辛的道路,但只要坚持不懈,就能够取得不错的成果。我相信,只要我继续努力,我就能够掌握更深层次的Java知识,并能够在未来的工作中发挥更大的作用。

第六次大作业:7-1 课程成绩统计程序-1,这是一个新的系列,本次的难度不大,主要是理清楚,学生、班级、课程、和成绩的关系是继承、组合、关联还是什么。

第七次大作业:分了四个小题。7-1 容器-HashMap-检索:使用HashMap存储学生信息,并实现根据学号的检索功能。7-2 容器-HashMap-排序:使用HashMap存储学生信息,并实现根据学号的进行排序功能。7-3 课程成绩统计程序-2:在7-1 课程成绩统计程序-1的基础上加了实验课,其实就是再加一个实验课类继承 成绩类。7-4 动物发声模拟器(多态):设计一个动物发生模拟器,用于模拟不同动物的叫声。比如狮吼、虎啸、狗旺旺、猫喵喵……。

第八次大作业:分了四个小题。7-1 容器-ArrayList-排序、7-2 课程成绩统计程序-3:在7-3 课程成绩统计程序-2的基础上加了权重,实验课和考察课都要用设计的权重来计算成绩。7-3 jmu-Java-02基本语法-03-身份证排序、7-4 jmu-Java-04面向对象进阶-03-接口-自定义接口ArrayIntegerStack、7-5 jmu-Java-03面向对象基础-05-覆盖。

 

设计与分析

第六次大作业

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

类图:

 

耦合度、圈复杂度:

 

简述:

这题我按照老师给的类图设计了:

①Course类(课程类):

这个类包含了三个属性:name、nature和assessmethod,分别表示课程名称、课程性质和考核方式。其中,name和nature属性均为字符串类型,而assessmethod属性也为字符串类型,表示考核方式的文字描述。
类中定义了两个构造方法,一个是有参构造方法,用于初始化实例的属性值,另一个是无参构造方法,可以用于创建一个空的实例。
通过这个类,我们可以创建多个实例,每个实例对应一个具体的课程。通过实例的属性值,我们可以了解该课程的基本信息,如课程名称、性质和考核方式。同时,我们也可以通过对类的扩展,添加其他属性和方法,来进一步描述和管理课程的各种特征和行为,方便对课程进行管理和分析。

②Student类(学生类):

它实现了Comparable<Student>接口,表明它可以被比较。这个接口需要实现compareTo()方法,这里的实现方法是比较学生的学号num属性,返回一个整数值。
这个类拥有三个属性,分别是学生的学号num和姓名name,以及一个无参构造方法。
在compareTo()方法中,使用了Integer.compare()方法来比较学号num的大小,这个方法会返回一个整数值,如果返回值为负数,则表明当前学生小于比较的学生,如果返回值为零,则表明两个学生相等,如果返回值为正数,则表明当前学生大于比较的学生。
这个类的设计是为了让Student对象可以被比较,并且可以根据学号进行排序。它可以应用于各种需要对学生对象进行排序或比较的场景,例如在学生管理系统中对学生信息进行排序或者查找。

③Choose类(选课类):

这个类表示了一个学生选课的过程。
这个类有三个属性,分别是一个Student对象、一个Course对象和一个Grade对象,用来表示学生选的课程以及成绩。
Choose类有一个带有三个参数的构造方法,用来初始化这三个属性,这个构造方法接受一个Student对象、一个Course对象和一个Grade对象,分别表示学生、课程和成绩。
Choose类还有一个无参构造方法。
这个类的设计是为了将学生和他所选的课程以及成绩联系在一起,方便管理和查询。在学生选课过程中,可以通过创建Choose对象来表示学生选了哪些课程以及这些课程的成绩。在学生管理系统中,可以使用Choose类来进行学生成绩的管理和查询。

 ④Classroom类(班级类):

它表示了一个班级。
有两个属性,分别是班号code和一个ArrayList类型的list,用来存储这个班级中的学生对象。
有一个带有两个参数的构造方法,用来初始化班号和一个学生对象,并将这个学生对象加入到班级的学生列表中。
提供了一个size()方法,用来返回这个班级中学生数量。
还有一个无参构造方法。
实现了Comparable<Classroom>接口,表明它可以被比较。这个接口需要实现compareTo()方法,这里的实现方法是比较班号code的大小,返回一个整数值。
这个类的设计是为了方便管理班级内的学生信息。在学生管理系统中,可以使用Classroom类来表示班级,并将学生对象加入到班级的学生列表中。通过实现Comparable接口,可以实现对班级对象的排序和比较,便于进行管理和查询。

⑤Grade类(成绩类):

有一个属性:总成绩

⑥Examgrade类(考试课):它继承了Grade类,表示了一门考试课程的成绩。这个类有两个属性,分别是平时成绩dailygrade和期末成绩finalgrade,用来存储考试课程的平时成绩和期末成绩。有一个getgrade()方法,用来根据平时成绩和期末成绩计算出总成绩。在这个方法中,将平时成绩乘以0.3,将期末成绩乘以0.7,然后将两者相加,得到总成绩。有一个带有两个参数的构造方法,用来初始化平时成绩和期末成绩。

还有一个无参构造方法。
这个类的设计是为了表示考试课程的成绩,并且计算出总成绩。通过继承Grade类,可以使用Grade类中的sumgrade属性和setSumGrade()方法来表示和设置总成绩。在学生管理系统中,可以使用Examgrade来表示一门考试课程的成绩,并进行总成绩的计算和管理。

⑦Inspectgrade类(考察类):

它继承了Grade类,表示了一门考察课程的成绩。有一个属性,即期末成绩finalgrade,用来存储考察课程的期末成绩。有一个getgrade()方法,用来将期末成绩赋值给总成绩sumgrade。有一个带有一个参数的构造方法,用来初始化期末成绩。还有一个无参构造方法。

这个类的设计是为了表示考察课程的成绩,并且计算出总成绩。通过继承Grade类,可以使用Grade类中的sumgrade属性和setSumGrade()方法来表示和设置总成绩。在学生管理系统中,可以使用Inspectgrade来表示一门考察课程的成绩,并进行总成绩的计算和管理。与Examgrade类相比,它的getgrade()方法计算总成绩的方式不同,因为考察课程成绩通常只有一个期末考试成绩。

⑧Jugde类(判断类):

这个类主要是一些静态的辅助方法,用于判断并处理用户输入的数据格式。下面是这个类中的一些方法的解释:
1. studentcf:判断某个学号是否存在于班级列表中。
2. getsingle:判断某个选课学生是否存在于选课列表中。
3. checkcf:判断某个课程是否存在于课程列表中。
4. sortHashMap:对学生列表按照学号进行升序排序。
5. checkclass:根据班级号在班级列表中查找并返回对应的班级对象。
6. checkcourse:根据课程名在课程列表中查找并返回对应的课程对象。
7. checkint:判断输入的数是否为正整数。
8. kongge:统计输入字符串中空格的个数。
9. input:根据输入字符串的格式判断输入信息的类型,包括课程信息、学生信息和成绩信息。
这些方法都是用于验证输入数据格式以及查询相关信息的,可以在学生管理系统中用于对用户输入的数据进行有效性检查,并根据检查结果给出相应的提示或操作。

⑨Main类:

 1 while(true) {
 2 if(data.equals("end"))
 3 break;
 4 else
 5 {
 6 konggenum=Jugde.kongge(data);//空格数
 7 input=Jugde.input(arr,cmap,konggenum);
 8 switch(input)
 9 {
10 case 1://加课程信息
11 {
12 if(arr.length==3&&arr[1].equals("必修")&&arr[2].equals("考察"))
13 System.out.println(arr[0]+" : course type & access mode mismatch");
14 else if(arr.length==2&&arr[1].equals("选修"))
15 System.out.println(arr[0]+" : course type & access mode mismatch");
16 else
17 {
18 if(!Jugde.checkcf(cmap,arr[0]))
19 {
20 if(arr.length==3)
21 cmap.put(arr[0],new Course(arr[0],arr[1],arr[2]));
22 else
23 cmap.put(arr[0],new Course(arr[0],arr[1],"考试"));
24 }
25 }
26 break;
27 }
28 case 2://加课程成绩信息
29 {
30 if(!Jugde.getsingle(chooselist,arr[0]+arr[1]+arr[2]))
31 {
32 smap.put(Integer.valueOf(arr[0]),new Student(Integer.valueOf(arr[0]),arr[1]));
33 checkclass=Jugde.checkclass(arr[0].substring(0,6),classroomlist);//查是否已有该班级
34 course=Jugde.checkcourse(arr[2],cmap);//查是否已有该课程
35 if(checkclass!=null)//如果找到该班号
36 {
37 if(!Jugde.studentcf(classroomlist,arr[0]))
38 {
39 checkclass.code=Integer.valueOf(arr[0].substring(0,6));//班号
40 checkclass.list.add(new Student(Integer.valueOf(arr[0]),arr[1]));//在班级类中的学生数组加上学生
41 }
42 }
43 else//如果没找到该班号
44 classroomlist.add(new Classroom(Integer.valueOf(arr[0].substring(0,6)),new Student(Integer.valueOf(arr[0]),arr[1])));//在班级数组中加上该班
45 if(Jugde.checkcourse(arr[2],cmap)==null)//找不到该课程信息
46 {
47 System.out.println(arr[2]+" does not exist");//课程不存在
48 flag=0;
49 break;
50 }
51 else
52 {
53 if(arr.length==5)//考试成绩
54 {
55 if(Jugde.checkcourse(arr[2],cmap).assessmethod.equals("考试"))//考核方式与输入的成绩量匹配
56 flag=1;
57 }
58 else//考察成绩
59 {
60 if(Jugde.checkcourse(arr[2],cmap).assessmethod.equals("考察"))//考核方式与输入的成绩量匹配
61 flag=2;
62 }
63 if(flag==0)
64 {
65 System.out.println(arr[0]+" "+arr[1]+" : access mode mismatch");//成绩数量和课程的考核方式不匹但课程存在
66 break;
67 }
68 }
69 if(flag==1)//判断是考试课还是考察课
70 chooselist.add(new Choose(new Student(Integer.valueOf(arr[0]),arr[1]),Jugde.checkcourse(arr[2],cmap),new Examgrade(Integer.valueOf(arr[3]),Integer.valueOf(arr[4]))));//在选课数组中加上选课
71 if(flag==2)
72 chooselist.add(new Choose(new Student(Integer.valueOf(arr[0]),arr[1]),Jugde.checkcourse(arr[2],cmap),new Inspectgrade(Integer.valueOf(arr[3]))));//在选课数组中加上选课
73 flag=0;
74 }
75 break;
76 }
77 case 0://数据异常
78 {
79 System.out.println("wrong format");
80 break;
81 }
82 }
83 }
84 data=sc.nextLine();
85 arr=data.split("\\s+");

这传代码是一个循环,用于不断读取用户输入,并根据输入的类型进行不同的操作。其中,根据输入的数据格式,调用了Jugde类中的各种判断方法,包括判断学号是否已经存在于班级列表中、判断某个选课学生是否存在于选课列表中、判断某个课程是否存在于课程列表中、判断输入的数是否为正整数、统计输入字符串中空格的个数等等。

根据不同的输入类型,进行不同的操作。对于加课程信息的操作,会先判断课程类型和访问方式是否匹配,如果匹配则将课程信息加入课程列表;对于加课程成绩信息的操作,会根据输入的信息对班级列表、选课列表、学生列表和课程列表进行相应的添加和修改,并进行各种异常情况的判断。

如果输入的数据格式不正确,则会输出“wrong format”提示。如果输入的数据为“end”,则退出循环。

//调用sortHashMap()排序并返回新的集合
HashMap<Integer,Student> sort = Jugde.sortHashMap(smap);//将hash里面的学生学号进行排序
for(Entry<Integer,Student> entry:sort.entrySet())
{
student=entry.getValue();
for(i=0,j=0;i<chooselist.size();i++)
{
choose=chooselist.get(i);
if(choose.student.name.equals(student.name)&&choose.student.num==student.num)
{
j++;
if(choose.grade instanceof Examgrade)//如果是考试课
{
examgrade=(Examgrade)choose.grade;
examgrade.getgrade();
}
else if(choose.grade instanceof Inspectgrade)//如果是考察课
{
inspectgrade=(Inspectgrade)choose.grade;
inspectgrade.getgrade();
}
avsum+=choose.grade.sumgrade;
flag1=1;
}
}
if(flag1==0)//选课类中没有该学生
System.out.println(student.num+" "+student.name+" did not take any exams");
else
{
avsum/=j;
cjmap.put(student.num,avsum);
System.out.println(student.num+" "+student.name+" "+avsum);
}
avsum=0;
flag1=0;
}

 

这段代码是用于对选课列表中的信息进行处理,包括对学生的成绩进行计算和统计。首先,代码使用Jugde类中的sortHashMap()方法对学生列表中的学生按照学号进行升序排序,并返回新的集合。
然后,代码使用一个循环遍历新的学生列表,对于每个学生,在选课列表中查找该学生选的所有课程,并对选的每门课程的成绩进行计算和统计。如果该学生没有选课,则输出“did not take any exams”提示;否则,将计算得到的平均成绩存入cjmap中,并输出该学生的学号、姓名和平均成绩。
在计算平均成绩时,代码使用了一个变量j来记录该学生选的课程数量,然后将所有成绩相加并除以j得到平均成绩。同时,代码也使用了一些类和方法,如Examgrade类的getgrade()方法和Inspectgrade类的getgrade()方法,用于获取课程成绩并进行计算。
需要注意的是,这段代码只是处理了选课列表中的信息,而对于班级列表、课程列表和学生列表的处理并没有在这里进行。因此,在使用这段代码前,需要先在其他地方对这些列表进行处理和初始化。

 

第七次大作业

7-1 容器-HashMap-检索

类图:

 

耦合度、圈复杂度:

 

简述:

这题实现了一个简单的学生信息管理程序。程序首先创建了一个HashMap对象studentsMap,用于存储学生信息。学生信息通过键值对的形式存储,其中键为学号,值为包含学生姓名和成绩的字符串数组。
接下来,程序使用Scanner类从标准输入读取学生信息,每次读取一行,并将该行信息分割成三个部分(学号、姓名、成绩)。然后,程序将学号作为键,将包含姓名和成绩的字符串数组作为值存入studentsMap中,以便后续的检索操作。
当用户输入一个要查询的学号后,程序使用containsKey()方法检查该学号是否存在于studentsMap中。如果存在,则使用get()方法获取该学号对应的值(即包含姓名和成绩的字符串数组),并输出学号、姓名和成绩;否则,输出“The student [学号] does not exist”提示。
需要注意的是,这段代码只能处理单个学生的信息查询。如果需要管理更多的学生信息,可以考虑使用更加复杂的数据结构或者设计更加完善的程序逻辑。同时,此代码中没有对输入的数据进行有效性检查,可能存在输入错误的情况,需要在实际开发中进行改进。

7-2 容器-HashMap-排序

类图:

 

耦合度、圈复杂度:

 

简述:

这题实现了一个简单的学生信息管理程序,实现了按学号从大到小排序输出学生信息的功能。程序首先创建了一个HashMap对象studentsMap,用于存储学生信息。学生信息通过键值对的形式存储,其中键为学号,值为包含学生姓名和成绩的字符串数组。
接下来,程序使用Scanner类从标准输入读取学生信息,每次读取一行,并将该行信息分割成三个部分(学号、姓名、成绩)。然后,程序将学号作为键,将包含姓名和成绩的字符串数组作为值存入studentsMap中,以便后续的排序和输出操作。
然后,程序创建一个ArrayList对象sortedKeys,并将studentsMap的键集合(即学号)按升序排列,存入sortedKeys中。由于需要按学号从大到小排序输出学生信息,因此程序使用for循环倒序遍历sortedKeys,然后依次输出每个学生的学号、姓名和成绩。
需要注意的是,由于该代码只实现了简单的学生信息管理功能,并且没有对输入数据进行有效性检查,因此在实际开发中可能需要加入更加完善的程序逻辑和数据检查。此外,该代码实现的排序功能只能按照学号从大到小排序,如果需要实现更加复杂的排序功能,可能需要使用其他排序算法或者更加复杂的数据结构来实现。

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

类图:

耦合度、圈复杂度:

 

简述:

这题在课程成绩统计程序-1的基础上加了一个Experiment实验课类。

继承自Grade类。该类包含一个int类型的finalgrade数据成员,表示期末成绩。同时,该类重写了Grade类中的getgrade()方法,实现了实验课成绩的计算,即将期末成绩赋值给sumgrade。
该类包含两个构造方法,一个为带参构造方法,用于创建一个具有期末成绩的实验课成绩对象;另一个为无参构造方法,用于创建一个空的实验课成绩对象。
需要注意的是,该类未对finalgrade数据成员进行访问限制,因此可以在类外直接访问和修改该成员。同时,在实际使用中,可能需要对输入的finalgrade数据进行有效性检查,以保证计算结果的准确性。

在Main类中主要针对输入数据进行处理。
首先,代码通过while循环不断读取用户输入的数据,直到输入数据为"end",程序才会退出。循环中的核心代码是一个switch语句,根据输入的数据类型(加课程信息、加课程成绩信息、数据异常)进行相应的处理。其中,加课程信息和加课程成绩信息的处理逻辑比较复杂,需要依据一定的规则进行判断和计算。
加课程信息部分,首先通过Jugde.kongge()方法获取输入数据中的空格数,并通过Jugde.input()方法判断输入数据是否符合要求。然后,根据输入数据中课程类型和考核方式的匹配情况,判断是否能够添加该课程信息。在判断是否能够添加该课程信息时,还需要通过Jugde.checkcf()方法判断是否已经存在相同的课程信息。
加课程成绩信息部分,首先通过Jugde.getsingle()方法判断是否已经存在相同的成绩信息(即同一个学生在同一门课程中是否已经有成绩记录),如果不存在,则通过Jugde.checkclass()方法和Jugde.checkcourse()方法判断该学生所在的班级和该课程信息是否已经存在。如果班级和课程信息不存在,则需要先创建班级和课程信息。然后,根据课程的考核方式,计算出相应的成绩,并将成绩信息加入选课数组中。
需要注意的是,该代码中存在一些硬编码的情况,例如判断课程类型和考核方式是否匹配时,直接比较了字符串。这种写法可能会导致代码的可维护性和可扩展性较差,应该尽可能使用枚举等更加灵活的方式进行判断。另外,由于该代码逻辑比较复杂,需要对输入数据进行多重校验和处理,因此在实际使用中可能需要进行更加详细和完善的测试和验证。

然后主要是对学生选课成绩进行统计和计算,输出每个学生的平均分和每门课程的平均分,并按班级进行统计输出班级平均分。
代码中首先调用了sortHashMap()方法来对学生按照学号进行排序,然后遍历每个学生,在选课列表中查找该学生选修的课程,并计算该学生所有课程的平均分,并将计算结果加入到cjmap这个HashMap中。然后通过对课程列表进行排序,遍历每门课程,查找该课程对应的成绩信息,根据该课程的考核方式计算平均分,并输出。接着,对班级列表进行排序,遍历每个班级,查找该班级的学生,统计该班级所有学生的平均分,并输出。
需要注意的是,代码中的计算平均分的方法存在一些问题,例如对于考试课程,将期末成绩占比计算为70%,平时成绩占比计算为30%。这种计算方法可能不严谨,应该根据具体情况进行调整。另外,该代码中的变量名较为简单,不太容易理解,应该考虑对其进行改进。

7-4 动物发声模拟器(多态):

类图:

 

耦合度、圈复杂度:

 

简述:

主要是一个简单的动物叫声模拟器,通过定义抽象类Animal和其子类Cat、Dog、Goat来模拟不同动物的叫声,并通过调用静态方法speak()来输出不同动物的叫声。
在代码中,Animal类是一个抽象类,其中定义了两个抽象方法getAnimalClass()和shout(),分别用于返回动物类别和动物叫声。Cat、Dog、Goat类都继承自Animal类,并重写了getAnimalClass()和shout()方法来返回猫、狗、山羊的类别和叫声。
在main()方法中,创建了一个Cat对象、一个Dog对象和一个Goat对象,并通过调用speak()方法来输出它们的叫声。speak()方法接受一个Animal类型的参数,通过调用该参数的getAnimalClass()和shout()方法来输出该动物的类别和叫声。
需要注意的是,在代码中使用了抽象类和抽象方法,这可以使得代码更加模块化和灵活,可以方便地扩展和修改代码。同时,由于Animal类是抽象类,不能直接创建对象,这也符合面向对象编程的多态性原则。

第八次大作业

7-1 容器-ArrayList-排序

类图:

 

耦合度、圈复杂度:

 

简述:

这题是一个学生成绩排序程序,通过输入不同学生的学号、姓名、数学成绩和物理成绩,计算出每个学生的总分,然后按照总分从高到低进行排序,并输出每个学生的学号、姓名和总分。
在代码中,定义了一个Student类,包括了学号、姓名、数学成绩和物理成绩等属性,以及获取这些属性的方法。然后在main()方法中,创建了一个空的ArrayList<Student>对象和一个Scanner对象,用于输入学生信息。
接着通过while循环,一行一行地读入学生信息,并将其分解为学号、姓名、数学成绩和物理成绩四个部分,然后创建一个Student对象,并将其加入到students这个ArrayList中。当输入“end”时,退出循环。
最后通过Collections.sort()方法对students进行排序,排序的依据是学生的总分,如果总分相同,则按照学生在List中的位置进行排序。在sort()方法中使用了一个匿名内部类来实现Comparator接口,重写了compare()方法,通过比较每个学生的总分进行排序。
最后通过for循环遍历students,依次输出每个学生的学号、姓名和总分,以空格分隔。
需要注意的是,代码中使用了Collections.sort()方法对ArrayList进行排序,这个方法会改变原来的ArrayList,如果不希望改变原来的ArrayList,可以先将其复制一份再进行排序。同时,代码中只考虑了总分相同的情况下按照List中的位置排序,没有考虑其他情况,例如按照学号或姓名排序等。

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

类图:

 

耦合度、圈复杂度:

 

简述:

这题是在7-2 课程成绩统计程序-2的基础上新增加了一个权重。实验课和考试课都要按照给定的权重来计算成绩。类结构不变。

以下是各个类的简单介绍和功能:

其中三个类:Course、Student和Choose。
Course类表示课程,包含课程的名称、性质、考核方式和实验课成绩数量等属性。构造函数初始化了该类的各个属性值。该类还包含一个ArrayList类型的quanz属性,表示权重,便于计算最终成绩。
Student类表示学生,包含学号和姓名属性,并实现了Comparable接口,以便对学生对象进行排序。
Choose类表示学生选择的课程,包含学生、课程和成绩等属性。
这段代码中定义的类是基于面向对象的编程思想,将数据和对数据的操作封装在类中,方便程序的组织和管理。这些类的属性和方法都是为了实现学生选课和成绩管理等功能而设计的。

1. Classroom类:班级类,包括班号和学生列表,实现了Comparable接口,可以进行排序操作。
2. Grade类:成绩类,包括总成绩字段。
3. Examgrade、Inspectgrade和Experiment类:考试课、考察课和实验课成绩类,都继承自Grade类,分别包括不同的成绩字段和计算方法。
4. Jugde类:工具类,包含了各种判断、查询、排序等方法,用于辅助实现程序功能。
其中的方法包括:
- checkassess():根据课程名称和编号,从HashMap中查找并返回对应的课程对象。
- studentcf():根据学号判断该学生是否在班级列表中。
- getsingle():判断学生是否已经选择过该课程。
- checkcf():判断该课程是否已经存在于HashMap中。
- sortHashMap():对HashMap中的学生对象按照学号进行升序排序。
- checkclass():根据班号从班级列表中查找并返回对应的班级对象。
- checkcourse():根据课程名称从HashMap中查找并返回对应的课程对象。
- checkint():判断输入的字符串是否是正整数。
- input():根据输入字符串的格式,判断输入的信息类型(课程信息或成绩信息)以及是否符合格式要求。

7-3 jmu-Java-02基本语法-03-身份证排序

类图:

耦合度、圈复杂度:

简述:

这题实现了对身份证号码进行排序的功能。程序首先从标准输入读入身份证数量和每个身份证的信息,然后通过命令行不断输入指令。当输入sort1时,程序对所有身份证按照年月日进行排序,并将排序结果输出。当输入sort2时,程序对每个身份证的年月日进行排序,并将排序结果输出。如果输入其他指令,则程序输出exit并退出。
sortByIds方法实现对每个身份证的年月日进行排序。程序首先将每个身份证的年月日提取出来,然后将其转换为“年-月-日”格式,并添加到字符串数组sortedIds中。接着,对字符串数组sortedIds进行排序,并将排序结果添加到字符串数组result中。最后,返回字符串数组result,其中只包含身份证号码,不包含“年-月-日”信息。
sortByDates方法实现对所有身份证的年月日进行排序。程序首先将每个身份证的年月日提取出来,并转换为“年-月-日”格式,添加到字符串数组dates中。然后,对字符串数组dates进行排序。接着,对每个排序后的日期,遍历字符串数组ids,找到第一个包含该日期的身份证号码,并添加到字符串数组sortedIds中。最后,返回字符串数组sortedIds,其中身份证号码按照年月日排列。
这段代码使用了ArrayList集合类来存储身份证号码和排序结果,使用了Collections.sort方法进行排序。代码结构清晰简单,实现了对身份证号码的排序功能。

7-4 jmu-Java-04面向对象进阶-03-接口-自定义接口ArrayIntegerStack

类图:

 

耦合度、圈复杂度:

 

简述:

这题定义了一个IntegerStack接口和一个实现该接口的ArrayIntegerStack类,实现了一个简单的栈(Stack)数据结构,并提供了相关操作方法。具体实现如下:
IntegerStack接口定义了栈数据结构的常用操作,包括push、pop、peek、empty和size等方法。
ArrayIntegerStack类实现了IntegerStack接口,并使用数组实现栈。其中,arr数组用于存储栈中元素,top表示栈顶元素的下标。push方法实现入栈操作,如果插入的元素为null或栈已满,则返回null,否则将元素插入到栈顶并返回插入的元素。pop方法实现出栈操作,如果栈为空则返回null,否则将栈顶元素弹出并返回该元素。peek方法获取栈顶元素,如果栈为空则返回null。empty方法判断栈是否为空,size方法获取栈中元素个数。
Main类作为程序的入口点,通过Scanner读取用户输入的信息,创建ArrayIntegerStack对象,调用ArrayIntegerStack的相关方法进行栈操作,并输出结果。具体流程为:
1. 读取用户输入的栈容量n和要压入栈中的数的个数m,并创建ArrayIntegerStack对象。
2. 通过循环,读取m个数并将它们压入栈中,输出每个数是否成功压入栈中。
3. 输出当前栈顶元素、栈是否为空、栈中元素个数。
4. 输出当前栈中所有元素。
5. 读取要出栈的元素个数x,并通过循环将它们依次出栈,输出出栈元素。
6. 输出当前栈顶元素、栈是否为空、栈中元素个数。
7. 输出当前栈中所有元素。
这段代码实现了栈数据结构的基本功能,并通过Scanner读取用户输入的信息进行栈操作,代码结构清晰,易于理解和修改。

7-5 jmu-Java-03面向对象基础-05-覆盖

类图:

 

耦合度、圈复杂度:

 

简述:

这题定义了一个PersonOverride类,包含了一个无参构造函数和一个有参构造函数。它还定义了一个Main类,其中包含了main方法。在main方法中,通过Scanner读取用户输入的信息,创建了两个ArrayList对象,分别存储了PersonOverride对象。
首先,程序读取了一个整数n1,表示要创建的PersonOverride对象的数量。然后,通过循环创建了n1个PersonOverride对象,并将其添加到persons1 ArrayList对象中。这些对象的name属性默认为"default",age属性默认为1,gender属性默认为true。
接着,程序读取了一个整数n2,并通过循环读取n2个PersonOverride对象的属性值。对于每个PersonOverride对象,如果persons2 ArrayList对象中还不存在该对象,则将其添加到该ArrayList对象中。
接下来,程序打印出persons1和persons2 ArrayList对象中所有PersonOverride对象的属性值,并输出persons2 ArrayList对象的大小。程序还通过反射获取了PersonOverride类中的所有构造函数。
PersonOverride类的equals方法覆盖了Object类的equals方法,用于判断两个PersonOverride对象是否相等。它按照name、age和gender属性依次比较这两个对象是否相等。
这段代码通过ArrayList存储PersonOverride对象,实现了对用户输入的数据进行存储和处理,并演示了如何在Java中使用equals方法进行对象比较,同时也展示了Java中反射的使用方法。代码清晰简洁,易于理解。

 

踩坑与心得

在课程成绩统计系列中:
踩坑:
① 输入格式:程序中需要读取用户输入的成绩信息,要求按照一定的格式输入。在读取用户输入时,要注意格式的正确性,以免导致错误或异常。
② 数据类型转换:在读取用户输入后,需要进行数据类型的转换,将字符串转换为数字,以便进行计算和存储。在进行数据类型转换时,要注意数据的范围和精度,以免发生数据溢出或精度丢失的情况。
③ 成绩计算:在统计成绩时,需要进行一系列的计算,包括平均成绩、最高分、最低分等。在进行计算时,要注意算法的正确性和效率,以确保程序能够正确地处理大量数据。
心得:
① 模块化编程:在编写程序时,要将任务拆分成逻辑清晰、功能独立的模块,便于调试和维护。可以使用函数、类、模块等方式实现模块化编程。
② 错误处理和异常处理:在处理用户输入、数据计算等过程中,难免会出现错误和异常。在编写程序时,要考虑到这些可能出现的问题,并进行相应的错误处理和异常处理,以避免程序崩溃或出现不可预知的错误。
③ 代码风格和注释规范:编写清晰、易读的代码是非常重要的。在编写程序时,要注意代码风格和注释规范,以便于他人理解和修改代码。可以采用一些编码规范和注释规范,例如Google编码规范和JavaDoc注释规范等。
其他题目中:

① 容器-HashMap-检索程序
踩坑:
- 在使用HashMap时,需要注意key的唯一性,否则会出现覆盖的情况
- 在使用Scanner类读取用户输入时,如果输入后没有调用nextInt()等方法将其读取,而是直接读取下一个输入,可能会导致程序出错
心得:
- HashMap是Java中非常常用的容器,它可以存储键值对,并且根据key进行快速检索。在使用HashMap时,要注意key的唯一性,可以使用containsKey()方法进行判断。同时,HashMap的put()方法可以用来新增或修改键值对,remove()方法可以用来删除键值对。
- 使用Scanner类读取用户输入时,要注意读取顺序和数据类型的匹配,以确保读取到正确的数据。
② 容器-HashMap-排序程序
踩坑:
- HashMap是一种无序的容器,不能直接排序,需要先将其转换为List,再进行排序
- 在使用Comparator进行排序时,需要实现compare()方法并根据需要进行排序
心得:
- 在对HashMap进行排序时,需要先将其转换为List,并根据需要实现Comparator进行排序。在实现compare()方法时,可以根据需要比较value或key的大小,可以使用升序或降序排序。
- 对于一些复杂的数据结构,可以使用Java中的容器来进行存储和处理,提高编程效率和可读性。
③ 动物发声模拟器(多态)程序
踩坑:
- 在使用多态时,需要注意父类和子类之间的关系,以确保程序能够正确地执行
- 在使用抽象类时,需要注意其子类是否实现了抽象方法
心得:
- 多态是面向对象编程中非常重要的概念,它能够提高代码的灵活性和可扩展性。在使用多态时,需要先将对象实例化为父类,再根据需要转换为子类进行操作。
- 抽象类是一种非常有用的代码抽象工具,它可以定义一些通用的方法和属性,同时让其子类自行实现一些特定的方法。在使用抽象类时,需要注意其子类是否实现了抽象方法,否则会导致编译错误。
④ 容器-ArrayList-排序程序
踩坑:
- 在使用Comparator进行排序时,需要实现compare()方法并根据需要进行排序
- 在使用Arrays.sort()方法对数组进行排序时,需要注意传入的数组类型和Comparator类型的匹配
心得:
- ArrayList是一种常用的容器,它可以存储任意类型的元素,并且支持快速增删改查。在对ArrayList进行排序时,可以使用Collections.sort()方法或者使用toArray()方法将其转换为数组后使用Arrays.sort()方法进行排序。
- 在实现Comparator时,可以根据需要比较元素的大小,可以使用升序或降序排序。在使用Arrays.sort()方法对数组进行排序时,需要传入正确的数组类型和Comparator类型,否则会导致编译错误。
⑤ jmu-Java-02基本语法-03-身份证排序程序
踩坑:
- 在读取身份证信息时,需要注意输入格式的正确性,在读取时要使用nextLine()方法,以读取整行数据
- 在使用Comparator进行排序时,需要注意字符串的比较方法,可以使用compareTo()方法进行比较
心得:
- 在读取身份证信息时,需要使用nextLine()方法以读取整行数据,然后使用正则表达式或其他方法进行解析。在解析过程中,要注意身份证号码和生日等信息的正确性。
- 在实现Comparator时,可以使用字符串的compareTo()方法进行比较,也可以自定义一些比较规则,以根据需要进行排序。
⑥ jmu-Java-04面向对象进阶-03-接口-自定义接口ArrayIntegerStack程序
踩坑:
- 在实现接口时,需要实现接口中的所有方法
- 在使用栈时,需要注意栈顶指针的位置,以确保入栈和出栈的顺序正确
心得:
- 接口是一种非常有用的代码抽象工具,它可以定义一些通用的方法,让其实现类自行实现具体的逻辑。在实现接口时,需要实现接口中的所有方法,否则会导致编译错误。
- 栈是一种常用的数据结构,它可以实现后进先出的功能。在使用栈时,需要注意栈顶指针的位置,并根据需要实现入栈、出栈、查看栈顶元素等方法。
⑦ jmu-Java-03面向对象基础-05-覆盖程序
踩坑:
- 在覆盖equals()和hashCode()方法时,需要遵循一定的规则,以确保其正确性和一致性
- 在使用String对象时,需要注意其不可变性,在进行字符串连接时会产生新的String对象,而不是修改原有对象
心得:
- 覆盖equals()和hashCode()方法是Java中常用的一种操作,它可以用于比较两个对象是否相等。在覆盖这两个方法时,需要遵循一定的规则,例如equals()方法应该满足自反性、对称性、传递性和一致性等。同时,hashCode()方法也应该与equals()方法保持一致。
- 在使用String对象时,需要注意其不可变性。在进行字符串连接时,应该尽量避免使用“+”

 

主要困难以及改进建议

还是设计类不够准确和熟练。

① 学习好Java的基础知识和概念:在开始编写Java代码之前,要先学习好Java的基础知识和概念,例如语法、面向对象编程、数据结构和算法等,这有助于更好的理解和掌握Java编程。

② 遵守Java的编码规范和风格:在编写Java代码时,应该遵守Java的编码规范和风格,例如命名规范、缩进、注释等,这有助于提高代码的可读性和可维护性。

③ 熟悉Java的类库和API:Java拥有庞大的类库和API,熟悉其中的常用类和方法可以提高编写Java代码的效率和质量。可以预先学习一下Java中常用的类和方法,或者在编写代码时查询相关资料。

④ 善于使用设计模式:设计模式是一种优秀的编程思想,可以帮助编写出更加灵活、可重用、可维护的Java代码。建议学习和尝试使用一些常见的设计模式。

⑤ 不断练习和实践:编写Java代码需要不断地练习和实践,通过不断地编写代码来巩固和提高自己的Java编程能力。可以参与一些开源项目或者自己实现一些小型的项目,不断提高自己的编程能力和经验。

 

总结

①这三次大作业都有课程成绩统计程序,逐步加深。这个系列只要类结构设计好就不会有太的问题。该程序的编写涉及到基本的数据结构和算法,例如数组、循环和条件判断等。需要注意实现数据的输入和计算,并输出结果。

② 容器-HashMap-检索程序:该程序主要涉及到HashMap容器的使用,要注意实现数据的插入和查找,并输出结果。需要注意Hash值的计算和冲突处理等。

③ 容器-HashMap-排序程序:该程序同样使用了HashMap容器,实现数据的插入和排序,并输出结果。需要注意排序算法的选择和实现。

④ 动物发声模拟器(多态)程序:该程序使用了Java的多态特性,实现了不同动物发出不同的声音。需要注意父类和子类的关系,以及方法的重写和调用。

⑤ 容器-ArrayList-排序程序:该程序使用了ArrayList容器,实现数据的插入和排序,并输出结果。需要注意排序算法的选择和实现。

⑥ jmu-Java-02基本语法-03-身份证排序程序:该程序使用了字符串处理和排序算法,实现了身份证号码的排序。需要注意身份证号码的格式和排序算法的选择。

⑦ jmu-Java-04面向对象进阶-03-接口-自定义接口ArrayIntegerStack程序:该程序使用了Java的接口特性,实现了一个自定义的栈类型。需要注意接口的定义和实现,以及栈的基本操作。

⑧ jmu-Java-03面向对象基础-05-覆盖程序:该程序使用了Java的覆盖特性,实现了一个父类和子类的关系。需要注意方法的重写和调用,以及父类和子类的关系。

在学习Java的过程中,多练多打是非常重要的,因为量的积累会引起质的变化。而对于Java语言来说,万物皆是对象,这也是Java语言的魅力所在。我们需要将现实世界中的对象抽象地体现在编程世界中,最终组成完整的程序设计。在学习的过程中,我逐渐熟悉了类与类之间的关系设计,并且能够熟练地绘制类图。我也意识到编程思维的重要性,并将其进行了训练和提升。同时,我也学习了异常处理、输入输出流等知识,对面向课程设计这门课程的认知也更深一层。在学习Java的过程中,需要注重代码的可读性和条理性,养成良好的代码书写习惯。在学习的过程中,我深深感受到了蔡老师的认真教学和先学再教的方法。通过自主学习和每周的测验,我能够更好地掌握课程内容和巩固所学知识。虽然有时候会觉得时间有些紧张,但是这种方法使得学习更加高效。在学习的过程中,PTA分数排行榜也是一种很好的鞭策和奖励。尽管和其他人相比,我还有很多不足之处,但我会努力全力以赴,争取在未来的学习中取得更大的进步。

posted on 2023-05-17 21:53  猜卟鋀  阅读(181)  评论(0)    收藏  举报