第二次BLOG作业

一、前言

 

这三次题目没题的题量和难度其实算是比上次要减少了,除了那个迭代系列的题,其他的题相较于上次的题要简单许多了。除了迭代部分,考察的就是自学的正则表达式,本人自以为就是如果学好了正式表达式这些题应该是不算什么问题,所以并没有对正则表达式的内容进行归纳。所以,本次归纳总结主要是对迭代部分还有一道大型的容器大题,进行了分析与总结。

 

二、设计与心得

7-4-3

 

if (s.charAt(0)=='4'){

                String[] data5 = a[4].split(",");

                double ex = Double.parseDouble(data5[0]);double ey= Double.parseDouble(data5[1]);point x5=new point(ex,ey);//第五个点

                juli s1=new juli(x3,x4);juli s2=new juli(x5,x3);juli s3=new juli(x5,x4);

                Line k1=new Line(x3,x4);Line k2=new Line(x4,x5);

                if (k1.getSlope()==k2.getSlope()){

                    System.out.print("points coincide");

                    System.exit(0); }

                if (x1.getX()==x2.getX()&&x1.getY()==x2.getY()){

                    System.out.print("points coincide");

                    System.exit(0); }

                if (x3.getX()==x4.getX()&&x3.getY()==x4.getY()){

                    System.out.print("data error");

                    System.exit(0);}

                if (x3.getX()==x5.getX()&&x3.getY()==x5.getY()){

                    System.out.print("points coincide");

                    System.exit(0);}

                if (x4.getX()==x5.getX()&&x4.getY()==x5.getY()){

                    System.out.print("points coincide");

                    System.exit(0);

                } if(s1.getJuli() + s2.getJuli() <= s3.getJuli() || s3.getJuli() + s2.getJuli() <= s1.getJuli() || s1.getJuli() + s3.getJuli() <= s2.getJuli()) {

                    System.out.print("data error");

                    System.exit(0);

                }  //判断是否成三角形  //调用三个gn5并且判断是否在三角形线段内

                gn5 jiao1=new gn5(x1,x2,x3,x4); gn5 jiao2=new gn5(x1,x2,x3,x5); gn5 jiao3=new gn5(x1,x2,x5,x4);int r=0,u=0,t=0;

                double zc=s1.getJuli()+s2.getJuli()+s3.getJuli();

                double p=zc/2;

                double mjmax=Math.sqrt(p*(p-s1.getJuli())*(p-s2.getJuli())*(p-s3.getJuli()));

                double mianji1=0,mianji2=0;

                double n1=0,n2=0,m1=0,m2=0;

                boolean dingdian3=false,dingdian4=false,dingdian5=false;

                if (jiao1.getx()==jiao2.getx()&&jiao1.gety()==jiao2.gety()){

                        dingdian3=true;

                        n1=jiao1.getx();

                        n2=jiao1.gety();

                        m1=jiao3.getx();

                        m2=jiao3.gety();}else if (jiao1.getx()==jiao3.getx()&&jiao1.gety()==jiao3.gety()){

                    dingdian4=true;

                    n1=jiao1.getx();

                    n2=jiao1.gety();

                    m1=jiao2.getx();

                    m2=jiao2.gety();}else if (jiao3.getx()==jiao2.getx()&&jiao3.gety()==jiao2.gety()){

                    dingdian5=true;

                    n1=jiao1.getx();

                    n2=jiao1.gety();

                    m1=jiao2.getx();

                    m2=jiao2.gety();}

                point dain1=new point(n1,n2);

                point dain2=new point(m1,m2);

                if (a.length!=5){

                    System.out.println("wrong number of points");

                    System.exit(0)  }//判断点的个数

                if (jiao1.getjieguo())

                    r++;

                if (jiao2.getjieguo())

                    u++;

                if (jiao3.getjieguo())

                    t++;

                int l=r+u+t;

                if (dingdian3||dingdian4||dingdian5)

                    l--;

               if (l==0||l==1){

                   System.out.println(l)}

                else if (l==2){

                        System.out.print("2"+" ");

                        if (r == 1 && u == 1 && t == 0||dingdian5) {

                            juli l1 = new juli(dain1, dain2);

                            juli l2 = new juli(x3, dain2);

                            juli l3 = new juli(x3, dain1);

                            double z = l1.getJuli() + l2.getJuli() + l3.getJuli();

                            double q = z / 2;

                            mianji1 = Math.sqrt(q * (q - l1.getJuli()) * (q - l2.getJuli()) * (q - l3.getJuli()));

                            mianji2 = mjmax - mianji1;}//x3为顶点

                        else if (r == 1 && u == 0 && t == 1||dingdian3) {

                            juli l1 = new juli(dain1, dain2);

                            juli l2 = new juli(dain1, x4);

                            juli l3 = new juli(dain2, x4);

                            double z =  l1.getJuli() + l2.getJuli() + l3.getJuli();

                            double q = z / 2;

                            mianji1 = Math.sqrt(q * (q - l1.getJuli()) * (q - l2.getJuli()) * (q - l3.getJuli()));

                            mianji2 = mjmax - mianji1; }//x4

                        else if (r == 0 && u == 1 && t == 1||dingdian4) {

                            juli l1 = new juli(dain1, dain2);

                            juli l2 = new juli(x5, dain1);

                            juli l3 = new juli(x5, dain2);

                            double z = l1.getJuli() + l2.getJuli() + l3.getJuli();

                            double q = z / 2;

                            mianji1 = Math.sqrt(q * (q - l1.getJuli()) * (q - l2.getJuli()) * (q - l3.getJuli()));

                            mianji2 = mjmax - mianji1; }//x5

                        else {

                            System.out.println("Wrong Format");  }

                        if(mianji1>mianji2){

                            double temp;

                            temp=mianji1;

                            mianji1=mianji2;

                            mianji2=temp;   }

                        System.out.print(mianji1+" ");

                        System.out.print(mianji2);  } }

 

 

 

  先总体说一下,这两次迭代作业的情况,相比于上次的作业总结啊,这次改善了上次代码总结的其中的一个问题-------平均的代码长度问题。主要是在做迭代的时候的第一个迭代的时候是做的是点,线的问题,当时我就意识到,因为功能较多,比较繁杂,做大量的类,防止代码臃肿。所以我基本上把能做的类全都做了类,除了功能里面的判断和字符串的截取,能做的都做了,当然辛苦也没有白费,将平均的方法代码长度减少到了十以内,符合业界标准。然后也因为这两个迭代作业代码长度的问题,也适当做了一些个注释,让注释的比例也提高了。

  再单独的分析一下三角形的问题。平均的逻辑分支条件是符合标准的,而为什么最大的逻辑分支条件不符合标准。我感觉主要问题是在功能4上面,在之后的采访心得,由于分析功能4的判断条件太多了,导致了逻辑最大分支的超标。从而也就导致了深度的提高。因为情况分的太多太细了。

