第一次博客作业

news/2025/3/15 20:59:56/文章来源:https://www.cnblogs.com/030810cmw/p/18504143

一、前言:
第一个题目集:
知识点:
包括类的定义、属性(成员变量)、方法(成员函数)以及构造函数。
封装:通过私有化数据域并提供公共的访问器(getter)和修改器(setter)来保护对象内部状态。
构造函数:无参构造函数和带参数构造函数的使用。
字符串表示:重写toString()方法以返回对象的状态信息。
数组与集合:使用数组存储多个对象,并遍历它们进行操作。
关联类:理解一个类如何包含另一个类的对象作为其属性。
输入输出:从用户获取输入,并将结果输出到控制台。
题量:
设计一个风扇Fan类、创建一个学生Student类及其测试、学生成绩计算(基本运用)、学生成绩计算(关联类)、 答题判题程序-1,在当时刚接触java的情况下确实有点多,主要是没教就让写。
难度:
设计一个风扇Fan类:中等难度。需要理解常量、私有数据域、构造函数及自定义的toString()方法。
创建一个学生Student类及其测试:中等难度。除了基本的类设计外,还需要实现对用户的输入处理。
学生成绩计算(基本运用):中等难度。涉及到数组的使用以及简单的数学运算。
学生成绩计算(关联类):较高难度。不仅需要处理成绩计算,还需要处理类之间的关系,即一个类内嵌入了另一个类的对象。
答题判题程序-1:难度高。刚接触java没有那么强的抽象能力,不能又快又精准得抽象出类以及类与类之间得关系,不仅如此,还要自学java自带的封装类数据中自带的方法、java的数组、对象数组、集合容器。
第二个题目集:
知识点:
面向对象编程基础(类、对象、属性、方法)
接口的实现
集合框架的使用
输入输出操作
基本数学运算
题量:
手机按价格排序、查找、求圆的面积(类与对象)、Java类与对象-汽车类、 答题判题程序-2。数量已经能够接受了。
难度:
手机按价格排序、查找:低难度。除了没教接口,没教怎么重写方法,剩下的不用动脑。
求圆的面积(类与对象):低难度。在给出大框架的情况下做代码的填充是相对简单的,但是出题的人是不是语文没学好,简易回去重新学一下语文。
Java类与对象-汽车类:中等难度。给出大框架进行补充,只需要补全没有的方法,在已经知道方法的返回类型以及参数列表的情况下十分简单。
答题判题程序-2:难度高。在第一次的基础上做修改,新增了试卷信息中的分数分布,类与类之间的关系结构也变化了。
第三个题目集:
知识点:
类的设计与封装
构造函数与成员方法
数据验证与异常处理
日期处理和计算
题量:
面向对象编程(封装性)、日期类的基本使用、答题判题程序-3。题目少但是难。
难度:
面向对象编程(封装性):低难度。使用在前面已经学到的知识就能解决问题。
日期类的基本使用:中难度。日期类的学习和使用不难,难得是题目里各种要求。
答题判题程序-3:难度高。在第二题的基础上新增了学号这一属性和其他限制性条件。类与类之间的关系和结构更加复杂了

二、设计与分析:
因为其他题目相较于题目集1~3的最后一题难度太低,在这不做分析。
答题判题程序-1:
类设计
Question (题目类)
属性:
int number: 题目编号
String content: 题目内容
String standardAnswer: 标准答案
方法:
boolean checkAnswer(String answer): 检查给定的答案是否与标准答案匹配
getter 和 setter 方法
Paper (试卷类)
属性:
List questions: 题目列表
int questionCount: 题目数量
方法:
void addQuestion(Question q): 添加一个新的题目到试卷中
Question getQuestion(int number): 根据题号获取题目
boolean checkAnswer(int number, String answer): 根据题号和答案,检查答案对错
List getAllQuestions():返回有序的题目列表
AnswerSheet (答卷类)
属性:
Paper paper: 对应的试卷
Map<Integer, String> answers: 答案列表,键为题号,值为答案
Map<Integer, Boolean> results: 判题结果列表,键为题号,值为true/false
方法:
void saveAnswer(int number, String answer): 保存一个题目的答案
void output(): 打印题目及其对应的答案

