面向对象程序设计前三次作业总结

前言

这篇博客是完成《面向对象程序设计》(java)课程的前三次PTA作业后的总结。在面向对象程序设计课程的前三次作业中,主要内容有:

  1. Java语言类和对象、数组的使用
  2. Java语言Scanner、Collections、ArrayList、Calendar等类的常见用法
  3. 自定义类属性和方法,类的构造函数(无参构造和有参构造)、函数重载等。
  4. 正则表达式用于匹配日期的基本用法
  5. 三次答题判题程序的迭代。

有价值的题目分析

这里只分析一些有价值的题目(太多写不完惹)

第一次作业

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

本题与上次作业不同之处在于:

  1. 需要输入试卷信息。
  2. 在输入格式上,增加了程序输入信息分三种,三种信息可能会打乱顺序混合输入。
  3. 每组答案包含某个试卷信息中的题目的解题答案,答案的顺序与试卷信息中的题目顺序相对应。
  4. 试卷总分警示:总分分值不等于100分时作提示之用。

因此针对本题,设计类图如下:

主要更改的地方有:

  1. 使用 HashMap 来存储试卷编号和题目编号的关联信息,提供灵活性,这样设计可以让不同试卷编号关联到不同的题目集合和分数。
  2. checkAnswers 方法增加了根据判题结果累计分数,并输出总分。
  3. 增加了检查总分是否为 100 分,否则输出警告。
  4. ...
    本题我的代码相比上一次作业功能上更加完善,功能上也更模块化,便于下次还有这道题时扩展。但也存在一些缺点和改进空间。因为从上次的题目迁移过来,所以在有些地方(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) objDate 类型,则操作同 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

本题与上次作业不同之处在于:

  1. 学生信息、删除题目信息
  2. 程序输入信息分五种,信息可能会打乱顺序混合输入。
  3. 学生信息
  4. 删除题目信息
  5. 增加的两种提示信息
    根据题目要求设计类图如下:

修改处为:

  1. 增加了 #D: 前缀的输入处理,用于删除指定题目。Question 类实例增加 isDeleted ,delete 方法被标记删除。
  2. 格式错误和警告信息存储:使用列表存储formatErrors 和 warnings。
  3. 新增 Student 类存储学号和姓名。
  4. ....

改进方面,这次的代码有一些可以更改的地方,例如:

  1. Main类负责的内容太多了(达到了150行)。目前 Main 类负责了信息处理、数据存储和错误输出,应该拆分开职责。
  2. 答卷类的private String studentId; // 学生学号可以直接是Student类的引用。但是这样改也有个问题,如果先输入答卷再输入学生就会遇到查找不到有这个Student实例的情况,所以需要再想一想。

学到了什么的总结

在完成《面向对象程序设计》(Java)课程的前三次PTA作业后,我对Java的基础知识和面向对象编程的核心概念有了更深入的理解。我在学习和实践中也有了一些总结:在设计Fan、Grade、Student、Car等类的过程中,我体会到了类的定义、属性和方法的设计思路,我了解了如何设计封装对象;Scanner、ArrayList、HashMap、Calendar等Java核心类简化了数据输入、集合存储、日期处理等操作,是Java方便易用的核心,应该多去了解。
有关类的关联、组合概念,我在Grade和Student的设计时有所涉及,类和对象之间应该有合理的关联。
完成答题判题程序时我需要进行很多的错误调试,这让我学到了很多有关程序调试输出的知识。
在设计时,我使用了PowerDseigner进行类图设计。我体会到使用类图辅助我们类设计可以更好地划分类职责关系,提升代码编写时候的清晰度。

这三次PTA作业让我在实践中加深了对Java和面向对象编程的理解,对于还没通过的题目我还要继续去尝试完成,并在日后的练习里面多使用现在学到的一些方法和知识。

posted @   邓凯晋  阅读(22)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· DeepSeek “源神”启动!「GitHub 热点速览」
· 我与微信审核的“相爱相杀”看个人小程序副业
· 微软正式发布.NET 10 Preview 1:开启下一代开发框架新篇章
· C# 集成 DeepSeek 模型实现 AI 私有化(本地部署与 API 调用教程)
· spring官宣接入deepseek,真的太香了~
点击右上角即可分享
微信分享提示