maojj

  博客园  :: 首页  :: 新随笔  :: 联系 :: 订阅 订阅  :: 管理
  3 随笔 :: 0 文章 :: 0 评论 :: 389 阅读

PTA题目集,实验以及期中考试总结性blog

前言

      在完成第四次PTA作业和期中考试之后,进行相应的总结和分析。

      1.第四次作业的7-2是第三次作业7-3的升级,难度较第三次提升了很多。

      2.第四次作业考察了正则表达式。

      3.期中考试的题目其实难度不大,但很多细节导致会直接0分。

第四次作业——题目集04 7-1

      题目集04 7-1主要考察正则表达式的掌握。

  整体思路介绍

      1.需要从输入的字符串中找出数字字符,计算每行数字之和并输出。

      2.找出数字字符应该使用正则表达式。

      3.整体可以用一个while(true)循环来进行操作,在识别到end的时候break。

      

  度量分析

      从圈复杂度可以看出来本题比较简单。

      

  核心代码分析

复制代码
 1 import java.util.Scanner;
 2 public class Main{
 3     public static void main(String[] args)
 4     {
 5         Scanner in=new Scanner(System.in);
 6         while(true)   //使用while循环不断读入字符串
 7         {
 8             String s=in.nextLine();
 9             if(s.equals("end"))
10             {
11                 break;
12             }
13             long sum=0;
14             String[] str=s.split("\\D+");     //本题代码最最最核心之处,正则表达式的运用。
15             for(int i=0;i<str.length;i++)
16             {
17                 if(!str[i].equals(""))
18                 {
19                     sum+=Integer.parseInt(str[i]);
20                 }
21             }
22             System.out.println(sum);
23         }
24     }
25 }
复制代码

   采坑分析

      本题最重要的一行代码就是String[] str=s.split("\\D+")这句了,整体来看没有什么难度,但是需要去自主学习正则表达式,并能对其进行一定的掌握。

  改进建议

      题目集04 7-1在整体我感觉比较简单,我觉得可以适当的增加一些难度。对于这道题的代码来说,我觉得没有什么需要过于改进的地方了,因为代码也比较少吧。

第四次作业——题目集04 7-2

      题目集04 7-2主要是延续题目集03 7-3的题型继续对点,线,边进行考察。

  整体思路介绍

      1.题目要求我们对输入的一串字符串进行相应的拆解与判断。

      2.可以将输入的字符串以空格进行分割,再利用循环根据空格分割出字符串的长度进行以逗号对字符串进行分割。

      3.对分割出的字符串进行正确的格式判断,非法则输出”Wrong format“。

      4.题目需要我们进行四边形的相应判断,我们可以将判断能否构成四边形写成一个方法,加以循环利用。

      5.题目还要需要我们判断四个点构成三角形的状况,这种情况我在做题时有一定思路,但最后并没有写成代码。

     

  度量分析

      圈复杂度最高达到了68,但比题目集03 7-3的121以及进步了很多。

      

 

  核心代码分析

复制代码
public static boolean isQuadri(Dot d0,Dot d1,Dot d2,Dot d3)   //判断四个点能否构成四边形
    {
        if ((d3.y - d2.y) * (d3.x -d1.x) == (d3.y - d1.y) * (d3.x - d2.x))    //判断任意三个点是不是共线
            return false;
        else if ((d3.y - d2.y) * (d3.x - d0.x) == (d3.y -d0.y) * (d3.x - d2.x))
            return false;
        else if ((d3.y - d1.y) * (d3.x - d0.x) == (d3.y - d0.y) * (d3.x - d1.x))
            return false;
        else if ((d2.y - d1.y) * (d2.x - d0.x) == (d2.y -d0.y) * (d2.x - d1.x))
            return false;
        else
            return true;
    }
复制代码

      这是本题最主要的代码,用来判断四个点能否构成四边形。但我后来发现顺时针连线构成四边形的时候,不止有三个点共线这种情况

无法构成四边形,还有比如点(0,0),(0,2),(1,2),(1,-2)这种也无法构成四边形。所以PTA上的测试点有些没有过。

 

复制代码
public static boolean isParall(Dot d0,Dot d1,Dot d2,Dot d3)
    {
        double a=(d1.y-d0.y)*(d3.x-d2.x);
        double b=(d1.x-d0.x)*(d3.y-d2.y);
        if(a!=b)
            return false;
        a=(d2.x-d1.x)*(d3.y-d0.y);
        b=(d3.x-d0.x)*(d2.y-d1.y);
        return a==b;
    }
