三次作业总结
题目集1:
题目较为简单,总共8道题目,总体难度不大,主要是对于java输入输出,if-else条件判断,以及for/while循环操作的掌握
下面针对第8题进行分析:
7-8 判断三角形类型 (20 分)
输入三角形三条边,判断该三角形为什么类型的三角形。
输入格式:
在一行中输入三角形的三条边的值(实型数),可以用一个或多个空格或回车分隔,其中三条边的取值范围均为[1,200]。
输出格式:
(1)如果输入数据非法,则输出“Wrong Format”; (2)如果输入数据合法,但三条边不能构成三角形,则输出“Not a triangle”; (3)如果输入数据合法且能够成等边三角形,则输出“Equilateral triangle”; (3)如果输入数据合法且能够成等腰直角三角形,则输出“Isosceles right-angled triangle”; (5)如果输入数据合法且能够成等腰三角形,则输出“Isosceles triangle”; (6)如果输入数据合法且能够成直角三角形,则输出“Right-angled triangle”; (7)如果输入数据合法且能够成一般三角形,则输出“General triangle”。
输入样例1:
在这里给出一组输入。例如:
结尾无空行
输出样例1:
在这里给出相应的输出。例如:
结尾无空行
输入样例2:
在这里给出一组输入。例如:
结尾无空行
输出样例2:
在这里给出相应的输出。例如:
结尾无空行
输入样例3:
在这里给出一组输入。例如:
结尾无空行
输出样例3:
在这里给出相应的输出。例如:
该题目存在一个编程中能够对一组无理数进行精确处理,而输入时却无法处理,导致在等腰直角三角形的判定中出现答案错误,也就是第一次提交时出现的部分正确,就是没考虑输入时无法确切的输入无理数,只能通过浮点数不断逼近,为了解决本次问题采取了一个误差值,在误差值的允许范围内视为正确,只要误差值足够小,就可以不断逼近。以下是第一次提交和最后提交前的提交记录。
代码分析:
第一次的作业集的代码由于本身的逻辑并不复杂,所以代码质量一般。
以下为本次作业我的源代码:
题目集二:
难度一般,一共5道题目,主要需要对java数组,字符串处理,java的类,封装性等进行学习和掌握
接下来对4,5两题进行代码分析:
7-4 求下一天 (30 分)
输入年月日的值(均为整型数),输出该日期的下一天。 其中:年份的合法取值范围为[1820,2020] ,月份合法取值范围为[1,12] ,日期合法取值范围为[1,31] 。 注意:不允许使用Java中和日期相关的类和方法。
要求:Main类中必须含有如下方法,签名如下:
输入格式:
在一行内输入年月日的值,均为整型数,可以用一到多个空格或回车分隔。
输出格式:
- 当输入数据非法及输入日期不存在时,输出“Wrong Format”;
- 当输入日期合法,输出下一天,格式如下:Next date is:年-月-日
输入样例1:
在这里给出一组输入。例如:
结尾无空行
输出样例1:
在这里给出相应的输出。例如:
结尾无空行
输入样例2:
在这里给出一组输入。例如:
结尾无空行
输出样例2:
在这里给出相应的输出。例如:
本次作业对于月份判别的方法中,如果一直循环判别的话,会略显复杂,我的处理方式是将月的天数除了2月都进行一次数组赋值,函数第一步进入判别后,给2月赋值,便可以直接对给出日期进行判断合法性。
本次代码一次通过,并未出现问题
代码分析:
以下为本次作业我的源代码:
7-5 求前N天 (30 分)
输入年月日的值(均为整型数),同时输入一个取值范围在[-10,10] 之间的整型数n,输出该日期的前n天(当n > 0时)、该日期的后n天(当n<0时)。
其中年份取值范围为 [1820,2020] ,月份取值范围为[1,12] ,日期取值范围为[1,31] 。
注意:不允许使用Java中任何与日期有关的类或方法。
输入格式:
在一行中输入年月日的值以及n的值,可以用一个或多个空格或回车分隔。
输出格式:
- 当输入的年、月、日以及n的值非法时,输出“Wrong Format”;
- 当输入数据合法时,输出“n days ago is:年-月-日”
输入样例1:
在这里给出一组输入。例如:
结尾无空行
输出样例1:
在这里给出相应的输出。例如:
结尾无空行
输入样例2:
在这里给出一组输入。例如:
结尾无空行
输出样例2:
在这里给出相应的输出。例如:
本题分析求后几天的方式与上题目一致,主要存在以下不同(合法性分析判断之后):
1:直接日期+n
2:后几天可能会超过当前月份,月份需要+1(2月特殊判断)
3:后几天可能会超过当年,进入下一年,需要对年月日都进行更改。
实验提交过程:
代码分析:
本次提交的源代码如下:
题目集三:
题目难度较难,总共三体,其中第三题难度较大,主要对类的创建,类的使用进行学习和掌握
下面对于2,3两题进行代码分析:
7-2 定义日期类 (28 分)
定义一个类Date,包含三个私有属性年(year)、月(month)、日(day),均为整型数,其中:年份的合法取值范围为[1900,2000] ,月份合法取值范围为[1,12] ,日期合法取值范围为[1,31] 。 注意:不允许使用Java中和日期相关的类和方法,否则按0分处理。
要求:Date类结构如下图所示:
输入格式:
在一行内输入年月日的值,均为整型数,可以用一到多个空格或回车分隔。
输出格式:
- 当输入数据非法及输入日期不存在时,输出“Date Format is Wrong”;
- 当输入日期合法,输出下一天,格式如下:Next day is:年-月-日
输入样例1:
在这里给出一组输入。例如:
结尾无空行
输出样例1:
在这里给出相应的输出。例如:
结尾无空行
输入样例2:
在这里给出一组输入。例如:
结尾无空行
输出样例2:
在这里给出相应的输出。例如:
由于作业2中对该类题目进行过分析书写后,本次作业7-2提交未出现错误
代码分析:
作业源码如下:
7-3 一元多项式求导(类设计) (50 分)
编写程序性,实现对简单多项式的导函数进行求解。详见作业指导书。
输入格式:
在一行内输入一个待计算导函数的表达式,以回车符结束。
输出格式:
- 如果输入表达式不符合上述表达式基本规则,则输出“Wrong Format”。
- 如果输入合法,则在一行内正常输出该表达式的导函数,注意以下几点: 结果不需要排序,也不需要化简;
- 当某一项为“0”时,则该项不需要显示,但如果整个导函数结果为“0”时,则显示为“0”;
- 当输出结果第一项系数符号为“+”时,不输出“+”;
- 当指数符号为“+”时,不输出“+”;
- 当指数值为“0”时,则不需要输出“x^0”,只需要输出其系数即可。
输出格式见输入输出示例。
输入样例1:
在这里给出一组输入。例如:
结尾无空行
输出样例1:
在这里给出相应的输出。例如:
结尾无空行
输入样例2:
在这里给出一组输入。例如:
结尾无空行
输出样例2:
在这里给出相应的输出。例如:
问题分析:
由于一次表达式存在空格的干扰,对问题的分析和问题的考虑会显得相当复杂和不可控。因此我们需要对输入的字符串处理,分为:五个步骤:
1:第一个去空格操作,操作后得到没有空格的表达式
1:若空格在数字之间,判定为错误
2:若判定为‘-’号后面,并且下一位是数字,返回错误(false)
2:由于去掉了空格,使得合法性检测情况就更方便了,合法性判断条件如下:
1:数字与x之间需要*
2:带指数x需要后接^
3:“±”号后面需要接数字或者x
4: 开头只能‘-’,数字,x中的一个,否则判定为输入错误
5:数字整体不能为0
3:判定完格式后就可以对规定格式内的数据进行提取系数和指数。
1:开头数字直接判定为系数
2:判定得到系数之后,下一个得到的数字判定为指数,或者x后面为‘±’,判定为指数'1'
3:若x前是‘±’,则系数为1
4:若数字为最后一位或者数字后面接着符号,并且前方读入过了指数或者还没开始读入任意一个数字,判定指数为0
4:取得系数和指数后进行求导操作
1:新系数为系数*指数
2:如果指数不为0,指数-1,指数为0,系数变为0即可
5:输出
1: 系数为1不显示系数,系数为0,指数系数均不显示
2:指数为0,不显示x,指数为1,不显示^1
3:指数带‘-’输出,为正数不输出‘+’
4:第一项式子为正不输出+,为负输出‘-’,其他项数均输出自己系数符号
当然提取数字过程中需要使用BigInteger来进行保存数据,否则在测试点中存在大数据测试过不去,下面给出一些特殊测试数据:
一、 -x+x^2+1
二、3*x^6-x
三、4*x-6+33*x^22-1+1222222222222222222222*x^6666666666666666666
四、16
五、x
Tips:以上均为部分特殊测试点测试,仅供参考,与题目测试点无关
提交过程:
本题最后一个测试点我也测试了很久,后来靠某位大佬的强力测试,得到了题目的测试点,去测试时发现,改题目测试点的数据出锅了,导致一直没通过。错误在于测试点所对应的答案的一次项系数求导后本来是一个整数,整数前是需要输出运算符号加减的,但是改题目最后一个测试点的结果则是正整数不输出符号
eg:12*x^5+66x
正常的求导:60*x^4+66
题目最后一个测试点的答案会要求是:60*x^466
因此为了得分,输出时增加一个条件分类,当指数是1时,并且系数为正数时,不输出运算符号就能通过了。
代码分析:
分析:
由于本次实验函数比较多,而且分工明确,但是每个函数对于不同情况的考虑不一样,依然会出现很多分支,导致函数的圈复杂度变得很大,我用了两个类,第一个类是主函数,用来提示输入输出,以及对应的结构设计的,而caculate类里面全是对字符串的处理,这个时候就需要再分详细一点,并且对于重复代码专门写个函数去调用,让结构更清晰。可以看出这种一直分情况的写方法,不仅深度高,而且时间复杂度也高,判断处理的特殊情况判断时间比较长,所以代码优化方面确实需要改进。
实验源码:
小结心得:
这三次实验对于Java编程有着不同的帮助,作业集一帮助熟悉java编程的相关语法,作业集二对于模块化,对于java中类和对象的思想加深,其中对于封装性考虑占比最大,作业集三对于代码优化,代码使用不同的类和方法来简化问题有着较大帮助,当然以上的代码分析可以看出,代码优化程度还有较大的上升空间,对于一个问题还是会主观的将面向过程的方法带入面向对象思想的编程中,导致if-else的条件分支过多,反而对于一个函数解决一类问题,将复杂的问题分解至不同函数的思想还需要多加练习。对于老师上课的授课方式,多听多练多理解,老师不只是教编程语音更多的是面向对象的思想,问题扩展以及问题发散性思维。这是第一次作业的总结,希望后续作业能够锻炼编码能力,最好与UI界面相关。












浙公网安备 33010602011771号