【Java学习】三次大作业总结

一、   前言

非常高兴可以在这里写下我的第一篇博客,这次的博客我相信将会是非常有意义的,说实话以前感觉写这种东西的人感觉非常的nb,没想到现在我也可以写下自己的第一篇博客啦!

这三次的Java大作业的知识点我认为主要还是主要在各种数据的处理方面。第一次大作业主要为基本数据的运算和数字大小的排序,还有字符串的处理这三大处理;第二次的大作业是字符串的处理和日期的处理这两个方面,而这次的三四五题思想基本一样,最主要考察的还是对不同月份的思考,需要考虑不同的方面,对基本的逻辑能力有一定的考察;第三次的大作业就不再是前两次的简单的数据处理了,考察了我们对面向对象的思考了,不再只是写在一个主类了,不只是考察我们的基本写一些代码的问题了,更多的是考察我们对面向对象这一实质的思考,利用数据的私有和不同类之间的关联了。

说实话这三次题量并不是那么多,毕竟每次的大作业给了我们一个星期的时间,在平时利用空余时间也可随时敲敲code。前两次的大作业都还好,都能够将所有的测试点给通过,而不是一堆的让人崩溃的绿色(PTA测试点不通过的情况),并且可以提前完成。但是到了最后的一次的大作业,明显难度就上升了好多,说实话十天的时间是够的,但是不知道我为什么就是没有写出来最后一题(可能自己的思维逻辑不够严谨强大吧,也可能就是自己比较懒,嘿嘿,以后一定更加努力)一元多项式求导(类设计)。

总的来说我对这三次的大作业还算是满意,就是对最后的一次大作业感觉还是挺失望的,毕竟没有通过所以的测试点,看着其他通过的同学内心还是挺难受的,不过通过这三次的大作业还是让我学到了挺多的。说了这么多,下面就让我来对这三次的作业做个具体的描述吧。

二. CODE设计与分析

 对于第一次的作业相对来说还是比较简单的,最后一题应该也就算是难一点的吧

 

对于这题的分析,主要还是将不同的三角形的区别有个良好的认知就可以了,我将这个判断写在一个类里面,类图如下:

 

用了一些方法便可以将这题解出来了。

•   对于第二次的作业,主要的模块还是求日期,在不允许使用Java中任何与日期有关的类或方法的条件下,这题就是要分析清楚这些月份之间的不同,搞清楚这些的特殊关系还是比较可以轻松的解决的,下面是这7-5,7-5的类图展示:

 

 对于第三次的就比较复杂了,对于Account类就是定义一个类然后对数据进行操作,主要关系类图如下

  

对于日期的也就是和第二次的大作业没有什么区别,这个就是利用了一个类专门来对日期进行操作,这样使得code的操作能力更强。

 

最后一题的正则表达式算是一大问题了,感觉明显是个烫手的“山芋”,在操作时,我想了许多的办法,但是最终还是没有解决,一顿操作猛如虎,结果像个‘250’,

对于正则表达式的操作,我发现还是有很大的缺陷,我发现在操作这些Java自带的类和方法还是挺困难的,对一个自带的类或方法的理解则需要自己不断的进行各种各样的操作才能够将这些正确的理解。对于正则表达式的理解,其实就是按照我们正常的思考来说就是挺简单的,但是code毕竟是code,从另一个角度来说,这个则更需要我们思维上的严谨,因为计算机不能自己思考,还是需要我们去操控的。

三. 采坑心得

1. 第一次的大作业说实话并没有太多的坑位,前面的几题都是比较的简单的,例如第一题的两个数的相加并没有任何的坑,由于在大一上学期学了C语言有了一定的基础,在刚学Java还是有一定的好处的。一直到第三题都是很平稳的,但是第四题就不一样了。在这题中,由于数据非常的多,有着不同数字,非常的容易看错,加上题目提供的表格上有一些的错误,导致在做的时候在税率结果计算上与答案有点误差导致测试点过不去,但是在经过多次的检查后还是全部过了。7-5这道题就有一定的思考了,在换钱币时需要优先考虑面值大的钱币,所以在数据操作时有了一定的限制,并且需要尽可能相当于尽可能的多换面值大的钱币,这就需要判断是否还能再换这种面值的钱币,这题目经过一定的思考还是有着比较好的处理的。7-6,7-8这两个题目主要还是考数组的使用,在7-8值得思考的是我们可以使用不同的排序方法来做(这里我采用的是冒泡排序)