复制代码

       这是本题第二重要的代码,用来判断是否为平行四边形,本题还需要在平行四边形的基础上判断是否为菱形,矩形,正方形,我是用到了

向量的方法来判断是否为平行四边形,但因为前面判断四边形有问题,所以这里也有问题。

  采坑分析

      这个题目的坑我我踩了的最致命的就是判断四边形的这个。没有去考虑点(0,0),(0,2),(1,2),(1,-2)这种顺序针如何去构成四边形,导致后面代码

不管怎么写都会有漏洞,有测试点过不去。只能说自己在做题之前还是没用仔细去考虑,只考虑到三点共线的时候了。

      还有一个坑,就是在判断四点能否构成三角形的时候。

复制代码
public static boolean isTriangle1(Dot d1,Dot d2,Dot d3,Dot d4,Dot d5,Dot d6)
    {
        if((d3.y-d2.y)*(d3.x-d1.x)==(d3.y-d1.y)*(d3.x-d2.x))//第二个点在第一个点和第三个点连成的线段上
        {
            if(d2.isin(d1,d3))
            {
                return true;
            }
        }
        if((d4.y-d3.y)*(d4.x-d2.x)==(d4.y-d2.y)*(d4.x-d3.x))//第三个点在第二个点和第四个点连成的线段上
        {
            if(d3.isin(d2,d4))
            {
                return true;
            }
        }
        if(isSame(d1,d2,d3,d4))   //四点有两个点相同时
        {
            return true;
        }
        else
            return false;
    }
复制代码

       在这个地方需要判断第二个点是否在第一个点和第三个点连成的线段上,或者第三个点在第二个点和第四个点连成的线段上,又或者是四个点中有两个点是重合

的,只有这样才能构成使四点构成三角形,但在实际写代码的时候,我发现在判断四点有两个相同时有太多种情况,导致最后没有对其进行代码的实现,PTA上这个选项的测试

点只拿了寥寥几分。但其实这个选项才是这次PTA大作业真正想要考察的东西,所以这次作业集的分并不高。

  改进建议

      这题我已经在题目集03 7-3的基础上进行了很大的改进,将能写成方法的都写成了方法,但只能说这题在考我们的数学知识,对于面向对象这一技能的考察几乎没

有,所以我觉得对这题进行适当的改进,不再这么刻意的去考我们的数学思维能力,应该多一些对于我们专业知识的考察会更好。在这之下,我再来说说我的代码问题,我觉得

我在知道了除了三点共线之外还有形成不了四边形的情况,应该及时对其进行补救,还有在判断四点构成三角形时,应该将四点重合两个进行完善,只要完善过,我相信应该能够

高上个10分吧。然后在进行非法输入情况的判断时,这题可以采用题目集03 7-3的非法判断,但测试点也较之前的更加多了,所以我觉得可以在这里使用正则表达式(听说我同学

用正则表达式测试点是全过了的,但我有一个测试点没有过)。

第四次作业——题目集04 7-3

      这题主要考察面向对象设计程序的能力。

  整体思路介绍

      本题整体思路其实只需要跟着题目走就行了,大致上要什么东西哪些方法,甚至方法的类型题目都讲的很清楚了。

      

  度量分析

      圈复杂度最高为4,比较简单。

      

 

  代码分析

      从类图和SourceMonitor分析可知,本题十分的简单,主要考察的就是对面向对象程序的设计,但题目基本上把所有的方法和方法类型都写出来了,我们

只需要对其进行完善就行了。

  改进建议

      本题其实可以适当的提升一点难度,但我觉得题目集04 7-2已经可以单独作为一个题目集发出来了,7-1和7-3完全是凑数,希望能有一个循序渐进的

过程,不要一下子太难。

农夫过河——实验3(1)

      实验的题目主要是考察我们对继承和多态的掌握。

  整体思路分析

      1.为之前的wolf,sheep,cabbage类设计一个父类。

      2.使用多态改进整个代码,提高代码的复用性。

      3.在子类可以使用super方法传递狼和羊的名字。

      本题类图如下:

      

 

  度量分析

      圈复杂度为6。

      

 

  核心代码分析

