其他分享
首页 > 其他分享> > 总结二、期中与pta题目

总结二、期中与pta题目

作者:互联网

一、前言

  PTA题目:考察了正则表达式,还有图像的判定,题目题量不多但是精选。图形题目难,代码量大,做起来困难,需要多思考。

  期中考试:考察自定义类,抽象类,继承与多态,加强了对类理解使用,题目比起PTA来说较为正常,正常语法,题量三题。

二、设计与分析

  PTA作业题目一:该题从每一行文字中提取数字,相加输出结果。由于没学过正则表达式,对于使用正则表达式的人来说,这是一道非常好的题目,题目不难可以有效的提高对正则表达式的一些基本使用,掌握和巩固正则表达式的函数。

1         String m="\\d+";
2         Pattern p=Pattern.compile(m);
3         Matcher s=p.matcher(arr);

  

  PTA作业题目二:这是继承直线和三角形之后的升级版,输入四个点既要判断是否为四边形又要判断为什么形状。输入五个点时,要判断前输入的四个点为三角形还是四边形,在判断点在图像里面还是在图像外面。输入六个点时,判断前输入的四个点为三角形还是四边形,在判断后面俩个点的直线与图像的交点有几个,然后计算出各各部分的面积

  输入的每一个数都为整数,判断输入是否合法可以使用正则表达式来使用,正则表达式使用起来较为方便

  注意:不能0开头并且后面还有数组,正常来说还有小数点后面不能没有数字,还有正反号的个数与位置

    public String text="[1-5]:( ?[+-]?(0|([1-9][0-9]*)),[+-]?(0|([1-9][0-9]*)))+";

  也可以自己定义一个类来判断是否输入合法,不过代码量大,容易出错,修改起来复杂,还有注意数组的范围

class Check{
    public String ch;
    Check(String arr){
        this.ch=arr;
    }
    public boolean che(){//判断基本格式
        String [] point=ch.split("\\s+|,|:");
        String [] num=ch.split("\\s");
        int e=0,dou=0;
        boolean mark=true;
        for(int i=1;i<point.length;i++){//检查格式是否合法
            for(int j=0;j<point[i].length();j++){//数字检查
                if(point[i].charAt(j)=='.'){//判断.出现的位置
                    if(j==0)
                         mark= false;
                }
               else if(point[i].charAt(j)=='+'||point[i].charAt(j)=='-'){
                    if(j!=0)//判断正负号是不是出现在第一个位置
                         mark= false;
                }
            }
        }
        
        boolean ren=true;
        for(int i=0;i<ch.length();i++){
            if(i!=ch.length()-1&&ch.charAt(i)==' ')//空格个数
                e++;
            if(ch.charAt(i)==',')//,的个数
                dou++;
            if(ch.charAt(i)!=' '&&ch.charAt(i)!='+'&&ch.charAt(i)!='-'&&ch.charAt(i)!='.'&&!(ch.charAt(i)<='9'&&ch.charAt(i)>='0')&&ch.charAt(i)!=','&&ch.charAt(i)!=':')
                mark=false;
            if(ch.charAt(i)=='0'&&i!=ch.length()-1){
                     	//在点前面   零后面有数字并且零前面没有数字
                if(ren&&(ch.charAt(i+1)<='9'&&ch.charAt(i+1)>='0')&&((ch.charAt(i-1)==' ')||(ch.charAt(i-1)==',')||(ch.charAt(i-1)=='+')||(ch.charAt(i-1)=='-')))//&&((ch.charAt(i-1)==' '&&ch.charAt(i-1)==','&&ch.charAt(i-1)=='+'&&ch.charAt(i-1)=='-')))//&&ch.charAt(i+1)!='.')//开头为0但是前面不是1-9的数字
                    mark=false;
            }
            else if(ch.charAt(i)=='.'){
                ren=false;//是否为开头
            }
            if(ch.charAt(i)==' '||ch.charAt(i)==',')//重置开头标志
                ren=true;
                if(ch.charAt(i)=='.'){//点在位置
                if(i==ch.length()-1)//点在最后
                    mark=false;
                if(i!=ch.length()-1&&ch.charAt(i+1)==' ')//点后面没东西
                    mark=false;
                }
        }
        if(dou!=e+1)
            mark=false;
        return mark;
    }
    public boolean pointnum(){//判断点的数目
        String [] point=ch.split("\\s+|,|:");
        String [] num=ch.split("\\s");
        boolean mark=true;
        int e=0;
        
        if(point[0].equals("1")||point[0].equals("2")||point[0].equals("3")){
            for(int i=0;i<ch.length();i++){
                if(ch.charAt(i)==',')//,的个数
                    e++;
            }
            if(e!=4)
                mark=false;
        }else if(point[0].equals("4")){
            for(int i=0;i<ch.length();i++){
                if(ch.charAt(i)==',')//,的个数
                    e++;
            }
            if(e!=6)
                mark=false;
        }else if(point[0].equals("5")){
        for(int i=0;i<ch.length();i++){
                if(ch.charAt(i)==',')//,的个数
                    e++;
            }
            if(e!=5)
                mark=false;
        }
        return mark;
    }
    public boolean sam(){
        boolean mark=true;
        String [] point=ch.split("\\s+|:");
        if(point[0].equals("1")||point[0].equals("3")){//没有匹配2
            for(int i=1;i<point.length;i++){
                for(int j=i+1;j<point.length;j++){
                    if(point[i].equals(point[j]))
                        mark=false;
                }
            }
        }
        return mark;
    }
}

 这题按题目要求,先判断输入的第一个数字是几,如果是1,则接收四个点,判断是否为四边形以及平行四边形,如果一对边平行且相等则为平行四边形,如果输入的是2,则判断菱形、矩形、正方形,菱形四条边都相等,矩形一对边相等且对角线相等,正方形则一对边相等且对角线垂直,如果输入的是3,判断是凹四边形还是凸四边形,如果对角线无焦点,则是凹四边形,如果有焦点则为凸四边形,在求出四边形的周长和面积。周长即求出四边长度在相加,面积则把四边形任取一个对角线,把四边形看出俩个三角形,在对三角形求面积在相加,如果输入是4,判断焦点个数,即判断直线与四边形每条条的焦点个数,如果输入的是5,先判断后面四个点为三角形还是四边形,如果判断第一个输入的点是在图形里面还是在图形外面,然后根据要求输出

 

 

