NCHU BLOG2
NCHU 面向对象程序设计 Blog 2
前言
关于面向对象的概念:
关于这几次练习:
课程内容总结
PTA第五周题目集
题目
思考:
参考类图:
代码实现:
代码分析:
收获
第六周题目集
题目
思考:
参考类图:
代码实现:
代码分析:
收获
第七周题目集
题目
思考:
参考类图:
代码实现:
代码分析:
收获
5~7周pta题目经验总结
对自己想说的话
关于课程和作业
前言
关于面向对象的概念:
这几次的大作业围绕了继承与多态,抽象类和接口
继承:当多个类有共同属性和行为时(如动物、交通工具)。
多态:实现通用逻辑(如统一处理不同形状的面积计算)。
抽象类:需要部分实现和部分抽象时(如模板方法模式)。
接口:定义纯行为规范(如支付接口、监听器)。
特性 | 继承 | 多态 | 抽象类 | 接口 |
---|---|---|---|---|
目的 | 代码复用 | 行为多样化 | 定义通用模板 | 规范行为契约 |
语法 | extends 关键字 | 方法重写 / 重载 | abstract 类和方法 | interface 关键字 |
实例化 | 子类可实例化 | 依赖继承或接口 | 不能实例化 | 不能实例化 |
多实现 | 单继承 | 不相关 | 单继承 | 多实现 |
抽象方法 | 非必需 | 非必需 | 至少一个 | 全部方法必须抽象 |
关于这几次练习:
这几次练习不算太难 算法与思考也很单纯就是考虑类的设计合不合理 反正代码是能够很轻松的写出来 题目对输入也没有限制
基本上就是一次性写完 每次也没有耗费多少时间 倒是那个实验很折磨人:为什么?因为禁用了复制粘贴 每一个字母得一个一个敲 我感觉敲的时间比我做这个
题目的时间至少快三倍了 地平线不语只是一味地敲一字一句地敲代码 甚至tab键的变量名自动补全也没有 很折磨人就是了
这段时间接触了另一个api爬虫 以及java swing的gui图形界面,利用其做了一个puzzle game 也有增删改查的普通业务逻辑 于我而言 自己写这个puzzlegame很快乐
也挺有收获
PTA第八周题目集
题目:
7-3 NCHU_航空货运管理系统(类设计)
分数 60
中等
作者 段喜龙
单位 南昌航空大学
航空快递以速度快、安全性高成为急件或贵重物品的首选。本题目要求对航空货运管理系统进行类设计,具体说明参看说明文件。
OO第九周作业题目说明.pdf
输入格式:
按如下顺序分别输入客户信息、货物信息、航班信息以及订单信息。
客户编号
客户姓名
客户电话
客户地址
运送货物数量
[货物编号
货物名称
货物宽度
货物长度
货物高度
货物重量
]//[]内的内容输入次数取决于“运送货物数量”,输入不包含“[]”
航班号
航班起飞机场
航班降落机场
航班日期(格式为YYYY-MM-DD)
航班最大载重量
订单编号
订单日期(格式为YYYY-MM-DD)
发件人地址
发件人姓名
发件人电话
收件人地址
收件人姓名
收件人电话
输出格式:
如果订单中货物重量超过航班剩余载重量,程序输出The flight with flight number:航班号 has exceeded its load capacity and cannot carry the order. ,程序终止运行。
如果航班载重量可以承接该订单,输出如下:
客户:姓名(电话)订单信息如下:
航班号:
订单号:
订单日期:
发件人姓名:
发件人电话:
发件人地址:
收件人姓名:
收件人电话:
收件人地址:
订单总重量(kg):
微信支付金额:
货物明细如下:
明细编号 货物名称 计费重量 计费费率 应交运费
1 ...
2 ...
注:输出中实型数均保留1位小数。
思考:
第一眼望去 输入输出很复杂 期中关系也很乱 但总的来说这里就三个很明确的对象 1货物 2购物人 3商家 再仔细分析其中文档
我觉得还有几个类是必要的
1payment抽象类以用来应对不同的购买方式
2order类来承载一个订单里多个货物;
3orderitem类来承载多个订单;
4ordermanager类来管理所有订单;
5customer类用户看到的界面;
参考类图:
代码实现:
public double getRate() {
if (weight >= 100) return 15.0;
else if (weight >= 50) return 25.0; // 50-99.99kg
else if (weight >= 20) return 30.0; // 20-49.99kg
else return 35.0; // <20kg
}
System.out.printf("客户:%s(%s)订单信息如下:\n", customerName, customerPhone);
System.out.println("-----------------------------------------");
System.out.println("航班号:" + flightNumber);
System.out.println("订单号:" + orderId);
System.out.println("订单日期:" + orderDate);
System.out.println("发件人姓名:" + senderName);
System.out.println("发件人电话:" + senderPhone);
System.out.println("发件人地址:" + senderAddress);
System.out.println("收件人姓名:" + recipientName);
System.out.println("收件人电话:" + recipientPhone);
System.out.println("收件人地址:" + recipientAddress);
System.out.printf("订单总重量(kg):%.1f\n", totalWeight);
System.out.printf("微信支付金额:%.1f\n\n", order.gettotalPrice());
System.out.println("货物明细如下:");
System.out.println("-----------------------------------------");
System.out.println("明细编号\t货物名称\t计费重量\t计费费率\t应交运费");
int itemNum = 1;
for (OrderItem item : orderItems) {
Product p = item.getproduct();
System.out.printf("%d\t%s\t%.1f\t%.1f\t%.1f\n",
itemNum++,
p.getName(),
p.getWeight(),
p.getRate(),
p.calculateprice()
);
}
}
}
代码分析:
行数(Lines):334 行,代码规模较小,相对易于理解和维护。
语句数(Statements):63 条,语句数量较少,代码逻辑相对简洁。
分支语句百分比(Percent Branch Statements):4.8% ,分支语句(如 if - else、switch )占比很低,程序逻辑较为线性,复杂程度低。
方法调用语句数(Method Call Statements):46 条,反映出代码中方法间调用情况,说明代码有一定的模块化程度。
含注释行百分比(Percent Lines with Comments):2.7% ,注释比例极低,不利于代码阅读与后期维护。
类和接口数(Classes and Interfaces):3 个,表明代码的封装和抽象程度较低,结构相对简单。
收获
在完成 Java 继承与多态的作业后,我对面向对象编程的核心概念有了全新且深刻的认知,仿佛打开了一扇通往代码世界的大门,收获颇丰。
这次作业让我意识到,面向对象编程不仅仅是语法规则的堆砌,更是一种编程思维的转变。继承和多态作为其重要特性,能够帮助我们将现实世界中的复杂事物抽象成代码模型,使代码更具逻辑性和结构性。在未来的学习和实践中,我会更加注重对这些核心概念的运用,尝试在更多实际项目中灵活使用继承和多态,不断提升自己的编程能力和解决问题的能力。同时,我也期待在后续的学习中,探索更多 Java 语言的特性和编程技巧,进一步完善自己的知识体系,为成为一名优秀的开发者而努力。
第九周题目集
题目
航空快递以速度快、安全性高成为急件或贵重物品的首选。本题目要求对航空货运管理系统进行类设计,具体说明参看说明文件。
OO第十二周作业题目说明.pdf
输入格式:
按如下顺序分别输入客户信息、货物信息、航班信息以及订单信息。
客户类型[可输入项:Individual/Corporate]
客户编号
客户姓名
客户电话
客户地址
货物类型[可输入项:Normal/Expedite/Dangerous]
运送货物数量
[货物编号
货物名称
货物宽度
货物长度
货物高度
货物重量
]//[]内的内容输入次数取决于“运送货物数量”,输入不包含“[]”
航班号
航班起飞机场
航班降落机场
航班日期(格式为YYYY-MM-DD)
航班最大载重量
订单编号
订单日期(格式为YYYY-MM-DD)
发件人地址
发件人姓名
发件人电话
收件人地址
收件人姓名
收件人电话
支付方式[可输入项:Wechat/ALiPay/Cash]
输出格式:
如果订单中货物重量超过航班剩余载重量,程序输出The flight with flight number:航班号 has exceeded its load capacity and cannot carry the order. ,程序终止运行。
如果航班载重量可以承接该订单,输出如下:
客户:姓名(电话)订单信息如下:
航班号:
订单号:
订单日期:
发件人姓名:
发件人电话:
发件人地址:
收件人姓名:
收件人电话:
收件人地址:
订单总重量(kg):
[微信/支付宝/现金]支付金额:
货物明细如下:
明细编号 货物名称 计费重量 计费费率 应交运费
1 ...
2 ...
思考
这次多了几种货物模式以及几种付费模式和我上周预料到的一样会大量涉及到多态所以我当时的一些抽象类的设置是有必要的
我试着尝试使用书上讲的设计模式 uml单例模式以及工厂模式
参考类图
代码实现
public double getRate(String type) {
switch (type) {
case "Normal":
return getNormalRate();
case "Expedite":
return getExpediteRate();
case "Dangerous":
return getDangerousRate();
default:
return 0.0;
}
}
public double getNormalRate() {
if (weight >= 100) return 15.0;
else if (weight >= 50) return 25.0; // 50-99.99kg
else if (weight >= 20) return 30.0; // 20-49.99kg
else return 35.0; // <20kg
}
public double getExpediteRate() {
if(weight>=100) return 30.0;
else if(weight>=50) return 40.0;
else if(weight>=20) return 50.0;
else return 60.0;
}
public double getDangerousRate() {
if(weight>=100) return 20.0;
else if(weight>=50) return 30.0;
else if(weight>=20) return 50.0;
else return 80.0;
}
public double getWeight() {
return weight;
}
代码分析
399 行,代码规模适中,行数多可能意味着功能复杂,维护成本相对较高。
分支语句百分比(Percent Branch Statements):13.0% ,分支语句(如 if - else、switch )占比不算高,程序逻辑的复杂程度相对可控。
方法调用语句数(Method Call Statements):63 条,说明代码中方法间调用频繁程度,较多调用可能意味着模块化程度尚可。
含注释行百分比(Percent Lines with Comments):4.0% ,注释比例较低,不利于代码可读性和后期维护,团队协作时他人理解代码意图难度增加。
类和接口数(Classes and Interfaces):7 个,表明代码的封装和抽象程度,多个类和接口有助于实现高内聚、低耦合的设计原则。
收获
抽象类更侧重于抽取类之间的共性,一个类只能继承一个抽象类;接口则更强调行为的规范和拓展,一个类可以实现多个接口。
抽象类中可以有成员变量、非抽象方法等多种成分,接口中属性默认是 public static final ,方法默认是 public abstract
8~9周pta题目经验总结
对自己想说的话
希望自己戒骄戒躁 保持一个学徒的心 认真学好面向对象 无论以后用什么语言都能是代码有条理 有对象 而不是 一锅乱炖;
专注于自己的课程 管好自己就行了
关于课程和作业
希望实验打开粘贴功能 虽然热爱敲代码 但是不喜欢做枯燥无谓的重复操作(还要一遍一遍核对)
课程上的东西很多都是需要一个一个阶段小项目区巩固的并非听过看过就知道 否则上手就是报错
就算有ai修复下次也不知道为什么会错