题目1-3BLOG

//知识点,题量,难度。

前言:

  最近发布的三次PTA作业难度确实在一次一次增加,也变得一次比一次难了,我也只有第一次完全做完了的。很难导致我都不愿意去看这些题,在最后不得不去做的时候才会去想起去做,看了看又发现自己还是会的,只要多花时间去思考,去修改还是可以拿到不少分数的。知识点的话,首先是,三次我做了的都没有从面向对象出发,还停留在面向过程。特别是第三次,本来计划是先写出来在将其改编一下,把方法提取出来,但写了一堆后就完全不知道咋去转变了。其次是,对于double与float的使用,任意的小数都会被看为double类型,想要改为float类型,一定要用强制转化改为float类型。但一定要记住强制转换可能会导致数据出现丢失,谨慎使用。合理使用自动转换,并且正确的使用。接着是,对于类似于a++与++a的区别,在使用的时候记住++a是先a+1再进行运算使用而a++相反。最后是,对于字符串,要抓住关键的字符去分别进行处理,在第三次题目时,要求把字符川转换为数字,我在csdn上了解到了2个新的方法,Integer.parseInt(a2[i]);与substring(1);一个可以直接把数字字符串转化为数字,而一个可以提取出关键的2个字符之间的字符串,首位要取最后一位不取。我感觉这三次作业我多没用心做,下次不会了。

  设计与分析:

第三次作业

在对第三次作业进行书写时,我遇到了很大的阻碍,在思考题目时发现我必须认真考虑几个问题:1.因为有逗号,所以要以字符串的形式进行输入。

1 String a1 = scan.nextLine();
2         //String a2 = scan.next();
3         
4         char[]a = new char[a1.length()];//
5         //char[]b = new char[a2.length()];

 

2.非法输入的判定,首先需要考虑的是有奇怪的符号插入,这必须判定为非法输入,其次是需要考虑符号的多输入.错误输入。光是这两点我就头大了。这时候正向考虑可能才是最好的方式。

for(int i = 0;i < a1.length();i++){
            if(a1.charAt(i) == '+'){
                if(a1.charAt(i+1) >= '0' && a1.charAt(i+1) <= '9'){
                    //System.out.println("Wrong Fotmat");
                    judge = true;
                }else{
                    judge = false;
                    break;
                }
            }
        }

 

3。如何将坐标分割开,这必须要找到准确的点可以利用sunstring()来进行分割(这是我目前唯一能想到的方式)但缺点很明显,无法广泛地进行利用只能用在这种少数的点上。再多出一些点就无法进行操作了。未实现第一题,第二三题也不可能得以实现。在完成实验过程中,我完全还是按照面向过程的形式进行书写的。在后续的2个题中我发现了是第一个题的升级,难度在一级一级的上升,但可以利用第一题的大部分进行数字提取,接下来就只是单纯的分类计算了。

//排列出4个数。
                a2[0] = a1.substring(0,num1[0]);
                //System.out.println(a2[0] + "hhhhhhhhhhhhh");
                //w = num1[0] + 1;
                a2[1] = a1.substring(num1[0] + 1,space);
                //w = space + 1;
                a2[2] = a1.substring(space + 1,num1[1]);
                //w = ;
                a2[3] = a1.substring(num1[1] + 1);
//得到四个数表示坐标
                for(int i = 0;i <= 3;i++){
                    if(a2[i].charAt(0) == '+'){
                        a2[i] = a2[i].substring(1);
                        //System.out.println(a2[i]);
                        a3[i] = Integer.parseInt(a2[i]);
                    }else if(a2[i].charAt(0) == '-'){
                        a2[i] = a2[i].substring(1);
                        a3[i] = Integer.parseInt(a2[i]);
                        a3[i] = 0 - a3[i];
                    }else{
                        a3[i] = Integer.parseInt(a2[i]);
                    }
                }

 

4.判断三点共线是,我第一反应是考虑用向量来进行计算这也不失是一种很好的方法,需要在表达出2个向量的表达式子,然后在x,y轴分别相除用double承载,如果2数相同的话就三点共线。由于我未进行方法的封装,所以我不能进行详细的分类。判断直线平行时,我还是想到的向量法,将直线转化为向量平行的问题来解决。

public void s(double []x , ,double []y){
    double x1;
    double x2;
    int isTrue = false;
    x1 = x[0] - x[1];
    y1 = y[0] - y[1];
    x2 = x[0] - x[2];
    y2 = y[0] - y[2];
    double x0 = x1 / x2;
    double y0 = y1 / y2;
    if(x0 == y0){
        isTrue = true;
    }
}

 

5.在第三题中,我也可以直接调用第一题(把第一题作为一个方法)调用完成所需要完成的目的。在第三题中,要表达出三角形内的范围并判断出第四个点是否在三较行的内部,这可以把三角形放在(x ,y)内部利用直线来进行三次直线内外的判断最终得到一个范围是三角的内部。

6.判定是否为非法输入时,可进行正向的考虑。在加号后面考虑是否为0到九的字符,记住这里还是字符的情况,所以要带上‘’,我本来想利用judge来判定是否为非法的,然后方便封装,但结果还是没有进行。但我感觉确实少了很多东西,例如有连个的逗号出现会不会也是一种非法输入,在之间有一些奇怪的符号出现会不会也是一种非法输入。但这种情况虽然想到了但是在不知道从哪开始考虑与判断。于是便就此进行简单的判定。在测试点未过的情况下加判定就行。

