20201318

一、前言

通过三次的pta练习,实话说,确实收获蛮多。从一开始的学习如何从c语言过渡到java;最简单的输入输出也让我感觉新奇,另外,第一次习题的第二个题目(国际标准中电话键盘上字母和数字之间的对应)中,我开始学会了习惯用switch- case,而不是一味的使用if-else;习题集一7-6中,我学会了java中数组的使用(int[]  array=new int[5];)其实题目集一中,我还学会了输出的不同用法,这确实要比差语言的输出要方便的多,比如:System.out.println();是输出并换行的意思,而System.out.print();是输出但不换行的用法;还有System.out.printf()是和c语言中的用法基本一致的,相对使用起来比较复杂,所以我自己相对比较少用。从题目集二开始,难度相对有所提升了,我也是花了更多的时间去查找资料学习相关知识点,题目集二的 7-1 IP地址转换,这是一个新奇的东西,为了完成这个题目,我花了不少功夫,从中也学习到了好多东西,字符串的使用(String类的使用),String list=input.nextLine();同时也学到了很多相关的知识点,比如子字符串的使用subString();还有字符型的强制转换为整 Integer.parseInt()字符串长度的表示和使用 list.length()!=32;另外就是从字符串中获取字符的方法 s.charAt(index);题目集二的 7-2 合并两个有序数组为新的有序数组中,我使用到了冒泡排序法,从新温习并巩固了这一排序方法,同时也去学习了其他一些排序的方法,比如,插入排序法;而接下来几道题目,都是要求用方法,所以,我又开始了方法的学习和实践,从中学会了方法的使用和调用,其实也就和c语言的用法差不多。但实话说,这些题目相对题目集一确实难了好多。题目集三主要是关于类方面的知识,这方面开始是确实是挺生疏的,对我来说也是相对不叫难理解的,花了我大量的时间去学习有关类的知识,最有难度的,要属第三次题目集最后一个题目了,他要用到正则表达式,这是一个重点也是一个难点,他知识点多且复杂,开始的时候,看完视频也不会用,但是经过慢慢的尝试和摸索,我也是成功的掌握了一些正则表达的基本用法,但是一些更加深入的用法海的通过进一步的学习、尝试和熟悉。

二、设计与分析

题目集一7-8

 

 

 

 

 

 

 

 

 

 

这题只用了一个Main类

这题判断三角形类型,我用了if- else语句来控制各种三角形的类型,这是一个最简单的方法。开始的时候,由于控制条件的错误让我改了多次,另外就是,因为复制题目中的三角形类型名称,导致输出时的符号不对,经过检查才发现错误。

题目集二7-4;

 

 

 

 这个题目相对前面的题目难度是有所增加的,也是比较需要细心和仔细的。在写着题目的时候我也是出现了许多的bug;比如;闰年的判断就出现了错误

错误:

