BLOG_2

(1)前言:本次BLOG主要对7到10周的内容做一个总结,过去几周进行了一次期中考和一次大作业。

  1.大作业还是一如既往的难绷,但是我觉得第一题和第三题设计的非常好,首先学到了新知识,题量也刚刚好,刚好让人能够练习的同时也不会写的太多,这样的就十分的好;而第二题实在是太难受了,我感觉题目是在考我们对于类和继承的应用,但这中间夹杂的一堆数学问题就非常难受,这让人觉得是解决数学问题而不是学习Java语言的使用,这就非常的捞,要是一次一题也还好,一次就来一堆,属实难绷,这方面我就觉得期中考试做的比较好。

  2.期中考试我就觉得相当舒服,对于原来不熟悉的点进行了训练,在次之前我Java语言应用还有不熟,很多还停留在c语言的阶段,但经过期中考试我对类和继承的使用开始有了一点感觉,对Java语言也有了更深一点的理解,我觉得想期中考试这种题目本身有引导性的就要多来点。

(2)设计与分析:

  1.第四次作业7-1:第一题是对正则表达式的初步运用,就是提取数字。用遍历提取确实可以,但用正则表达式方便许多。

while(s.equals("end")==false){
            Pattern p=Pattern.compile("\\d+");
            Matcher m=p.matcher(s);
            while(m.find()){
                a=Integer.parseUnsignedInt(m.group());
                all=all+a;
            }
            System.out.println(all);
            s=in.nextLine();
            all=0;
        }

  首先创建pattern.compile("\\d+")用以提取数字,第一重循环是用换行,第二重循环是对每行的具体处理,用find()检测是否还有没提取的,用group()提取数字的字符串,然后再用Integer.parseUnsignedInt()转化成int,用all记录每行的整数。

  2.第四次作业7-2::直接上图说明。

  

if(s.length()<5){
            System.out.println("Wrong Format");
            return;
        }
        if(s.charAt(0)<'0'||s.charAt(0)>'9'){
            System.out.println("Wrong Format");
            return;
        }
        if(s.charAt(1)!=':'){
            System.out.println("Wrong Format");
            return;
        }
        if((s.charAt(2)<'0'||s.charAt(2)>'9')&&(s.charAt(3)<'0'||s.charAt(3)>'9')){
            System.out.println("Wrong Format");
            return;
        }
        for(int i=0;i<count1;i++){
            if((s.charAt(c1[i]-1)<'0'||s.charAt(c1[i]-1)>'9')&&(s.charAt(c1[i]+1)<'0'||s.charAt(c1[i]+1)>'9')){
                p=0;
                break;
            }
            if(i==count1-1){
                if((s.substring(c1[i]+1).length()>1)&&(s.charAt(c1[i]+1)<'0'||s.charAt(c1[i]+1)>'9')&&(s.charAt(c1[i]+2)<'0'||s.charAt(c1[i]+2)>'9')){
                    p=0;
                    break;
                }
            }
            else if(i<count1-1)
                if((s.charAt(c1[i]+1)<'0'||s.charAt(c1[i]+1)>'9')&&(s.charAt(c1[i]+2)<'0'||s.charAt(c1[i]+2)>'9')){
                    p=0;
                    break;
                }
        }
        if(p==0){
            System.out.println("Wrong Format");
            return;
        }
        for(int i=0;i<count2;i++){
            if((s.charAt(c2[i]-1)<'0'||s.charAt(c2[i]-1)>'9')&&(s.charAt(c2[i]+1)<'0'||s.charAt(c2[i]+1)>'9')){
                q=0;
                break;
            }
            if((s.charAt(c2[i]+1)<'0'||s.charAt(c2[i]+1)>'9')&&(s.charAt(c2[i]+2)<'0'||s.charAt(c2[i]+2)>'9')){
                q=0;
                break;
            }
        }
        if(q==0){
            System.out.println("Wrong Format");
            return;
        }
        if((Integer.parseInt(s.substring(0,1))+4)/2!=count1){
            System.out.println("wrong number of points");
            return;
        }
        if((Integer.parseInt(s.substring(0,1))+4)/2!=count2+1){
            System.out.println("Wrong Format");
            return;
        }

  我的思路不是说一点点遍历看格式是否错误,而是直接得到逗号与空格的数量以及逗号和空格的位置(因为逗号数等于数据组数),通过逗号或者空格两侧元素的ASIC码值来初步判定判定是否正确以及数据数目是否符合要求。如果空格的两边都不是数字或者逗号的两边都不是数字那就格式错误;如果一个非数字符号之后紧跟一个非数字元素那就格式错误,如果String长度连最低要求都达不到,也是格式错误……但这些判定中有一部分其实有点蠢(不精确),比如5,5 +,5就判断不出来而5,5 +5,5就可以,诸如此类错误都不能判定,估计测试数也没有很精确,算是比较幸运。

  

