一、前言

  1. PTA题目集4:
  2. PTA题目集5:
  3. 期中考试:

二、设计与分析

PTA题目集4

  1. 题目内容
    RS232是串口常用的通信协议,在异步通信模式下,串口可以一次发送 5-8位数据,收发双方之间没有数据发送时线路维持高电平,相当于接收方持续收到数据“1”(称为空闲位),发送方有数据发送时,会在有效数据(5~8位,具体位数由通信双方提前设置)前加上1位起始位“0”,在有效数据之后加上1位可选的奇偶校验位和1位结束位“1”。请编写程序,模拟串口接收处理程序,注:假定有效数据是8位,奇偶校验位采用奇校验。

  2. 题目分析
    本题难点(关键点)在于判断非法输入,也可以说这一道题就是判断数据是否合法的问题,对于每一个数据,需要输出序号+其有效数据,如果数据出错,则输出的为序号+出错原因,那么很容易想到,只要提取出每一个数据,然后依次判断合法与否并输出结果就行。

  3. 题目设计
    对于输入数据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");
    

    若无错误则输出序号+有效数据

  4. 完整代码

    
    
  5. SourceMonitor分析
    img
    只能说惨不忍睹,用面向过程写是这样的,由于前两次作业都在PTA上直接写,因此也没有写注释。

PTA题目集5

  1. 题目内容
    输入两个点的坐标,计算两点之间的距离
  2. 题目分析
    本题还是非常简单的,用面向过程的方法几行就能搞定,但是,为了之后几题的代码复用,采用面向对象的方式编写。
  3. 题目设计
    很容易想到可以设计一个Point类,由于点有x,y坐标,因此在Point类里要有这两个属性,计算两点之间的距离也可以放在Point类中
     class Point{
         double x,y;
         public double getDis(Point a){
             //具体实现
         }
     }
    

    可以构建Input类和Format类这两个工具类来分别处理用户的输入以及数据的格式,方便之后复用。

     class Input{
         //对用户输入的各种提取方法,具体由题目规则而编写
     }
     class Format{
         //对格式的不同判断方法,具体由题目规则而编写
     }
    
  4. 完整源码(其中多余的部分是在之后的题目中添加的,本题中用不到)
     
    
  5. SourceMonitor分析
    img
    在绿色部分中的是符合期望的,这里挑没有在绿色部分中的项说,Comments是注释占比,超了还行……本来是想多写点注释方便以后回顾的,问题不大。Methods/Class是类和方法的数量,由于本题简单,因此不需要很多的类与方法,因此偏少情有可原,另外Avg Stmts也是一样的原因,总体来看还不错。再看柱状图,深度集中在2上下,因此还算比较良好的。

期中考试

  1. 题目内容
    用户输入一组选项和数据,进行与直线有关的计算。选项包括:
    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”。
  2. 题目分析
    本题开始变得复杂,显然在Main函数里需要使用switch语句根据输入的选项进行相应的操作,不仅要对每个操作进行实现,还需要对不同的格式进行判断。同样采用面向对象的方式,并且可以利用7-1的代码。
  3. 题目设计
    本题中提到了线的概念,而过两点确定一条直线,因此可以构建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上
     	}
     }
    
  4. 完整源码(新增的,可以复用7-1中的Point类、Input类和Format类)
     
    
  5. SourceMonitor分析
    img
    对于题目二,主要是最大复杂度太高了,Avg Depth也很高,查看代码发现,主要是主函数的锅,在主函数里镶嵌了太多的switch和if else语句,因此拉高了整个程序的复杂度,其他到还好,通过柱图可以发现,深度在2,5这里较多,普遍较高,还需要改进。

三、踩坑心得

  1. 第三次作业7-1
    这题坑很难受,对于0,0这一个数据需要判断成错误输入,当时改了很久才发现。
  2. 第三次作业7-2
    这题又双叒叕来搞事情,在7-1里不能通过的0,0在这一题有可以通过了,真的是很离谱,只能说测试点很搞心态了。输入的判断最好要用正则表达式,不然光判断就得写上100行。
  3. 第三次作业7-3
    这题要注意的是格式化输出,单纯的String.Format()会保留多余的0,要消去。还要注意有三维坐标点,四维坐标点等等,要注意删除(case 8好像是这个情况),当时以为自己的正则能把这个点筛掉,然后在48分卡了好久….不知道是这个错了

四、改进意见

  1. 首先一定要把主函数给改掉,由于之前设定了Format类来判断格数正确与否,可以将所有的格式判断都放到里面(虽然当初设计的时候就是这样想的,但是后来敲着敲着就没想到放在Format里),尽量将主函数简化,可以避免圈复杂度过高的问题
  2. 代码中没有对类的属性进行私有化(private),觉得很麻烦,但其实实际上是需要的,写题的时候偷懒就没写。。

五、总结

这三次作业可以说是从面向过程到面向对象的一个过渡吧,虽然在第三次作业中大部分采用了面向对象的设计思想,但是实际上实现的时候难免会在某些地方写成了面向过程(包括main函数和某些方法内部其实还可以再拆分)。总得来说还是不太熟练,但是对于类的设计还是增加了一点点的经验,并且对字符串处理,修饰符等知识点的掌握程度也有了较大的提升(顺便还复习了一波数学:一般式啥的早忘了…我都无语了)。在之后也会想改进一下现在的代码,方便后面的题目复用。

原文地址:http://www.cnblogs.com/Sudadaaa/p/16838867.html

1. 本站所有资源来源于用户上传和网络,如有侵权请邮件联系站长! 2. 分享目的仅供大家学习和交流,请务用于商业用途! 3. 如果你也有好源码或者教程,可以到用户中心发布,分享有积分奖励和额外收入! 4. 本站提供的源码、模板、插件等等其他资源,都不包含技术服务请大家谅解! 5. 如有链接无法下载、失效或广告,请联系管理员处理! 6. 本站资源售价只是赞助,收取费用仅维持本站的日常运营所需! 7. 如遇到加密压缩包,默认解压密码为"gltf",如遇到无法解压的请联系管理员! 8. 因为资源和程序源码均为可复制品,所以不支持任何理由的退款兑现,请斟酌后支付下载 声明:如果标题没有注明"已测试"或者"测试可用"等字样的资源源码均未经过站长测试.特别注意没有标注的源码不保证任何可用性