public static boolean isLeapYear(int year){
if(year%4==0||year%400==0&&year%100!=0)
return true;
else
return false;

而正确的代码应该是

public static boolean isLeapYear(int year){
if(year%4==0&&year%100!=0||year%400==0)
return true;
else 
return false;

说实话,这个我开始一直都没发现,直到后面检查的时候,同学告诉我这地方是不是存在问题,我仔细思考后发现确实存在漏洞,改正后通过了。这让我积累了经验,同时该代码也是可复刻的代码,以后兴许还能用上。另外,开始的时候写完代码,提交时,pta里面一直显示代码超长,但我发现我写的笔别人的行数更少,于是我带着疑问问老师,老师回答,这是由于我写的代码复杂度太高,就是要我去优化代码,于是我又对自己的代码进行了改进。开始是用了switch- case判断各种条件,复杂度太高,于是我想了一种方式,那就是用数组的方式来存储每个月的天数

int[] mon=new int[]{31,28,31,30,31,30,31,31,30,31,30,31};
if(isLeapYear(year)){
mon[1]=29;

这样我的判断语句就会简单的多,并且会更加的清晰明了。另外,方法的使用让代码更加美观,思路更加清晰简洁。我的主代码就只有几行:

if(checkInputValidity(year,month,day)){
nextDate(year,month,day);
}
else
System.out.println("Wrong Format");
}

如果合法(调用checkInputValidity(year,month,day)方法)就输出下一天(调用nextDate(year,month,day);方法)

否则输出(Wrong Format);这就是主代码了。

不过最核心的应该是求下一天的方法了:

public static void nextDate(int year,int month,int day){
int[] mon=new int[]{31,28,31,30,31,30,31,31,30,31,30,31};
if(isLeapYear(year)){
mon[1]=29;
}
if(month<12&&day<mon[month-1]){
day++;
System.out.println("Next date is:"+year+"-"+month+"-"+day);
}
else if(month<12&&day==mon[month-1]){
month++;
day=1;
System.out.println("Next date is:"+year+"-"+month+"-"+day);
}
else if(month==12&&day<31){
day++;
System.out.println("Next date is:"+year+"-"+month+"-"+day);
}
else if(month==12&day==31){
year++;
month=1;day=1;
System.out.println("Next date is:"+year+"-"+month+"-"+day);
}
}

这里最重要的的就是12月,二月的判断。

 

 

题目集二7-5

 

 

 

 这个题目和上一题有异曲同工之妙,好多东西都是一样的尤其是他的方法,比如闰年的判定和合法性的判定,其实开始时候,我是先写的这道题的,结果由于我思路相对复杂,而且这题的判断条件跟多要考虑的临界点,所以我写了一晚上,但还是好多个点都没过,一个是三月初的测试点,一个是十二月的测试点等等,我仔细整理思路,但老感觉好乱。于是我决定先写前一题,再根据前一题进行适当修改就可以是第五题的答案了。于是,我写完第四题后,只需要对nextDate(year,month,day);进行适当补充修改,就是第五题答案了。于是我成功完成了这道题。

习题集三7-2

 

 

 

 这个题目其实是和题目集二的第四题一样的,但他要求用类的知识来写,也就是要创建一个新的类Date。该类中要有year,month,day三个私有属性。有了前面的代码以及学习完类的相关知识后我很快写完了这道题。主要改进的地方就是:创建一个date类后,设置year,month,day三个私有属性,然后将题目集二的第四题所有方法都拷贝过来,但绝对不是原原本本的拷贝,为了体现类的封装性,我把原来方法里面的参数删了。这就满足了封装性的要求。另外还得注意的是,由于类具有封装性,所以我们不能直接对里面的函数进行使用。这就出现了类的调用问题。必须new一个变量才能对他进行调用(Date src=new Date(););另外,从中我还了解了this的用法和相关知识。

题目集三7-3

 

 

 

 这是目前为止,我做到的最难的一题。他用到了许多我之前从没见过也没接触过的一些用法。主要是正则表达式的运用,我单单雪正则表达式就看了差不多一星期,它里面的东西真的很多。正则表达式(regular expression)描述了一种字符串匹配的模式(pattern),可以用来检查一个串是否含有某种子串、将匹配的子串替换或者从某个串中取出符合某个条件的子串等。但他确实非常的实用,我在解决这道题时,可以用正则表达式来匹配我需要的正确的函数表达式,通过这个来判定输入表达式的合法性。如下

public boolean checkCorrectness(String a) {
Pattern x=Pattern.compile("\\+0|[+-]0\\*|\\^0");
Matcher y=x.matcher(a);
if(y.find())
{return true;}
else
{return false;}

同时,我也可以用它来对一串函数表达式进行分组

public String[] fGroup(String[] array) {
hanshu1=hanshu.replaceAll(" ", "");
Pattern p=Pattern.compile("[-]?(\\d+\\*)?x(\\^[+-]?\\d+)?");
Matcher m=p.matcher(hanshu1);
int i=0;
while(m.find()) {

array[i]=m.group();
i++;
// System.out.for(int i=0; ;)
// System.out.println(m.group());
// m.group();
}
// System.out.println(m.group());

return array;
}

 "[-]?(\\d+\\*)?x(\\^[+-]?\\d+)?"这就是用来表示多项式的表达式,另外,这里也运用了Pattern、Matcher、m.find()。这是匹配的用法若符合匹配模版则输出

Pattern p=Pattern.compile("[-]?(\\d+\\*)?x(\\^[+-]?\\d+)?");//匹配模版
Matcher m=p.matcher(hanshu1);//用来匹配的对象
int i=0;
while(m.find()) {}//如果找到,则。。。这里的find()返回值为boolean类型,即true,false。

对了,这道题中有个大数测试,这让我困惑了很久,后来查找各种资料,请教同学,学长才知道,数据类型中竟然还有个BigInteger,这或许让我惊喜又意外,之前还真不知道有这玩意。

三、总结

经过三次的题目集作业的的提交,我学到了好多,感觉比上学期要充实得多,学习也逐渐忙碌起来,自主学习的能力有所提升。我学到了一些java特有的输入输出方式,学习到了java中数组的定义和使用,学习到了String类的相关知识,学习到了如何获取子字符串substring(),学习到了方法的使用和类的使用,了解了类的封装性,更是学习了正则表达式的相关知识。。。。但其实我觉得,我从中最大的收获并不是这些知识,而是用过这三次的题目集,我学会了自主学习,学会了独立思考,学会了“不写出代码不吃饭”。这应该是我最大的收获了吧,另外就是积累了一些写代码的经验,一些错误点的判断,我也学会了如何看代码,如何高效的查找代码的bug并对其进行修改,学会了如何使用debug,也锻炼了我写代码的一些思维逻辑。但是经过这三次的题目集,我也发现了自己的很多不足。比如对类的使用不太熟练,不是非常理解类,对其里面的很多东西都是一知半解,这还需要我对其进行更进一步的学习和深入了解。正则表达式也是存在很多的欠缺,学习的时间还远远不够,还没能够正真掌握其知识,对split()函数了解不是非常深刻,还需要花时间去琢磨一下。

第一次作业

我开始从从语言过渡到java,通过对比两者的异同,我学会了java的输入输出形式:输入:int id=input.nextInt();输出:System.out.println().学会了java中数组的定义:int[]  array=new int[];

学会了多种排序算法:插入排序法,冒泡排序法,选择排序法。。。

第二次作业

我从中学会了字符串的定义和使用,String类的使用,学会了length()方法,charAt(index)方法,equals(s1)方法以及compareTo(s1)方法的使用。也学会了方法的调用和复刻性。

第三次作业

我学会了类的创建、使用和类之间的调用,还学习到了正则表达式的使用,她其中的一些元字符的含义和用法,以及重复的用法,贪婪与懒惰的知识,patterner、matcher的用法时最关键的,还有s.find()的用法。

 

学习的路还很长,进步的空间还非常大,我们还得继续努力前进。

 

posted @ 2021-04-04 23:16  pta工具人  阅读(96)  评论(0)    收藏  举报