题目集4~6的总结性Blog
一 、前言:
总结三次题目集的知识点、题量、难度等情况
知识点
第四次题目集主要考察了java语言三大特性中的多态,子类与父类的继承关系、方法重写,信息处理、比较,排序输出,类的对象创建有无参数的不同构造方法、属性的访问权限等知识点,对类的设计要求提高。
第五次题目集主要考察了java中的封装与继承,多个类的设计,类与类之间的关系考虑,向下转型,compare接口的使用,集合接口的实例化,迭代器,数据的查找、排序,字符串处理,正则表达式,类型转换,类与对象、方法的使用,方法的调用与返回,多个类的关系与使用、链表或哈希表、遍历方法等知识点。
第六次题目集主要考察了面向对象的封装性,类的设计等知识点。集合了前几次的知识点于一体考察。
三次题目集都体现了面向对象的设计思想。
题目及题量、难度
nchu-software-oop-2024-上-4:
7-1 答题判题程序-4
7-2 设计一个学生类和它的一个子类——本科生类
7-3 校园角色类设计-1
共三道题,难度一般,比上一次简单多了。第一道是之前答题判题程序的最后一次迭代,增加了两个题型,要求使用继承,也就是这两种新增题型可以用之间普通的选择题为父类而继承,在这基础上修改判题方法、给分方法。这一次的大作业主要是要求大家使用父类、子类,学会继承,一些方法重写和数据的权限设计都还是有难度的。
nchu-software-oop-2024-上-5:
7-1 家居强电电路模拟程序-1
7-2 7-3 请阅读程序并调试改正程序,获得正确答案
共三道题,难度提高了很多。这次的第一道题就是核心题目:电路程序,在这题中我们要先做好类的设计,这道题中有非常多的不同的类,每个类的功能、属性都各不相同,增加了些许难度。后面的两道题比较简单,考察我们对接口、迭代器使用、修改程序的能力。
nchu-software-oop-2024-上-6:
7-1 家居强电电路模拟程序-2
就一道大作业:上次电路程序的迭代。在这次作业中,老师删除了测试点的具体说明,写代码时遇到未通过的测试点,只能自己猜测哪种情况还未考虑或者代码哪里出现错误,给我们带来了不少的困难。除了测试点,这次还增加了电器种类、电路种类,既考察了我们对电路电阻、电流、电压的计算,又考验了我们遇到问题时考虑得全面不全面,还有在类的设计时能否设计出符合题目要求的多种类,缕清类与类之间的关系。
二、第四次的答题判题程序分析
设计与分析
第四次的答题判题程序类图以及SourceMontor的生成报表内容:
在这次题目中我在之前设计的Topic,Answer,Test,Student,Sort,Main六个类的基础上又新增了两个类:Multiple类(多选题)和Summary类(填空题)。这两个类是以Topic为父类的子类,继承Topic中的方法,在此就不分析原来的六个类了,几乎没有改动,着重分析新增的两个类。
- Multiple类:用于表示多选题,属性与Topic类一致,包括题号(no)、题目内容(content)和标准答案(standardAnswer)。
新增了一个type属性用于区分题目类型。包含了一个无参构造方法和一个有参构造方法,用于初始化题目对象。
在Topic类中所包含的方法基础上,重写了answer方法,即判题方法,因为多选题有多个答案,在判题上与原来的Topic不同。 - Summary类:用于表示填空题,属性与Topic类一致,包括题号(no)、题目内容(content)和标准答案(standardAnswer)。
新增了一个type属性用于区分题目类型。
包含了一个无参构造方法和一个有参构造方法,用于初始化答题对象。
与Multiple类一样,重写了判题方法answer,判题的结果有三种:完全一样为true,有错误则为false,不完全一样且没有错误答案为partiallt correct,用到了字符串比较的方法。
新增类代码如下:
点击查看代码
class Multiple extends Topic{//多选题
public Multiple()
{}
public Multiple(int no,String cotent,String standaraAnswer)
{
super(no,cotent,standaraAnswer);
type=1;
}
public String answer(String s)//判题
{
int j=0;//正确答案数量
int k=0;//错误答案数量
//System.out.println(standaraAnswer);
String[] s1=s.split(" ");//分隔作答
String[] s2=standaraAnswer.split(" ");//分隔答案
//先判断两个数组长度是否相同
for(int i=0;i<s1.length;i++)
{
//System.out.println(s1[i]);
int flag=-1;
for(int l=0;l<s2.length;l++)
{
//System.out.println(s2[l]);
if (s2[l].equals(s1[i])) {
flag=0;
j++;
break;
}
else if(!s1[i].equals(""))
flag=1;
else flag=-1;
}
if(flag==1)
k++;
}
//System.out.println(k+" "+j);
if(k!=0)
return "false";
else if(k==0&&j==4)
return "true";
else
return "partially correct";
}
}
class Summary extends Topic{//填空题
public Summary() {
// TODO 自动生成的构造函数存根
}
public Summary(int no,String cotent,String standaraAnswer)
{
super(no,cotent,standaraAnswer);
type=2;
}
public String answer(String s)//判题
{
s=s.trim();
if(standaraAnswer.indexOf(s)==-1){
return "false";
}
else{
if(standaraAnswer.equals(s)==true){
return "true";
}else{
return "partially correct";
}
}
}
}
踩坑心得
- 这次的大作业对输入信息要求不一样,可以乱序输入,导致对部分信息的处理应该放在所有信息输入之后。比如删除题目的信息可以出现在题目之前,试卷可以出现在题目之前等。
- 在写多选题和填空题的判题方法中遇到了困难,不像之前的Topic类的判题,完全一样就是正确,否则就是错误,但是新增的两个题型考虑到答案部分正确的情况,因此判题时不仅要比较标准答案与回答的答案的长度、内容是否一致,还要考虑不一致时有没有出现错误答案,在写这两个判题方法时学到了字符串的子串的应用,非常好用,几行代码就能将多种情况都实现了。
- 之前的学生答题不会出现多张试卷,但是这次时多个学生有多张不同试卷,需要考虑输出顺序的优先级,实现这个时要注意!
改进建议
- 对输入信息处理时,注意可乱序输入的信息,我增加了题目变量用于存储输入的题目信息,类似于题库,在试卷中查找题目、删除题目的操作均放在所有题目信息的输入之后。
- 用字符串的子串来判断填空题答案是否正确,在这里要注意空字符串、空格,有些空格是答案的一部分,在一开始我没有用子串判断,而是用了最笨的方法:一个一个字符查找比对,这样就导致代码效率不高,还会出现对一些空格判断时的错误,于是我去搜索了比对字符串还有没有什么更好的方法,就发现了indexOf()方法。
三、第一次家居强电电路模拟程序分析
设计与分析
第一次家居强电电路模拟程序类图以及SourceMontor的生成报表内容:
可以看出这次的程序有非常多的类,第一次的电路程序中只考虑一条串联电路,故电路中只有控制设备(开关,分档调速器,连续调速器),受控设备(灯啊,风扇啊)。这次的类都是元件设备,所以我先设计了一个Lead类作为所有电路元件的父类:包含了一个无参构造方法和一个有参构造方法,用于初始化对象。包括了两个引脚(虽然没怎么用上)、状态、电压、名字、优先级等属性。提供了输出方法(每个电器都需重写,有对应不同的输出方法)、设置电压方法等。
我还设计了一个Array类和Build类,其中Array类包括了一个链表,用于存储所以元件信息。Build类用于建立不同元件对象。
点击查看代码
class Array{
public Array() {
// TODO 自动生成的构造函数存根
}
ArrayList<Lead> arrayList=new ArrayList<Lead>();
public Object arraylist;
void add1(Lead l)
{
arrayList.add(l);
}
class Build{
public Build() {}
public void bulid(String string,Array array,int x,int a) {
switch (string) {
case "K": {
SW sw=new SW(x,string+a);
sw.VVC();
array.add1(sw);
break;
}
case "L":{
Continuous_governor L=new Continuous_governor(x,string+a);
L.VVC();
array.add1(L);
break;
}
case "F":{
Grade_governor F=new Grade_governor(x,string+a);
F.VVC();
array.add1(F);
break;
}
case "B":{
Incandescent_light_bulb B=new Incandescent_light_bulb(x,string+a);
B.VVC();
array.add1(B);
break;
}
case "R":{
LED L=new LED(x,string+a);
L.VVC();
array.add1(L);
break;
}
case "D":{
Ceiling_fan L=new Ceiling_fan(x,string+a);
L.VVC();
array.add1(L);
break;
}
}
}
}
- SW类:用于表示开关,和别的类不同的有一个切换开关状态的方法。
- Grade_governor类:用于表示分档调速器,增加了一个档位greas属性,和别的类不同的有增加档位、减小档位的方法。还有根据不同档位,设置分档连续器输出的电压不同的方法。
- Continuous_governor类:用于表示连续调速器,也增加了一个档位greas属性,和别的类不同的有设置档位的方法,根据不同档位,设置分档连续器输出的电压不同的方法。与分档调速器不同的就是这个调速器的档位是输入后设置的,而分档调速器是一档一档增加或减少。
- Light类:用于表示灯,是日光灯、白炽灯的父类。增加了亮度的属性。增加了一个根据不同电压设置不同亮度的方法
Incandescent_light_bulb类和LED类均只重写了设置亮度的方法。 - fan类:用于表示风扇,是吊扇的父类,增加了转速的属性。增加了一个根据不同电压设置不同转速的方法。
Ceiling_fan类则是重写设置电压的方法。 - Main类:包含了主程序,用于输入电路元件信息和电路连接信息和处理这些信息。我在主类里写的一些对应不同元件不同属性的处理方法:VVC连接方法,连接方法,开关调整方法,分档调速器调档方法,连续调速器调档方法。
踩坑心得
- 分档调速器的调档,写的时候没有考虑调小档位时最小值为0,增加档位时最大值为4,在我原来的代码中会出现档位为-1或5、6的情况。
- 开关默认是开着的!一开始没有考虑这个情况导致整条电路中元件的电压都不对。后面发现默认开着的,一定有输入一条开关信息使其闭合后电路中才有电压。
改进建议
- 将开关的状态默认设为0
- 修改分档调速器中增加或减小档位的代码,对是否不可增加或减小的情况进行判断。
修改前代码
class Grade_governor extends Lead{//分档调速器
int gears=0;//档位
public Grade_governor() {}
public Grade_governor(int lead1,String name) {
super(lead1,name);
k=2;
}
public void U() {
gears--;
U0();
}
public void Z() {
gears++;
U0();
}
public void U0() {
u=220;
if(gears==0)
u=0;
else if(gears==1)
u=u*0.3;
else if(gears==2)
u=u*0.6;
else if(gears==3)
u=u*0.9;
else if(gears==4)
u=u;
}
public void L(double u) {
if(u==0)
lead2=0;
}
public void print() {
System.out.println("@"+name+":"+gears);
}
}
修改部分方法
public void U() {
if(gears!=0)
gears--;
U0();
}
public void Z() {
if(gears!=3)
gears++;
U0();
}
四、第二次家居强电电路模拟程序分析
设计与分析
第二次家居强电电路模拟程序类图以及SourceMontor的生成报表内容:
这一次的迭代中增加了一种风扇(落地扇Stand_fan类)和并联电路,并联电路是由串联电路组成的。所以我写了一个电路类:Circuit类(也继承Lead类,也是电路元件的一种)。其中包含了电路中电路元件数量,计算电流、电压、电阻的方法。然后设计了Series类(串联电路)和Multiple类(并联电路),这两个类都继承Circuit类,结合物理知识我们知道这两种电路有不同的计算电阻、电压方法。
- Series类:用于表示串联电路,包括电路元件数量(num)、各元件名字(s[],根据名字来查找arraylist的中电路元件)、状态(x)。包含了一个无参构造方法和一个有参构造方法,用于初始化串联电路对象。
提供了:
add方法:用于增加该电路中的电路元件。
R方法:用于计算该条电路的电阻。串联电路的电阻计算就是将各元件的电阻相加即可。
jude方法:用于判断该电路状态,主要是看电路中有无开关,并且根据开关状态来改变电路状态。
working方法:用于通路,使各元件工作。 - Multiple类:用于表示并联电路,包括电路元件数量(num)、各元件名字(s[],根据名字来查找arraylist的中电路元件)、状态(x)。包含了一个无参构造方法和一个有参构造方法,用于初始化并联电路对象。
提供了:
add方法:用于增加该电路中的电路元件。
R方法:用于计算该条电路的电阻。并联电路的电阻计算复杂一点,总电阻的倒数等于各电阻的倒数之和。
jude方法:用于判断该电路状态,主要是看并联中的串联电路的状态,调用串联电路的jude方法。
working方法:用于通路,使各元件工作。
踩坑心得
这次的大作业老师把测试点的说明给关了,给我们增加了很大难度啊,只能干猜,一点点试,改代码的过程中经常出现这个过了那个又没过了。
- 电阻的计算中就有很多坑!串联电路中还好,都是直接相加,但是!并联电路中倒数加来加去,就需要注意!首先要考虑并联电路中的串联电路是否连接到电路中,如果其中有一条电路状态为开,计算电阻时不加进去,如果所有电路状态为开,则该并联电路状态为开,总电路状态也会为开。还有要考虑元件电阻为0的情况,这时编译器可能不会报错但是真正运行的时候会导致计算错误或者空输出。不仅要考虑元件电阻为0,也要考虑最后整个并联电路为0、并联电路中有一条电阻为0的情况(虽然这次电路不考虑短路),但是还是要注意。
- 注意两个调速器,设置电压的时候要先看调速器输出电压为多少,连接电路时的电压就为多少。连续调速器默认为0,输出电压为0,这也是一个需要注意的细节。
- 精度问题啊,和同学交流之后知道有一个测试的竟然是风扇的的转速输出中199和200的差别。数据在多次计算中误差越来越大。
改进建议
- 每一条电路中的电路计算前先对整条电路进行状态判断,再进行电阻的计算。并联电路计算中记得考虑电阻为0时不能作为分母计算。
点击查看代码
public void R(Series[] series,int a) {//并联电路计算电阻
jude(series, a);//判断电路状态
if(this.x==0)
R=0;
else {
double r=0;
for(int i=0;i<a;i++)
{
for(int j=0;j<num;j++) {
if(series[i].name.equals(s[j])&&series[i].x==1)
{
if (series[i].R!=0)
r+=1.0/series[i].R;
else {
r=0;break;
}
}
}
}
if(r!=0)
this.R=1.0/r;
else {
this.R=0;
}
}
}
- 连接电路时先找找电路中是否有调速器,有的话根据调速器的电压再设置整条电路的电压。
五、总结:
在这三次大作业中写了两种程序,之前的试卷程序终于结束了,感觉自己写的很不好,虽然都拿到了满分,但是每次写新的迭代的时候都大改特改,结构写的很不好,看那个圈复杂度也很高,很无奈。
这几次的大作业为了降低难度都没有考虑异常输入信息的处理,但是我傻傻的还是稍微考虑了一下,有点耽误时间。感觉自己写代码中经常会忽略一些小细节,比如电路中电阻为0的情况。
上一次的三次大作业时严格的三周,但是这次时间跨度有点大,老师也提前把题面发出让我们好好设计设计类,整理思路。给足时间思考,写大作业时就有个大致方向,没有那么迷茫了。
我觉得在我完成的这三次大作业中仍然有很多可以改进的地方:数据结构可以更好,下次尝试用下HashMap,提高查找速度、改善插入删除操作;依然没有很好的实现函数单一职责,但和上一次有点长进,学会了把功能相同类似的代码合并成一个函数,记得之前的代码主类里只有一个主函数,这几次我都将一些功能单拎出来成为一个函数,虽然有些函数的功能比还是很复杂;封装性不够,写的时候有些急,想到什么写什么,想用那个数据就直接用了,没有考虑数据的私有化,就直接调用,导致代码的安全性、灵活性都不高。
大概还有两次大作业就结束了这学期的java学期,学习java这门语言主要是培养我们面向对象的思想,在一次次的大作业中遇到越来越多的类的设计,错综复杂的类的关系让人头疼,但也学到了很多,最后希望剩下的几次大作业能做到更好,保证拿分的同时提高自己代码结构的灵活性,代码的安全性、灵活性。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步