第二次总结性blog

                                  第二次总结性blog

一、前言

1.第四次大作业中主要考察的是类的设计,调用类里的各种方法以及增值表达式的运用,总共三道题,7-1、7-2的难度适中,花费的时间大概每道题半小时。7-3中点线性系列中关于对凸四边形的计算难度比较大,耗时很久,花了几天都没有弄到满分,其中对于数学的计算比较令人头疼与难以理解。希望自己以后能解决好图形类的题目叭!

2.期中考试一共有三道题,题量不大,三道题是一个渐进的过程,其中第一道题最为简单基础,最后一道题最难。每道题都有给设计类图,按照设计类图完成编程。题目总体来说不太难,思路比较清晰,但是因为我的基础不太扎实,所以我在期中考试中并没有拿到满分。每道题大概费时半个小时,其中我关于容器类的掌握不够扎实,导致我最后一道题并没有拿满分。今后一定要稳扎稳打,将自己的面向对象程序设计的能力提高,不要再出现简单的题目写不出来的情况了。

3.目前做了两次实验,实验的难度总体偏大,每次实验都要写好几天,但是能够很好的锻炼自己的编程能力,很好的巩固自己所学的知识。

二、设计与分析

第四次大作业——7-2 点线型系列4—凸四边形的计算

1.思路

 1.通过charAt的运用对字符串进行分析,

 2.判断空闲、起始、结束以及奇偶校验位的数字是否存在和正确,

 3.用if语句再对相应的情况进行不同的分析,输出不同的结论。

2.重要代码分析

1.//判断是否为四边形

复制代码
 1 class Judge2{
 2 
 3 public static boolean judge2(double x1,double y1,double x2,double y2,double x3,double y3,double x4,double y4){
 4     double[] core;
 5     core=nodical.nod(x1, y1, x4, y4, x3, y3, x2, y2);
 6   if ((y4 - y3) * (x4 - x2) == (y4 - y2) * (x4- x3))
 7          return false;
 8   else if ((y4- y3) * (x4 - x1) == (y4 - y1) * (x4 - x3))
 9     return false;
10   else if ((y4 - y2) * (x4 - x1) == (y4 - y1) * (x4 - x2))
11     return false;
12   else if ((y3 - y2) * (x3 - x1) == (y3 - y1) * (x3 - x2))
13     return false; //任意三个顶点成直线,非四边形
14   else if((y1-y2)*(x3-x4)-(y3-y4)*(x1-x2)==0&&(y2-y3)*(x3-x4)-(y3-y4)*(x2-x3)==0)
15     return false;
16   if(( ((core[0]>x1&&core[0]<x2)||(core[0]>x2&&core[0]<x1)) &&((core[1]>y1&&core[1]<y2)||(core[1]>y2&&core[1]<y1)))&&( ((core[0]>x3&&core[0]<x4)||(core[0]>x4&&core[0]<x3)) &&           ((core[1]>y3&&core[1]<y4)||(core[1]>y4&&core[1]<y3))))
17     return false;
18   else
19     return true;
20   }
21 }
复制代码

2.//四边形判断点是否在四边形内