•最后一题就是判断三角形了,其实这题目也并没有什么很难跳出的坑,这里最主要的就是要判断等腰三角形和等腰直角三角形和之间三角形这几者的区分。但是有一个坑我确实是好久都没有发现自己的code哪里有问题考虑的不周,但是在同学的提醒下,我发现了自己的问题了。众所周知,直角三角形是a^2+b^2=c^2,但是double数据时并不能完全将数据输入成√2的形式,所以实际上在数据的处理上会有一定的差异,在同学的提醒下我将判断直角三角形两边平方的和等关于第三边的平方改成两边平方的和小于0.001从而解决误差过大造成的答案偏差过大的问题。

        double x,y,z;
        Scanner in=new Scanner(System.in);
        x= in.nextDouble();
        y=in.nextDouble();
        z=in.nextDouble();
        if(x<1||x>200||y<1||y>200||z<1||z>200){
            System.out.println("Wrong Format");
        }
        else{
            if(x+y<=z||x+z<=y||y+z<=x){
                System.out.println("Not a triangle");
            }
            else if(x==y&&y==z){
                System.out.println("Equilateral triangle");
            }
            else if(x==y||y==z||x==z){
                if(x*x+y*y-z*z<0.001||x*x+z*z-y*y<0.001||y*y+z*z-x<0.001){
                    System.out.println("Isosceles right-angled triangle");
                }
                else{
                    System.out.println("Isosceles triangle");
                }
            }
            else if(x*x+y*y==z*z||x*x+z*z==y*y||y*y+z*z==x*x){
                System.out.println("Right-angled triangle");
            }
            else{
                System.out.println("General triangle");
            }
        }
    }
}

最终这些第一次的大作业还是把全部的测试点过了。

2. 第二次的大作业在后面三题是非常相关的说实话。在第一题只要正确的使用字符串的处理便可以轻松的将这道题给完成了,在处理这道题的时候使用了toCharArray()这个方法,通过将字符串转化为字符数组将这些一个个的字符进行分析即可。第二题的话就是将两个字符串进行合并,这个我做的时候并没有对这个进行仔细的分析,所以写的时候直接创造了一个新的数组来存这两个数组里面的数据然后直接进行排序这样题目也能过(其实这样是一直偷懒的行为吧),其实在后来我仔细思考了一下这题,发现这道题可以对比两个数组的每个数据如何再来输出,这样对内存空间就不会有很大的浪费了。在后面的三题,可以说是一个东西吧,因为他们没有什么太大的区别,无非就是增加了一些功能,还有就是功能复杂化了。在处理完第三题的时候就可以一起连着第四题第五题一起构造了。这最后的三天的难点主要就是在判断月份和是否闰年这里了,因为平年只有365天,而润年有366天,还有一个就是每个月的天数不是完全一样的。在判断n天之后是什么日期就需要考虑好每个月的情况了。而我在处理这些时则是利用了一个变量来判断这个月是几月,而在输出是就会随着一开始输入的那个month量(这个数据是输入的月份,后面nextDate()这个方法在使用)而改变,但是在输出之前month是一直在变的,这个就会导致在输出时不是我们想要输出的那个month(如果不定义一个变量来保存month)。

3. 第三次作业的难度就明显的上升了。这次虽然只有三题,但是这三题的难度却和前两次完全不在一个等级上。创建一个Account类账户还好,只要把Account类里面的不同的方法搞清楚,分门别类就可以将这些功能逐渐完善。

Account account = new Account(id, InitialBalance, annualInterestRate);
        if (WithDrawMoney > InitialBalance || WithDrawMoney < 0) {
            System.out.println("WithDraw Amount Wrong");
        }
        account.deposit(StoredMoney);
        account.WithDraw(WithDrawMoney, StoredMoney);
        System.out.printf("The Monthly interest:%.2f\n", account.getMonthlyInterestRate(WithDrawMoney, StoredMoney));
        System.out.println("The Account'dateCreated:2020-07-31");