tool=s;
        for(int i=0;tool.contains(",");i++){
            if(i==0)
                c1[i]=tool.indexOf(",");
            else if(i>0)
                c1[i]=tool.indexOf(",")+s.length()-tool.length();
            tool=tool.substring(tool.indexOf(",")+1);
        }
        tool=s;
        for(int i=0;tool.contains(" ");i++){
            if(i==0)
                c2[i]=tool.indexOf(" ");
            else if(i>0)
                c2[i]=tool.indexOf(" ")+s.length()-tool.length();
            tool=tool.substring(tool.indexOf(" ")+1);
        }

  上面是记录空格、逗号位置的方法,先引入工具String类tool,避免改变原有输入s,然后不断找到字符串中第一个空格或逗号,再选取所找到字符后一位到结尾的一段新字符串赋值给tool,如此循环就能记录位置。

int count1=s.length()-s.replace(",","").length();
int count2=s.length()-s.replace(" ","").length();

  这段代码是计算空格和逗号数量的,用s的长度减去把s中所求字符串换成空字符的字符串长度,去除以所求字符串长度即可得到所求字符串的数量,本题所求字符串也就是一个字符,长度为一。

X=s.substring(0,c1[0]);
        Y=s.substring(c1[0]+1,c2[0]);
        x[0]=Double.parseDouble(X);
        y[0]=Double.parseDouble(Y);
        if((X.length()>2&&X.charAt(1)=='0')||(X.length()==2&&X.charAt(0)=='0')){
            System.out.println("Wrong Format");
            return;
        }
        if((Y.length()>2&&Y.charAt(1)=='0')||(Y.length()==2&&Y.charAt(0)=='0')){
            System.out.println("Wrong Format");
            return;
        }
        for(int i=1;i<count2;i++){
            X=s.substring(c2[i-1]+1,c1[i]);
            Y=s.substring(c1[i]+1,c2[i]);
            x[i]=Double.parseDouble(X);
            y[i]=Double.parseDouble(Y);
            if((X.length()>2&&X.charAt(1)=='0')||(X.length()==2&&X.charAt(0)=='0')){
                System.out.println("Wrong Format");
                return;
            }
            if((Y.length()>2&&Y.charAt(1)=='0')||(Y.length()==2&&Y.charAt(0)=='0')){
                System.out.println("Wrong Format");
                return;
            }
        }
        X=s.substring(c2[count2-1]+1,c1[count2]);
        Y=s.substring(c1[count2]+1);
        x[count2]=Double.parseDouble(X);
        y[count2]=Double.parseDouble(Y);
        if((X.length()>2&&X.charAt(1)=='0')||(X.length()==2&&X.charAt(0)=='0')){
            System.out.println("Wrong Format");
            return;
        }
        if((Y.length()>2&&Y.charAt(1)=='0')||(Y.length()==2&&Y.charAt(0)=='0')){
            System.out.println("Wrong Format");
            return;
        }
        double reson=Math.sqrt((Math.pow((double)(x[0]-x[1]), 2.0)+Math.pow((double)(y[0]-y[1]), 2.0))*1.0);
        System.out.println(reson);
        in.close();
    }

  这里就是比较朴实的提取数字并且计算答案了,其中也夹杂了对"005"、"00"这种错误格式的判定。除去前两个和最后两个,每组都是空格到逗号间有一个,逗号到空格间又有一个,然后先用X或Y来存这段字符串,再判断这段字符串是否前两位都位非数字,通过后则用下x[i]或y[i]储存起来,用以计算2点距离。

  这是其中一部分的数学问题,剩下的也不是很会了,会的也不知道怎么说,不太好分析。

  3.第四次作业7-3:非常经典的类应用,将各种数据与各种功能方法储存在BankBusiness类中,使main函数简介明了,使功能模块化。具体功能没什么分析,比较容易实现。

