一、前言
- PTA题目集4:
- PTA题目集5:
- 期中考试:
二、设计与分析
PTA题目集4
-
题目内容
RS232是串口常用的通信协议,在异步通信模式下,串口可以一次发送 5-8位数据,收发双方之间没有数据发送时线路维持高电平,相当于接收方持续收到数据“1”(称为空闲位),发送方有数据发送时,会在有效数据(5~8位,具体位数由通信双方提前设置)前加上1位起始位“0”,在有效数据之后加上1位可选的奇偶校验位和1位结束位“1”。请编写程序,模拟串口接收处理程序,注:假定有效数据是8位,奇偶校验位采用奇校验。 -
题目分析
本题难点(关键点)在于判断非法输入,也可以说这一道题就是判断数据是否合法的问题,对于每一个数据,需要输出序号+其有效数据,如果数据出错,则输出的为序号+出错原因,那么很容易想到,只要提取出每一个数据,然后依次判断合法与否并输出结果就行。 -
题目设计
对于输入数据s,若数据不足11位或者输入数据全1没有起始位,则输出”null data”。if(s.indexOf('0')==-1||s.length()<11){ System.out.println("null data"); return; }
对于一个数据d,若其结束符不为1,则输出“validate error”。
if(d.charAt(10)!='1') System.out.println(j+":validate error");
对于一个数据d,其奇偶校验错误,则输出“parity check error”。
for(int k=0;k<d.length();k++) sum+=(int)d.charAt(k)-'0'; if(sum%2==0) System.out.println(j+":parity check error");
若无错误则输出序号+有效数据
-
完整代码
-
SourceMonitor分析
只能说惨不忍睹,用面向过程写是这样的,由于前两次作业都在PTA上直接写,因此也没有写注释。
PTA题目集5
- 题目内容
输入两个点的坐标,计算两点之间的距离 - 题目分析
本题还是非常简单的,用面向过程的方法几行就能搞定,但是,为了之后几题的代码复用,采用面向对象的方式编写。 - 题目设计
很容易想到可以设计一个Point类,由于点有x,y坐标,因此在Point类里要有这两个属性,计算两点之间的距离也可以放在Point类中class Point{ double x,y; public double getDis(Point a){ //具体实现 } }
可以构建Input类和Format类这两个工具类来分别处理用户的输入以及数据的格式,方便之后复用。
class Input{ //对用户输入的各种提取方法,具体由题目规则而编写 } class Format{ //对格式的不同判断方法,具体由题目规则而编写 }
- 完整源码(其中多余的部分是在之后的题目中添加的,本题中用不到)
- SourceMonitor分析
在绿色部分中的是符合期望的,这里挑没有在绿色部分中的项说,Comments是注释占比,超了还行……本来是想多写点注释方便以后回顾的,问题不大。Methods/Class是类和方法的数量,由于本题简单,因此不需要很多的类与方法,因此偏少情有可原,另外Avg Stmts也是一样的原因,总体来看还不错。再看柱状图,深度集中在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”。 - 题目分析
本题开始变得复杂,显然在Main函数里需要使用switch语句根据输入的选项进行相应的操作,不仅要对每个操作进行实现,还需要对不同的格式进行判断。同样采用面向对象的方式,并且可以利用7-1的代码。 - 题目设计
本题中提到了线的概念,而过两点确定一条直线,因此可以构建Line类,其中包含过的两个点p1,p2。ABC为直线一般方程的参数。class Line{ Point p1,p2; Double A,B,C; }
再设计直线中可能用到的方法,想不出来后可以看看题目,分析需要用到直线方法并且再添加到设计中去。
class Line{ Point p1,p2; Double A,B,C; public double Get_Slope() { //计算斜率 } public double P_to_L_dis(Point a) { //求点a到自身的距离 } public boolean Slope_Exist() { //判断斜率是否存在 } public boolean Line_Parallel(Line l2) { //两直线是否平行 } public boolean Line_Cioncide(Line l2) { //两直线是否重合 } public boolean Point_Cioncide() { //线本身的两点是否是一个点 } public Point Cross_Point(Line l2) { //求两线交点 } public boolean Cross_In_Line(Point a) { //点是否在线段s上 } }
- 完整源码(新增的,可以复用7-1中的Point类、Input类和Format类)
- SourceMonitor分析
对于题目二,主要是最大复杂度太高了,Avg Depth也很高,查看代码发现,主要是主函数的锅,在主函数里镶嵌了太多的switch和if else语句,因此拉高了整个程序的复杂度,其他到还好,通过柱图可以发现,深度在2,5这里较多,普遍较高,还需要改进。
三、踩坑心得
- 第三次作业7-1
这题坑很难受,对于0,0这一个数据需要判断成错误输入,当时改了很久才发现。 - 第三次作业7-2
这题又双叒叕来搞事情,在7-1里不能通过的0,0在这一题有可以通过了,真的是很离谱,只能说测试点很搞心态了。输入的判断最好要用正则表达式,不然光判断就得写上100行。 - 第三次作业7-3
这题要注意的是格式化输出,单纯的String.Format()会保留多余的0,要消去。还要注意有三维坐标点,四维坐标点等等,要注意删除(case 8好像是这个情况),当时以为自己的正则能把这个点筛掉,然后在48分卡了好久….不知道是这个错了
四、改进意见
- 首先一定要把主函数给改掉,由于之前设定了Format类来判断格数正确与否,可以将所有的格式判断都放到里面(虽然当初设计的时候就是这样想的,但是后来敲着敲着就没想到放在Format里),尽量将主函数简化,可以避免圈复杂度过高的问题
- 代码中没有对类的属性进行私有化(private),觉得很麻烦,但其实实际上是需要的,写题的时候偷懒就没写。。
五、总结
这三次作业可以说是从面向过程到面向对象的一个过渡吧,虽然在第三次作业中大部分采用了面向对象的设计思想,但是实际上实现的时候难免会在某些地方写成了面向过程(包括main函数和某些方法内部其实还可以再拆分)。总得来说还是不太熟练,但是对于类的设计还是增加了一点点的经验,并且对字符串处理,修饰符等知识点的掌握程度也有了较大的提升(顺便还复习了一波数学:一般式啥的早忘了…我都无语了)。在之后也会想改进一下现在的代码,方便后面的题目复用。
原文地址:http://www.cnblogs.com/Sudadaaa/p/16838867.html