PTA4~6题目集作业总结

前言

时光飞逝,转眼之间几周就过了,又到了写博客的时候。经过这几周的磨砺,我感觉自己的Java水平有了很大的提升,但距离熟练还有较大的距离,每隔一段时间总结可以很好地提升学习的效率,因此博客还是要坚持写下去的。路漫漫其修远兮,吾将上下而求索。

PTA 答题判题程序-4

这次作业中新增了填空题,多选题,输出顺序变化和多张试卷信息,内容上新加了很多东西,但其实还是原来学过的东西,并没有新鲜事物,主要还是考察正则表达式的运用。

PTA 家居强电电路模拟程序-1

这是在答题判题程序后新加的迭代程序,由于是一个新的程序,我就有充足时间考虑类的设计和后续迭代的实现方法,不用像答题判题程序一样在自己刚开始写的垃圾代码上花大量时间改代码。同时也可以感受出来:这次的程序更加简单,只需要像连连看一样处理信息就行了。

PTA 家居强电电路模拟程序-2

在第一次的基础上,这次迭代新加了串联和并联情况,但难度与第一次相比反而下降了,因为并没有错误输出的测试点,就不需要花大量时间去调试代码。

设计与分析

答题判题程序-4

设计

答卷类(Answer):用于保存回答的信息

private int number;//试卷编号
private String no;//题号
private String[][] answers;//题目标准答案
private String[] reply;//回答的答案

题目类(Question):用于保存一道题目的信息。

private boolean flag;//题目是否删除
private int no;//题号
private String content;//题目内容
private String standardAnswer;//标准答案

选择题题类(ChooseQuestion):用于保存选择题的信息。

private boolean flag;//题目是否删除
private int no;//题号
private String content;//题目内容
private String[] options;//选择题答案
public int check(String[] answer )//判断题目是否正确

填空题题类(GapQuestion):用于保存填空题的信息。

private boolean flag;//题目是否删除
private int no;//题号
private String content;//题目内容
private String[] options;//选择题答案
private String[] gap;//填空题答案
public int check(String[] answer )//判断题目是否正确

学生类(Student):保存学生的信息

private String no;//学号
private String name;//姓名

试卷类(Paper):保存和处理一张试卷的信息以及处理的方法

解释private int number;//试卷编号
private int sum;//题目数量
public int[] no=new int[20];//题目编号
public int[] grade=new int[20];//题目得分
public void zongfen();//判定总分是否为100

处理类(Test):保存和处理一张答卷的信息以及处理的方法

private Question[] questions;//题目
private Paper paper;//试卷
private Student student;//学生
private Answer answer;//答卷

包装类(Packaging):保存和处理答卷信息

private Question[] questions;//题目
private Paper paper;//试卷
private Student student;//学生
private Answer answer;//答卷
public void finding()//将试卷和答卷进行匹配包装

匹配类(Matching):对输入的信息进行处理

public void match()//对输入的信息进行处理

批改类(Check):对答卷进行批改

public void checking()//对输入的信息进行处理

排序类(Sort):对试卷题目进行排序

public void sorting()//对试卷题目进行排序

输出类(Print):输出结果

public void printing()输出结果
SourceMontor报表如下:

类图如下:

分析

这道题中新增的选择题和填空题有与普通题目不一样的批改方式:标准答案有多个,只有全答对才能得全分,没全答对只能得一半的分,如果其中有错误答案则没有分。因此需要将这两道题的批改方式进行修改,将每道题的答案存入一个数组中,遍历这个数组进行批改。

采坑心得

在填空题答案中,可能存在“或“”和“等连接词表示答案的内容,如果是用或进行连接,则只要答对其中之一就能得全分,因此在对标准答案进行处理时要考虑这点,将其中的”或“与”和“用空格进行替代。

改进建议

虽然我在第三次迭代的基础上进行了大量的重构,但仍然有一些处理不好的地方,比如对输入信息进行处理时应该将对应信息的处理放在对应的类中以减少复杂度。

家居强电电路模拟程序-1

设计

引脚类(Pin):存放引脚的信息

protected double v = 0;//电压默认为0
protected int id;//引脚的编号
public String type;/8引脚设备所属的类型

开关类(Switch):存放开关的信息

private int id;//开关的编号
public Pin pin1;//开关的引脚
public Pin pin2;//开关的引脚
private boolean state;//开关状态
public void print()//输出信息

调档器(Governor):存放调档器的信息

protected int id;//调档器的编号
public EnterPin pin1;//输入引脚
public OutPin pin2;//输出引脚
public void print();//输出信息

分档调档器(Governor):存放分档调档器的信息

protected int id;//调档器的编号
public EnterPin pin1;//输入引脚
public OutPin pin2;//输出引脚
private double[] grade = {0, 0.3, 0.6, 0.9};//分档调档器的档位
private int gear;
public void print();//输出信息

连续调档器(Governor):存放连续调档器的信息

protected int id;//调档器的编号
public EnterPin pin1;//输入引脚
public OutPin pin2;//输出引脚
private double grade;//调档器的档位
public void print();//输出信息

灯类(Light):存放灯的信息

protected int id;//灯的编号
public EnterPin pin1;//输入引脚
public OutPin pin2;//输出引脚
public void print();//输出信息

风扇类(Fan):存放风扇的信息

protected int id;//风扇的编号
public EnterPin pin1;/输入引脚
public OutPin pin2;//输出引脚
public void print();//输出信息

匹配类(Matching):对输入的信息进行处理

public void match()//对输入的信息进行处理

方法类(Method):对信息进行处理并输出