for(int i = 0;i < a1.length();i++){
            if(a1.charAt(i) == '+'){
                if(a1.charAt(i+1) >= '0' && a1.charAt(i+1) <= '9'){
                    //System.out.println("Wrong Fotmat");
                    judge = true;
                }else{
                    judge = false;
                    break;
                }
            }
        }

7.第三道作业的的UML图

 

 在分出三角形的类时,在以后的计算中都可以用到这些性质,这就是Java的优势一码多跑。这个三角类的方法,比如判断三角类型属于钝角,直角还是锐角可直接调用该三角类的该方法就非常的简洁明了。

8.在利用射线法时,一定要记得控制x的范围来表示为射线。

小总结:在对第三次题目进行书写时,我感觉自己的的思路受到了很大的限制,特别是在对于方法的封装,有点摸不着头脑。不知道咋去整体去运用减少写后面题目的难度又或者说是减少重复性,提高代码的质量。

BUG情况:

1.在第一个题目时,我在最后计算时忘记讨论符号问题了,得到的结果一直是啥也没有,比如:在代码中不可以减去负数这种形式出现,否则得不到要求的输出。

a4[2] = 0 - a4[2];
                        a4[3] = 0 - a4[3];
                        dis = Math.sqrt(Math.pow(a4[0]+a4[2],2) + Math.pow(a4[1]+a4[3],2));
                    }else if(a4[2]<0){
                        a4[2] = 0 - a4[2];
                        dis = Math.sqrt(Math.pow(a4[0]+a4[2],2) + Math.pow(a4[1]-a4[3],2));
                    }else if(a4[3]<0){
                        a4[3] = 0 - a4[3];
                        dis = Math.sqrt(Math.pow(a4[0]-a4[2],2) + Math.pow(a4[1]+a4[3],2));
                    }else{
                        dis = Math.sqrt(Math.pow(a4[0]-a4[2],2) + Math.pow(a4[1]-a4[3],2));
                    }
//错误方式:
dis = Math.sqrt(Math.pow(a4[0]-a4[2],2) + Math.pow(a4[1]-a4[3],2));

2.在运用字符截取方法时substring(a,b),注意开始的a要取而b不取,不然结果会对不上的。

第二次作业

在第二次作业中,主要是对于空闲位与结束位进行判得出最终想要的二进制数据流。在此基础上,需要对位数进行判断。可将之封装为一个方法,这样就能进行多次使用,这可以大大增加代码的观赏性。不论是自己还是他人。关键在于找到相应的开始符,在8位数截取再加上结束位的判定来确定是否符合要求。但还是可以完全用面向过程的方式进行实现。尽管老师要求我们用面向对象思维来写。在最后我会试着给出一个思路UML图。先来分析一下思路与我所学到的吧。

在数据不足11位或者输入数据全1没有起始位,输出"null data“,在利用length()方法进行长度的判定。当只有return时结束,注意如果在return后面加上其他执行项也不会进行执行的。到return就是结束项。

int ln = str.length();
if(ln<11) {
            System.out.print("null data");
            return;
        }

Line的用处:在需要比如输入空格在字符串中并且还想直接进行输出的话,就可以加上这个后缀,防止被空格截取为2个字符串。

String str = input.nextLine();

比如:

String input = scan.next();
System.out.println(input);
String input1 = scan.nextLine();
System.out.println(input1);//input 和input1都输入”abcd acde“;

这时候输出就是2种情况,”abcd“和”abcd acde“,这就是Line的魅力,可以直接把空格输出出来,算解决的String类型的一个问题。

在判定某个数据的结束符不为1时要用到charAt(1)加上for循环来解决索引问题,如下:

if(str.charAt(i+10)!='1') {
                                System.out.print("validate error");
                            i = i + 10;
                            continue;
                        }
                        else 
                            if((str.charAt(i+9)=='0'&&ji==0)||(str.charAt(i+9)=='1'&&ji==1)) {
                                    System.out.print("parity check error");
                                i = i + 10;
                                continue;
                            }

continue;的用法也很有趣,可以跳过当前循环直接进行下一个循环,在有需求时就会知道其重要性了。在看这个时我好奇到如果有2层循环时想要直接跳过外侧的循环是否也有方法:

label : for(;;){
    for(;;){
    continue label;
    }    
}  

在外循环前加一个名,这样便可以直接跳过外层循环,真的很方便。我还看到break也是同样的使用方式!

 

 这是我为第二题方法进行了封装,以后的题最好都按照这个来。

心得体会:

在这三次作业中,我的代码那是突出一个杂乱无章,写着写着就不知道自己在设立的名表达的是啥意思了。这让我非常的头疼,导致在最后我不得不在很多地方进行注释,这才能勉强弄清楚我自己的想法。但确实,当我在代码上写上了注释后,我确实在看到的瞬间就回想起了自己想要表达的意思。所以注释真的非常重要!!!但后2次的得分真的一言难尽,所以,千万不要在最后的时间才开始赶作业,作业一定要在布置的时候就开始写才是最好的选择!!在写的时候不懂的先一定要自己解决,自己去csdn上查可能会让你记忆的更加深刻一些。写blog时,最好配上相应的图,这样条理会更加清晰的,也方便你以后观看和回顾。在写完的基础上,可以去改善一下自己那丑陋的代码,使代码更加简洁才是最好的。写的时候一定要耐心,不然很难坚持下去的。有想法可以去实践,特别是当你只有唯一的一个想法又感觉这想法很难时,一定要去实践!可能你的代码会比他人的自找很多麻烦,但也会有很多的收获的(毕竟在写完之后还可以去请教一下别人的代码嘛),总比啥都不写好吧。

posted @ 2022-04-10 15:47  21201609高源  阅读(53)  评论(0)    收藏  举报