详情可以看到我上面拷贝的功能4代码。

7-6-2

 

 

  然后我们来单独的分析一下迭代中的凸四边形里的问题,相对于三角形,他的问题就更加严重了,因为功能4的判断代码,他实在是太多了,我的功能四套用其中有一部分是套用的,三角形里面的判断在最最一开始,三角形的判断就非常多,在三角形判断的基础上,又加了一个对凸四边形的判断,就导致了逻辑条件分支更深更复杂更多也进一步导致了平均代码逻辑条件的增加。

由此可见,在进行迭代的时候,最近一开始就要考虑好代码的分配,问题,否则会让代码发出臭味。这些都是一环扣一环的。

这里就不粘贴凸四边形的功能4的代码了,因为那个代码我自己看着都烦,由此可见功能四的判断里写的大有问题。

7-5-8

 

相比于迭代的作业,这个容器的作业,我觉得还是完成的比较不错的,在想到了容器这个方法的时候,从一开始的编写难度就已经大大降低了。然后这道题我也是想到了迭代的时候的一个思想,一定要多做类,所以就对,对展示银行,取款,存款等一系列功能都做了一个单独的类。然后并让他们做各司其职,分配了自己的工作,就使得平均代码长度的有效减少和除了最大逻辑,其他的逻辑分支的减少。最大逻辑的问题主要还是取决于check这里面的判断,确实要稍微的复杂一点,因为这里要考虑人物的身份。这里就只粘贴一部分,因为这个跟迭代里面的功能4差不多。

 

三、踩坑心得

对于迭代系列的踩坑心得。

 

  因为迭代作业的感受差不多,所以这里就放在了一起写,并且主要以三角形迭代作为例子进行讲解。

到三角形的时候,因为我做之前了很多的类,然后直接把点线的功能类直接挪用到了三角里,前期还是比较顺利的,除了一些非法输入测试点,实在测不出来那个没有办法,重点是在第四个功能。

因为第四个功能,她的情况实在是太多了,首先你要考虑它的焦点,个数可能是一个可能是两个可能是三个,也可能没有。考虑一个和没有的时候很简单,只要把之前写的点在线段内的功能套用就可以了,但是到了两个和三个的时候就非常麻烦了,两个的时候他就有两种情况,其中之一的情况就是正常的和三角形的两条边各交一个点。另一种情况就是只交一个顶点,但是在我的功能里面,他是算做两个焦点的,所以就导致了本来是一个焦点,变成了两个焦点,我还要去重新判断它是不是这两个点相同?如果相同,我还不能去计算面积。在这里解决就耗费了大量的判断和时间。然后又是两个焦点的第一种情况,这个倒是好解决,因为直接就分割成了一个四边形和一个三角形。

其实就是交三个交点,也就是说交一个顶点,再交上的一个点。这个时候你就又要去判断哪两个交点是一样的了,然后你把那个点删除之后,他就变成两个点了,然后你又得判断两个点的时候的哪种情况,因为交三个点的这种情况它截取的是两个三角形,而不是一个三角形加一个四边形,这又要重新判断。就导致非常非常的麻烦。做这一个功能就耗费了一天的时间,但是普通的例子都过去了,其他的例子还是过不去,就导致我非常的难受(;_;)。