复制代码
Creature wolf;
    Creature sheep;      //使用继承和多态,提高代码的复用性
    Creature cabbage;
    Farmer farmer;
    Boat boat;
    Game(){
        String wolfname="huitailang";
        String sheepname="xiyangyang";
        wolf = new Wolf(wolfname);
        sheep = new Sheep(sheepname);
        cabbage = new Cabbage();
        farmer = new Farmer();
        boat = new Boat();
    }
复制代码

      实验需要在原来的基础上增加了一个Creature类,作为wolf,sheep,cabbage三种生物的父类,在构造时,需要使用Creature进行定义,才能使用多态的特性,如果是还是使用子类的的构造方法来构造,就不能够叫做多态了。

 下面是新增的父类:

复制代码
class Creature{
    private String name;
    private boolean crossRiver;
    private boolean isAlive=true;
    public Creature(String name)
    {
        this.name=name;
    }
    public Creature()
    {

    }
    public void setCrossRiver()
    {
        crossRiver=!crossRiver;
    }
    public boolean isCrossRiver()
    {
        return crossRiver;
    }
    public void showStatus()
    {
        System.out.println(getClass().getName()+" "+getName()+" is alive :"+isAlive+"  "+getClass().getName()+" "+getName()+" has Cross :"+crossRiver);
    }
    public boolean getisAlive()
    {
        return isAlive;
    }
    public void setAlive(boolean alive)
    {
        isAlive=alive;
    }
    public void Eat(Farmer farmer,Creature creature1,Creature creature2)
    {
        if(creature2.isCrossRiver()==creature1.isCrossRiver()&&creature2.isCrossRiver()!=farmer.isCrossRiver())
        {
            creature1.setAlive(false);
        }
        else
        {
            creature1.setAlive(true);
        }
    }
    public String getName()
    {
        return name;
    }
}
复制代码

  采坑分析

      实验中过河时,可能会出现想带生物不和农夫在同一侧的情况,实验给的源码中并没有写这方面的功能,所以我们需要使用一个if-else语句来进行判断

 

       并且我在测试中发现,给出的源码是输入0结束,但因为判断是否结束的gameOver是由isGameOver()方法来决定的,所以我们需要在输入0的情况时加上强制退出来结束游戏。

 

       还有一个问题就是输入0-4之外的数字时,也应该提示用户输入错误,即使用default语句

 

  改进建议

      1.可以在后面语句时加上一个gameOver是否为真的if判断,如果前面已经输0结束,这里就不用再判断是否game Over了。

 

      2.在父类的构造方法时,应使用重载,提供一个带参数的name的构造方法和无参构造

      即这样。

21级软件工程专业期中考试——7-1

      本题考察面向对象程序的设计。

  整体思路介绍

      1.根据题目所说分别设计一个点Point类,和一个线LIne类。

      2.分别写好两个类的构造方法以及属性的getter与setter方法。

      3.写好两个类的display()方法。

      4.注意输入的坐标的范围为(0,200]。

 

      

 

 

  度量分析

      圈复杂度最高为5,本题算比较简单的题。

      

  核心代码分析

复制代码
 public static void main(String[] args)
    {
        Line line=new Line();
        Scanner input=new Scanner(System.in);
        double a,b,c,d;
        a=input.nextDouble();
        b=input.nextDouble();
        c=input.nextDouble();
        d=input.nextDouble();
        String s=input.next();
        if(a>0&&a<=200&&b>0&&b<=200&&c>0&&c<=200&&d>0&&d<=200)  //控制输入坐标的范围
        {
            Point point1 = new Point();      //使用点类的构造方法
            Point point2 = new Point();
            point1.setX(a);
            point1.setY(b);
            point2.setX(c);
            point2.setY(d);
            line.setPoint1(point1);
            line.setPoint2(point2);
            line.setColor(s);
            line.display();
        }
        else
        {
            System.out.println("Wrong Format");
        }
    }
复制代码

 

   采坑分析

      

 

      在点类钟我这个构造方法做空了,直接使用了setX和setY方法,应该改成在构造方法里面调用setX和setY方法,即

      这样。

 

 

  改进建议

      在采坑分析的基础上,前面的main方法也要进行相应的改动,应该改成

      

 

      这样大大减少了程序的行数,看起来也不会那么冗杂了。