复制代码
 1 class Judge4{
 2     public static int judge4(double x1,double y1,double x2,double y2,double x3,double y3,double x4,double y4,double x5,double y5) {
 3         double s1,s2,s3,s4,area,area1;
 4         double l1,l2,l3,l4,l5;
 5         double n1,n2,n3,n4,n5;
 6         l1=length.longth(x2, y2, x5, y5);
 7         l2=length.longth(x2, y2, x3, y3);
 8         l3=length.longth(x3, y3, x4, y4);
 9         l4=length.longth(x4, y4, x5, y5);
10         l5=length.longth(x2, y2, x4, y4);
11         n1=length.longth(x1, y1, x2, y2);
12         n2=length.longth(x1, y1, x3, y3);
13         n3=length.longth(x1, y1, x4, y4);
14         n4=length.longth(x1, y1, x5, y5);
15         area=0.5*l1*l4*triangle.sin(l5, l1, l4)+0.5*l2*l3*triangle.sin(l5, l2, l3);
16         s1=0.5*n1*n2*triangle.sin(l2, n1, n2);
17         s2=0.5*n2*n3*triangle.sin(l3, n3, n2);
18         s3=0.5*n3*n4*triangle.sin(l4, n3, n4);
19         s4=0.5*n1*n4*triangle.sin(l1, n1, n4);
20         n5=(float)(s1+s2+s3+s4);
21         area1=(float)area;
22         if(area1-n5!=0)
23             return 0;
24         else
25         {
26             if(n1+n2-l2==0||n2+n3-l3==0||n3+n4-l4==0||n4+n1-l1==0)//判断点是否在线上
27                 return 2;
28             else
29                 return 1;
30         }
31         
32     }
33 }
复制代码

3.类图

 4.踩坑心得

因为我倒在了判断错误格式上了,但是我觉得我将点输入多了的情况判断,正确的格式判断,其余的就是格式错误的格式了,但是这样交上去仍然不行。

5.改进建议

我们可以将一些数学计算做一个类,再引用。否则圈复杂度过高,不利于下次迭代和维护。其实只写了一下合并同类项,因为怕写得多了反而出错,权衡一下收益并没有深入(然后还是出错了QAQ)
对于每一个表达式,我们如果可以定义其哈希值,那么sin(x)与sin((x^2+1))便显然可以以x和x^2+1作为两个sin的键,其指数作为值,这样键值关系就出现了,便依然可以做到对于每个三角函数迅速找到与其对应的cos^2 sin^2 与 1。于是就可以用类似第二次的方法进行优化。但是考虑到嵌套因子的存在,这个优化所需的时间开销应当是会比第二次大不少的。

 期中考试第一题——点与线(类设计)

1.思路

通过题目所给的类图和题目要求去完成代码,通过对类图的分析我解剖去了解思路,然后完成代码。

2.重要代码分析

关于点的设计

 

复制代码
 1 class Point {
 2 
 3 private double x;
 4 private double y;
 5 
 6 public Point() {
 7 
 8 }
 9 
10 public Point(double x,double y) {
11 this.x=x;
12 this.y=y;
13 }
14 
15 public double getX()
16 {
17 return x;
18 }
19 
20 public void setX(double x) {
21 this.x=x;
22 }
23 
24 public double getY()
25 {
26 return y;
27 }
28 
29 public void setY(double y) {
30 this.y=y;
31 }
32 public void display() {
33 
34 }
35 
36 }
复制代码

 

 

 

 

3.类图

 

 

期中考试第二题——7-2 点线面问题重构(继承与多态)

1.思路

通过题目所给的类图和题目要求去完成代码,通过对类图的分析我解剖去了解思路,然后完成代码。

2.重要代码分析

复制代码
 1 Scanner in = new Scanner(System.in);
 2         Element element=new Element();
 3         
 4         double x1 = in.nextDouble();
 5         double y1 = in.nextDouble();
 6         double x2 = in.nextDouble();
 7         double y2 = in.nextDouble();
 8         String color = in.next();
 9         
10         Point p1 = new Point(x1,y1);
11         Point p2 = new Point(x2,y2);
12         Line L1=new Line(p1,p2,color);
13         Plane c = new Plane(color);
14         
15         element=p1;
16         element.display();
17         
18         element=p2;
19         element.display();
20         
21         element=L1;
22         element.display();
23         
24         element=c;
25         element.display();
复制代码

 

 

3.类图

 

期中考试第三题——7-3 点线面问题再重构(容器类)

1.思路

通过题目所给的类图和题目要求去完成代码,通过对类图的分析我解剖去了解思路,然后完成代码。

2.重要代码分析

复制代码
 1 Scanner input = new Scanner(System.in);
 2         int choice = input.nextInt();
 3         double x;
 4         double y;
 5         double z;
 6         double w;
 7         int number;
 8         String color;
 9         
