1. 程式人生 > 其它 >總結二、期中與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作業那些圖形題目,更像是考察思路方面,當然我不是說題目不好,我希望有一些學了之後剛好有對應的題目來練練手。我們也做過了不少的圖形題目,有題目還是蠻難的,我們做完之後沒有題解,沒有相關程式碼檢視,在裡面花費了大量的時間和精力,我希望有題解可以看看。