一、前言
对于本次blog所涉及的题目,个人感觉主要是对于String类型的变量处理,以及对于面向过程所使用的类的用法有较高要求,难度也是逐渐递增,尤其是点线三角形更是如此 ,如果不采取类的思想,代码会及其冗余,当然也是第一次如此直接的使用面向对象的编程思维,免不了需要学习其使用过程,中间也会不断地理解面向对象的好处,对于代码量较小的程序,面向对象相对于面向过程的优势似乎没有那么明显。下图是所有题目的大致代码分析。
二、设计与分析
- 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。
例如:
1:11101011
2:01001101
3:validate error
题目分析:不难看出代码的圈复杂度为2.00,说明整体的结构还行,虽然本人在其写完后感觉可能复杂度很高,使用了大量的if、else语句,本题可以算是一次正式的接触接收String类型变量类型进行数据处理,也是用到了很多函数,比如charat()、length(),但是对于数据流的处理,感觉对于程序的架构思路有一点难度(对于本人这个小菜鸡而言)
2、点、线计算
2.1
7-1 点线形系列1-计算两点之间的距离分数 10 作者 蔡轲 单位 南昌航空大学 输入连个点的坐标,计算两点之间的距离 输入格式: 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”。 2.2 7-2 点线形系列2-线的计算 分数 42 作者 蔡轲 单位 南昌航空大学
用户输入一组选项和数据,进行与直线有关的计算。选项包括:
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",
题目分析:这里我就把这一次作业前两题的点和线放一起说了,第三题因为直接面向过程了,就另外稍后再说。
创建了Point和Line两个对象类,然后再在主类Main里面调用,对于选项的输入用五个if判定,然后再在里面分别判断,首先读入用户输入,用split函数将其按照特定符号分隔开并存储
在数组里面,后期转化成坐标需要用强制类型转换,这里用到了类似于Point p2 = new Point(Double.parseDouble(string2[0]),Double.parseDouble(string2[1]))的方法,当然用valueof()也是可以的。
3.
7-3 点线形系列3-三角形的计算 分数 48 作者 蔡轲 单位 南昌航空大学用户输入一组选项和数据,进行与三角形有关的计算。选项包括:
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"
输入格式:
基本格式:选项+":"+坐标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"
题目分析:
差不多复杂度相比于之前的代码就飙升到了17,说实话,面向对象虽然好用,但是对于反复的创建对象以及调用方法,还是偶尔会出现报错,而且每次报错改bug又有很长时间,所以第三题直接面向过程,全部放到主类里面了。
没啥好说的,具体的遇到问题以及解决过程再后面会说到。
三、踩坑心得
1.第一个就是数组查询越界问题了,这个算是逻辑错误吧,写代码过程遇到过很多次了,有时候就是改一下逻辑就好了,有时候是改一下正则判定
2.第二个就是对于强制类型转换的问题,大多数涉及坐标的需要将其转换为double类型,有时候选项判定也要转换为,这时候不是int类型,就第一次接触了interger类型的变量
3.有时候也会遇到方法不能调用,还有什么对象创建为空,是因为将类的属性或者方法设置了private类型,有时候加个static修饰一下就可以直接调用,或者是使用getxxx()或者
setxxx()就可以了(就是很头疼类似的问题)
PS:由于没料到要写blog,所以遇到的问题也没有保存截图,大多数就边查学习边debug也就解决了。
四、改进建议
说实话我感觉肯定有集成式的函数,还是要多了解,这样多用一些肯定可以简化我的代码过程和复杂度
五、总结
-
收获
- 对java的类和对象了解更加深刻,并且已经开始学着去使用它。
- 编码的优化程度大大提高,程序的可读性更好了。
-
不足
一.对java的熟练程度有待提高,还是过于依赖之前C语言的固有思维。
二.对题目的细节考虑不清,非常容易犯一些细节错误,造成测试点的错误。
-
通过本阶段三次题目集的训练对教师、课程、作业、实验、课上及课下组织方式等方面提出的改进建议及意见
- 老师的教学速度是可以接受的,但是试题难度跳跃性过大,学生需要花费非常多时间去学习掌握。(当然也有利于自我的自学能力)
- 希望老师可以对pta的题目进行分析和讲解。
TRANSLATE with