点击查看代码
public class Question {private int number; // 题目编号private String content; // 题目内容private String standardAnswer; // 标准答案public Question() {}public Question(int number, String content, String standardAnswer) {this.number = number;this.content = content.trim();this.standardAnswer = standardAnswer.trim();}public void setStandardAnswer(String standardAnswer) {this.standardAnswer = standardAnswer;}public boolean checkAnswer(String answer) {return standardAnswer.equals(answer.trim());}}
public class Paper {private HashMap<Integer, Question> questions = new HashMap<>();private int count = 0;public Question getQuestion(int number) {return questions.get(number);}public void addQuestion(int number, String content, String standardAnswer) {questions.put(number, new Question(number, content, standardAnswer));count++;}public boolean checkAnswer(int number, String answer) {Question question = getQuestion(number);return question != null && question.checkAnswer(answer);}public List<Question> getAllQuestions() {List<Question> questionList = new ArrayList<>();for (int i = 1; i <= count; i++) {questionList.add(questions.get(i));}return questionList;}
}public class AnswerSheet {private Paper paper; // 试卷对象private List<String> answers = new ArrayList<>(); // 答案列表private List<Boolean> results = new ArrayList<>(); // 判题结果列表public AnswerSheet(Paper paper) {this.paper = paper;}public void saveAnswer(int number, String answer) {answers.add(answer.trim());results.add(paper.checkAnswer(number, answer));}public void output() {List<Question> questionList = paper.getAllQuestions();for (Question question : questionList) {int number = question.getNumber();String answer = answers.get(number - 1);System.out.println(question.getContent() + " ~" + answer);}for (Boolean result : results) {System.out.print((result ? "true" : "false") + " ");}System.out.println();}
}

答题判题程序-2:
判题程序2在一的基础上添加了多张答卷以及题目有分数,答卷的试卷可能是一样的也可能不一样。若继续使用一中高耦合度的代码则会出现数据的冗余以及难修改的坏处。
Question类:
属性: number (题目编号), content (题目内容), standardAnswer (标准答案)
方法: isCorrect(String answer) (检查给定的答案是否正确)
Paper类:
属性: paperNumber (试卷编号), questionScoreMap (题号到分值的映射), totalScore (总分)
方法: addQuestion(int questionNumber, int score) (添加题目及其分值), isFullScoreValid() (检查总分是否为100)
AnswerSheet类:
属性: paperNumber (试卷编号), answers (答案列表)
构造函数: AnswerSheet(int paperNumber, List answers)

点击查看代码
public class Question {int number;String content;String standardAnswer;public Question(int number, String content, String standardAnswer) {this.number = number;this.content = content;this.standardAnswer = standardAnswer;}public boolean isCorrect(String answer) {return this.standardAnswer.equals(answer);}
}
public class Paper {int paperNumber;Map<Integer, Integer> questionScoreMap;int totalScore;public Paper(int paperNumber) {this.paperNumber = paperNumber;this.questionScoreMap = new LinkedHashMap<>();this.totalScore = 0;}public void addQuestion(int questionNumber, int score) {questionScoreMap.put(questionNumber, score);totalScore += score;}public boolean isFullScoreValid() {return totalScore == 100;}
}
public class AnswerSheet {int paperNumber;List<String> answers;public AnswerSheet(int paperNumber, List<String> answers) {this.paperNumber = paperNumber;this.answers = answers;}
}
答题判题程序-3: 第三题新增学生信息,学生信息和试卷绑定,可以删除题目,题目被删除之后,引用该题目的试卷依然有效,但被删除的题目将以0分计,同时在输出答案时,题目内容与答案改为一条失效提示。 Question类: 属性: number (题目编号), content (题目内容), standardAnswer (标准答案), isValid (题目是否有效) 方法: isCorrect(String answer) (检查给定的答案是否正确), invalidate() (使题目无效), isValid() (检查题目是否有效) Paper类: 属性: paperNumber (试卷编号), questionScoreMap (题号到分值的映射), totalScore (总分) 方法: addQuestion(int questionNumber, int score) (添加题目及其分值), isFullScoreValid() (检查总分是否为100) Student类: 属性: studentId (学生ID), name (学生姓名) 构造函数: Student(int studentId, String name) AnswerSheet类: 属性: paperNumber (试卷编号), studentId (学生ID), answers (答案列表) 构造函数: AnswerSheet(int paperNumber, int studentId, List answers) 逻辑流程 读取输入数据。 根据输入行的前缀(#N:、#T:、#X:、#S:、#D:N-)解析不同的信息类型(题目、试卷、学生、答卷、取消题目)。 将题目存储在questionMap中,试卷存储在paperMap中,学生存储在studentMap中,答卷存储在answerSheets列表中。 对每个答卷进行处理: 检查试卷是否存在。 如果试卷总分不等于100,输出警告。 获取学生的姓名。 遍历试卷中的每道题目,根据答卷中的答案进行判题,并计算分数。 输出每道题目的答题情况及最终得分。 输出学生的成绩。
点击查看代码
class Question {int number;String content;String standardAnswer;boolean isValid = true;public Question(int number, String content, String standardAnswer) {this.number = number;this.content = content;this.standardAnswer = standardAnswer;}public boolean isCorrect(String answer) {return this.standardAnswer.equals(answer);}public void invalidate() {this.isValid = false;}public boolean isValid() {return this.isValid;}}class Paper {int paperNumber;Map<Integer, Integer> questionScoreMap;int totalScore;public Paper(int paperNumber) {this.paperNumber = paperNumber;this.questionScoreMap = new LinkedHashMap<>();this.totalScore = 0;}public void addQuestion(int questionNumber, int score) {questionScoreMap.put(questionNumber, score);totalScore += score;}public boolean isFullScoreValid() {return totalScore == 100;}
}class Student {int studentId;String name;public Student(int studentId, String name) {this.studentId = studentId;this.name = name;}
}class AnswerSheet {int paperNumber;int studentId;List<String> answers;public AnswerSheet(int paperNumber, int studentId, List<String> answers) {this.paperNumber = paperNumber;this.studentId = studentId;this.answers = answers;}
}

三、采坑心得:对源码的提交过程中出现的问题及心得进行总结,务必做到详实,拿数据、源码及测试结果说话,切忌假大空
第二次作业我想在第一次的基础上修改,但是我发现因为一张试卷要被多个答卷使用,所以试卷类就不能存放题目类,只能存放分数。题目、试卷、答卷就要在主方法里新建,再根据组合关系进行组合,这样可以提高代码的自由度。

四、改进建议:
第一个题目耦合度太高了,改一个地方,很多地方要改;但是第二次第三次耦合度很低修改类中方法只需要在使用的地方修改使用过程。还有在Main类的主方法中放太多代码了,说明代码还是不够抽象,没有把读入、处理抽象成方法。每次不同题目Main的主方法就要重写一遍,有点偏向面向过程编程了。同时我对java本身自带的对象类数据不够了解,导致我在处理数据时没有使用更优的处理方法。

五、总结:
模块化设计的重要性:
通过将代码分解成多个类和方法,每个部分负责一个具体的职责,这样不仅提高了代码的可读性,也使得维护和扩展变得更加容易。例如,Question、Paper、Student 和 AnswerSheet 类分别封装了题目、试卷、学生和答卷的信息,而Main类则负责整个流程的控制。
异常处理的价值:
在实际开发中,输入数据往往不会总是完美无缺。因此,在解析输入时增加异常处理是非常重要的。这不仅可以帮助我们捕获并处理意外情况,还可以提升程序的健壮性和用户体验。
面向对象编程的优势:
利用面向对象的思想来组织代码,比如使用继承、封装和多态等特性,可以让程序更加灵活。在这个例子中,虽然没有直接体现这些高级特性,但通过定义不同的类和它们之间的关系,已经很好地展示了如何使用面向对象的方法解决问题。
测试的重要性:
虽然在这个简短的示例中没有包含单元测试,但在实际项目中编写测试用例是至关重要的。它可以帮助我们在早期发现错误,并确保代码按预期工作。对于复杂的系统来说,自动化测试尤为重要。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/822472.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

第12题——入门级js

题目网址:https://match.yuanrenxue.cn/match/12解题步骤看流量包和其回显数据。只有一个流量包,那就是只要访问该网址就能获取页面数据。看下请求地址的组成。变量m一看就是base64编码,解码看下原字符串。再尝试访问第二页,看看原字符串组成的规律。比较明了了,原字符串就…

高等数学 7.10常系数线性微分方程组解法举例

在研究某些实际问题时,会遇到由几个微分方程联立起来共同确定几个具有同一自变量的函数的情况。这些联立的微分方程称为微分方程组。 如果微分方程组中的每一个微分方程都是常系数线性微分方程,那么,这种微分方程组就叫做常系数线性微分方程组。 对于常系数线性微分方程组,…

2024-10-26:最长公共后缀查询。用go语言,给定两个字符串数组 wordsContainer 和 wordsQuery,要对每个 wordsQuery[i] 找到一个与其有最长公共后缀的字符串

2024-10-26:最长公共后缀查询。用go语言,给定两个字符串数组 wordsContainer 和 wordsQuery,要对每个 wordsQuery[i] 找到一个与其有最长公共后缀的字符串。如果有多个字符串与 wordsQuery[i] 有相同的最长公共后缀,则返回在 wordsContainer 中最早出现的那个。最后,返回一…

PTA第1~3次大作业分析及总结

一、前言 经过数周的努力,第三次大作业也落下了帷幕,这三次大作业从第一次到第三次难度逐渐递增,需求不断地增加,对于初学JAVA的我无疑是一个巨大的考验。 第一次大作业,主要侧重类的简单设计,老师在最后一题给出了类的参考设计,算是对我们java的一个入门考验,既是考验…

使用spi-gpio-custom模块配置SPI总线

使用spi-gpio-custom模块配置SPI总线来源 https://www.xuzhe.tj.cn/index.php/2023/10/26/spi-gpio-customspi/ 参考专栏 https://www.zhihu.com/column/c_16980846677677096961. 引言 SPI(Serial Peripheral Interface)是一种常见的串行通信协议,广泛应用于微控制器与外部设…

开源化验单智能识别:思通数科AI平台引领医疗数据处理新变革

智能化验单识别系统在医疗数据管理中的应用意义体现在多个方面,包括提高数据录入效率、减少人为错误、优化患者体验,以及为医疗研究提供高质量数据支持。以下是智能化验单识别系统在医疗数据高效管理中的主要应用意义:提升数据录入效率,减轻医护人员负担传统的化验单录入多…

关于栈

关于栈栈的图一.什么是堆栈平衡(比较抽象)含义就是 当函数在一步步执行的时候 一直到ret执行之前,堆栈栈顶的地址 一定要是call指令的下一个地址。 也就是说函数执行前一直到函数执行结束,函数里面的堆栈是要保持不变的。 如果堆栈变化了,那么,要在ret执行前将堆栈恢复成原…

简单谈谈Google TPUv6

简单谈谈Google TPUv6 根据Google TPU第六代的数据做了一些性能数据的对比,需要注意的是TPUv6当前应该是一个用于训推一体的单Die的版本,用于训练的V6p双Die版本应该会后期再发布. 需要注意的是在国内外都开始卷大模型推理价格的时候, TPU这样的东西对于提高ROI非常有帮助。快…

GNU编译器(GCC)原理简介

GNU编译器(GCC)原理简介GNU编译器(GCC, GNU Compiler Collection)是GNU工具链的关键组件,与GNU、Linux相关项目的标准编译器。它设计之初仅用来处理C语言的(也被称为GNU C编译器),紧接着扩展到C++、Objective-C/C++、Fortran、Java、Go等编程语言。 目前,GCC已经被以知…

22207130-叶盛东-Java大作业总结

Java大作业总结 目录Java大作业总结一.前言第一次作业1.设计与分析第一小题第二小题第三小题第四小题第五小题2.踩坑心得3.改进建议第二次作业1.设计与分析第一小题第二小题第三小题第四小题2.踩坑心得3.改进建议第三次作业1.设计与分析第一小题第二小题第三小题2.踩坑心得3.改…