JAVA题目集1~3的总结
前言:本次博客主要是总结一下有关JAVA课程学习和作业的相关问题与心得。已经上课学习JAVA一个月左右啦,也做了三次大作业了,总体来说,题目还是有点难度的,题量还行,还是能在规定时间内写完的。下面举例具体分析我学会的和遇到的问题吧。
题目集1 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:
在这里给出相应的输出。例如:
结尾无空行
踩坑心得:
错误1:编译错误
前面定义的是double类型,后面的比较比前面的优先,所以出了这个问题。是优先级的问题,可能受到赋值(=)运算符的影响,以为&的优先级比“==”大,实际上恰好相反。相对于位运算符,恒等运算符优先级大一点。而且,其实这里想表达的也并不是赋值,而是比较是否相等。
错误2:答案错误
勾股定理在这里应表示为:a * a + b * b - c * c < 0.000001,而非:a * a + b * b - c * c =0;
浮点数的运算是需要注意的,具体内容我在
源代码:
题目集2 7-4
求下一天 (30 分)
输入年月日的值(均为整型数),输出该日期的下一天。 其中:年份的合法取值范围为[1820,2020] ,月份合法取值范围为[1,12] ,日期合法取值范围为[1,31] 。 注意:不允许使用Java中和日期相关的类和方法。
要求:Main类中必须含有如下方法,签名如下:
输入格式:
在一行内输入年月日的值,均为整型数,可以用一到多个空格或回车分隔。
输出格式:
- 当输入数据非法及输入日期不存在时,输出“Wrong Format”;
- 当输入日期合法,输出下一天,格式如下:Next date is:年-月-日
输入样例1:
在这里给出一组输入。例如:
结尾无空行
输出样例1:
在这里给出相应的输出。例如:
结尾无空行
输入样例2:
在这里给出一组输入。例如:
结尾无空行
输出样例2:
在这里给出相应的输出。例如:
结尾无空行
踩坑心得:
这道题,我一开始的时候并没有想到可以使用数组,我是大概就是一个个地去分析,类似于这样:
得到的结果是:
我认真的看每一个函数,每一个分析,都觉得十分正确,但的确列的很复杂。问了室友,室友说这个用数组协会很简洁明了。我突然就觉得我是神经病。因为这样一个个分析确实容易混淆脑子里的思路,或者掉进逻辑的陷进出不来。苦恼了很久之后,我采用了数组的方法,没想到,一下子就正确了,也进行了进一步的优化,写了一个总的输出语句,看起来就更直接明了了。(当然,如果有大佬能指出我前面单独分析地BUG的话,评论告诉我,我万分感谢!)
设计与分析:
只要将一些特殊值列出并对它们进行相应的操作就没问题,当然为了不让自己思绪混乱,最好简洁的使用数组来进行编码。
源代码:
题目集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.这道题,和前面一道题极为相似,吸取了前面的经验,我毫不犹豫的选用了数组方法。但是,就是因为与前一题极为相似,我放低了谨慎,我因为一个函数方法的错误,徘徊犹疑了很久。如下:

这是很明显的算法错误,应该改为:
2.与上题不同的还有“输入一个取值范围在[-10,10] 之间的整型数n”,所以需要稍微改动非法输入条件,
或
设计与分析:
跟上一题差不多,但要考虑更多特殊值和正负数的问题,当然还是依靠数组来比较方便快捷。
源代码:
题目集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:
在这里给出相应的输出。例如:
结尾无空行
踩坑心得:
这题我本来想偷个懒,将void getnextDate(int year,int month,int day)这个函数直接采用上一次大作业中的取下一天的那个函数,我还将
if(rq.checkInputValidity(rq.getYear(), rq.getMonth(),rq.getDay()))
rq.getNextDate(rq.getYear(), rq.getMonth(),rq.getDay());
else
System.out.print("Date Format is Wrong");
这个判断放到了主函数里,得到的结果是这样的:

我发现测试点都是答案错误,后来我意识到Date rq=new Date();受
public Date() {
int year,month,day;
}
影响应该是无法对检查函数进行取值,所以最后我又将判断合法性放回了取下一天的那个函数,结果正确。
设计与分析:
会上面的题,这题其实就很简单,主要是学会类的定义就好了。
源代码:
题目集3 7-3
一元多项式求导(类设计) (50 分)
编写程序性,实现对简单多项式的导函数进行求解。详见作业指导书。
输入格式:
在一行内输入一个待计算导函数的表达式,以回车符结束。
输出格式:
- 如果输入表达式不符合上述表达式基本规则,则输出“Wrong Format”。
- 如果输入合法,则在一行内正常输出该表达式的导函数,注意以下几点: 结果不需要排序,也不需要化简;
- 当某一项为“0”时,则该项不需要显示,但如果整个导函数结果为“0”时,则显示为“0”;
- 当输出结果第一项系数符号为“+”时,不输出“+”;
- 当指数符号为“+”时,不输出“+”;
- 当指数值为“0”时,则不需要输出“x^0”,只需要输出其系数即可。
输出格式见输入输出示例。
输入样例1:
在这里给出一组输入。例如:
结尾无空行
输出样例1:
在这里给出相应的输出。例如:
结尾无空行
输入样例2:
在这里给出一组输入。例如:
结尾无空行
输出样例2:
在这里给出相应的输出。例如:
结尾无空行
设计与分析:
我刚看到的时候,一脸蒙圈。后来各种查阅,这道题呢,主要就是正则表达式 学习了正则表达式,如此便有了一定的思路头绪。
首先,我先将输入的多项式进行判断,如果有空格存在,就删掉空格,直接用函数替换。然后在进行判断是否符合多项式的规则,代码如下:
String s = in.nextLine();
String b = s.replaceAll(" ","");
如果输入的字符串符合多项式的要求,那么就进行多项式的拆解,在这里运用正则表达式,来进行多项式的多种情况,例如:
Pattern.compile("\\+\\d{1,}\\*x\\^\\+\\d{1,}|\\d{1}\\*x\\^\\+\\d{1,}|-\\d{1,}\\*x\\^\\+\\d{1,}|\\+x\\^\\+\\d{1,}|x\\^\\+\\d{1,}|-x\\^\\+\\d{1,}|\\d{1,}\\*x\\^\\d{1,}|\\+\\d{1,}\\*x\\^\\d{1,}|-\\d{1,}\\*x\\^\\d{1,}|\\d{1,}\\*x\\^-\\d{1,}|\\+\\d{1,}\\*x\\^-\\d{1,}|-\\d{1,}\\*x\\^-\\d{1,}|x\\^\\d{1,}|x\\^-\\d{1,}|-x\\^\\d{1,}|\\+x\\^\\d{1,}|\\+x\\^-\\d{1,}|-x\\^-\\d{1,}|\\+\\d{1,}\\*x|-\\d{1,}\\*x|\\d{1,}\\*x|\\+\\d{1,}|-\\d{1,}|\\d{1,}|x|\\+x|-x");;
Pattern.compile("\\d{1,}|-\\d{1,}|\\+\\d{1,}"); ;
Pattern.compile("\\d{1,}|-\\d{1,}");
Pattern.matches("\\d{1,}|-\\d{1,}|\\+\\d{1,}",b);
接着我写了多个方法来进行判断,判断输入的多项式,满足以上哪一种正则表达式,如果满足,就按照相对应的拆分方法进行拆分,然后在输出求导后的多项式。这个题目对我来说还是十分困难的,我写了好久,也咨询了很多同学,到最后也还是有一个测试点一直没有过。

但后来我听我们一个同学说了这个问题
第三题最后一个测试点的问题是:
如果某一项求导以后是个正的常数,那这个项输出的时候不带 + 号
知道问题所在之后,稍作修改就可以啦!
源代码:



浙公网安备 33010602011771号