OO第一次博客作业
2021-04-02 lian
-----------------------------------------------
前言
对于这三次pta作业,总体来讲是写得比较顺利的,除了第三次作业的最后一个题(后面会重点讲到),对于作业的量也比较适中。这三次作业主要是让我们理解Java最基础的语法以及各种基本方法,创建方法,类的使用。
设计与分析及踩坑心得
第一次作业
第一次作业都为基础题,八个题都能加强我对Java基础语法以及一些基础语句的使用熟练度,以第八题为例,只要对题目稍作分析,写出他们的大体结构,输出顺序,就能轻松写出题目,只是涉及到许多if else,把结构图转为代码时要多注意输出顺序,这样才能保证代码一次过,而对于此题的算法,主要注意等腰直角三角形的判断,这两个条件是合取关系。当我把以上都做好时,提交代码之后发现有一个测试点一直过不了,对此我一直很不解,测试了很久最后询问了同学,发现是精度的问题,原来,double类型的变量,在平方之后,精度会损失,所以需要把对于直角的判断--平方和相等改为平方相减小于10的-6次方即可((a*a+b*b)-(c*c)<0.0001),这个测试点卡了我很久,因为初学Java,对于Java内部的精度算法不清楚,导致这次错误,不过,这也提醒了我,以后只要涉及到小数点后的问题,都要注意需要什么精度,不然花很多时间也找不到错误,效率很低。
第二次作业
第二次作业前两个题主要是一个过渡,也让我们了解一下进制转换问题和排序问题,而到了后面三个题,就是我们对Java创建方法的初次尝试了,三个题均与月份有关,第一个是求闰年,此题是为后两题做准备,技术要求不高,主要是一个将月份存入数组的技巧和闰年算法,这里要注意除4取余和除100取余是析取关系,二这两个条件析取后的整体要和除400取余合取起来(year%4==0&&year%100!=0||year%400==0),这样算法才是,正确没有遗漏的。而对于星期的判断,因题上已经给出文字算法,这里就不细讲了。到第二个题求下一天,先把前一个题的部分算法照搬过来,因为会有跨月,所以依然要进行闰年判断,需要在判断到是闰年时提前把二月改为29天,防止出错,而跨年和跨月的算法也涉及到许多if else,先进行跨年判断,再跨月,最后普通,依次输出,这里要特别注意,当数据非法时,要在输出wrong的同时直接结束程序,不要数据还会继续传入方法中执行,造成一些不可理解的错误,这个思想也会应用于之后很多地方,因为许多程序在某些特定的时候不需要将全部代码执行,这时就需要一些技巧才能达到目的。对于最后一个题,也是卡了我很久的一个题,求某一天的前n天,卡了很久的主要原因有几个,第一,因为n可正可负,所以跨年和跨月既可以向前跨也可以向后跨,这就导致需要注意每个月的前后有多少天,从而导致if else算法冗杂,当时还没有写注释的习惯,导致写到后面自己都不太清楚哪一段代码是判断哪些月份的。第二,在跨月输出的时候,自己的思路不是很清楚,到时候当时下标判断错误,输出的结果一直不符合自己的想法,但在代码上也没有太大问题,当时也还不会debug,所以在这个地方卡了很久,一直改输出算法,一直尝试,最后才发现是下标的问题。解决了以上问题之后,整个代码才算是初步完成了,之后就是一些细节上的小问题。
第三次作业
第三次作业比起前两次作业在难度上就有很大提高了,仅仅三个题,就导致我学习软件以来第一次作业未全部完成,因为要创建类就行使用,最开始学习他的语法就花了很多时间,以及对于类对象的封装,如何实现私有属性,最后还有恶魔般的正则表达式的学习,这次要学习的东西比起前两次来讲可谓天差地别,这也让我意识到了我对Java的学习才刚刚开始,真正核心的东西我都还未做了解。这次作业前两个题主要是让我们初步了解类的语法,对象的封装,测试类的使用,在主方法中创建类的类型的变量以及调用类里面的东西,让我们熟练这种写法模式,这也是学好Java的开始。做前两个题还算比较顺利,第一个题先熟悉语法,到第二个题就比较熟练了,几乎是一次过
Data(){
Scanner an=new Scanner(System.in);
year=an.nextInt();
month=an.nextInt();
day=an.nextInt();
panduan2=isLeapYear(year);
。到了第三题,正则表达式,最开始罗老师让我们先跟着网课自学一段时间的时候我还不以为然,觉得到时候看看书再听老师讲一讲就能过,事实证明我太天真了,从一开始看到题,就无从下手,然后开始着手学习正则表达式,他的独有语法以及配合pattern,matcher使用让我感觉这不是Java,而是一种新的,独立的语言,最开始我只是写一些简单的数字匹配,理解了+*?的区别,但真的到了求导实战的时候,不管我怎么改我的正则表达式,他都匹配不上,尝试了很久之后又去看了老师发的网址,上面有此题要用的正则表达式详解,看完之后发现自己之前很多地方?+*都用错了,有些地方括号也用错了,最大的问题是匹配顺序,按理来讲我应该将同一项x的系数和指数放在一组,而pattern.matcher返回的boolean类型一直是wrong并且把前一项的指数和后一项的系数匹配在了一组,后反复检查修改也没有写出正确的正则表达式,于是我有返回去继续学习正则表达式,最后写出了能正确分割每一项的正则表达式,
String hh1 = "([-+]?([1-9]+[0-9]*(\\*)?)?x?(\\^[+-]?[1-9]+[0-9]*)?)+";
String hh2 = "[-+]?([1-9]+[0-9]*(\\*)?)?x?(\\^[+-]?[1-9]+[0-9]*)?";
String hh3 = "[-+]?((([2-9]+[0-9]*)|([1-9]+[0-9]+))(\\\\*)?)?x?(\\\\^[+-]?(([2-9]+[0-9]*)|([1-9]+[0-9]+)))?";
String hh4 = "[0-9]";
String regex = "([-+]?[2-9]+[0-9]*)|[-+]?([1-9]+[0-9]+)";
但又发现我把系数和指数提取出来后我无法判断这是指数还是系数,所以程序只能判断每一项都含有指数和系数的方程,想了很久也没有找到解决办法,因为提交时间已到期限,只能将过wrong和常量的代码交了上去,算是比较遗憾,这次作业让我深刻意识到我对于Java学习的不足,对于正则表达式使用得不熟练,对于逻辑的整理不清晰,但经过这次之后,我也会更加努力把每个地方都弄到全懂。而听说下一次作业还有求导,希望在下一次不要像现在这样,加一个半成品上去,再接再厉吧!
改进建议
对于这里每一个题因为测试点的缘故我都没有加提示语句,这对于一个程序来讲是十分不合理的。
这些题用了很多if else,而很多地方的if else我都写得比较乱,主要是没有在写代码前去梳理结构并写出程序框图的习惯,这也是我一个不好习惯,希望自己以后能改进。
if(day-n<1&&month==1)
{
System.out.println(n+" days ago is:"+(year-1)+"-12-"+(31-n+day));
}
else if((day-n)>lian[month-1]&&month==12)
{
System.out.println(n+" days ago is:"+(year+1)+"-1-"+(0-n-(lian[month-1]-day)));
}
else if(day-n>lian[month])
{
System.out.println(n+" days ago is:"+year+"-"+(month+1)+"-"+(0-n-(lian[month-1]-day)));
}
else if(day-n<1)
{
System.out.println(n+" days ago is:"+year+"-"+(month-1)+"-"+((lian[month-2]+day)-n));
}
else
{
System.out.println(n+" days ago is:"+year+"-"+month+"-"+(day-n));
}
总结
在这几次作业中,我入门了Java,又促进了我未来成为一名合格的程序员。
第一次作业学习了Java的基本语法;第二次作业学习了创建方法以及调用;第三次作业学会了创建类以及对其封装和使用,还入门了正则表达式,总的来说收获颇丰,而正则表达式也让我意识到Java不是这么好学的,以后还得要拿出百分之一百二十的努力,去学习更多的东西。
最后,希望以后的作业能布置在上课讲了之后,这样才能让我们少走弯路。