前言
(1)pta题目集一:
第一次pta题目比较简单,主要是一些比较简单的Java编程,涉及到到的知识点有Sring类型,从字符串中获取字符、if语句、各种数据类型之间的转换,总共8道题,题目量有点多,但是比较简单。
(2)pta题目集二:
第二次pta的题目相较于第一次的题目集要复杂一点,涉及到的知识点与第一次差不多,以及非法格式的判定,总共3道题,相较于第一次的pta难度有所提升。第一道题是将字母装换为数字,可以先将字母全变为大写或小写,再转换为数字。第二道题是RS232串口字符解析,考察的是对字符串的比对,字符串长度,字符串截取方法的用法。第三题相较于第二题更简单。
(3)pta题目集三
第三次的pta题目的难度较高,总共有3道题。涉及到的知识点有正则表达式,方法和类的使用。这3题从点到线再到三角形,难度逐级递增,第三题还涉及了关于三角形与点线之间的关系。
设计与分析:
(1)pta题目集二的7-2
串口字符解析
RS232是串口常用的通信协议,在异步通信模式下,串口可以一次发送5~8位数据,收发双方之间没有数据发送时线路维持高电平,相当于接收方持续收到数据“1”(称为空闲位),发送方有数据发送时,会在有效数据(5~8位,具体位数由通信双方提前设置)前加上1位起始位“0”,在有效数据之后加上1位可选的奇偶校验位和1位结束位“1”。请编写程序,模拟串口接收处理程序,注:假定有效数据是8位,奇偶校验位采用奇校验。
输入格式:
由0、1组成的二进制数据流。例如:11110111010111111001001101111111011111111101111
输出格式:
过滤掉空闲、起始、结束以及奇偶校验位之后的数据,数据之前加上序号和英文冒号。
如有多个数据,每个数据单独一行显示。
若数据不足11位或者输入数据全1没有起始位,则输出"null data",
若某个数据的结束符不为1,则输出“validate error”。
若某个数据奇偶校验错误,则输出“parity check error”。
若数据结束符和奇偶校验均不合格,输出“validate error”。
如:11011或11111111111111111。
设计思路:先判断输入的字符串的长度,长度小于11为非法输入,判断是否全为输入1,全为1非法输入,再读取起始位,从起始位为开始截取11位数进行判断。
代码分析:
代码中出现了很多的if-else使得圈复杂度和深度都超出,当时写的代码有几个测试点没有通过,就加了一些循环和判断语句,导致圈复杂度和深度都超出。
踩坑心得:当时写的时候选择截取11位去判断,没用8位,使得很多判断都要写的复杂一点。还有截取的时候没有考虑到截取到最后没有11位的情况以及一些截取时出现的一些问题,然后就多加了很多循环和判断语句,使得代码很复杂,其实可以重新设计代码。
改进建议:可以把代码的一些冗杂的判断进行修改
(2)pta题目集三的7-1
点线形系列1-计算两点之间的距离
输入连个点的坐标,计算两点之间的距离
输入格式:
4个double类型的实数,两个点的x,y坐标,依次是x1、y1、x2、y2,两个点的坐标之间以空格分隔,每个点的x,y坐标以英文“,”分隔。例如:0,0 1,1或0.1,-0.3 +3.5,15.6。
若输入格式非法,输出"Wrong Format"。
若输入格式合法但坐标点的数量超过两个,输出“wrong number of points”。
输出格式:
计算所得的两点之间的距离。例如:1.4142135623730951
设计思路:根据题目要求先写一个正则表达式来判断格式输入是否正确,然后计算两点间的距离
代码分析:
线的代码并不是很复杂,设计正则表达式来判断格式是否输入正确。
踩坑心得:刚开始的时候没有选择使用正则表达式,写的判断语句很长而且还可能有没有考虑到的情况,后面就改用正则表达式。
改进建议:可以把点设计为一个类,可以在后续用到。
(3)pta题目集三的7-2
点线形系列2-线的计算
用户输入一组选项和数据,进行与直线有关的计算。选项包括:
1:输入两点坐标,计算斜率,若线条垂直于X轴,输出"Slope does not exist"。
2:输入三个点坐标,输出第一个点与另外两点连线的垂直距离。
3:输入三个点坐标,判断三个点是否在一条线上,输出true或者false。
4:输入四个点坐标,判断前两个点所构成的直线与后两点构成的直线是否平行,输出true或者false.
5:输入四个点坐标,计算输出前两个点所构成的直线与后两点构成的直线的交点坐标,x、y坐标之间以英文分隔",",并输出交叉点是否在两条线段之内(不含四个端点)的判断结果(true/false),判断结果与坐标之间以一个英文空格分隔。若两条线平行,没有交叉点,则输出"is parallel lines,have no intersection point"。
输入格式:
基本格式:选项+":"+坐标x+","+坐标y+" "+坐标x+","+坐标y。
例如:1:0,0 1,1
如果不符合基本格式,输出"Wrong Format"。
如果符合基本格式,但输入点的数量不符合要求,输出"wrong number of points"。
不论哪个选项,如果格式、点数量都符合要求,但构成任一条线的两个点坐标重合,输出"points coincide",
设计思路:正则表达式可以使用上一题的,多加一个选项的判断。选项三可以采用两点式来判断是否在一条直线上,选项四判断斜率是否相同或者都不存在斜率,选项五先求两条线的表达式,再求交点。
代码分析:
代码并没有使用类,只使用了方法,代码的逻辑也不是很清晰。这题的格式也要注意,要判断点的输入个数,格式,非法输入。
踩坑心得:在进行非法输入的判断时,用点的正则表达式判断输入的合法性,后来发现还有选项要判断,就将选项和坐标分开判断。这题还要考虑很多的情况,求直线的时候哪个方法更简单就用哪个。
改进建议:并没有用到类,可以把点和线分为两个类会更简单。还有设计的正则表达式也有问题,需要改进。
(4)pta题目集三的7-3
点线形系列3-三角形的计算
用户输入一组选项和数据,进行与三角形有关的计算。选项包括:
1:输入三个点坐标,判断是否是等腰三角形、等边三角形,判断结果输出true/false,两个结果之间以一个英文空格符分隔。
2:输入三个点坐标,输出周长、面积、重心坐标,三个参数之间以一个英文空格分隔,坐标之间以英文","分隔。
3:输入三个点坐标,输出是钝角、直角还是锐角三角形,依次输出三个判断结果(true/false),以一个英文空格分隔,
4:输入五个点坐标,输出前两个点所在的直线与三个点所构成的三角形相交的交点数量,如果交点有两个,则按面积大小依次输出三角形被直线分割成两部分的面积。若直线与三角形一条线重合,输出"The point is on the edge of the triangle"
5:输入四个点坐标,输出第一个是否在后三个点所构成的三角形的内部(输出in the triangle/outof triangle)。
必须使用射线法,原理:由第一个点往任一方向做一射线,射线与三角形的边的交点(不含点本身)数量如果为1,则在三角形内部。如果交点有两个或0个,则在三角形之外。若点在三角形的某条边上,输出"on the triangle"
设计思路:正则表达式可以使用上一题的。通过判断三点是否在一条直线上来判断是否能构成三角形,选项二的面积可以使用海伦公式,选项三判断时,由于使用的是浮点数,所以不能用cos大于小于等于0来判断。选项五可以任取一个无穷远的坐标(99999,0),将输入的点与无穷远的坐标相连,判断是否在内部。
输入格式:
基本格式:选项+":"+坐标x+","+坐标y+" "+坐标x+","+坐标y。点的x、y坐标之间以英文","分隔,点与点之间以一个英文空格分隔。
输出格式:
基本输出格式见每种选项的描述。
异常情况输出:
如果不符合基本格式,输出"Wrong Format"。
如果符合基本格式,但输入点的数量不符合要求,输出"wrong number of points"。
如果输入的三个点无法构成三角形,输出"data error"。
注意:输出的数据若小数点后超过6位,只保留小数点后6位,多余部分采用四舍五入规则进到最低位。小数点后若不足6位,按原始位数显示,不必补齐。例如:1/3的结果按格式输出为 0.333333,1.0按格式输出为1.0
选项4中所输入线的两个点坐标重合,输出"points coincide",
代码分析:
这题还是跟线一样,并没有使用类,就还是很复杂。
踩坑心得:刚开始的判断是否能构成三角形时采用了三角形的定义(两边之和大于第三边),忽略浮点数的精度问题,后面就直接判断三点是否在一条直线上。判断锐角,直角,钝角也是忽略浮点数的精度问题。
改进建议:并没有用到类,可以把点,线,三角形分为三个类会更简单。
总结
总的来说,这三次pta的作业难度逐渐升高,从简到难。第一次pta作业先熟悉了Java的基础知识,第二次pta作业要是字符串的使用,第三次pta作业难度变大,使用正则表达式及类的使用。通过本阶段三次题目集,让我学会了很多关于Java的字符串处理的语法和方法,同时我对于类的使用还不是很熟练,要加强面向对象理念。