1、 前言正则表达式
很是高兴能够在这里写下个人第一篇博客,此次的博客我相信将会是很是有意义的,说实话之前感受写这种东西的人感受很是的nb,没想到如今我也能够写下本身的第一篇博客啦!数组
这三次的Java大做业的知识点我认为主要仍是主要在各类数据的处理方面。第一次大做业主要为基本数据的运算和数字大小的排序,还有字符串的处理这三大处理;第二次的大做业是字符串的处理和日期的处理这两个方面,而此次的三四五题思想基本同样,最主要考察的仍是对不一样月份的思考,须要考虑不一样的方面,对基本的逻辑能力有必定的考察;第三次的大做业就再也不是前两次的简单的数据处理了,考察了咱们对面向对象的思考了,再也不只是写在一个主类了,不仅是考察咱们的基本写一些代码的问题了,更多的是考察咱们对面向对象这一实质的思考,利用数据的私有和不一样类之间的关联了。学习
说实话这三次题量并非那么多,毕竟每次的大做业给了咱们一个星期的时间,在平时利用空余时间也可随时敲敲code。前两次的大做业都还好,都可以将全部的测试点给经过,而不是一堆的让人崩溃的绿色(PTA测试点不经过的状况),而且能够提早完成。可是到了最后的一次的大做业,明显难度就上升了好多,说实话十天的时间是够的,可是不知道我为何就是没有写出来最后一题(可能本身的思惟逻辑不够严谨强大吧,也可能就是本身比较懒,嘿嘿,之后必定更加努力)一元多项式求导(类设计)。测试
总的来讲我对这三次的大做业还算是满意,就是对最后的一次大做业感受仍是挺失望的,毕竟没有经过因此的测试点,看着其余经过的同窗心里仍是挺难受的,不过经过这三次的大做业仍是让我学到了挺多的。说了这么多,下面就让我来对这三次的做业作个具体的描述吧。优化
二. CODE设计与分析ui
• 对于第一次的做业相对来讲仍是比较简单的,最后一题应该也就算是难一点的吧spa
对于这题的分析,主要仍是将不一样的三角形的区别有个良好的认知就能够了,我将这个判断写在一个类里面,类图以下:设计
用了一些方法即可以将这题解出来了。3d
• 对于第二次的做业,主要的模块仍是求日期,在不容许使用Java中任何与日期有关的类或方法的条件下,这题就是要分析清楚这些月份之间的不一样,搞清楚这些的特殊关系仍是比较能够轻松的解决的,下面是这7-5,7-5的类图展现:rest
• 对于第三次的就比较复杂了,对于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