前三次题目集大致分析报告
在前三次题目集中初次尝试了使用java语言进行编程,接触到了新的知识和概念,比如如何调用和构造方法,类的概念及类与类之间的关系,并且题目集的难度我认为是逐渐增大的,其中不乏有一些自己没有解决的问题。同时也了解到了一些没考虑过的情况,接下来对三次题目集中的部分题目进行一些简单的分析。
作业的实现过程:
题目集一7-8:
7-8是输入三角形的三个边长然后对三角形的类型进行判断,首先是对非法输入的判断和判断其输入值能否构成一个三角形,只要使用一些if语句即可,结合一些数学知识可以很快的大致分成几类,虽然题目难度不大但是也有一些要考虑的问题。
直角三角形的两种情形,普通直角三角形,等腰直角三角形。初次尝试的的时候,我认为如果三角形的边条件满足直角三角形同时又存在两边相等即为等腰直角三角形,发现运用这样的判断条件是不合适的,之后查资料发现了需要考虑精度的问题
((Math.abs( c * c - a * a - b * b)<= 0.00001)||(Math.abs(a * a - c * c - b * b)<= 0.00001)||(Math.abs(b * b - a * a - c * c)<= 0.00001));采用这样的判断语句后可以正常运行,并且多判断语句的顺序不能随便更改位置关系否则会出现逻辑错误。总的来说作为第一次题目集的内容难度算较为简单。
题目集二7-4:
7-4是输入一个日期然后程序进行判断后输出该日期的下一天,这次题目也让我们首次使用到了“方法”,即为c语言中的函数。依据题目的提示需要使用到如下的方法
public static void main(String[] args);//主方法
public static boolean isLeapYear(int year) ;//判断year是否为闰年,返回boolean类型
public static boolean checkInputValidity(int year,int month,int day);//判断输入日期是否合法,返回布尔值
public static void nextDate(int year,int month,int day) ; //求输入日期的下一天
首先我的思路方向是主方法用于输入参数,isLeapYear用于判断输入的日期年份是否为闰年并给与其他的方法调用处理参数,checkInputValidity用于判断日期输入的合法性, nextDate用于输出日期的下一天。
本次题目中在学习过程中主题为两个方向,1.是对java方法的学习和使用。2.是对布尔类型的学习和使用。在初次尝试后初步了解到了方法之间的调用能模块化的处理问题,以及了解到布尔类型方法只有两个返回值,真或假。考虑到每个月份的天数不尽相同,可以依据每个月的天数分成几个大类依次讨论,同时最特殊的二月要经过isLeapYear方法的判断来输出它的天数。接下来就是对输入的日期是否为该月份的最后一天进行判断,思路清晰。按照这个思路将一,三,五,七,八,十月分为了该月为三十一天的一组,同理又将其他的月份进行如此的分组,并且考虑了输入日期是否为该年的最后一天。
遇到的问题:
1.if(year%4==0)采用了这样的判断语句来判断是否为闰年,结果可想而知,导致很长一段时间没有找到运算结果错误的原因。
2.没有考虑该月会有最后一天的月进位问题。
3.没有考虑到会有该年的最后一天月进位的问题。
题目集二7-5
7-5可以说是在7-4的基础上的一次升级版。按照7-4的思路流程还是一样的进行分组判断但再次基础上我又再次分组,所以我采用了方法进行模块化处理运用了7-4中的类似方法。但逻辑思路可能出了一些问题,需要判断的问题很多,1.该月的天数是多少天然后进行分组,2.输入的n是正数还是负数?3.输入的n是否会让月份发生变化?4.是否会产生年份的变化?
依照这样的思路,实现目的。public static boolean isLeapYear(int year)
{
boolean p = false;
if((year%4==0&&year%100!=0)||(year%400==0))
p = true;
else
p = false;
return p;
}
public static boolean checkInputValidity(int year,int month,int day){
boolean q = false;
if ((year > 2020)||(year < 1820)||(month > 12)||(month < 1)||(day > 31)||(day < 1))
q = false;
else
q = true;
return q;
}
通过两个简单的方法来判断输入年份是否为闰年即便于处理遇到二月这个特殊月份是进行判断。并且对输入日期的合法性进行判断。
接着用Math类对n进行绝对值化if(Math.abs(n) > (31 - s[2])),if(Math.abs(n) > (31 - s[2]))采用多个类似的判断语句来判断输入的日期和n是否会使得月份甚至年份发生改变,然后是对n分为正和负两种情况进行整合。
遇到的问题:
- 没有考虑到会有平年二月二十九这样的特殊日期,判读日期合法性的方法有漏洞。
- 首次操作时无法区分正负两种情况,导致结果出现紊乱的输出。
- 没有将月份的类似情况整合,导致程序复杂效率低下。
- 改进后由于思路问题还是留下了不少问题,如代码接近四百行且使用了近百个if else语句圈复杂度相当的大,类似问题在下次迭代的类似题目中进行大幅度整改。
题目集三7-2:
本次题目可以说是对上次题目的深入讨论,同样的是结合多种方法对输入的数据进行整合处理并输出该输入日期的下一天,但本次题目中要求引入“类”,采用类的手段来操作数据体现java的封装性的特点。题目的本身逻辑思维简单,再者通过上一次的练习实现算法不算问题,问题在于对类的使用,通过上课的学习和平时的练习,了解到私有属性的重要,使得无法从外部对内部属性进行更改更能表现出java的封装性。同时java是以类为程序的基本单位,所以熟练掌握类的使用对以后的学习很有帮助。
从这方面入手,首先我private定义了几个使用属性:year,month,day。定义了一个命名为class Date的类,并在类当中构造了几个方法来处理数据,依然采用从主类中输入数据,同时在主类中调用定义的类来输出。


