welcome to my blog~

博客园 首页 新随笔 联系 订阅 管理

一.前言

本学期第二轮大作业即将迎来末尾,其他技术方面是否提升不太好说,但是堆砌代码的技术长了不少,明明可以耗费更多心思设计的更完美一些,但还是选择了重复一堆代码来实现目的,仿佛这样会使我的思路更加清晰明了。比如存入数据完全可以通过一个数组来存入要匹配的类型,我却写了六个循环来匹配数据,导致至少有200行代码重复度极高,明明完全可以依靠一个循环搞定的。

书接上文,仍然是答题判题程序,第四次题目集让我第一次体会到了什么叫做改改就能用,得益于一、二次题目集的教训,第三次题目集大改类的设计,终于在这一次重新拿了满分,本次题目除了新增多选题外,还有填空题,思路倒是不难想,多选题先判断是否有错误答案,再判断与正确答案匹配个数,是否重复写入同一个答案,改一下判题函数的返回值即可,填空题直接判断是否是子集以及答案和标准答案的长度即可,唯独没想到有一个格式错误竟然是答案中包含空格,还不能去掉这无用的空格,狠狠的被摆了一道。——难度适中,题量尚可。

新的开始,家居强电电路模拟程序,第五次题目集刚拿到手的时候其实是完全发懵的,一点也看不懂的,好在第一次只考串联线路,而且设备很少,一次最多只串联三个,于是投机取巧的堆砌代码,两两设备链接,勉强通过。基于题面看不懂的情况,难度还是很大的,但好在老师仁慈,没设下坑,难度可改为适中,题量较大。

第六次题目集,我觉得完全可以算是一道新题,尽管仍是家居强电电路模拟程序,但改变了输入模式,这输入模式一换,就是一道全新的题目,思路一下子就明了了,他竟然提供了并联线路的输入,在此之前我完全以为是像第五次一样,只给设备和引脚,这样的话我就不得不考虑如何根据引脚来判断什么是并联电路的,什么是干路上的,但好在没有下这么大的黑手。根据老师在课堂上的提示,我将并联线路设计成了电器元件。难度较大,题量适中。

二.大作业分析

第四次大作业分析

对比前三次来讲,第四次大作业分析堪称仁慈,没有过多的异常处理,还给了那么多的提示,由于多了多选题和填空题,题目不再是简单的对或错,为此我改变了判题函数,不再是布尔型的,同时题目类新增属性:题目类型(0N1K2Z)

class Tell extends Question{
    String tellQA(String Q,String A,int type){
        this.type=type;
        A=A.trim();
        if(type==0) {
            if(Q.equals(A)) {
                return "true";
            }else{
                return "false";
            }
        }else if(type==1){
            if(Q.contains(A)&&Q.length()==A.length()) {
                return "true";
            }else if(Q.contains(A)&&Q.length()!=A.length()) {
                return "partially correct";
            }else{
                return "false";
            }
        }else if(type==2){
            int find=0;
            int count=0;
            String[] words = Q.split(" ");
            String[] Answer = A.split(" ");
            for(int i=0;i<Answer.length;i++){
                for(int j=0;j<words.length;j++){
                    if(Answer[i].equals(words[j])){
                        find=1;
                        count++;
                        break;
                    }
                }
                if(find==0){
                    return "false";
                }
                find=0;
            }
            if(count== words.length) {
                return "true";
            }else{
                return "partially correct";
            }
        }
        return "false";
    }
}

如代码所示,返回的是字符串,正确,错误,部分正确,同时传入题目类型

类图如下

SourceMonitor报表如下

第五次大作业分析

新的大作业,需要新的思路,根据题面,我设计了以下类别

引脚类

包含引脚序号和电压两部分

但结果是完全用不上这东西,但又因为代码还需要这东西运行,不然就要大改,我就勉强留下了

设备类

作为电器的父类,有设备序号,两个引脚,和两端电压的压强差。

变压器类,我觉得需要单独拿出来,这样我会好分析点,所以单独作为一个父类被设计出来

其它子类都是具体设置自己的参数,并没有什么值得分析的。

因为第一次接触这个,输入的信息还不是一整条线路,所以我只能选择最笨的方法来实现,一个一个链接。

最开始是和电源链接,每个设备都要写一次循环来和电源匹配,如果匹配的是电器,那么引脚1电压就是220,引脚2电压就是0,包含开关。

如果是变压器和电源链接,那么变压器引脚1是220引脚2是输出电压,方便后续通过引脚传递电压。

接下来是变压器和电器连接,也是一样的堆代码。通过循环匹配电器,再循环匹配变压器,成功后把前者2引脚电压供给后者1引脚电压