期中考试:

  第一题:根据所给图像写出相应的类

class Point{
    private double x;
    private double y;
}
class Line{
    private Point point1;
    private Point point2;
    private String color;
}

  记得将类里面的元素private,然后实现元素的get,set方法

  因为第一题是其他题目的基础有,第一题要多花写时间检查,如果第一题写出了后面回来修改还是非常麻烦的

 

  输出double类型的时候,记得保留小数点后俩位,剩下部分四舍五入,可以使用

     System.out.printf("The line's length is:%.2f",a);

  也可以先加上0.005之后乘以1000强制转换为整数,在除以1000变回double,因为强制转换会先下取整,所以需要加上0.005。

double a=((int)((a+0.005)*1000))/1000.0

  第二题:第一题的升级版生成一个的抽象父类,在制作一个子类面,抽象类里面有一个抽象方法display(),使用多态。

  即不同的表现形态

  该题代码量不多,并且难度适中,是一个不错的题目

import java.util.Scanner;
public class Main{
    public static void main(String args[]){
        Scanner sc=new Scanner(System.in);
        double [] num=new double [4];
        String color;
        boolean mark=true;
        for(int i=0;i<4;i++){
            num[i]=sc.nextDouble();
            if(num[i]>200||num[i]<=0){
                mark=false;
            }
        }
        color=sc.next();
        if(!mark){
            System.out.println("Wrong Format");
        }else{
            Element element1=new Point(num[0],num[1]);
            Point point1=new Point(num[0],num[1]);
            element1.display();
            Element element2=new Point(num[2],num[3]);
            Point point2=new Point(num[2],num[3]);
            element2.display();
            Element element3=new Line(point1,point2,color);
            element3.display();
            Element element4=new Plane(color);
            element4.display();
        }
    }
}
abstract class Element{
    public abstract void display();
}
class Plane extends  Element{
    private String color;
    Plane(String color){
        this.color=color;
    }
    public String getColor(){
        return this.color;
    }
    public void setColor(String color){
        this.color=color;
    }
    public void display(){
        System.out.println("The Plane's color is:"+this.color);
    }
}
class Point extends  Element{
    private double x;
    private double y;
    Point(double x,double y){
        this.x=x;
        this.y=y;
    }
    public double getX(){
        return this.x;
    }
    public double getY(){
        return this.y;
    }
    public void setX(double x){
        this.x=x;
    }
    public void setY(double y){
        this.y=y;
    }
    public void display(){
        System.out.printf("(%.2f,%.2f)\n",this.x,this.y);
    }
}
class Line extends  Element{
    private Point point1;
    private Point point2;
    private String color;
    Line(Point point1,Point point2,String color){
        this.point1=point1;
        this.point2=point2;
        this.color=color;
    }
    public Point getPoint1(){
        return this.point1;
    }
    public Point getPoint2(){
        return this.point2;
    }
    public void setPoint1(Point point1){
        this.point1=point1;
    }
    public void setPoint2(Point point2){
        this.point2=point2;
    }
    public String getColor(){
        return this.color;
    }
    public void setColor(String color){
        this.color=color;
    }
    public double getDistance(){
        double a=(point1.getX()-point2.getX())*(point1.getX()-point2.getX())+(point1.getY()-point2.getY())*(point1.getY()-point2.getY());
        return Math.sqrt(a);
    }
    public void display(){
        double a=Math.sqrt((this.point1.getX()-this.point2.getX())*(this.point1.getX()-this.point2.getX())+(this.point1.getY()-this.point2.getY())*(this.point1.getY()-this.point2.getY()));
        System.out.printf("The line's color is:%s\n",this.color);
        System.out.printf("The line's begin point's Coordinate is:\n");
        System.out.printf("(%.2f,%.2f)\n",this.point1.getX(),this.point1.getY());
        System.out.printf("The line's end point's Coordinate is:\n");
        System.out.printf("(%.2f,%.2f)\n",this.point2.getX(),this.point2.getY());
        System.out.printf("The line's length is:%.2f\n",a);
    }
}
Element element1=new Point(num[0],num[1]);
            Point point1=new Point(num[0],num[1]);
            element1.display();
            Element element2=new Point(num[2],num[3]);
            Point point2=new Point(num[2],num[3]);
            element2.display();
            Element element3=new Line(point1,point2,color);
            element3.display();
            Element element4=new Plane(color);
            element4.display();

  还要在不同的类中重写抽象父类中的抽象方法

  第三题:第二题的升级版,生成一个容器类,要求有容器的相关功能

  将多态传入容器,在容器是进行容器操作,在删除操作的时候要注意容器的范围,如果输入不合法则会自动跳过改操作。