然后在计算面积的时候,你要知道焦点的坐标,这是一个问题,但是我的点和线段的那个单独的功能类已经解决这个问题了,这个倒还好说。最难受的问题就是当你的线交到了三角形的顶点的时候,你就要去判断是交到了哪个点?交到哪条边?。如果交的点不同,边不同就有不同的计算数据。就导致我分这些情况,就分了好多的情况,详情可以见到代码分析那里的源代码。但是我还找不到化简的办法就很难受以至于逻辑嵌套的不合规范。

  更何况,迭代到了凸四边形,还要去判断他是不是凸四边形?如果不是凸四边形,然后去判断是不是三角形?然后又大大增加了嵌套逻辑的不合理性。这里就不再赘述了,因为在判断凸四边形的时候,考虑情况要比三角形更麻烦。所以就写了要比三角形判断多得多的判断,以至于到后面代码已经超过限制了。

 

容器银行的心得

 

  这道题的难点,我感觉不是很怪吧,不像迭代作业里,它的难点主要是在于情况分析和逻辑的设计。一开始我也在思考怎么让这些数据去匹配并且如果存储?后来我想到了容器,然后一系列的问题就迎刃而解了,只不过代码写的比较繁琐,现在在看,我根据新学的知识,感觉这些代码有很大的优化空间,这里我们后面再聊。后面的一些小问题就是非法输入都是通过的try catch进行的实现。用try catch确实大大的减少了对于非法输入判断的代码长度。

 

四、改进和建议。

对于迭代系列的改进和建议。

 

我这里做了个小对比,我把功能4的判断给删除了一部分,图表的逻辑问题大大减少。所以也验证了上一个三角形迭代的平均深度问题,就是出自与功能4。

 

 

 

 

   所以我的改进方案是对功能4交点的判断问题也单独做一个类,因为它太庞大了。还有要想到简化方式,把判断简化,不要再出那么多的分支了。还有在整体上来讲,在分割字符串几乎每个功能都重写了一遍,在这里有应该也单独做一个类,用来单独分割字符串,根据输入的首字母不同,选择不同的模式,分割不同个点数,从而简化代码。自从上次进行了反思,我已经开始在写代码之前,会去画一些个逻辑分析图,我发现确实也是提升了写代码的速度,也大大减少了测试的错误量,但是这个方法好像在功能4上面,好像没有什么用,因为它实在是太复杂了,你自己去写这个逻辑图的话,也是会漏情况的,等到后来再想到的话,就跟没写一样了,也要重新去补,重新去构思。可能需要在网上借鉴一些个好的思路或者学习一些新的方法,简化功能4的复杂程度和判断的逻辑分支。

其他的功能又检查了一遍,确实已经是最简了,已经将其中的大部分功能转移到类里面了,剩下的代码问题就是类里面的可能,后续要对类进行细分。

 

对于容器的改进和建议。

对于容器,我只是用了最简单的用法。所以导致了在录数据的时候,主函数里面代码过多,过于臃肿,我的改进方法是。我要做一个父类,然后让数据类继承这个父类,让他们统一变成父类的变量。然后我再创建一个hashset,然后他的储存类型是父类类型。然后key设置为用户名。这样的在后续就会大大减少录入的臃肿和调用时的繁琐,直接通过父类和key进行对相关用户的数据调用。也就实现了用户数据的一对一调,用不会出现交叉。    

 

五、总结       

这次总结就单单对这三道题进行一个总结吧,在这里学到的新东西,还有一个是限制小数点位数。import java.text.DecimalFormat;

   0代表数字,如果number的位数大于等于pattern的0的个数,result=number。否则不够的位数以0填充。

#号和0的含义相同,都是代表数字,不同的是其不会用0填充,不够位数就不显示。

还有try catch  try/catch 语句用于处理代码中可能出现的错误信息。通常是程序员造成的编码错误或错别字,也可能是拼写错误或语言中缺少的功能
如果没有try/catch 的话,就有可能出现异常导致程序崩溃,而try/catch 则可以保证程序的正常运行。

报错类型就不列举了。 

  正则表达式也学到了一些新东西。不同类型的正则表达式会因为环境配置的不同而无法运行 

经过和老师沟通,我已经明白了,我的学习方法是有问题,并且调整学习方法,从沟通之后大大减少我的压力,然后学习也更加顺畅了,也有额外的时间娱乐和去学习其他科目的知识,在这里还是要感谢段老师的耐心指导。      

posted @   伏蛰  阅读(34)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· Manus的开源复刻OpenManus初探
· AI 智能体引爆开源社区「GitHub 热点速览」
· 从HTTP原因短语缺失研究HTTP/2和HTTP/3的设计差异
· 三行代码完成国际化适配,妙~啊~
点击右上角即可分享
微信分享提示