面向对象程序设计前三次作业总结
前言
这篇博客是完成《面向对象程序设计》(java)课程的前三次PTA作业后的总结。在面向对象程序设计课程的前三次作业中,主要内容有:
- Java语言类和对象、数组的使用
- Java语言Scanner、Collections、ArrayList、Calendar等类的常见用法
- 自定义类属性和方法,类的构造函数(无参构造和有参构造)、函数重载等。
- 正则表达式用于匹配日期的基本用法
- 三次答题判题程序的迭代。
有价值的题目分析
这里只分析一些有价值的题目(太多写不完惹)
第一次作业
1. 设计一个风扇Fan类
题目要求是设计一个Fan类,具有速度常量(SLOW、MEDIUM、FAST)、开关状态、半径和颜色。
需要提供无参构造方法设置默认值,并允许自定义设置风扇参数,并且提供 toString 方法,使得根据风扇状态输出不同的描述信息。
以下为数据的存储定义,包含常量速度与私有的数据,需要搭配查询和修改方法使用。
class Fan {
public static final int SLOW = 1;
public static final int MEDIUM = 2;
public static final int FAST = 3;
// 私有数据域
private int speed; // 风扇的速度
private boolean on; // 风扇是否打开
private double radius; // 风扇的半径
private String color; // 风扇的颜色
}
这道题让我初步认识了类与对象的用法(class一个类,在要用的地方new一个对象)。
2. 成绩计算-2-关联类
题目要求创建一个成绩类 (Grade) 和学生类 (Student) 来模拟学生成绩计算。
Grade 类负责处理平时成绩和期末成绩,并根据题目提供的计算方法计算总成绩。Student 类包含学生基本信息及多门课程成绩,通过组合不同的Grade 对象实现各科成绩关联。程序运行时根据输入计算每个学生的总分和平均分。
类图表示如下:
其中组合Grade对象的代码为
private Grade chineseScore;
private Grade mathScore;
private Grade physicsScore;
这道题让我初步理解了类关联与组合关系的应用。
3. 答题判题程序-1
题目要求实现了一个答题判题程序。
程序分为三个主要类:Question 类用于封装单个题目信息,包括题号、题目内容和标准答案;Exam 类封装整套题目及其操作,如存储和获取题目;AnswerSheet 类关联试卷并存储用户答案,提供判题和输出功能。
主要用了的一些Java提供的数据结构有List。List可以提供动态的多个元素存储,并且不需要我们关心底层的数组大小维护等。
程序按输入题目和答题信息处理判题结果,并输出每道题的题目内容、答案和判题信息。
这道题比较复杂,踩了一下坑,比如在处理输入时,用了一次性输入并分割字符串的方法。因为输入比较的复杂,导致调试时分割字符串调试比较长时间。
AnswerSheet 中,checkAnswers 在这题里面的实现比较绕圈,应该简化。
第二次作业
1. sdut-oop-4-求圆的面积(类与对象)
这道题目在考察对Java类的构造方法、封装和方法调用的掌握,它要求我们定义圆类Circle及里面的一些成员变量、无参和有参构造方法、实现操作private成员变量的方法和toString方法,基本上是把类的基本功能实现了一遍,不是很困难。
Circle类定义私有成员变量radius,并实现两个构造方法,分别用于无参和有参对象的初始化;无参构造将半径设为2,有参构造接受用户输入的半径,若输入值为0或负数,则默认设为2。Circle类的set和get方法用于半径赋值和获取,getArea()计算面积,toString()格式化输出。
2. Java类与对象-汽车类
本题要求设计一个用于描述汽车的类 Car,包含车主姓名、当前速率、和当前方向盘的转向角度,并实现用于改变汽车速率和停车的操作方法。
在实现过程中,我定义了 Car 类的私有成员变量 ownerName,curSpeed,curDirInDegree 分别表示车主姓名、当前速度和方向盘的转向角度。
类的构造方法用于初始化汽车信息,并在类中定义了两个主要操作方法:changeSpeed(float curSpeed) 用于设置新的车速,stop() 用于将车速设为0。
getOwnerName()、getCurSpeed() 和 getCurDirInDegree() 这三个查询方法,分别获取车主姓名、当前速度、和当前方向盘角度。
通过本题,加深理解了类的构造方法、封装性以及如何定义与调用对象的成员方法等内容。
3. 答题判题程序-2
本题与上次作业不同之处在于:
- 需要输入试卷信息。
- 在输入格式上,增加了程序输入信息分三种,三种信息可能会打乱顺序混合输入。
- 每组答案包含某个试卷信息中的题目的解题答案,答案的顺序与试卷信息中的题目顺序相对应。
- 试卷总分警示:总分分值不等于100分时作提示之用。
因此针对本题,设计类图如下:
主要更改的地方有:
- 使用 HashMap 来存储试卷编号和题目编号的关联信息,提供灵活性,这样设计可以让不同试卷编号关联到不同的题目集合和分数。
- checkAnswers 方法增加了根据判题结果累计分数,并输出总分。
- 增加了检查总分是否为 100 分,否则输出警告。
- ...
本题我的代码相比上一次作业功能上更加完善,功能上也更模块化,便于下次还有这道题时扩展。但也存在一些缺点和改进空间。因为从上次的题目迁移过来,所以在有些地方(getQuestion方法)使用的遍历方法访问并查找题目编号,效率其实是很低的,如果用Map会更好一点。
我并没有通过所有测试点,主要错的地方在于“2套试卷、2分答卷、不满100分、答案为空”、“2试卷2答卷 满分不是100 答案有缺失 答卷试卷号不匹配”和“各种情况皆有”。所以我应该在补练题上尝试完善我的代码,让它可以成功运行。
第三次作业
1. jmu-java-日期类的基本使用
题目要求编写一个程序,对输入的日期字符串进行验证和处理。
输入一个单个日期的字符串,格式为"YYYY-MM-dd";如果该日期有效,程序需要输出其相关信息,包括是否为闰年、在当年的第几天、在当月的第几天,以及在一周中的第几天。若该日期无效,程序则输出自定义的错误信息。
第二行输入两个日期字符串,用空格分隔,分别代表起始日期和结束日期。程序首先验证这两个日期是否有效。如果任一日期无效,则输出自定义错误提示;
如果两个日期均合法,则进一步判断结束日期是否晚于或等于起始日期。如果日期区间有效,程序将输出两个日期之间的天数差、月份差和年份差;如果结束日期早于起始日期,则输出说明日期区间不合法的错误信息。
为此要使用Calendar类。引用Calendar类的描述:
public abstract class Calendar
extends Object
implements Serializable, Cloneable, Comparable<Calendar>
所述Calendar类是一个抽象类,可以为在某一特定时刻和一组之间的转换的方法calendar fields如YEAR , MONTH , DAY_OF_MONTH , HOUR ,等等,以及用于操纵该日历字段,如获取的日期下个星期。 瞬间可以用毫秒值表示,该值是1970年1月1日格林威治标准时间1970年1月1日00:00:00,000(格里高利)的Epoch的偏移量。
方法 | 描述 |
---|---|
boolean after(Date date) |
若调用此方法的 Date 对象在指定日期之后则返回 true ,否则返回 false 。 |
boolean before(Date date) |
若调用此方法的 Date 对象在指定日期之前则返回 true ,否则返回 false 。 |
Object clone() |
返回此对象的副本。 |
int compareTo(Date date) |
比较调用此方法的 Date 对象和指定日期。相等时返回 0 ,在指定日期之前则返回负数,之后返回正数。 |
int compareTo(Object obj) |
若 obj 是 Date 类型,则操作同 compareTo(Date) ;否则抛出 ClassCastException 。 |
boolean equals(Object date) |
若调用此方法的 Date 对象和指定日期相等则返回 true ,否则返回 false 。 |
long getTime() |
返回自1970年1月1日00:00:00 GMT以来此 Date 对象表示的毫秒数。 |
int hashCode() |
返回此对象的哈希码值。 |
void setTime(long time) |
用自1970年1月1日00:00:00 GMT以后的 time 毫秒数设置时间和日期。 |
String toString() |
把此 Date 对象转换为以下格式的字符串:dow mon dd hh:mm:ss zzz yyyy ,其中 dow 表示星期几(Sun, Mon, Tue, Wed, Thu, Fri, Sat)。 |
程序逻辑上,实现了parseDate将字符串转换为Date对象并进行解析为Date。单个日期设计了handleSingleDate, 处理单个日期,计算日期的各种属性,如判断日期是否是闰年、当年第几天、当月第几天、当周第几天。
同时有一个坑:Java的Date类,默认一周第一天为周日(西方),为此需要加入一段代码来修正为东方时间:
if( dayOfWeek != Calendar.SUNDAY && dayOfWeek <= Calendar.SATURDAY) {
dayOfWeek -= 1;
}
else if(dayOfWeek == Calendar.SUNDAY) {
dayOfWeek = 7;
}
多个日期需要计算天数差、月份差、年份差。
2. 答题判题程序-3
本题与上次作业不同之处在于:
- 学生信息、删除题目信息
- 程序输入信息分五种,信息可能会打乱顺序混合输入。
- 学生信息
- 删除题目信息
- 增加的两种提示信息
根据题目要求设计类图如下:
修改处为:
- 增加了 #D: 前缀的输入处理,用于删除指定题目。Question 类实例增加 isDeleted ,delete 方法被标记删除。
- 格式错误和警告信息存储:使用列表存储formatErrors 和 warnings。
- 新增 Student 类存储学号和姓名。
- ....
改进方面,这次的代码有一些可以更改的地方,例如:
- Main类负责的内容太多了(达到了150行)。目前 Main 类负责了信息处理、数据存储和错误输出,应该拆分开职责。
- 答卷类的
private String studentId; // 学生学号
可以直接是Student类的引用。但是这样改也有个问题,如果先输入答卷再输入学生就会遇到查找不到有这个Student实例的情况,所以需要再想一想。
学到了什么的总结
在完成《面向对象程序设计》(Java)课程的前三次PTA作业后,我对Java的基础知识和面向对象编程的核心概念有了更深入的理解。我在学习和实践中也有了一些总结:在设计Fan、Grade、Student、Car等类的过程中,我体会到了类的定义、属性和方法的设计思路,我了解了如何设计封装对象;Scanner、ArrayList、HashMap、Calendar等Java核心类简化了数据输入、集合存储、日期处理等操作,是Java方便易用的核心,应该多去了解。
有关类的关联、组合概念,我在Grade和Student的设计时有所涉及,类和对象之间应该有合理的关联。
完成答题判题程序时我需要进行很多的错误调试,这让我学到了很多有关程序调试输出的知识。
在设计时,我使用了PowerDseigner进行类图设计。我体会到使用类图辅助我们类设计可以更好地划分类职责关系,提升代码编写时候的清晰度。
这三次PTA作业让我在实践中加深了对Java和面向对象编程的理解,对于还没通过的题目我还要继续去尝试完成,并在日后的练习里面多使用现在学到的一些方法和知识。
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】凌霞软件回馈社区,博客园 & 1Panel & Halo 联合会员上线
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】博客园社区专享云产品让利特惠,阿里云新客6.5折上折
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· DeepSeek “源神”启动!「GitHub 热点速览」
· 我与微信审核的“相爱相杀”看个人小程序副业
· 微软正式发布.NET 10 Preview 1:开启下一代开发框架新篇章
· C# 集成 DeepSeek 模型实现 AI 私有化(本地部署与 API 调用教程)
· spring官宣接入deepseek,真的太香了~