三、踩坑心得

PTA

  题目一:正则表达式匹配符记得\\d后面加个+反正只能匹配到一位个数字

  题目二:由于题目有多个操作符,要进行多个选择,要是每个操作都在main里面写,代码太多,会导致后面操作、修改、寻找困难,可以在里面设置一个switch然后每一个操作符对应一个方法,这样会在后面修改的时候方便许多,还有题目有些问题希望可以改正

样例7 
2:0,0 -10,80 0,160 -10,80
输出not a quadrilateral

这里点(-10,80)重合,根据题意

选项1、2、3中,若四边形四个点中有重合点,输出"points coincide"。

判断格式要注意,如果判断的方法不好,后面正常输入的时候才发现,会时修改起来较为复杂

操作3中,要判断是凹四边形还是凸四边形要根据对角线来判断如果对角线有焦点则说明的凸四边形,如果无焦点则是凹四边形。如果通过求出一个对角线,判断是否其他俩个点在直线的左右俩边,需要判断俩次更加复杂

判断输入的四个点是四边形还是三角形的时候要判断是否有点重合,或者点在俩个点的连线上,计算俩点减斜率的时候要考虑分母为零的情况,分母为零的时候要特殊考虑

  题目三:变量名记得大小写,注意不要打错字,用到四舍五入的时候用printf

期中考试

  第一题;根据所给的类图写出目标类,计算点之间的距离时记得要开方

  第二题:定义新的面类,还有一个共同的父类,类是抽象的,还有抽象方法,在每一个子类中都要重新抽象类的抽象方法,然后同过父类来new子类,形成多态,父类就可以调用子类方法,使的主方法更加美观,看起来清晰易懂

  第三题:定义容器类,一个容器只能装入一种类型,但是可以同过多态的形式来装的同一类型的不同形式,通过装入父类,把不同类型装入,最后在输出的时候可以统一调用display方法,不同判断是什么类型,非常方便

四、改进建议

  在面对大代码量的题目,多次操作多做操作的题目可以用switch然后对应每一个操作定制一个函数,这样会在后期修改,选择函数会方便许多,像上次图像题目代码量太大,操作多,用if-else会有大量的代码去写,到最后,进行修改代码的时候非常麻烦,非常难找。

  在输出函数里面 不要把算术放里面,这样在后面寻找错误的时候麻烦,难找还要修改,不如直接就分开写,在一些算法,思路方面可以在代码边上写注释,后面回来看的时候会方便很多。

  规范代码的书写,这样可以在后面寻找的时候方便许多,注意数组的范围,数组范围索引越界处理起来复杂,在运行之后才能发现,所以要注意数组的范围

五、总结

  通过期中考试,我更加了解了类的定义,抽象类的使用,还有容器类的原理,以及对继承和多态的使用掌握了更加深刻。也明白的学习还有一些地方有待加强,要多做一些相关题目,加强理解

  这段时间的学习了异常处理、抛出异常以及多态抽象类和接口的基本使用以及如何从程序联系到文本,从文件中读取和存储。

  我觉得期中考试的题目就不错,考察一些语法的使用,像PTA作业那些图形题目,更像是考察思路方面,当然我不是说题目不好,我希望有一些学了之后刚好有对应的题目来练练手。我们也做过了不少的图形题目,有题目还是蛮难的,我们做完之后没有题解,没有相关代码查看,在里面花费了大量的时间和精力,我希望有题解可以看看。

标签:num,ch,题目,charAt,pta,期中,判断,四边形
来源: https://www.cnblogs.com/dragon-2022/p/16250335.html