从这三次的题目集来看,难度系数逐渐增大,Java就像老师说的一样,如果要想完全学会Java,三十年也无法完全教完,说明了Java的难度,这就更加需要我们付出更多的时间去学习了解它,并且Java的应用范围非常的广泛,听学长们说,Java将是我们未来工作的饭碗,所以我们必须要学好它,否则将会后悔莫及。
前言
第一次题目集考察的是前三章的基本内容,目的是让我们学会简单的基本操作,就像第四题的计算税率那道题,考察的都是基本语句,可以用多种方法去做这道题,可以使用if的嵌套语句,也可以使用switch语句,相对于if语句,switch语句更为简单方便,而第二三次的题目集的难度,有了明显的提升。虽然题目一次比一次少,但难度却一次比一次难,考察的知识点也更加的全面,分别运用到了对字符串的使用,方法的调用,对象和类(数据域的封装的等)。题目三一元多项式求导(类设计),实现对简单多项式的导函数进行求解,由于对 Java 程序的不熟悉,在构造两个类时,没有把它分为不同的文件,导致我的代码出现了诸多的错误;
Number类还是太长,内部有部分面向过程的编程思想;
命名不规范,虽然按照代码风格修改成符合要求的命名,但是命名几乎没有什么实际含义。此方法也用到了正则表达式,正则表达式是非常常用且实用的一种方法,既简单易懂,也可以解决许多一些麻烦且棘手的问题。这是我对以上三次题目集的前言。
设计与分析
针对题目集一的第七题,从键盘输入一个整数n,n代表需要排序的整数数量,然后再从键盘输入n个整数,对这些数从小到大排序并输出。对于此题,我所使用的是选择排序法,选择排序法,举个例子,假如有五个数6,2,9,1,8。选择排序法采用的基本操作是比较和交换,不过和比较的对象有一个数是固定的,冒泡排序和他相似,但也有很大的不同,后者是两两比较,前者小于后者则交换。这两种方法在实际的问题中都非常好用,简单易懂。
for( i=0;i<n-1;i++)
{
for( j=0;j<n-i-1;j++)
{
if(sz[j+1]<sz[j])
{
t=sz[j+1];
sz[j+1]=sz[j];
sz[j]=t;
}
}
}
首先控制了轮次,控制比较次数,i指向第一个选定的数组元素,j指向i后的其他元素,如果小于则交换。
判断三角形的类型的这道题,看似简单,时则有着很大的陷阱,考察了对基本知识的掌握。虽然用几句简单的if语句即可,但是在判断b的平方减4ac时右侧一定不能只写0,否则将无法通过该测试点,至于为什么,是因为系统对0的概念不像人一样,对于0,系统是无法理解的,所以一定要写成0.000001。
题目集二的四五题,考察的是类与对象,和一些基本的函数调用。像7-4 求下一天,要求:Main类中必须含有如下方法:
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) ; //求输入日期的下一天
我所提交的源码,使用的是最简单的if语句,简单易懂,虽然是通过了个个测试点,但是看起来却非常的不美观,一些格式上也出现了诸多问题。就像老师所说的垃圾代码一样,但毕竟是初学者,随着时间推移和磨练,我也一样那个可以写出更好的代码。7-5和7-4其实差不多,但是要注意的是闰年的问题,如果是闰年,我们要考虑2月份多出来的那一天和数据是否具有合法性的判断,其实对该题的求解,方法有很多,我的只不过是其中的一种而已,而且还是相当的繁琐。希望今后自己能有所改进。针对题目集三的第二题,考察的是对类的使用,这是Date类的结构图
我们需要按照图表来构造上图内容,这是我所呈现出来的内容,使用数据域作为设置方法或者构造方法的参数可以是代码易于阅读,并且避免了不必要的名字(即this),像this.month=month;的这种。而像第三题这种复杂的一元多项式求导,索要涉及的方面非常多,包括我们必须要掌握的正则表达式,表达式要符合基本规则,还有就是要对表达式求导的理解要透彻。
采坑心得
刚开始所提交的代码总会出现编译错误的问题,随着对Java的了解和错误提示,能够解决绝大多数的问题,出现此等错误不要烦躁,耐心查找并修改便能解决出现的问题。当在pta上出现了部分正确的时候,可能是有一些题目上的要求你没有达到,比如临界点问题,或者应该输出的数据和事实不符,这是我们需要问题的角度出发,找出问题的所在点,进行排查和修改,方能解决实际当中的问题,就拿题目集三的第二题举例
我们需要进行测试,来检查你的代码是否真正的符合题目的要求比如跨年的测试,闰年平年二月底的测试,闰年是29天,平年是28天,在这的基础上进行加减,才不会出现细节上的错误,即使出现了一些测试点不能通过,我们也不能轻易放弃,而是要重视起来,只有解决了你的问题所在,你才会有真正意义上的收获。
还有那道题目集一的最后一题,一定要注意根的判别式符号右边一定要是0.000001,而不是0,系统无法理解0的概念,所以这是我们必须要注意的地方,拿对直角三角形的判断来举例子;
else if((a*a+b*b-c*c<0.000001)||(a*a+c*c-b*b<0.000001)||(b*b+c*c-a*a<0.000001))
System.out.println("Right-angled triangle");
在题目做对的情况下,要注意范围是否合法,否则将会出现边界测试点不通过的问题,例如题目要求,其中:年份的合法取值范围为[1900,2000] ,月份合法取值范围为[1,12] ,日期合法取值范围为[1,31] 。我们必须按照他的要求来进行划分,这是最最最基本的要求。
改进建议
public boolean isLeapYear() {
if ((year%400==0)||(year%4==0&&year%100!=0))
return true;
else
return false;
}
public boolean checkInputValidity() {
if((year<1900||year>2000)||(month<1||month>12)||(day<1||day>31))
return false;
else if( isLeapYear()==true)
if(((month==2)&&(day>29||day<1)) ||((month==4)&&(day>30||day<1))||((month==6)&&(day>30||day<1))||((month==9)&&(day>30||day<1))||((month==11)&&(day>30||day<1))) {
return false;
}
else
return true;
else if(isLeapYear()==false && (month==2 && day>28))
//if(((month==2)&&(day>28||day<1))||((month==4)&&(day>30||day<1))||((month==6)&&(day>30||day<1))||((month==9)&&(day>30||day<1))||((month==11)&&(day>30||day<1)))
return false;
else
return true;
}
针对以上我所写的代码无疑是最易懂的,但也是最垃圾的代码,运用的全都是if语句,如果可以改写成这样
if(month==12&&n>0) {
if(day-n<=aa[month]&&day-n>0) {
a = year;
b = month;
c = day-n;}
if(day-n<=aa[month]&&day-n<0) {
a = year;
b = month-1;
c = aa[b]-n+day;
}
if(day-n<=aa[month]&&day-n==0) {
a = year;
b = month-1;
c = aa[b]-n+day;
}
}
if(month==12&&n<0) {
if(day-n>aa[month]) {
a = year +1;
b = 1;
c =day - n -aa[month];
}
if(day-n<=aa[month]) {
a = year;
b = month;
c =day - n;
}
}
if(month>1&&month<12&&n>0) {
if(day-n<=aa[month]&&day-n>0) {
a = year;
b = month;
c = day-n;}
if(day-n<=aa[month]&&day-n<0) {
a = year;
b = month-1;
c = aa[b]-n+day;
}
if(day-n<=aa[month]&&day-n==0) {
a = year;
b = month-1;
c = aa[b]-n+day;
}
}
if(month<12&&month>1&&n<0) {
if(day-n>aa[month]) {
a = year;
b = month+1;
c =day - n -aa[month];
}
if(day-n<=aa[month]) {
a = year;
b = month;
c =day - n;
}
}
if(month == 1&&n>0) {
if(day-n<=aa[month]&&day-n>0) {
a = year;
b = month;
c = day-n;
}
if(day-n<=aa[month]&&day-n<0) {
a = year-1;
b = 12;
c = aa[b]-n+day;
}
if(day-n<=aa[month]&&day-n==0) {
a = year-1;
b = 12;
c = aa[b]-n+day;
}
}
if(month==1&&n<0) {
if(day-n>aa[month]) {
a = year;
b = month+1;
c =day - n -aa[month];
}
if(day-n<=aa[month]) {
a = year;
b = month;
c =day - n;
}
}
System.out.println(n+" days ago is:"+a+"-"+b+"-"+c);
}
else System.out.println("Wrong Format");
}
我觉得这样不仅工整,而且简单易懂,检查复杂度的时候也很低,没有像我那样复杂度极高,代码寻求的并不是字的多少,而是质量的问题,质量越高,在将来才会被用户和市场的需求和认可,所以我们要追求的是高质量,复杂度极低的代码,当到了截止日期之后,我们可以上网找那些代码写得比你好的人,参考一下他的写法,吸取它代码上的优点并从中改进。或者也可以去问老师,同学,看看他们能不能给你一些好的建议和方法,正所谓三人行,必有我师焉,在一些点上,他们一定会有比较好的方法值得你去参考借鉴。
总结
Java的学习也已经一个月了,对java也有了基本的了解,随着题目的难度系数一次一次的增加,我学到了一些基本的皮毛,对象与类,循环,选择和字符串的使用等等。但针对第九章的对象与类,还是有很多地方没有完全掌握,比如一些数据域的封装性,和一些关键术语的使用还没有熟练运用,在大学,学习一些知识要完全去靠自己,而不能去靠老师来约束你,未来的路是要你自己去走,别人帮不了你,Java是一门复杂且应用非常广泛的这么一门学科,需要你去用心学习和理解,不能模凌两可,学好了它,你便能去靠它去吃饭。对于自己这一个月的学习态度,我并不满意,我总喜欢偷懒,把任务往后去拖,这样是极其不好的行为,我以后一定要改掉这个臭毛病,争取提前去完成任务,关于正则表达式,还是有许多地方没有消化完,还是需要自己去上网学习相关资料,争取将他理解透彻,以后我们还会有很多地方要用到这个正则表达式,所以一定要将他彻底学透,学精。在Java这门课上,老师讲解的很到位,虽然他对我们要求严格,但是我知道,这都是为我们好,最让人钦佩的是,老师几乎每天工作都凌晨两点多才会睡觉,为的是看我们pta上的提交情况,可谓真的是兢兢业业。至于我的意见就是希望老能早点休息,不要那么过度劳累。
老师上课有时候只顾自己讲,
与学生的互动很少,建议:采取多样形式和学生互动(提问,分组讨论等)
,这样能督促学生积极学习,相信效果比较好。
2部分老师认为很多知识我们都已经学过,所以就不再讲解,但其实,我们需要老师给我们带来一些会回忆。
所以我的建议就是老师上课时尽量花点时间,带着我们复习以前学过的知识,这样更能巩固我们之前所学过的知识点。
以上便是我对这次的总结。
原文:https://www.cnblogs.com/1442087602a/p/14616642.html