10         
11         GeometryObject g = new GeometryObject();
12          while(choice != 0) {
13                 switch(choice) {
14                 case 1:{
15                     x=input.nextDouble();
16                     y=input.nextDouble();
17                     Point p = new Point(x,y);
18                     g.add(p);
19                 }
20                     break;
21                 case 2:{
22                     x=input.nextDouble();
23                     y=input.nextDouble();
24                     Point p1 = new Point(x,y);
25                     z=input.nextDouble();
26                     w=input.nextDouble();
27                     Point p2 = new Point(z,w);
28                     color = input.next();
29                     Line L = new Line(p1,p2,color);
30                     g.add(L);
31                     
32                 }
33                     break;
34                 case 3:{
35                     color = input.next();
36                     Plane p = new Plane(color);
37                     g.add(p);
38                 }
39                     break;
40                 case 4:{
41                     
42                     number = input.nextInt();
43                     if(g.getList().size()>=number)
44                         g.remove(number-1);
45                     }
46                     
47                 }
48                 choice = input.nextInt();
49             }
50          ArrayList<Element> list = g.getList();
51          for(int i=0;i<list.size();i++) {
52              list.get(i).display();
53          }
复制代码

 

3.类图

 

4.踩坑心得

可能在按照类图写题目是漏看了abstract或者返回的类型,导致错误,类图对不上,通过对类图的仔细分析,才能找出错误。

5.改进建议

对于在这次的实验我觉得没有什么可以改进的,因为我们是按照类图来写的,所以一切都是比较完美的,没有那么多弯路,第一次感觉有类图去写题目是多么的nice。

三、总结

对于自己写的程序来说bug还是有很多的,但形成的原因也是有很多的,比如类的混乱,还有随机数的产生导致有些点可以过,但随机数可能使那些点不能过。还有那些正则表达式超级长,看到就脑阔疼,今后我个人会尽量避免写出这样的代码,除非真的万不得已。

  当然在写第四次大作业的时候7-2中的第4次情况写了一大段,但是当运行的时候就不能运行,一开始以为时是单纯的进不了循环,当测试几个样例的时候发现可以进入,那个时候就快崩溃了,当时代码写的太杂了,而且都是很混乱的,导致自己根本改不好,只能无奈的全删了,去骗分。当时就后悔了,应该讲那些代码写进一个类,在类里面进行判断,这样代码既不会写错,到时候改的时候也会更清晰明了一点。不会像这样气急败坏的删除了。

  期中的做题目,我虽然没有取得满分,但是最后我在下面看了看,我觉得我会,可能是当时太紧张了,学的知识不牢固。通过这次的期中考试我知道了容器怎么用,对于类的分类也更清晰了。

  面向对象不一定比面向过程,面向结果优越,但是优秀的封装和类一定好太多了,第四次作业能写满分,我相信他的封装和代码一定比别人更清晰明了,也更容易看的懂。

  展望:

  经过这半个学期的洗礼,我觉得我的代码能力有明显的提升,当然有些地方也有些不足,同时自我学习能力也会更强,因为那些正则表达式是自己在网络上找的资料学习的,当然大家的进步速度也是迅猛的,我也要加把劲。

  在后面两次作业中,能明显感受到代码量增加,第一次全部加起来都没有400行,但是现在,一个题目就会有200-350行代码左右,因为里面包含很多算法和方法。

   期望:

  在这半个学期我学到了很多东西,例如一些函数的运用,同时也吸取了教训,积累了经验。

posted @   做眉间长风  阅读(79)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· DeepSeek 开源周回顾「GitHub 热点速览」
· 物流快递公司核心技术能力-地址解析分单基础技术分享
· .NET 10首个预览版发布:重大改进与新特性概览!
· AI与.NET技术实操系列(二):开始使用ML.NET
· .NET10 - 预览版1新功能体验(一)
点击右上角即可分享
微信分享提示