PTA题目集1-3的总结

前言

 PTA第一次习题集:

主要有java语言的简单的输入输出语句,if-else语句,数组的定义,排序的方法,题量八题,题量较多,题目难度较为简单;

PTA第二次习题集:

主要有java语言的简单的输入输出语句,if-else语句,循环语句,传参,数组的定义,排序的方法,题量五题,题量适中,题目难度适中;

PTA第三次习题集:

主要有java语言的简单的输入输出语句,if-else语句,类的封装性,正则表达式的运用,动态数组的运用,类的设计,题量三题,题量适中,题目难度偏难;

设计与分析

PTA第一次习题集的7-8

题目:判断三角形的类型

代码分析:SourceMonitor生成图

解释:生成图中的圈复杂度为16,代码状况复杂,可测性中,维护成本中,类除Main类外无其他类,该题需要判断三角形的类型,会出现各种各样的情况,在Main类中的main方法里嵌套了很多if-else语句,能实现判断三角形类型,题目较为简单;

心得:该题属于比较简单,主要是基本的输入,输出,if-else嵌套,写代码时更应该考虑到圈复杂度的问题,使代码更加简洁。

PTA第二次习题集的7-4

题目:求下一天

代码分析:SourceMonitor生成图

 

解释:生成图中的圈复杂度为12,代码状况复杂,可测性中,维护成本中,类除Main类外无其他类,该题目是要求一天的下一天,代码中只有一个Main类,其中main方法用来输入输出,并调用下一天的方法,boolean isLeapYear(int year)判断该年是不是闰年,boolean checkInputValidity(int year,int month,int day)判断输入的年月日是否合法,void nextDate(int year,int month,int day)判断下一天日期;

心得:该题与现实生活连接的比较紧密,主要需要考虑闰年2月份29天的特殊情况情况,每一个月的最后一天,年数不变,月数加1,天数为1;每一年的最后一天,年数加1,月数为1,天数为1。

PTA第二次习题集的7-5

题目:求前N天

代码分析:SourceMonitor生成图

 

 

解释:生成图中的圈复杂度为23,代码状况非常复杂,可测性低,维护成本高,类除Main类外无其他类,该题要求求前N天,代码中一个Main类,一个main方法求前N天,boolean isLeapYear(int year)判断是否为闰年;

心得:该题与现实生活连接的比较紧密,主要需要考虑闰年2月份29天的特殊情况情况,还需注意当n>0的时候是前n天,n<0才是后n天,要不结果完全相反。

PTA第三次习题集的7-2

题目:定义日期类

代码分析:SourceMonitor生成图

Power Designer类图

解释:生成图中的圈复杂度为12,代码状况复杂,可测性中,维护成本中,该题为定义日期类,并且Date三个属性均为私有的,还得体现类的封装性,该程序的方法也在类图中显示出来了,后面求下一天的方法与PTA第二次作业的7-4类似;

心得:在今后写代码中类的属性最好写成私有的,通过get来获取相应的属性这种设计可以体现出类的设计,以及体现类的封装性。

PTA第三次习题集的7-3

题目:一元多项式求导(类设计)

代码分析:SourceMonitor生成图

解释:生成图中的圈复杂度为5,代码状况清晰、结构化,可测性高,维护成本低,但是这道题10个测试点只过了3个,对于这道求导没有很好的方法实现他,只实现了验证多项式的合法性,以及常数的求导;

心得:这道题学了很多新知识(像最主要的正则表达式,动态数组),但是自己还是不会将问题细化,不知道如何分解每个小问题,导致无法解决这道问题。

 

采抗新得

PTA第一次习题集:

由于刚接触java语言,对java语言的书写还不是很习惯(与c语言还是有挺多区别的),会出现各种各样的编译错误,有忘记在最后加上括号,对于要输出的语句需要打引号,漏掉分号,等等简单的问题,这些问题应该也是很多初学者容易犯的,在今后的编码中更加注意就行;

PTA第二次习题集7-4:

问题:

没有考虑到数组是从a[0]开始的,导致月份里面的数与真实月份不匹配,出现了编译错误;

总结:

在拿到题目不要急着去写将问题考虑清楚再开始写

更改过的代码:

 

解释:因为数组从0开始,所以与月份之间的差距为1,为了获取当月的总天数,需要arr[month-1]与day做比较。

PTA第二次习题集7-5:

问题:

1.这道题一上来就开始犯错,思维定势的以为当n>0,是求当天的后几天,n<0是求当天的前几天,导致代码编好测试答案全为答案错误,在测试区与标准答案比对才知道原来理解错意思了;

2.最开始写的时候还考虑了跨几个月的前n天情况,并没有看到题目的同时输入一个取值范围在[-10,10] 之间的整型数n,导致浪费很多时间分析;

总结:

以上两个错误都体现出认真读题的重要性,解决这道题的主要方法还是将符合大规律的写在一起,不符合的话单独列出来。

更改过的代码:

 

