面向对象程序设计
第2次博客作业
一、前语
榜首次作业
榜首次作业有三道题,前两道道为入门的小题,最终一题在之前的答题判别程序上进行了第四次迭代,在标题方面增加了多选题以及填空题,试卷方面增加了多张试卷多个同学答题的输入状况,判题方面增加了部分正确这一得分等级,全体难度较大。
第2次作业
第2次作业有三道题,后两道为入门及简略的小题,榜首题为难度较大的家居电路模仿程序。首要调查对类的特点和办法的规划与运用,以及在规则格局下对程序用户的输入进行解析然后获取电器设备以及操作等信息,并给与相应的输出。
第三次作业
第三次作业只要一道题,即在前一次家居电路模仿程序的基础上进行迭代。增加了并联电路类,改变了输入格局,难度较大。
二、规划与剖析
榜首次作业
SourceMontor报表
3.7% 的代码行包括注释,2 个类中没有特别指出类和接口的注释份额。
均匀每个类有 4 个办法,每个办法均匀有 7.62 条句子,办法的均匀杂乱度方针没有特别指出。最大块深度为 2(指代码块嵌套的层数);均匀块深度为 1.08;均匀杂乱度为 1.00(指办法中不同途径的数量,较高的杂乱度或许意味着办法难以测验和保护)标明代码的杂乱度操控得相对较好。
最杂乱的办法是 Question.Question(),坐落第 11 行。这或许标明 Question.Question() 办法过于杂乱,需求进一步的分化或重构或许需求拆分;其杂乱度为 1,包括 11 条句子,最大深度为 2,调用了 0 次办法调用。这标明 Question.Question() 办法或许需求进一步的优化。
类图
Question 类:
包括四个成员变量 id、content、answer 和 isDeleted,标明一个标题的基本信息、答案和删去状况。
包括一个结构办法,用于初始化标题的基本信息。
包括一个静态工厂办法 parseFromInput,用于从输入字符串解析并创立 Question 方针。
包括一个笼统办法 grade,用于依据学生答案和满分核算得分,由子类完结具体的判分逻辑。
Paper 类:
包括三个成员变量 id、questionIdToScore 和 sequenceToQuestionId,标明一个试卷的基本信息、标题分值映射和标题次序。
包括一个结构办法,用于初始化试卷的基本信息。
包括一个静态工厂办法 parseFromInput,用于从输入字符串解析并创立 Paper 方针。
包括一个办法 getTotalScore,用于核算试卷的总分。
Student 类:
包括两个成员变量 id 和 name,标明学生的基本信息。
包括一个结构办法,用于初始化学生的基本信息。
包括一个静态工厂办法 parseFromInput,用于从输入字符串解析并创立 Student 方针列表。
AnswerSheet 类:
运用了 Paper 和 Student 方针来标明答卷信息。包括三个成员变量 paperId、studentId 和 sequenceToAnswer,标明一个答卷的基本信息、学生答案和标题次序。
包括一个结构办法,用于初始化答卷的基本信息。
包括一个静态工厂办法 parseFromInput,用于从输入字符串解析并创立 AnswerSheet 方针。
Main 类:
包括 main 办法,是程序的进口点,包括数据存储结构和事务逻辑。
运用 HashMap、LinkedHashMap 和 ArrayList 来存储 Question、Paper、Student 和 AnswerSheet 方针。
处理输入数据,包括标题、试卷、学生和答卷信息,并进行相应的事务逻辑处理,如判分、输出过错信息和正告信息。
第2次作业
SourceMontor报表
12.9% 的代码行包括注释,没有特别指出类和接口的注释份额。
均匀每个类有 3.67 个办法,每个办法均匀有 6.03 条句子,办法的均匀杂乱度方针没有特别指出。最大块深度为 7(指代码块嵌套的层数);均匀块深度为 2.85;均匀杂乱度为 1.82(指办法中不同途径的数量,较高的杂乱度或许意味着办法难以测验和保护)标明代码的杂乱度操控得相对较好。
最杂乱的办法是 Circuit.calculateVoltages(),坐落第 210 行。这或许标明 Circuit.calculateVoltages() 办法过于杂乱,需求进一步的分化或重构或许需求拆分;其杂乱度为 9,包括 16 条句子,最大深度为 7,调用了 14 次办法调用。这标明 Circuit.calculateVoltages() 办法或许需求进一步的优化。
类图
ControlDevice 类:
包括两个成员变量 id、inputVoltage 和 outputVoltage,标明操控设备的标识符、输入电压和输出电压。
包括一个结构办法,用于初始化操控设备的标识符。
包括一个笼统办法 updateOutputVoltage,用于更新设备的输出电压。
包括一个笼统办法 getStatus,用于获取设备的当时状况。
Switch 类:
包括一个成员变量 isClosed,标明开关的当时状况。
包括一个结构办法,用于初始化开关的标识符。
包括一个办法 toggle,用于切换开关的状况。
承继并完结 updateOutputVoltage 办法,依据开关状况更新输出电压。
承继并完结 getStatus 办法,回来开关的当时状况。
StepSpeedController 类:
包括一个成员变量 level,标明分档调速器的当时档位。
包括一个结构办法,用于初始化调速器的标识符。
包括两个办法 incrementLevel 和 decrementLevel,用于调整档位。
承继并完结 updateOutputVoltage 办法,依据档位更新输出电压。
承继并完结 getStatus 办法,回来调速器的当时档位。
ContinuousSpeedController 类:
包括一个成员变量 position,标明接连调速器的当时方位参数。
包括一个结构办法,用于初始化调速器的标识符。
包括一个办法 setPosition,用于设置调速器的方位参数。
承继并完结 updateOutputVoltage 办法,依据方位参数更新输出电压。
承继并完结 getStatus 办法,回来调速器的当时方位参数。
ControlledDevice 类:
包括两个成员变量 id、inputVoltage 和 outputVoltage,标明受控设备的标识符、输入电压和输出电压。
包括一个结构办法,用于初始化受控设备的标识符。
包括一个笼统办法 updateOutputVoltage,用于更新设备的输出电压。
包括一个笼统办法 getStatus,用于获取设备的当时状况。
IncandescentLamp 类:
包括一个结构办法,用于初始化白炽灯的标识符。
包括一个办法 calculateBrightness,用于核算灯具的亮度。
承继并完结 updateOutputVoltage 办法,白炽灯不需求更新输出电压。
承继并完结 getStatus 办法,回来灯具的亮度。
FluorescentLamp 类:
包括一个结构办法,用于初始化日光灯的标识符。
包括一个办法 calculateBrightness,用于核算灯具的亮度。
承继并完结 updateOutputVoltage 办法,日光灯不需求更新输出电压。
承继并完结 getStatus 办法,回来灯具的亮度。
CeilingFan 类:
包括一个结构办法,用于初始化吊扇的标识符。
包括一个办法 calculateSpeed,用于核算电扇的转速。
承继并完结 updateOutputVoltage 办法,吊扇不需求更新输出电压。
承继并完结 getStatus 办法,回来电扇的转速。
Circuit 类:
包括三个成员变量 controlDevices、controlledDevices 和 connections,别离存储操控设备、受控设备和设备间的衔接联系。
包括三个办法 addControlDevice、addControlledDevice 和 connectDevices,用于增加操控设备、受控设备和衔接设备。
包括一个办法 processCommand,用于处理操控指令。
包括一个办法 calculateVoltages,用于核算电路中一切设备的电压。
包括一个办法 outputStates,用于输出一切设备的状况。
Main 类:
包括 main 办法,是程序的进口点,担任读取输入并模仿电路系统的操作。
在 main 办法中,运用 Circuit 方针来办理电路中的一切设备和衔接。
处理输入数据,创立相应的设备方针,衔接设备,并处理操控指令。
最终,核算电路中的电压并输出一切设备的状况。
第三次作业
SourceMontor报表
13.1% 的代码行包括注释,没有特别指出类和接口的注释份额。
均匀每个类有 4.78 个办法,每个办法均匀有 5.42 条句子,办法的均匀杂乱度方针没有特别指出。最大块深度为 7(指代码块嵌套的层数);均匀块深度为 2.23;均匀杂乱度为 1.57(指办法中不同途径的数量,较高的杂乱度或许意味着办法难以测验和保护)标明代码的杂乱度操控得相对较好。
最杂乱的办法是 Circuit.processCommand(),坐落第 282 行。这或许标明 Circuit.processCommand() 办法过于杂乱,需求进一步的分化或重构或许需求拆分;其杂乱度为 9,包括 23 条句子,最大深度为 4,调用了 19 次办法调用。这标明 Circuit.processCommand() 办法或许需求进一步的优化。
类图
ControlDevice 类:
包括三个成员变量:设备标识符 id,输入电压 inputVoltage,输出电压 outputVoltage。
包括一个结构办法,用于初始化设备标识符。
包括两个笼统办法:updateOutputVoltage 用于更新设备的输出电压,getStatus 用于获取设备的当时状况。
// 操控设备的父类
abstract class ControlDevice {
String id; // 设备标识符
double inputVoltage = 0; // 输入电压
double outputVoltage = 0; // 输出电压
ControlDevice(String id) {
this.id = id;
}
// 更新输出电压的笼统办法,具体完结由子类完结
abstract void updateOutputVoltage();
// 获取设备状况的笼统办法,具体完结由子类完结
abstract String getStatus();
}
Switch 类:
包括一个成员变量 isClosed,标明开关的开闭状况。
包括一个结构办法,用于初始化开关的标识符。
包括一个办法 toggle,用于切换开关的状况。
重写 updateOutputVoltage 办法,依据开关状况更新输出电压。
重写 getStatus 办法,回来开关的当时状况。
// 开关类,承继自 ControlDevice
class Switch extends ControlDevice {
boolean isClosed = false; // 初始状况为翻开
Switch(String id) {
super(id);
}
// 切换开关状况
void toggle() {
isClosed = !isClosed;
}
@Override
void updateOutputVoltage() {
// 开关闭合时输出电压等于输入电压,否则为0
outputVoltage = isClosed ? inputVoltage : 0;
}
@Override
String getStatus() {
return "@" + id + ":" + (isClosed ? "closed" : "turned on");
}
}
StepSpeedController 类:
包括一个成员变量 level,标明分档调速器的档位。
包括一个结构办法,用于初始化调速器的标识符。
包括两个办法 incrementLevel 和 decrementLevel,用于调整档位。
重写 updateOutputVoltage 办法,依据档位更新输出电压。
重写 getStatus 办法,回来调速器的当时档位。
// 分档调速器类,承继自 ControlDevice
class StepSpeedController extends ControlDevice {
int level = 0; // 初始档位为0
StepSpeedController(String id) {
super(id);
}
// 增加档位
void incrementLevel() {
if (level < 3) level++;
}
// 削减档位
void decrementLevel() {
if (level > 0) level--;
}
@Override
void updateOutputVoltage() {
// 依据档位调整输出电压
double[] factors = {0, 0.3, 0.6, 0.9};
outputVoltage = inputVoltage * factors[level];
}
@Override
String getStatus() {
return "@" + id + ":" + level;
}
}
ContinuousSpeedController 类:
包括一个成员变量 position,标明接连调速器的方位参数。
包括一个结构办法,用于初始化调速器的标识符。
包括一个办法 setPosition,用于设置调速器的方位参数。
重写 updateOutputVoltage 办法,依据方位参数更新输出电压。
重写 getStatus 办法,回来调速器的当时方位参数。
// 接连调速器类,承继自 ControlDevice
class ContinuousSpeedController extends ControlDevice {
double position = 0.00; // 初始档位参数为0.00
ContinuousSpeedController(String id) {
super(id);
}
// 设置档位参数
void setPosition(double position) {
this.position = position;
}
@Override
void updateOutputVoltage() {
outputVoltage = inputVoltage * position;
}
@Override
String getStatus() {
return String.format("@%s:%.2f", id, position);
}
}
ControlledDevice 类:
包括三个成员变量:设备标识符 id,输入电压 inputVoltage,输出电压 outputVoltage。
包括一个结构办法,用于初始化设备标识符。
包括两个笼统办法:updateOutputVoltage 用于更新设备的输出电压,getStatus 用于获取设备的当时状况。
// 受控设备父类
abstract class ControlledDevice {
String id; // 设备标识符
double inputVoltage = 0; // 输入电压
double outputVoltage = 0; // 输出电压
ControlledDevice(String id) {
this.id = id;
}
// 更新输出电压的办法,具体完结由子类完结
abstract void updateOutputVoltage();
// 获取设备状况的办法,具体完结由子类完结
abstract String getStatus();
}
IncandescentLamp 类:
包括一个结构办法,用于初始化白炽灯的标识符。
包括一个办法 calculateBrightness,用于核算灯具的亮度。
重写 updateOutputVoltage 办法,白炽灯不需求更新输出电压。
重写 getStatus 办法,回来灯具的亮度。
// 白炽灯类,承继自 ControlledDevice
class IncandescentLamp extends ControlledDevice {
IncandescentLamp(String id) {
super(id);
}
// 核算亮度
int calculateBrightness(double voltageDifference) {
//略
}
@Override
void updateOutputVoltage() {
// 灯具不需求更新输出电压,依靠电压差
}
@Override
String getStatus() {
double voltageDifference = Math.abs(inputVoltage - outputVoltage);
return "@" + id + ":" + calculateBrightness(voltageDifference);
}
}
FluorescentLamp 类:
包括一个结构办法,用于初始化日光灯的标识符。
包括一个办法 calculateBrightness,用于核算灯具的亮度。
重写 updateOutputVoltage 办法,日光灯不需求更新输出电压。
重写 getStatus 办法,回来灯具的亮度。
// 日光灯类,承继自 ControlledDevice
class FluorescentLamp extends ControlledDevice {
FluorescentLamp(String id) {
super(id);
}
// 核算亮度
int calculateBrightness(double voltageDifference) {
//略
}
@Override
void updateOutputVoltage() {
// 灯具不需求更新输出电压,依靠电压差
}
@Override
String getStatus() {
double voltageDifference = Math.abs(inputVoltage - outputVoltage);
return "@" + id + ":" + calculateBrightness(voltageDifference);
}
}
CeilingFan 类:
包括一个结构办法,用于初始化吊扇的标识符。
包括一个办法 calculateSpeed,用于核算电扇的转速。
重写 updateOutputVoltage 办法,吊扇不需求更新输出电压。
重写 getStatus 办法,回来电扇的转速。
// 吊扇类,承继自 ControlledDevice
class CeilingFan extends ControlledDevice {
CeilingFan(String id) {
super(id);
}
// 核算转速
int calculateSpeed(double voltageDifference) {
//略
}
@Override
void updateOutputVoltage() {
// 电扇不需求更新输出电压,依靠电压差
}
@Override
String getStatus() {
double voltageDifference = Math.abs(inputVoltage - outputVoltage);
return "@" + id + ":" + calculateSpeed(voltageDifference);
}
}
FloorFan 类:
包括一个结构办法,用于初始化落地扇的标识符。
包括一个办法 calculateSpeed,用于核算电扇的转速。
重写 updateOutputVoltage 办法,落地扇不需求更新输出电压。
重写 getStatus 办法,回来电扇的转速。
// 落地扇类,承继自 ControlledDevice
class FloorFan extends ControlledDevice {
FloorFan(String id) {
super(id);
}
// 核算转速
int calculateSpeed(double voltageDifference) {
//略
}
@Override
void updateOutputVoltage() {
// 落地扇不需求更新输出电压,依靠电压差
}
@Override
String getStatus() {
double voltageDifference = Math.abs(inputVoltage - outputVoltage);
return "@" + id + ":" + calculateSpeed(voltageDifference);
}
}
SeriesCircuit 类:
包括两个成员变量:电路标识符 id 和衔接列表 connections。
包括一个结构办法,用于初始化电路标识符。
包括一个办法 addConnection,用于增加电路衔接。
// 串联电路类
class SeriesCircuit {
String id;
List<String[]> connections = new ArrayList<>();
SeriesCircuit(String id) {
this.id = id;
}
void addConnection(String[] connection) {
connections.add(connection);
}
}
ParallelCircuit 类:
包括两个成员变量:电路标识符 id 和串联电路列表 seriesCircuits。
包括一个结构办法,用于初始化电路标识符。
包括一个办法 addSeriesCircuit,用于增加串联电路。
// 并联电路类
class ParallelCircuit {
String id;
List<SeriesCircuit> seriesCircuits = new ArrayList<>();
ParallelCircuit(String id) {
this.id = id;
}
void addSeriesCircuit(SeriesCircuit seriesCircuit) {
seriesCircuits.add(seriesCircuit);
}
}
Circuit 类:
包括四个成员变量:操控设备映射 controlDevices,受控设备映射 controlledDevices,串联电路映射 seriesCircuits,和并联电路映射 parallelCircuits。
包括四个办法:addControlDevice 增加操控设备,addControlledDevice 增加受控设备,addSeriesCircuit 增加串联电路,addParallelCircuit 增加并联电路。
包括两个办法:processSeriesCircuit 处理串联电路,processParallelCircuit 处理并联电路。
包括一个办法 processCommand,用于处理操控指令。
包括一个办法 calculateVoltages,用于核算电路中一切设备的电压。
包括一个办法 outputStates,用于输出一切设备的状况。
// 电路类,办理一切设备及衔接
class Circuit {
//增加设备,电路
//处理指令
void processSeriesCircuit(String line) {
//略
}
// 核算电压
void calculateVoltages() {
//略
}
// 输出设备状况
void outputStates() {
//略
}
// 获取设备类型的排序优先级
private int getOrder(ControlDevice device) {
//略
}
}
Main 类:
包括 main 办法,是程序的进口点,担任读取输入并模仿电路系统的操作。
在 main 办法中,运用 Circuit 方针来办理电路中的一切设备和衔接。
处理输入数据,创立相应的设备方针,衔接设备,并处理操控指令。
最终,核算电路中的电压并输出一切设备的状况。
三、踩坑与心得
1.答案过错
答案过错往往是核算逻辑过错或许输出的格局有误。需求用到测验用例进行运转测验,经过比对估计输出以及实践输出的不同找出格局过错,比如说榜首次作业有不全对的标题,要求给一半的分,可是事例测验时答案过错,经过实践输出发现是得分与估计输出不同,所以我查看判分部分的代码,才发现是判别不全对的条件写错了。
点击查看代码if (hasAllCorrect && !hasError) {
return fullScore;
} else if (hasError || userAnswers.isEmpty()) {
return 0;
} else {
return fullScore / 2; // 部分正确,给一半分
}
2.非零回来
非零回来这一问题困扰了我良久良久,导致前两次作业不太抱负,首要是不理解非零回来究竟指什么,所以我查找材料,究竟什么对错零回来,得到的答案是这样的:
在PTA平台上提交代码时,呈现“非零回来”过错一般意味着程序在运转过程中遇到了反常状况,导致回来状况码不是零。
然并卵:)仍是没说清楚什么是"回来状况码不是零",接着我持续查导致的原因,总结了以下几点:
一、逻辑过错:
描绘:程序中的逻辑过错或许导致某些条件未被满意,成果抛出未捕获的反常或进入死循环。
解决办法:仔细查看代码逻辑,保证一切条件都被正确处理。运用调试器逐渐履行代码,调查变量的改变,确认导致反常的具体方位和原因。
二、数组或列表越界:
描绘:拜访数组或列表时,索引超出范围。
解决办法:在拜访数组或列表之前,查看索引是否在合法范围内。
三、非零回来值:
描绘:程序中调用了System.exit()并传递了非零值。
解办法:防止直接调用System.exit(),让程序天然完毕以保证回来值为0。
四、输入输出过错:
描绘:如测验读取不存在的文件或将数据写入只读的文件。
解决办法:对输入数据进行有效性查看,保证在处理之前数据的合法性。
我一条一条比对时发现,基本上都是第四种状况,说人话即输入的格局过错导致用户输入为空或不符合预期格局,但是,PTA检测时的输入是固定的,所以仍是代码在解析用户输入时有的整理没有考虑到。
四、改善主张及总结
改善主张:尽管老师说测验样例少是为了让我们自己考虑到各个状况,但我仍是觉得至少能够再把测验的提示写具体一点,或许说在提交时刻完毕之后公布出来,这样也能够在时分总结有哪些状况没有考虑到,下一次编写程序的时分就会有前进,这样到达一个学习的意图。而不是不知道就一直是懵的状况,前一次作业有没考虑进去的状况后边迭代的时分就更难了。
总结:经过本阶段三次标题集的编写以及提交,我在面向方针的思维上有了进一步的了解,学会了许多JAVA的语法函数。但关于一些相关办法还需求进一步学习及研讨,期望上课时能更多的了解这方面的内容。