而我最后过的就是这两个测试点,虽然测试了各种各样的数据,但是还是找不出任何问题,于是问了同学发现当两种测试数据均非法的时候最终答案输出需要显示提取非法再显示存取非法,在经过一番操作后还是过了(当时内心还是挺开心的,嘻嘻!)。第二题是日期,与第二次的大作业很类似,只是这次是将这些写成一个类,并包含三个私有属性年(year)、月(month)、日(day),这次的测试点都非常的正常,一遍过。

重点来了,7-3是一元多项式求导,当时看到这题可以说是没有任何的头绪,发现如果是只是利用字符串拆分成字符数组进行操作,一番操作后发现这几乎是不可能完成的。老师的提醒用正则表达式才发现这题目还是有方法做的。利用matches,group,split等各种操作后,提交答案,发现还是一堆的错误,两天的思考这道题发现还是没有解出来这题,提交看了下测试点,发现最终只有以下几个过了,如下:

其实我的思路大概就是拆分分析然后操作一个个子字符串之后再将操作好的字符串输出,但是操作起来的结果还是不行,时间截至,我的这题也没有全部完成。最大问题还是出现在对字符串的拆分和操作,情况的各种各样,考虑的也比较多,所以这次的一元多项式求导并没有完成。

4. 代码的优化

(1)第一次的大作业就是基本的输入输出也就是进行无脑操作罢了,只需要把答案输出正确就可以,但是在思考排序的时候可以考虑使用复杂度更低的排序方法,毕竟冒泡排序的复杂度O(n²)挺高的。这里是我找到一些排序方法的复杂度,稳定性的情况:

(2)第二次的大作业第一题也就是正常的字符串操作,而第二题就有很大的改进了。我直接开辟了一个新的数组然后排序,这样是一个比较复杂的方法,当数据量大的时候这个就非常的复杂了。对于这题我认为就可以直接对两个数组里面的数据进行操作,对两个数组里面数据进行比较然后创建一个新的数组进行存放,哪个数组里面的数据小就先存放哪个数据,这样就只要遍历一遍便可以直接将两个数组里面的数据排好序了。对于后面的三题在对月份操作的时候可以简化下判断条件,我认为我的操作有点过于复杂(一个一个月的分析),可以将有31天的分为一类,30天的分为一类,而2月最特殊额外进行考虑,这样就简单多了。

(3)第三次的大作业就是在考虑类的操作时可以将类的划分变得更加清晰,使功能更加的容易体现出来。正则表达式的操作是最需要改进的,本来正则表达式就是一个比较难操作的东西。这次我并没有将不同功能进行划分(例如将判断合法表达式写成一个类,将字符串拆分写成一个类),因为这次只是一元表达式的求导还没有考虑到sin,cos等这些情况,所以影响还不是很大。其实若是将这些功能进行拆分的话,在操作起来时考虑的情况自然也就更加周全了。

(期待大佬对我的描述有更好的的建议)

5.写在最后-我的一点感想

总的来说吧,这三次的大作业就属最后一次的一元多项式求导最复杂了,我们也知道一个良好的程序给人的第一感觉就是具有可读性,能够一眼让人看出你在干什么,而我这次的code并并没很好的可读性,因为在敲的时候没有将代码注释,同时也没有一个很好的前提规划,致使在码的时候可能思路会有点乱。Java提供了丰富的类库,但是知识面的短小以至于在各种操作的时候使得代码的复杂性明显的上升。

面向对象可以说是Java最重要的特性。Java语言的设计完全是面向对象的,所以这还是非常符合我们的思考方式的,刚入Java,虽然有着C的基础,但是面向过程的C突然转向面向对象的过程还是有一定的差异的,一句话,思考的过程往往比无脑的操作是值当的。

在接下来的学习,我认为最主要的是如何正确的理解这一语言的思考方式,只要路是对的,就不怕路远。

这段时间的学习还是有一定的缺陷的,但也还算可以。在代码的风格也也需要良好的改进,虽然现在大部分软件都有代码规范的功能,但自己有对code的排版也可以使自己的代码有着更好的理解。

最后,在上课,实验等我感觉可以最好是传授些基础只是,毕竟有个人教授会在理解方面有着更好的理解。

 在接下来的生活要全力以赴啦!!!

2021-04-04

posted @ 2021-04-04 16:28  Heart969  阅读(499)  评论(0)    收藏  举报