然后是电器和电器链接,主要是看开关在前还是在后,分别再堆两个大循环

最后检测线路是否连通,这样第五次大作业就结束了。

类图如下

SourceMonitor报表如下

第六次大作业分析

第六次大作业可不得了

完全不同于上一次的输入方式,给了我一丝希望,关于如何写线路类设计的希望。

如图所示,T代表串联M代表并联,而且M还是直接用了T作为成员而不是电器,更是给了总线路T3,这样的话,思路就清晰的不得了。

串联线路类设计如下

有电阻,有序号,有电压,有设备链表

并联线路是线路链表

如此一来,先存串联线路,通过6个循环匹配6个设备,并联线路也当作设备存入,例如M1,存入完毕。

再去存并联线路,存入时匹配到对应的线路,再去匹配线路中是否存在开关,如果存在,是否全部闭合,只有线路连通才配存入并联线路中。

计算基础数据,计算所有T的电阻,所有设备电阻已经给出,直接加就行,但是干路设备中的M并没有算,所以先不加。

计算M电阻,上面已经计算了所有T的电阻,如果M的成员大于1通过并联电路电阻公式计算出M电阻,如果等于1,直接将T的电阻给M。

再将M电阻加到干路中,干路电阻就补全了。

最后开始分压,先检测干路线路是否连通,通过检测干路的K开关设备是否闭合,连接的M的线路成员个数,来判断干路是否接通,如果接通,判断是否有变压器,通过变压器给干路T3赋予电压,根据串联线路电压之比等于电阻之比,已知干路电压和干路电阻,各电器电阻,只需要一个简单的乘法就能分压完毕。

M分到电压,根据并联线路电压处处相等,所以T1,T2电压就是分到的电压,最后M成员线路再根据串联线路分压,最后输出所有设备信息

第六次大作业结束。

类图如下

SourceMonitor报表如下

最开始是想把所有设备存到一个容器里的,后来想了想,存到一个容器设计循环思路反而没那么清晰,所以干脆一个设备一个链表,这样思路清晰,排序还可以直接用接口。

三.踩坑心得

对于这几次大作业来说,最为重要的仍是设计,对于敲代码来说,有一个好的设计就如鱼儿得水,有了设计,就有了思路,有了思路就可以一路高歌前行。

对于输入数据来讲,一定要注意边界处理,比如档位变压器,最高就是3档,不可以输出3以上的数值。

对于用户输入的数据,一定要原封不动的保留,切不可私自处理,比如第四次大作业用户给出的答案包含无用的空格,我们只有在对比正确答案时才会去除这些空格,其他时候保留这些空格。

如果你想保留类里面的某些数据不被重新new导致清零,请使用static

针对于测试点不再给予提示,我们自己测试的时候可以考虑由简单到困难,比如本次测试可以从最简单的串联线路,电源-电器-接地,依次增加开关,器件,并联线路,这样可以测出是否有基本数据出错,比如无开关线路默认供压220V写成了0V

四.改进建议

针对家用电器线路这个大作业,我建议直接删除引脚类,改为在函数中处理引脚连接情况,整体分析下来发现完全不需要依靠引脚传递电压,而是在线路搭建完成后电压就分好了,如果有引脚异常链接的情况,也是单独做出一个检测函数,比依靠检测引脚传递情况要好,当然,要是应用到现实肯定是不能这么干的。

对于设备存储,想了想还是改为存储在一个容器内比较好,代码可以变得更加简洁,存入方式也不再是匹配正则表达式,改为匹配设备数组中的参数,这样就可以减少重复循环的次数。

线路方面,还是改为一个链表比较好,但是我的代码依靠双链表循环匹配,已经无力更改了。

针对排序,如果不能使用接口排序,那就在输出时将要输出的数据临时存入到一个数组,进行排序。

五.总结

对于一名学生来讲,写大作业最重要的是读懂题目以及类的设计,宁愿花费三分之二的时间去理解题目,也不要拿到手就开始写,做好类的设计,想好逻辑思路,敲代码也不过是4小时左右的时间,就可以完成基本框架,只需细节调试即可,如果提前设计好,碰到错误就会有思路,知道具体哪里错,怎么改,而不会抓耳挠腮想不清楚,最后迫不得已的一次又一次重写代码,试图理清思路。

善用正则表达式,他的强大虽然不是滥用的理由,但当你无法修补漏洞是,他或许是最好的补丁,比如保存答案时用了trim去除多余空格,顺便把答案的空格扔掉了,但是用正则表达式匹配答案,就可以直接存入带空格的答案。

希望之后的路能够更加顺利!

posted on 2024-06-03 19:39  郑瑞琦  阅读(19)  评论(0编辑  收藏  举报
回到顶部