解释:把合法输入的代码进行分类就行;

PTA第三次习题集7-2

问题:

第一次需要写体现类封装性的类,对封装性的理解还不深刻;

总结:

根据类图能清晰的看出需要写什么类,类中都有一些什么方法,清楚的了解了封装性的概念。

PTA第三次习题集7-3

问题:

1.对于没有类图的问题就不知道如何去进行类的设计;

2.很容易写着写着就写成C语言的结构;

3.想着将判断合法性,每一项单独提出,对每一项求导,将求导结果进行相加分成4部分来写,但是对正则表达式掌握的不好,对于很多判断都错误了,只能进行简单判断;

4.每次花上很久的时间去进行尝试,结果都不理想,导致心态崩溃,无法真正静心去分析;

总结:

1.要多练来积累经验,对题目要求分析清楚,进行类的设计;

2.java语言一切皆类,不要让c语言的局限了思维;

3.需要深入学习正则表达式的用法;

4.多用知识武装自己,也不会有那么多结果不理想了

分享一下判断多项式的每一项的正则表达式:

改进建议

PTA第二次习题集7-5:

该题的圈复杂度23,代码非常复杂,从代码中可以看出每一种情况其中有两个小情况是一样的,可以将其合并,少一些if-else的嵌套,降低圈复杂度;

PTA第三次习题集7-3:

该题希望在今后的学习中能有更深刻的理解,将问题全部解决,将此题做出。

总结

写博客的知识总结:

对SourceMonitor中的圈复杂度

圈复杂度 (Cyclomatic complexity) 是一种代码复杂度的衡量标准,也称为条件复杂度或循环复杂度,它可以用来衡量一个模块判定结构的复杂程度。

计算方法:有一个简单的计算方法,圈复杂度实际上就是等于判定节点的数量再加上1。向上面提到的:if elseswitch casefor循环、三元运算符,&&,|| 等等,都属于一个判定节点。

 

最好我们每次写程序能将圈复杂度控制在10之内。

 PTA第一次习题集:

1.输入首先的加上 Scanner in = new Scanner(System.in);

​ 使用之前必须加入一个包 import java. util. Scanner;

​ 输入整数型:int a = in.nextInt();

​ 输入浮点数型:int b = in.nextFloat();

​ 输入实数型:int c = in.nextDouble();

​ 2.定义长度为n的数组并对往数组里输入数:

​ int n = in.nextInt();
​ int a[] = new int[n];
​ for(int i=0;i<n;i++){
​ a[i] = in.nextInt();
​ }

​ 输出数组里的每一个元素:

​ for(i=0;i<n;i++)
​ System.out.print(a[i]+" ");

​ 对数组a里的数进行排序java有自己特定的方法: Arrays.sort(a);//(前提必须加入一个包import java.util.Arrays;)

 PTA第二次习题集:

1.for(i=0;i<str.length();i++){

​ str.charAt(i);

}//可以获取字符串里面的元素

2.java中幂次的用法:

Math.pow(a,b);//a的b次方

例如:Math.pow(2,7);//2的7次方

3.将两个数组合并成一个数组:

public static int []New(int[] arr1,int[] arr2)
{
int[] arr3 = new int[arr1.length+arr2.length];
for(int p=0;p<arr1.length;p++)
{
arr3[p]=arr1[p];
}
for(int q=0;q<arr2.length;q++)
{
arr3[arr1.length+q]=arr2[q];
}
return arr3;
}//arr3数组里面的数是arr1与arr2里面的所有数

4.判断是否为闰年

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

PTA第三次习题集:

1.类的封装性

封装将类的某些信息隐藏在类内部,不允许外部程序直接访问,只能通过该类提供的方法来实现对隐藏信息的操作和访问。

例子如下:

2.正则表达式

正则表达式通常被用来检索、替换那些符合某个模式(规则)的文本。

Pattern类和Matcher类:

解释:判断输入str有无符合regex格式的式子,通过m.find找到符合要求的,再通过m.group找到符合要求的每一项,通过这种方法能很好的判断式子的合法性,并把合法的式子得到。

运用Pattern类和Matcher类需加上import java.util.regex.Matcher; import java.util.regex.Pattern;这两个包

3.动态数组(ArrayList类)

引入包:import java.util.ArrayList;

初始化变量:ArrayList List = new ArrayList();

.add()在末端添加元素

.get()获取值

.remove()删除指定的值

.size()获取数组数量

总结:适用于元素个数不确定的情况下,以及需要用到其中的方法。

 总结性话语(待改进地方)

1.通过此次总结发现自己代码的圈复杂度都非常的高,在今后分析问题中把圈复杂度也考虑进去;

2.对类设计的能力有待提高,多学多练多总结;

3.读题非常的不仔细,导致浪费很多时间,无法实现功能;

4.多尝试java中有的函数,新的方法,使代码更加简洁。

 

 

 

posted @ 2021-04-04 16:43  芳7  阅读(260)  评论(0)    收藏  举报