21级软件工程专业期中考试——7-2

      本题在上题的基础上,考察了继承与多态的使用。

  整体思路介绍

      1.需要给点Point类和线Line类增加一个共同的抽象父类Element。

      2.将display()方法在抽象类钟进行声明。

      3.实现继承和多态。

      

  度量分析

      

 

  核心代码分析

      这题其实就是在7-1的基础上增加一个父类(抽象类)。

abstract class Element{
    public void display()
    {

    }
}

 

       并使用多态特性进行相应的display输出。

      

 

      整体代码方面和上题没有什么区别。但使用了继承和多态,极大的提高的代码的复用性。并且如果后期修改有错误的话,也比较易于修改。

  采坑分析

      踩的最大的坑,直接让我这道题目0分了,就是在抽象父类中写的display()方法是这样的,但是题目其实是叫我们

 

对其进行声明,没有看清题目的我虽然这题的测试点过了,但在后期的人工测评中依旧会被给予0分处理。

  改进建议

      下次一定一定一定要看清楚题目之后再做题,改进就是将Element中的display()方改为声明,而不是做空。

即改为

    再次提醒自己,一定一定要看清楚题目。

 

21级软件工程专业期中考试——7-3

      本题在7-2的基础上,增加了一个容器类。

  整体思路介绍

      1.增加容器类保存点、线、面对象,并对该容器进行相应增、删、遍历操作。

      2.增加一个GeometryObject容器类,其属性为ArrayList<Element>类型的对象。

      3.在主方法中,用户循环输入要进行的操作。

      

  度量分析

      圈复杂度为15。

      

 

  核心代码分析

复制代码
class GeometryObject{    //新增的容器类,存放点,线,面等对象。
    private ArrayList<Element> elements =new ArrayList<>();
    public GeometryObject()
    {

    }
    public void add(Element element)//增加操作
    {
        elements.add(element);
    }
    public void remove(int index)    //删除操作
    {
        if(index>=0&&index<=elements.size()){
            elements.remove(index-1);
        }
    }
    public ArrayList<Element> getList()
    {
        return elements;
    }
}
复制代码

 

   采坑分析

      依旧和上题一样,在考试的时候没有考虑到抽象方法声明的问题,在这道题就不再说一遍了。但还有一个我觉得需要注意的地方就是,在删除的时候

      

 

      这里需要加一个if(index>=0&&index<=elements.size())是因为在题目说了若index数据非法,则无视该操作。但我一开始并没有加上<elements.size()导致一直有个测试点过不去。

后来发现还需要小于一个东西来限制index,才让pta上那4分的测试点过去。

  改进建议

      本题改进依旧是和上题一样,将抽象类中的display方法改为是声明,而不是做空。我觉得是因为在白天的时候我们才刚刚学习了抽象类,所以导致我们没有对抽象方法的运用没有一个较为深层次的了解,导致我7-2错了,7-3也错,但希望这次的教训让我铭记,以后需要仔细看题,仔细看书。

总结

      1.对于PTA的题目集04,我觉得难度较之前来说提高了,更注重考察了算法。

      2.对于Java的学习,这三周我学到类与类之间的各种关系,组合,聚合等等。

      3.对于期中考试来说,后面两题因为没有看清楚题目导致没有拿到分是我这三周最大的遗憾。

      4.但经过期中考试之后,我对于类与类之间的继承和多态,以及列表的使用有了更深层次的理解。

      5.对于正则表达式我也有了一个较为深刻的学习。

      经过这次PTA作业和期中考试,我明显的发现了我的两个缺点。一是在想出了题目的思路后,发现过于麻烦就不进行代码的实现。二是看题目的时候没有沉下心来看,导致期中考试的7-2和7-3两题的分都白拿了,让原本100分的东西变成了20分,让自己的努力付之东流。希望我经过这次总结后,以后写题时能够冷静一点,能够敢于去写那复杂的代码,然后再去思考如何讲冗杂的代码改进成条理清晰,易于修改的优质代码。但总体来说,我比上三次PTA题目集做出来的题目好了很多,虽然分数可能没有上三次高,但我的整体复杂度下来了,懂得对代码进行一定的优化,我觉得这算是一个很大的改变。我觉得这几次PTA的图形类的题目,主要还是在考我们的数学思维,可能这就是更深层次的算法,但我感觉现在对我们来说接触算法会不会过早,应该要有一个循序渐进的过程。最后,希望我在下次不会有这几周存在的这些问题。

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

      

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