对Java题目集1-3的总结性分析
前言:
这三次题目集的难度是呈递增的形式,就像游戏里的升级打怪,你的级数越高,那么你要攻略的boss的难度也越大!
(1)nchu-software-oop-1-new 是三次题目集里题量最多的题目,但相应的它的题目也是相对来说最简单的,所有的代码在一个Main类就可以实现
难度:低等
题量:8题
知识点:if-else语句、for循环、简单的输入输出、数组
(2)nchu-software-oop-2 在上一个题目急的难度上增加了一点,有对类的调用。相应的题量减少,但还是能让人接受
难度:中等
题量:5题
知识点:if-else语句、for循环、String类的一些用法、数组、boolean方法的使用
(3)nchu-software-oop-3 的难度在上一个题目集的难度上增加了许多(非常难),涉及到各个类的调用,许多的方法老师上课时可能只是提了一嘴,大多需要自己自学!
难度:高等
题量:3题
知识点:if-else语句、for循环、String类的一些用法、数组、boolean方法的使用,正则表达式的使用
就上述的三个题目集来概括,题目的难度逐步提高,题量减少。但从完成度来看题量并不是决定性因素,题目难度才是!!!而且增加的知识点也要迅速掌握,否则根本无法完成作业,就像本次
作业的第三个题目集中的最后一个题,有几个检测点,无论如何也找不到错误在哪,所以我们不仅要上课认真听讲,课后更是要加快速度自己提前学一些才能跟上老师的步伐。
设计与分析:本次将重点分析题目集1的7-8,题目集2的7-4、7-5以及题目集3的7-2、7-3
(1)题目集1的7-8
—————————————————————题目————————————————————————————————

解题分析:由题目可知首先我们把输入的数据储存在数组中,然后要对输入的数据做一个判断,是否为非法输入,若为非法输入就输出“Wrong Format”运行终止。
若输入的数据是合法的则可以进入下一个步骤,它判断输入数据的三角型的类型,可以根据各种三角型的特性进行判断(如等边三角形:三条边长相等)
根据if-else语句的判断,判断出三角形的类型,输出即可。
提交结果:由于题目只涉及到简单的判断语句以及输出语句所以,同学们可以轻松的通过所有的测试点。这里并无太多较难测试点,只需要注意输出是否对应相应的三角型!

这里给出相应的判断语句以供参考:
if((temp[0]>=1&&temp[0]<=200)&&(temp[1]>=1&&temp[1]<=200)&&(temp[2]>=0&&temp[2]<=200))
判断是否为合法输入.....接下来仅需要补充判断三条边所构成的三角型的代码即可
由于题目全程只有用到一个Main类,没有涉及到相关类的调用。
——————————————————————————————————————————————————————————————————
(2)题目集2的7-4

解题分析:由题目可知,所要求的是求“下一天”,那么其中涉及到许多的判断了:(如是否为闰年,是否正好下一天是下一个月的第一天,或下一天正好是下一年......都有可能,所以这里就涉及到了一些方法的使用。如题目中所给到的方法,需要我们去完善。
一下列出需要注意的情况:
- 注意输入数据的边界
- 注意2月份情况
- 注意12月份情况
- 注意每月有30天和31天的情况
首先:依旧是对输入的数据进行合法判断
public static boolean checkInputValidity(int year,int month,int day){
if(year<1820||year>2020)
return false;
else if(month>12||month<1)
return false;
else if(day>31||day<1)
return false;
else return true;
}//判断输入日期是否合法,返回布尔值
用该方法判断输入的数据是否符合题目要求,并返回布尔值,以判断下面的方法是否继续进行
若为合法数据,则进行下一步,判断输入的年份是否为闰年,这涉及到二月对应的天数(28天或29天)
然后就开始进入解题的最后一步了,就是区分特殊情况与一般情况。
一般情况:只需要相应的天数加一即可:day++
特殊情况:a.若为一个月的最后一天(还需考虑一个月的天数:30天或31天):则month++;day=1;
b.若为二月,则考虑是否为 闰年(若为闰年则二月有29天,若不是则有28天)
c.若为12月,则考虑是否为12月的最后一天(若为最后一天:则进入下一年且下一年不能超过合法数据的年份):year++;month=1;day=1;
public static void nextDate(int year,int month,int day) {
if(month==1||month==3||month==5||month==7||month==8||month==10){//一月有31天
if(day==31){
month++;day=1;
System.out.println("Next date is:"+year+"-"+month+"-"+day); }
else if(day<31){
day++;System.out.println("Next date is:"+year+"-"+month+"-"+day);}}
else if(month==2){
if(day==28){
if(isLeapYear(year)){day++;System.out.println("Next date is:"+year+"-"+month+"-"+day);
}else if(!isLeapYear(year)){ month++;day=1;System.out.println("Next date is:"+year+"-"+month+"-"+day);} }
else if(day==29){if(isLeapYear(year)){
month++;System.out.println("Next date is:"+year+"-"+month+"-"+day); }
else System.out.println("Wrong Format");
}
else if(day<28){ day++;
System.out.println("Next date is:"+year+"-"+month+"-"+day); } }
else if(month==4||month==6||month==9||month==11){ if(day==30){month++;day=1;
System.out.println("Next date is:"+year+"-"+month+"-"+day); }
else if(day<30){day++;
System.out.println("Next date is:"+year+"-"+month+"-"+day); } }
else if(month==12){if(day==31){ year=year+1;month=1;day=1;
System.out.println("Next date is:"+year+"-"+month+"-"+day);}
else if(day<31){day++;
System.out.println("Next date is:"+year+"-"+month+"-"+day);}}}
}
这里给出相应源码以供参考(用于判断下一天的相关方法)

