OO第三次博客作业

 2021-05-01     lian

---------------------

前言:

一、7-9次作业主要针对类的继承,多态,接口和抽象方法的使用做一些针对性的练习,题目所需要的结构相比之前的题要复杂不少,从每次作业都只有一两个题就知道这些题目不是那么容易就能写的出来的,需要我们先分析结构,然后根据类图写出基本的代码框架,最后完善方法和逻辑。

二、对于题量,虽然说题目数量不多,总共就四个题,但是每次作业所花的时间一点也不比前面的少,主要是代码量比较大,尤其是银行的题,结构写完已经好几百行了。

三、难度的话,整体难度都不算大,只是需要花时间去理清每个类之间的关系,不然会写的非常的混乱,从而导致自己知道自己算法有问题,但是却完全不知道错在哪里,所以做前分析可以极大减小题的难度。

设计与分析:

 

一、习题7-1、7-2两道题目的递进式设计分析总结

1、习题7-1使用了一个抽象方法shape,这个方法是所有图形类的父类,它可以实现让图形共有的东西都继承,然后有区别的地方就重写,这样写的优点就是能使所有的图形类都属于图形但又各有区别,能分开各自的功能,达到面向对象的基本程序结构,就是创建一个类型的对象,他各自能执行各自的行为,只需要我来下命令;并且在传参使,不用特意区分名字,是需要传父类带来的类型,就本题,所有图形类继承shape类,那么他们都是shape这个类型,所以写一些方法使,只需要Shape shape 就行,不需要精确到他是圆形还是三角形,这也能减少代码的复杂度,让其更加简洁易懂。

2、习题7-2与7-1的结构基本一致,只是游戏规则有所改变,然后加了两个用来排序的接口,对于接口的作用,当一个类继承一个接口时,就代表这个类里面有一部分的方法是不可变的,再加上自己的一部分方法,整个类就形成了一个一部分算法可变一部分算法不可变的形式,这样的代码往往具有更强的可扩展性,这在Java中也属于一种编程思想。

3、总的来讲这种渐进式的设计很好的体现了Java面向对象思想的核心,让对象执行自己有的行为,不逾矩。

二、题目集8和题目集9两道ATM机仿真题目的设计思路分析总结

1、题目集8是基于银行的一些基本职能而写的一个程序,它将银行所具有的最基础的东西作为类,并将它们环环相扣起来,是一种聚合的结构,每个类就有自己的属性和方法,代表他们能够执行的动作;对于指导书里给的属性,需要用程序指令进行储存,并且也是一种链式的储存,存的基本是对象;整体来讲,只要将结构写好,剩下的方法和算法都比较好写。

2、相较于上一个题,这次的银行可以跨行取款和透支,更加完善了这个银行的功能,所以对于整个程序的实际意义来讲,他肯定有更好的实用性,而透支最重要的就是判断这个人是在哪一个银行取的款,然后根据手续费扣除相应的钱,整体结构与题目集8没有太大区别。

3、第九题是对第八题的一个延申,他们都能我们能够对聚合这种结构有一个针对性的练习,让我们以后看到这样的结构能处变不惊,也能让我们将这种结构应用到之后的实际操作中。

 

三、对习题中的链式结构总体分析

   这种链式的类结构,属于Java中的链式编程思想,他体现了程序员思路的一种具现化,用对象.对象的形式展现程序一环扣一环的紧凑结构,也让阅读者能够很简单的理解到整个程序是怎样执行的,每一个步骤的数据最终会储存到那个地方去,就算没有太多注释,也能从类的顺序上理解到程序的整体结构;并且在链式编程,大部分的方法都不需要返回具体的值,只需要返回对象;并且这样的程序可维护性也很高。

踩坑心得:

1、在题目集8的程序编写时,因为整个程序都是链式的,所以储存题目所给的数据使也采用了链式的编程,但这也导致之后的使用for循环匹配卡号时不能能执行成功,就拿账户整个类来讲,for循环需要从0开始,直到达到账户数量就结束,但链式结构会让每个账户的对象名称都不一样,他不是以链表或数组的形式储存,这个问题我想了很久,最终发现可以将每一个类型的对象都储存一个数组,然后用这个数组来进行循环,然后再将每层循环的结束点设置为其对象带有的下一级对象的数量,这样就能实现储存和循环嵌套的功能。

2、题目集9因为加了一个银行,所以ATM机的数量突破了10,但是在上一题我输出的时候,对0几的输出采用的是输出0和ATM机的int值,这就导致了我的这次作业输出时,如果有在超过10的ATM机上取款的操作就会输出011等,这个问题导致我三个测试点一直没有通过,并且还一直找不到错误,最后以外输入了11号ATM机的单独取款,终于发现了错误,只需要将输出的地方改为%02d就解决了。

if(cunqu[s]<0) {
                                        //System.out.println(+""++""++""++"0");
                                        System.out.printf("业务:存款 %s在%s的0%d号ATM机上存款¥%.2f\n",bank[r].user[t].getName(),bank[bankJudge-1].getBankName(),atmId[s],(-1)*cunqu[s]);
                                    }
                                    else {
                                        //System.out.println(bank[r].user[t].getName()+"在"+bank[r].getBankName()+"的0"+atmId[s]+"号ATM机上款¥"+cunqu[s]+"0");
                                        System.out.printf("业务:取款 %s在%s的0%d号ATM机上取款¥%.2f\n",bank[r].user[t].getName(),bank[bankJudge-1].getBankName(),atmId[s],cunqu[s]);
                                    }

 

3、对于程序一开始将输入的数据分行储存的操作也是我一直以来没有太懂的,因为这个方法时从其他地方学的,但这次作业我认真阅读了一下,终于读懂了,如下:

 

String source ="";
        String line ="";
        BufferedReader bf = new BufferedReader(new InputStreamReader(System.in));
        String data[]= new String[100] ;
        String str="#";
        for(int i=0;line.equals(str)==false;i++){
            line = bf.readLine();
            source += line;
            data[i]=source;
            source="";
        }

 

改进建议:

1、银行的题,这两次作业的数据都使用的是一次性储存,不能增加也不能减少,如果能将其数据写入文件,那就可以写出一整个完整的系统,每个类的数据都储存在文件中,程序执行就是读文件和写文件,这样就又可以极大提高程序的实用性。

2、在这些程序创建对象时,我们都可以使用创建对象数组,然后使用arraylist来储存他,这样做可以使程序运行时可以想有多少组数据就有多少组数据,提高程序的实用性。

总结:

     通过这几次作业,我们针对学习了面向对象程序的聚合、继承、多态等,这写基础的关系为我们之后写大工程打下了基础,并且能够让我们对面向对象有更加深刻的理解;其次,我们再次学习了链式编程,这是程序的一大难点,同时也是一个非常实用的功能,它能实现很多功能,但是要想写出自己想要的链式结构,在这一学期还要对其进行不断地学习才行。

     对于目前的课程安排以及学习节奏我认为是比较合适的,只是对于每个题题干上面给的测试点实在是太窄太片面,光把题上所给的测试点过掉基本得不到任何信息,所以麻烦老师下次给测试点的时候能给几个能测出大部分人关键问题的测试点,不然就会像我这次一样,因为一个输出问题而困扰很久得不到答案。

posted on 2021-06-17 08:38  lian152  阅读(63)  评论(0编辑  收藏  举报

导航