通过如此手段来引入数据加以处理。
根据题目提供的类图很快能有相应的思路,接下来就是吸取上一次的经验来整合优化算法流程。
遇到的问题:
- 首次使用类的不熟悉,不知道类的框架结构,不知道如何去定义一个类,和类的成分组成。
- 没有private数据后进行声明,导致下面包含相关数据的代码报错。
- 没有用System.exit(0);及时关闭导致输出非法输入时仍然执行后面的代码。
题目集三7-3:
本次题目集是对一元多项式进行求导。可以说这次题目遇到了相当大的问题,花费八天的时间只得了一半的分。首先结合所学过的数学知识对一元多项式的求导相当熟悉,但是把思路转化成代码却十分麻烦。输入的数据是字符串类型,其中多各项糅合在一起,初步想法是通过某种方法能将多项式分为一个一个单位小项然后依次操作,学习玩split函数和多次尝试后,我想分离出两个字符串数组进行比对,能判断指数和负数的正负并且能一一对应,所以我两种方法分割字符串后一个为符号数组,另一个为数字数字。

通过如此方法分割后得到一个只包含x^和-号的字符串和数组和一个只有指数系数常数项的字符串数组。我判断条件是如果出现x^这个元素即证明出现了一个一元项同时检查其前面是否有-这个项,和后一项是否是-即可知道指数和系数的正负情况。
运算较为简单,同时我把字符串分割成一个一个字符的字符串数组,用于来判断输入是否合法。
遇到的问题:
- 没有去掉字符串中的空格,导致后期的字符串分割出现问题。
- 没有考虑首位是否为负号是两种情况,同时出现了循环越界报错的问题。
- 进行分割后出现首位元素为空的情况,循环报错。
- 字符串无法进行整形数那样的加减乘除,需要转化类型。
- 没有考虑到一次项是不包含^遗漏掉了一次项。
- 常数项和系数指数夹杂在一起无法进行分离,运算出现错误。
- 无法对庞大的数据进行处理。
- 判断合法性时没有考虑到出现^,*时若出现整十数字会无法判断。
- 等等错误……
复杂度简单分析:



对于前两个题目不加赘述,后面三个都出现了严重的问题,圈复杂度过于庞大,运算时间长同时出现逻辑错误或者遗漏时很难进行更改,原因在于使用了过多的if else语句大大增加了循环次数,在改进时应尽可避免if语句的使用尽量用swtich语句替代。并且尽可能的优化算法把类似的情况包容在一组考虑方法当中。
查找bug的方法:
总结了一些经验后,老师介绍的debug和自己采用方法来判断某一段代码是否执行了,即在下面进行输出,或者输出结果和预期不符,可以采用输入多种数据依照结果来改正。
心得体会:
遇到复杂或者新鲜问题后发现光靠一个人学很难解决问题,学习的进步也需要别人的帮助,如一个算法设计考虑很久得不出答案思路卡住的时候问周围人可能会有奇效,多于他人讨论对进步很有帮助,如在最后一题老师提示使用正则表达式会更容易上手,没有提取建议固执头铁的我果然是失败了,做了几次题深深的明白了自己实力的差劲,同时老师一再强调代码的规范性,看了看自己的估计只能评上垃圾中的垃圾代码。总的来说自己还是或多或少学到一些东西,比较学习能力也就这样,耐心性子,像老师说的要学的东西还有很多,所以加油!

浙公网安备 33010602011771号