class BankBusiness{
    public static String bankName="中国银行";
    private String name,password;
    private double balance;
    BankBusiness(String name,String password,String bankName){
        this.name=name;
        this.password=password;
        this.bankName=bankName;
    }
    BankBusiness(String name,String password){
        this.name=name;
        this.password=password;
    }
    public static void welcome(){
        System.out.println("中国银行欢迎您的到来!");
    }
    public static void welcomeNext(){
        System.out.println("请收好您的证件和物品,欢迎您下次光临!");
    }
    public void deposit(String password,double business){
        if(this.password.equals(password)){
            balance=balance+business;
            System.out.println("您的余额有"+balance+"元。");
        }
        else{
            System.out.println("您的密码错误!");
        }
    }
    public void withdraw(String password,double business){
        if(this.password.equals(password)){
            if (balance >= business) {
                balance=balance-business;
                System.out.println("请取走钞票,您的余额还有"+balance+"元。");
            }
            else{
                System.out.println("您的余额不足!");
            }
        }
        else{
            System.out.println("您的密码错误!");
        }
    }
}

  4.期中考试非常nice,通过这场考试真的学到了很多,之后的一些练习和实验才没有一脸懵逼。期中的题目就有意引导我们如何使用类,往Java开发的方向走。

  

 

  比如说用点对象作为参数构造线类,突然就让我相通了一些关系。还有后面对于抽象类的应用,都在题目的引导下对这写更有了解。

(3)踩坑心得:

  1.PTA作业没有太多的坑,主要还是对语言的使用,而7-2实在是坑太多了,我都不知道自己踩了啥。

  2.期中考试的7-3:

switch(choice) {
                case 1:
                    x=in.nextDouble();
                    if(x<=0||x>200){
                        System.out.println("Wrong Format");
                        System.exit(1);
                    }
                    y=in.nextDouble();
                    if(y<=0||y>200){
                        System.out.println("Wrong Format");
                        System.exit(1);
                    }
                    Element e1=new Element();
                    Point point=new Point(x,y);
                    e1=point;
                    list.add(e1);
                    list.get(i).display();
                    i++;
                    break;
                case 2:
                    x1=in.nextDouble();
                    if(x1<=0||x1>200){
                        System.out.println("Wrong Format");
                        System.exit(1);
                    }
                    y1=in.nextDouble();
                    if(y1<=0||y1>200){
                        System.out.println("Wrong Format");
                        System.exit(1);
                    }
                    x2=in.nextDouble();
                    if(x2<=0||x2>200) {
                        System.out.println("Wrong Format");
                        System.exit(1);
                    }
                    y2=in.nextDouble();
                    if(y2<=0||y2>200){
                        System.out.println("Wrong Format");
                        System.exit(1);
                    }
                    Element e2=new Element();
                    Point point1=new Point(x1,y1);
                    Point point2=new Point(x2,y2);
                    color=in.next();
                    Line line=new Line(point1,point2,color);
                    e2=line;
                    list.add(e2);
                    list.get(i).display();
                    i++;
                    break;
                case 3:
                    color=in.next();
                    Element e3=new Element();
                    Plane plane=new Plane(color);
                    e3=plane;
                    list.add(e3);
                    list.get(i).display();
                    i++;
                    break;
                case 4:
                    index=in.nextInt();
                    Element e4=new Element();
                    if(index-1-j>=0&&index-1-j<i-j){
//                        System.out.println(list.size());
                        e4=list.remove(index-1-j);
//                        e4.display();
//                        System.out.println(list.size());
                        j++;
                    }
                    else
//                      System.out.println("1313");
                        continue;
                    break;
            }

  这里的本应该是进行一系列选择后输出结果,但是我在每个选择后都输出结果就会让我的删除选项无效。

  3.期中的7-2和7-3应该用抽象类,但是我用的是父类。

(4)改进建议:

  1.期中考试,PTA7-1,PTA7-3非常好,我觉得没什么改进的。

  2.PTA7-2这种实在是难搞,一次一题都吃不消,应该少点数学问题多点语言本身的问题。

(5)总结:

  1.学到了什么:PTA7-1初步学习了正则表达式,7-2依旧是很骚的数学问题,主要学到了某些数学问题在Java中的便利解法,7-3熟悉了一下类的使用;期中考试更加深的理解了类的使用,以及初步学习了继承与堕多态。

  2.改进意见:这个题目本身我觉得判定数据要做好,不能出现第一次作业那种情况;

        题目难度我觉得得合理一点,比如说7-2这个就太难了,数据运算多,考察的点也多,而且也不说明错误点,很难修改,到头来其实没学到啥,全在改数学错误;

        我觉得题目应该更多地考察我们对于Java语言新知识的应用,对于这种数据或者数学问题没有必要抓这么紧,比如可以出点题目要求多个类之间的相互应用,类本身可以不那么复杂,但多  个类的                     使用肯定能让我们更多地了解到类的妙处;

        实验的话希望要求表达地清晰一点,有的时候有点难以理解实验要求。

posted @ 2022-05-09 20:24  uncley  阅读(30)  评论(0编辑  收藏  举报