public static void electrify();//计算每一个设备的电压
public static void print();//将设备信息按顺序进行输出
SourceMontor报表如下:

类图如下:

分析

这次的程序模拟的电路系统中有许多存在关联的类,例如调档器可以改变电路中的电压,开关可以决定电路中是否有电压等,因此在类设计上需要先将设备的信息存储到容器中再在最后对设备的电压进行更改。

采坑心得

需要注意如何实现开关断开时让整个电路(包括之前更改过电压的设备)电压为0,在遍历设备到开关时如果开关未闭合就要重新遍历并将初始电压设为0.此外要注意设备中的电压在计算时为double类型才能避免误差,但在输出时需要转化为int类型。

改进建议

建议在对信息处理时通过设备的引脚来对设备进行查找和匹配,因为在之后的迭代中存在引脚错接的情况,如果直接对设备进行处理会导致之后的迭代很难处理。

家居强电电路模拟程序-2

设计

设备类(Facility):所有设备的父类

protected int id;//编号
protected String type;//设备类型
protected double r = 0;//电阻
protected EnterPin pin1;//输入引脚
protected OutPin pin2;//输出引脚
protected boolean state = true;//设备状态
public void print();//输出设备信息

设备储存类(Facility Factory):储存所有设备的信息

public HashMap<Integer, Switch> switches = new HashMap<>();//所有开关
public HashMap<Integer, Gradegovernor> gradegovernors = new HashMap<>();//所有分档调档器
public HashMap<Integer, Continuousgovernor> continuousgovernors = new HashMap<>();//所有连续调档器
public HashMap<Integer, Incandescentlight> incandescentlights = new HashMap<>();//所有白炽灯
public HashMap<Integer, Daylight> daylights = new HashMap<>();//所有日光灯
public HashMap<Integer, Ceilingfan> ceilingfans = new HashMap<>();//所有吊扇
public HashMap<Integer, Standfan> standfans = new HashMap<>();//所有落地扇
public ArrayList<Line> allLines = new ArrayList<>();//所有串联电路
public ArrayList<Lines> lines = new ArrayList<>();//所有并联电路
public void printAll();//输出所有设备信息

并联类(Lines):存放并联电路信息

public int number = 0;//并联电路中通路的支路数量
ArrayList<Line> lines = new ArrayList<>();//并联电路中的支路

引脚类(Pin):存放引脚的信息

protected double v = 0;//电压默认为0
protected int id;//引脚的编号
public String type;/8引脚设备所属的类型

开关类(Switch):存放开关的信息

private int id;//开关的编号
public Pin pin1;//开关的引脚
public Pin pin2;//开关的引脚
private boolean state;//开关状态
public void print()//输出信息

调档器(Governor):存放调档器的信息

protected int id;//调档器的编号
public EnterPin pin1;//输入引脚
public OutPin pin2;//输出引脚
public void print();//输出信息

分档调档器(Governor):存放分档调档器的信息

protected int id;//调档器的编号
public EnterPin pin1;//输入引脚
public OutPin pin2;//输出引脚
private double[] grade = {0, 0.3, 0.6, 0.9};//分档调档器的档位
private int gear;
public void print();//输出信息

连续调档器(Governor):存放连续调档器的信息

protected int id;//调档器的编号
public EnterPin pin1;//输入引脚
public OutPin pin2;//输出引脚
private double grade;//调档器的档位
public void print();//输出信息

灯类(Light):存放灯的信息

protected int id;//灯的编号
public EnterPin pin1;//输入引脚
public OutPin pin2;//输出引脚
public void print();//输出信息

风扇类(Fan):存放风扇的信息

protected int id;//风扇的编号
public EnterPin pin1;/输入引脚
public OutPin pin2;//输出引脚
public void print();//输出信息

匹配类(Matching):对输入的信息进行处理

public void match()//对输入的信息进行处理

方法类(Method):对信息进行处理并输出

public static void electrify();//计算每一个设备的电压
public static void print();//将设备信息按顺序进行输出
SourceMontor报表如下:

类图如下:

分析

在上一次的基础上新增的落地扇,串联及并联电路,对信息的处理方式全部改变,变成了对一整条线路进行处理。

采坑心得

可以把并联电路看成一整个设备,因此在处理线路时很容易算出并联电路的电压,同时在处理并联电路后要重新对串联电路进行处理,因为并联电路可能是断路状态。此外还需要考虑并联电路中存在短路的情况,可以通过统计并联电路中通路支路的数量与总支路进行比较判断。

改进建议

由于存在大量的设备,而且在每个环节几乎都要调用,因此可以将所有设备存储到一个容器中,每次传参时只需要传入容器,不需要之前一大行的传入,还可以尽可能多地将匹配,处理,输出等方法分开以降低耦合度。

总结

这三次作业从各个方面考察了我的Java能力,包括我的类设计能力,类与类之间的关联设计等,同时我对正则表达式的运用更加熟练。

此外,我对Hash Map的运用更加熟练,对于HashMap中的各种方法都有了一定的了解,并且可以将这些方法熟练运用到我的设计中。

最重要的是,我对Java面向对象特点的理解更加深刻,对类的设计不会像一个初学者一样胡乱设计了,而是会去分析类与类之间的关系,之后再通过题目信息来分析如何实现需求,同时我会将功能模块化、封装成类以提高代码的可读性和可维护性。

这三次大作业给了我不小的提升,也让我发现了自己的不足,因此我希望能够将这几次作业的经验应用到之后的实践中,让我的能力有所提升。

posted on 2024-06-04 20:47  刘瀚峰  阅读(3)  评论(0编辑  收藏  举报