三次大作业总结性blog
前言:
第一次大作业:
1.题量:这次的大作业有五道题,题量较大。
2.难度:第一次大作业的难度适中,前三题难度较为简单,难度主要是集中在最后一题:答题判题程序-1。
3.知识点的使用:
第一次大作业使用了以下Java知识点:
(1)类与对象:如定义了Fan类,表示风扇,包括风速、开关、半径和颜色等属性。通过类的构造方法和各个getter和setter方法来进行属性的初始化和访问。
(2)面向对象编程:如最后一题代码中定义了Question类和Paper类,分别表示试题和试卷(一组题)。
(3)集合类:有代码中使用了ArrayList类,用于存储试题、答案和判题结果等数据。
(4)字符串处理:有代码中使用了String类的一些方法,如trim()、split()以及replaceAll()等,用于去掉字符串中的空格、分割字符串和替换字符串中的字符等操作。
(5)输入输出流:代码中使用Scanner类从控制台读取用户输入,以及使用System.out.println()和System.out.print()等方法输出数据。
(6)条件语句和循环语句:代码中使用了if、while和for等语句,用于控制程序流程和实现各种功能。
(7).数据类型:使用基本数据类型,如第一题中int、boolean和double等,来存储风扇的属性。使用String类型来存储风扇的颜色。
第二次大作业:
1.题量:第二次大作业共有四道题,题量适中。
2.难度:第二次大作业的难度适中,相较于第一次大作业难度肯定有所提升,但难度仍然集中于最后一题:答题判题程序-2。该题是由第一次大作业的最后一题迭代而成,增加了乱序输入,试卷信息,试卷总分,答卷分值等相关功能。
3.知识点:
第二次大作业使用了以下Java知识点:
(1)类与对象的概念、构造函数、成员变量、成员方法
(2)集合框架的使用,如 List、Map等
(3)字符串的处理,包括 split、trim 等方法的使用
(4)输入输出流的基本操作,包括 Scanner 和 System.out.println等
(5)条件语句 if 和循环语句 for 的使用
(6)异常机制的概念和 try-catch 语句的使用
(7)常用数据类型的转换,包括 String 到 int、List 到数组等的转换
(8) Map 的键值对操作,包括 put、get 等方法的使用
(9)对象的比较和筛选,包括 filter、findFirst 等方法的使用。
第三次大作业:
1.题量:第三次大作业共有三道题,题量较少。
2.难度:第三次大作业的难度较大,相较于前两次大作业的难度大有提升,前两题的难度也有所提高,难度也还是集中于最后一题:答题判题程序-3。难度迭代提高不少,增加了学生信息,题目删除信息,引用题目错误提示等功能。
3.知识点:
第三次大作业使用了以下Java知识点:
(1)类与对象的概念、构造函数、成员变量、成员方法
(2)集合框架的使用,包括 List、Map 等
(3)字符串的处理,包括 split、substring 等方法的使用
(4)输入输出流的基本操作,包括 Scanner 和 System.out.println 等
(5)条件语句 if 和循环语句 for 的使用
(7)异常机制的概念和 try-catch 语句的使用
(8)常用数据类型的转换,包括 String 到 int、List 到数组等的转换
(9)Map 的键值对操作,包括 put、get 等方法的使用,例如在处理试卷题目和答案时使用Map来存储数据,使用put方法向Map中添加数据,使用get方法获取Map中的数据。
(10)对象的比较和筛选,包括 filter、stream 等方法的使用。 如List中的对象进行筛选和排序。
设计与分析:
一.SourceMontor分析
我对我三次大作业的最后一题的代码进行了SourceMontor分析生成报表内容。
第一次大作业报表如下图:
我们可以看到代码总体信息:
1.总行数(Lines):141
2.语句数目(Statements):80
3.分支语句比例(Percent Branch Statements):13.8%
4.注释比例(Percent Lines with Comments):8.5%
5.包含的类和接口的总数量:4
6.平均类包含方法:3.5
7.平均每个函数包含的语句数目:3.39
8.函数调用语句:39
第二次大作业报表如下:
1.总行数(Lines):205
2.语句数目(Statements):125
3.分支语句比例(Percent Branch Statements):8.8%
4.注释比例(Percent Lines with Comments):0%
5.包含的类和接口的总数量:4
6.平均类包含方法:6.75
7.平均每个函数包含的语句数目:3.07
8.函数调用语句:108
第三次大作业报表如下:
1.总行数(Lines):337
2.语句数目(Statements):210
3.分支语句比例(Percent Branch Statements):20%
4.注释比例(Percent Lines with Comments):0.3%
5.包含的类和接口的总数量:6
6.平均类包含方法:4.00
7.平均每个函数包含的语句数目:4.57
8.函数调用语句:140
二.powerdesigner制作的相应类图
我对我三次大作业的最后一题的代码也进行了powerdesigner设计相应的类图。
第一次大作业:
Question类的作用是存储题目的相关信息。Paper类的作用是存储试卷信息,也就是题目集。AnswerSheet的作用是存储答案信息。其中Paper和与Question是聚合关系。Main则与所有类有关联依赖。
第二次大作业
Question类的作用是存储题目的相关信息。Test类的作用是存储试卷信息,也就是题目集。AnswerSheet的作用是存储答案信息。其中Test和与Question是聚合关系。AnswerSheet和与Question是聚合关系。Main则与所有类有关联依赖。
第三次大作业
Question类的作用是存储题目的相关信息。Test类的作用是存储试卷信息,也就是题目集。AnswerSheet的作用是存储答案信息。Student是存储学生信息。其中Test和与Question是聚合关系。AnswerSheet和与test是关联关系。AnswerSheet通过test与Question有间接关系。Main则与所有类有关联依赖。
三.心得:
通过这三次大作业的设计与分析,我明白了每一个类都应该有清晰的职责分配,并且其中部分类之间还有重要的关系。通过分析代码产生的类图,我认识到了代码结构清晰的重要性。并且我学到了类图是将理论转化为实际操作的有力工具,它既反映了设计思想,也有助于理解和交流实际的系统结构。通过构建类图,可以更深入地理解系统,并为代码的实际编写提供有价值的指导。
踩坑心得:
一.第一次大作业的踩坑:
1.因为是第一次大作业的书写,对代码的类构建,方法调用仍不熟悉,发生了类属性的调用错误,在对类属性进行状态定义为private后,类中的方法构造并未使用public,导致调用的错误,改进后class Question {
private int number;
private String content;
private String answer;
public Question(int number, String content, String answer) {
this.number = number;
this.content = content;
this.answer = answer; }
}
2.在做分析读取试卷题目时,未进行空格符号的去除,导致输出紊乱,输出错误,导致后来在进行题目提取错误,答案错误。
后来更改代码for (int i = 0; i < numOfQuestions; i++) {
String line = scanner.nextLine().trim(); // 去掉多余空格符
String[] parts = line.split(" ");
int number = Integer.parseInt(parts[0].substring(3));
String content = parts[1].substring(3).trim(); // 去掉多余空格符
String answer = parts[2].substring(3).trim(); // 去掉多余空格符
Question question = new Question(number, content, answer);
paper.addQuestion(question);
}
二.第二次大作业的踩坑:
在进行数据判定和输出时,输出时的判定出错,
相关代码: for (Question p : test.getQuestions()) {
if(x>= answerSheet.getQuestions().size())
{
System.out.println("answer is null");
continue;
}
if (p.getAnswer().equals(String.valueOf(answerSheet.getQuestions().get(x)))) {
p.setinscore(test.getQuestions().get(x).getGetscore());
System.out.println(p.getStr() + "~" + answerSheet.getQuestions().get(x) + "~" + "true");
} else {
p.setinscore(0);
System.out.println(p.getStr() + "~" + answerSheet.getQuestions().get(x) + "~" + "false");
}
测试结果:输入:#N:1 #Q:1+1= #A:2
#N:2 #Q:2+2= #A:4
#T:1 1-5 2-8
#S:1 #A:5 #A:22
End
输出:alert: full score of test paper1 is not 100 points
1+1 = 5false
answer is null
0 0~0
但样例输出是 alert: full score of test paper1 is not 100 points
1+1 = 5false
2+2 = 22false
0 0~0
但由于时间关系,在做此blog前也未能完成修正。
三.第三次大作业的踩坑:
问题所在是在处理 #N: 标记的行时,我期望有三个由空格分隔的部分(分别代表问题编号、问题以及答案),而提供的示例里问题编号和问题没有用空格隔开。这就导致了 parts 数组的长度不等于3,进而触发 "wrong format" 的输出导致重复输出。
输入:#N:1 +1= #A:2
#N:2 #Q:2+2= #A:4
#T:1 1-5 2-8
#X:20201103 Tom-20201104 Jack-20201105 Www
#S:1 20201103 #A:1-5 #A:2-4
#D:N-2
End
输出:
wrong format:#N:1 +1= #A:2
wrong format:#N:1 +1= #A:2
alert: full score of test paper1 is not 100 points
non-existent question~0
the question 2 invalid~0
20201103 Tom: 0 0~0
样例输出:
wrong format:#N:1 +1= #A:2
alert: full score of test paper1 is not 100 points
non-existent question~0
the question 2 invalid~0
20201103 Tom: 0 0~0
改进心得:调整代码来适应不同的输入格式:if (line.startsWith("#N:")) { String[] parts = line.split("#Q:| #A:"); if (parts.length != 3) { System.out.println("wrong format:" + line); } else { String numberPart = parts[0].substring(3).trim(); String content = parts[1].trim(); String answer = parts[2].trim(); ... } }
改进建议:
1.处理无效输入。
2.提高代码可读性:每一个算法或复杂的操作应该通过方法进行封装,以简化 main 方法中的逻辑并提高可读性。
3.强化错误检查:在添加答案之前,确保它们的编号是有效的,即存在于问题集中。若非如此,给出错误提示或采取其他操作。
4.优化数据结构:Paper 类中使用线性搜索去寻找题目是低效的(时间复杂度O(n)),可以考虑将 ArrayList 替换为 HashMap 来改善性能,特别是在大量题目的情境下。
5.避免不必要的操作。
6.持续优化。
总结:
这三次的大作业题目集,对于我个人来说是很有难度,我个人的逻辑思维差,而java编码恰恰就需要复杂的逻辑思维去梳理题目的信息,我这几次的大作业是做的很差。但我也希望我能在这一次次大作业中得到提升。
一.学习点:
1.输入验证与错误处理:
学习到了如何处理和验证用户输入,使程序能够优雅地处理不可预见的输入,包括非法格式和意外的数据类型。
2.代码的可读性和可维护性:
从代码示例中体会到,清晰和模块化的代码结构对于长期维护与读懂代码意图是多么重要。
3.数据结构的选择:
对如何根据需求选择合适的数据结构有了更深的理解,例如当需要优化搜索操作时使用 HashMap 而不是 ArrayList。
4,异常处理机制:
了解了异常处理的原则和在代码中实现异常处理的方法,以增强代码的健壮性。
5.面向对象设计原则:
学习到了诸如单一职责原则在实际编码中的应用,并理解了这些原则如何促进了代码的整洁与可扩展性。
二.进一步学习的方向:
学习如何有效地编写单元测试,是确保代码质量的关键。
1.性能优化:
代码示例中提出了有关性能优化的建议,这是一个持续的学习过程,特别是在处理大数据量时。
2.设计模式的运用:
进一步学习和实践设计模式,理解在何种场景下应用哪种设计模式。
三.改进建议及意见:
1.教材和教学方法:
课堂教学可以更多地包含实际案例,通过实际项目来加深对理论知识的理解。
2.实验和课下活动:
安排更多实践性实验和编程练习,为学生提供一个可以立即应用所学知识的平台。
3.课堂互动:
增加课堂互动,例如通过编程竞赛或代码审查会议来促进学生的积极参与。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· 25岁的心里话
· ollama系列01:轻松3步本地部署deepseek,普通电脑可用
· 按钮权限的设计及实现