在这题中,最重要的因素便是细心,如上图的一个检测点的错误,便是因为在nextDay的判断函数中对8月的错误判断!
这里给出相应的
sourcemonitor图

可以看出该题目的难度其实并不大,按照我们的实际学习情况,还是能解决的!
———————————————————————————————————————————————————————————————————————
(3)题目集2的7-5
请看题:

由题可知:该题与上一题的大体上是相似的,改变的点为从求下一天变为“求前n天”,在上一题的基础上难度增加了些许,但是只要细心还是能通过该题的测试。
解题思路:同上一题7-4,下面我们来说说相同与不同之处吧
相同之处:同样需要对数据进行合法检查、判断是否为闰年,
不同之处:由下一天变为前N天(且N可能为负数,若n为负数,则为后N天,若N为正数,则为前N天;这里我们不需要把N为正或N为负分开来考虑,只需要用day=day+N即可;
对day进行讨论,若day>30(31),同时伴随着月的讨论
在次奉上源码以供查看
public static void daysago(int year, int month, int day, int n) {
int sum = day - n;
int temp;
if ( month == 5 || month == 7 || month == 8 || month == 10) {
if (sum > 31) {
month++;
day = sum - 31;
} else if (sum < 0) {
month--;
day = 31 + sum;
} else if (sum > 0 && sum < 31) {
day = sum;
}
} else if (month == 3) {
if (sum > 31) {
month++;
day = sum - 31;
} else if (sum < 0) {
month--;
if (isLeapYear(year))
temp=29;else temp=28;
day = temp +sum;
} else if (sum > 0 && sum < 31) {
day = sum;
}
} else if (month == 2) {
if (isLeapYear(year)) {//如果是闰年
if (sum > 29) {
month++;
day = sum - 29;
} else if (sum > 0 && sum < 29) {
day = sum;
} else if (sum < 0) {
month--;
day = 31 +sum;
}
} else {
if (sum > 28) {
month++;
day = sum - 28;
} else if (sum > 0 && sum < 28) {
day = sum;
} else if (sum < 0) {
month--;
day = 31 + sum;
}
}
} else if (month == 4 || month == 6 || month == 9 || month == 11) {
if (sum > 30) {
month++;
day = sum - 31;
} else if (sum < 0) {
month--;
day = 31 + sum;
} else if (sum > 0 && sum < 30) {
day = sum;
}
} else if (month == 12) {
if (sum > 31) {
year++;
month = 1;
day = sum - 31;
if(year>2020){
System.out.println("Wrong Format");
System.exit(0);
}
} else if (sum < 0) {
month--;
day = 30 + sum;
} else if (sum > 0 && sum <= 31) {
day = sum;
}
}
else if(month == 1 ){
if (sum > 31) {
month++;
day = sum - 31;
} else if (sum < 0) {
year--;month=12;
day = 31 + sum;
} else if (sum > 0 && sum < 31) {
day = sum;
}}
System.out.println(n + " days ago is:" + year + "-" + month + "-" + day);
}
调用该方法即可实现题目要求

从给出的错误可以看出,一些大大小小的错误均是由于不细心导致的,考虑的情况没有完整,未考虑全面,所以我们要查缺补漏,作为一名代码人,首先要学会的是修改自己的代码
找出错位的点在哪,然后逐个击破!!只有这样你才能成功通过所有测试点的检查
经过重重努力,终于通过了所有的测试点

———————————————————————————————————————————————————————————————————————————
(4)题目集3的7-2
请看题:

- 当输入数据非法及输入日期不存在时,输出“Date Format is Wrong”;
- 当输入日期合法,输出下一天,格式如下:Next day is:年-月-日
以上的题目列表中已给出了相应的类图,以供参考。
Date类中包含的属性与方法
该题是题目集2中7-4的改良版,不只是单纯的只有一个Main类,这里多出来了一个Date类来对数据进行处理,返回下一天的值,而相应的Main类执行的主要功能就非常简单了,通过这样的方法可以使解题的思路更加的清晰,题目呈现的更加明确,各个类的分工合作明显。
解题思路:a.首先对输入的数据进行合法判断,若数据合法则可以进行下一步,若不合法,则输出"Wrong Format",运行结束。
b.第二通过调用Date类中的方法对输入的数据进行处理,返回对应的数据,然后在Main类中执行输出的功能。
这里给出Date类的对应代码以供参考
class Date{
private int year;
public void setYear(int year) {
this.year = year;
}
public int getYear() {
return year;
}
private int month;
public int getMonth() {
return month;
}
public void setMonth(int month) {
this.month = month;
}
private int day;
public void setDay(int day) {
this.day = day;
}
public int getDay() {
return day;
}
private int [] mon_maxnum=new int []{0,31,28,31,30,31,30,31,31,30,31,30,31};
public boolean checkInputValidity(int year,int month, int day){
if(year<1900||year>2000||month>12||month<1||day>31||day<1)
return false;
else return true;
}
public boolean isLeapyear(int year){
if(year%4==0&&year%100!=0||year%400==0)
return true;
else return false;
}
public void getNextDate(int year,int month,int day){
if(month==1||month==3||month==5||month==7||month==8||month==10)
{
if(day<31)
day++;
if(day==31){
day=1;month++;
}}
else if(month==2){
if(isLeapyear(year)){
if(day<29)
day++;
else if(day==29){
month++;day=1;
}}
else {
if(day==29)
{ System.out.println("Date Format is Wrong");
System.exit(0);}
else if (day < 28) {
day++;
} else {
month++;
day = 1;
}}}
else if(month==4||month==6||month==9||month==11){
if(day<30)
day++;
else if(day==30){
month++;day=1;
}}
else if(month==12){
if(day<31)
day++;
else if(day==31){
year++;
month=1;day=1;
}}
if(checkInputValidity(year,month,day)){
System.out.println("Next day is:"+year+"-"+month+"-"+day);
}}}
大同小异的是他们都具有对闰年的判断,以及把相应的大小月份分开来讨论,思路都算明确,题目并不难解决。(再次强调:细心)
这里给出相应的测试点以供查看

以及对应的SourceMonitor的难度分析图

由该图可看出其难度在品均值水平,并不算难。我们所要做的就是细心考虑每个可能错误的地方,然后把它修改过来
————————————————————————————————————————————————————————————————————————
(5)题目集3的7-3
这一题是一个全新的题目,在以前的作业中,从未出现过,十分困难,其中最困难的点在于正则表达式的用法。导致我写了三天也没有完全写出正确的答案,所以只能给出相应的分析(希望见谅)
如下给出题目:

解题分析: a.由题意可知,我们需要做的是对输入的表达式求导,但是首先我们得用一段正则表达式来对该输入数据进行判断,输入的数据是否正确。若错误,输出“Wrong Format”运行终止
b.若正确,此时我们需要定义不同的正则表达式(指数的、简单数字的、乘法的......)来匹配相应的表达式中的用+号连接起来的式子,把他们拆分到对应的各个数组中去
c.由于在上一步中我们以把表达式拆分到各个数组中去了,那么我们对应不同的数组,我们对应不同的数组写出不同的方法来应用他们,比如,我们把所有(//d)*x的数把,返回它的//d的值,这样就得出相应的导 数
d.其它不同的表达式类型也依次返回它们的导数值,
e.最后把返回的值用加号连接起来输出即可
该题的细节十分之多,代码也及其冗长,一旦在某一个检查点无法通过,那么便是一个灾难,需要观察好久,也不一定能修改正确,在这个题目上,花费了三天的时间,最终也没能完全正确,
它让我感受到我的Java之路任重而道....学习之路还很长,我们仍需努力,才能写出一个个的难题。。。。。。
在这里给出我仅仅通过的三个测试点

踩坑心得:
(1)首先,我们一般在编译器中写代码,不一定会把所有的Java类的名称命名为Main类,所以在我们把代码复制到pta上时,时常会忘记修改类名,导致编译错误,所以下次千万要记得把类名修改过来。

如在这里我就忘记把类名修改为Main,所以出现了编译错误,这个要时时刻刻记在心里,因为一次惨痛的经历,下次在也不敢忘记了。
2.比如在第二次题目集中的求下一天的题目中,里面涉及到大量的关于日期的测试点,我们如果,有哪一个测试点无法通过的话,那么我们只需要输入它给我们的测试时间,看看它会输出什么,然后我们在进行相应的修改,即可。
这样,我们就有修改的思绪,不会像一个无头苍蝇乱撞。
3.当涉及到多个if-else语句时,千万要仔细,(其实我在这里建议大家,在可以不用太多if-else语句时可以不用,把它换成别的语句实现)因为这个语句,可能再有的时候进行的判断与我们所想象的不同,给出的结果也不经如人意
所以我就把在判断下一天是哪一天的题目中,对它进行了修改,把if-else换成了switch语句来使用,原先出现的不知名错误也被解决了
4.最后一点,当遇到某个点实在无法通过时,可以去问老师或者是去问问同学,因为,可能是自己写的代码,无法轻易就观察到自己的错误,而老师就不一样了,他拥有的知识面更广,肯定能找出我们的错误,当然也可以上百度上搜索相应的问题,在其中,还能学到一些新的知识点,(这里借用高数老师的一句话:知识不问来路,学问不问出处)学到了才是真本身
改进建议:
1.对于第三次题目集中的7-3印象十分深刻,那么就聊聊它可能拥有的改进吧:
首先,就7-3这个题目而言,它的要求并没有那么难,表达式中所包含的数据也特别的单一,只涉及到指数与常数,还有乘法、幂函数 的求导,我们数学中长用的几个式子它都没有包含在内,所以接下来它的改进里面可以在次加入一些其他的未涉及到的表达式,如:三角函数,对数的求导.........等等
2.且对于第二次题目集中的求下一天是哪一天的题目
我们可以在为它加一些特殊的功能,如提醒功能:如提醒节日的功能,10月1日是国庆节、5月1日是劳动节,........各种节日都保存在函数中,当正好输出的是指定节日时,那么我们就提醒用户,正好到某某节日啦,记得过节哟~~
增加用户的体验感,何乐而不为呢!!!(而且还有隐藏功能,如提醒用户生日!!给他一个惊喜)
3.当我们的技术精进时,能够设计界面时,那么我们就设计一个输入界面,而不在是原先的那个黑黑的界面,使界面更加美观
总结
这三次题目集让我成功的从一个什么也不会的菜鸟进阶成为会一点点的菜鸟~~~最起码摸到了一点Java的用法 的特殊之处(万物皆对象)从一开始的只会简简单单的套用C,对Java什么也不了解
到后来,学会了类的概念,以及类中所包含的属性与方法的定义,类的调用,属性的封装与调用,以及用类创建自己所需要的对象,接着让对象执行我们想要让他执行的方法。了解到Java中数据库的强大,
基本上他囊括了我们所要用到的很大一部分方法,尤其是字符类Strng,我们需要通过不断的学习来掌握他所赋予我们的这些方法,来调用他们,使我们执行程序更加的简单。
其中,在这三次题目集里学会的最重要的东西便是正则表达式的用法了,它的功能十分强大,几乎随处可见它,比如在网页中,需要创建用户,输入用户密码时,这里便用到了正则表达式,它用来限定用户
的输入,比如密码必须有数字与字母组成,若输入其他的则报错!但对应的时正则表达式的用法也非常的难,这需要不断的去学习!!!
在我们的学习中,自学是很重要的一部分,其实老师只是在课堂上教我们的时间只有一个半小时,课后才是我们主要的学习时间
对课程与老师的建议:希望老师能在要求我们自学一个新的知识点之前就在群里通知我们一下,然后截至时间不要卡的那么死,比如课堂上的作业,通常是20分钟就截至,而如果没学会的话,那么这次的作
业则无法完成了,对一些学习困难的学生很不友好(比如我呜呜呜~~~)希望老师能多给一些机会,其他的老师都管理的很好,对同学也很亲切,很和蔼,在放假时也很关心我们,不忘记给我们布置题目
由此可见老师对我们有多好了!!!另外,从这次题目中,我深刻的体会到自己的不足之处(比如对类的封装以及正则表达式的使用不熟悉)后面我将更加努力的学习!变成一个合格的代码人!!!
浙公网安备 33010602011771号