1. 程式人生 > 其它 >PTA7~9題目集總結與歸納

PTA7~9題目集總結與歸納

前言:

  總結三次題目集的知識點、題量、難度等情況。

目錄:

  1. 題目集7(7-1)、(7-2)兩道題目的遞進式設計分析總結
  2. 題目集8和題目集9兩道ATM機模擬題目的設計思路分析總結

一. 題目集7(7-1)、(7-2)兩道題目的遞進式設計分析總結

題目集7-1 圖形卡片排序遊戲

掌握類的繼承、多型性使用方法以及介面的應用。詳見作業指導書2020-OO第07次作業-1指導書V1.0.pdf

輸入格式:

  • 首先,在一行上輸入一串數字(1~4,整數),其中,1代表圓形卡片,2代表矩形卡片,3代表三角形卡片,4代表梯形卡片。各數字之間以一個或多個空格分隔,以“0”結束。例如:1 3 4 2 1 3 4 2 1 3 0
  • 然後根據第一行數字所代表的卡片圖形型別,依次輸入各圖形的相關引數,例如:圓形卡片需要輸入圓的半徑,矩形卡片需要輸入矩形的寬和長,三角形卡片需要輸入三角形的三條邊長,梯形需要輸入梯形的上底、下底以及高。各資料之間用一個或多個空格分隔。

輸出格式:

  • 如果圖形數量非法(小於0)或圖形屬性值非法(數值小於0以及三角形三邊不能組成三角形),則輸出Wrong Format
  • 如果輸入合法,則正常輸出,所有數值計算後均保留小數點後兩位即可。輸出內容如下:
  1. 排序前的各圖形型別及面積,格式為圖形名稱1:面積值1圖形名稱2:面積值2 …圖形名稱n:面積值n,注意,各圖形輸出之間用空格分開,且輸出最後存在一個用於分隔的空格;
  2. 排序後的各圖形型別及面積,格式同排序前的輸出;
  3. 所有圖形的面積總和,格式為Sum of area:總面積值

輸入樣例1:

在這裡給出一組輸入。例如:

1 5 3 2 0

輸出樣例1:

在這裡給出相應的輸出。例如:

Wrong Format

輸入樣例2:

在這裡給出一組輸入。例如:

4 2 1 3 0
3.2 2.5 0.4 2.3 1.4 5.6 2.3 4.2 3.5

輸出樣例2:

在這裡給出相應的輸出。例如:

The original list:
Trapezoid:1.14 Rectangle:3.22 Circle:98.52 Triangle:4.02 
The sorted list:
Circle:98.52 Triangle:4.02 Rectangle:3.22 Trapezoid:1.14 
Sum of area:106.91

輸入樣例3:

在這裡給出一組輸入。例如:

4 2 1 3 0
3.2 2.5 0.4 2.3 1.4 5.6 2.3 4.2 8.4

輸出樣例3:

在這裡給出相應的輸出。例如:

Wrong Format
題目集7-2 圖形卡片分組遊戲

掌握類的繼承、多型性使用方法以及介面的應用。 具體需求參考作業指導書。

2021-OO第07次作業-2指導書V1.0.pdf

輸入格式:

  • 在一行上輸入一串數字(1~4,整數),其中,1代表圓形卡片,2代表矩形卡片,3代表三角形卡片,4代表梯形卡片。各數字之間以一個或多個空格分隔,以“0”結束。例如:1 3 4 2 1 3 4 2 1 3 0
  • 根據第一行數字所代表的卡片圖形型別,依次輸入各圖形的相關引數,例如:圓形卡片需要輸入圓的半徑,矩形卡片需要輸入矩形的寬和長,三角形卡片需要輸入三角形的三條邊長,梯形需要輸入梯形的上底、下底以及高。各資料之間用一個或多個空格分隔。

輸出格式:

  • 如果圖形數量非法(<=0)或圖形屬性值非法(數值<0以及三角形三邊不能組成三角形),則輸出Wrong Format
  • 如果輸入合法,則正常輸出,所有數值計算後均保留小數點後兩位即可。輸出內容如下:
  1. 排序前的各圖形型別及面積,格式為[圖形名稱1:面積值1圖形名稱2:面積值2 …圖形名稱n:面積值n ],注意,各圖形輸出之間用空格分開,且輸出最後存在一個用於分隔的空格,在結束符“]”之前;
  2. 輸出分組後的圖形型別及面積,格式為[圓形分組各圖形型別及面積][矩形分組各圖形型別及面積][三角形分組各圖形型別及面積][梯形分組各圖形型別及面積],各組內格式為圖形名稱:面積值。按照“Circle、Rectangle、Triangle、Trapezoid”的順序依次輸出;
  3. 各組內圖形排序後的各圖形型別及面積,格式同排序前各組圖形的輸出;
  4. 各組中面積之和的最大值輸出,格式為The max area:面積值

輸入樣例1:

在這裡給出一組輸入。例如:

1 5 3 2 0

輸出樣例1:

在這裡給出相應的輸出。例如:

Wrong Format

輸入樣例2:

在這裡給出一組輸入。例如:

4 2 1 3 0
3.2 2.5 0.4 2.3 1.4 5.6 2.3 4.2 3.5

輸出樣例2:

在這裡給出相應的輸出。例如:

The original list:
[Trapezoid:1.14 Rectangle:3.22 Circle:98.52 Triangle:4.02 ]
The Separated List:
[Circle:98.52 ][Rectangle:3.22 ][Triangle:4.02 ][Trapezoid:1.14 ]
The Separated sorted List:
[Circle:98.52 ][Rectangle:3.22 ][Triangle:4.02 ][Trapezoid:1.14 ]
The max area:98.52

輸入樣例3:

在這裡給出一組輸入。例如:

2 1 2 1 1 3 3 4 4 1 1 1 2 1 0
2.3 3.5 2.5 4.5 2.1 2.6 8.5 3.2 3.1 3.6 8.5 7.5 9.1245 6.5 3.4 10.2 11.2 11.6 15.4 5.8 2.13 6.2011 2.5 6.4 18.65

輸出樣例3:

在這裡給出相應的輸出。例如:

The original list:
[Rectangle:8.05 Circle:19.63 Rectangle:9.45 Circle:21.24 Circle:226.98 Triangle:4.65 Triangle:29.80 Trapezoid:50.49 Trapezoid:175.56 Circle:105.68 Circle:14.25 Circle:120.81 Rectangle:16.00 Circle:1092.72 ]
The Separated List:
[Circle:19.63 Circle:21.24 Circle:226.98 Circle:105.68 Circle:14.25 Circle:120.81 Circle:1092.72 ][Rectangle:8.05 Rectangle:9.45 Rectangle:16.00 ][Triangle:4.65 Triangle:29.80 ][Trapezoid:50.49 Trapezoid:175.56 ]
The Separated sorted List:
[Circle:1092.72 Circle:226.98 Circle:120.81 Circle:105.68 Circle:21.24 Circle:19.63 Circle:14.25 ][Rectangle:16.00 Rectangle:9.45 Rectangle:8.05 ][Triangle:29.80 Triangle:4.65 ][Trapezoid:175.56 Trapezoid:50.49 ]
The max area:1601.31

輸入樣例4:

在這裡給出一組輸入。例如:

1 1 3 0
6.5 12.54 3.6 5.3 6.4

輸出樣例4:

在這裡給出相應的輸出。例如:

The original list:
[Circle:132.73 Circle:494.02 Triangle:9.54 ]
The Separated List:
[Circle:132.73 Circle:494.02 ][][Triangle:9.54 ][]
The Separated sorted List:
[Circle:494.02 Circle:132.73 ][][Triangle:9.54 ][]
The max area:626.75
聚合一Main類:
public class Main{
    public static void main(String[] args){
        Scanner input=new Scanner(System.in);
        int c=input.nextInt();
        DateUtil dateUtil=new DateUtil();
        switch (c){
            case 1:{
                dateUtil.year= input.nextInt();
                dateUtil.month= input.nextInt();
                dateUtil.day= input.nextInt();
                dateUtil.setter(dateUtil.year, dateUtil.month, dateUtil.day);
                int n= input.nextInt();
                if(dateUtil.checkInputValidity(dateUtil.year, dateUtil.month, dateUtil.day)){
                    dateUtil.getNextNDays(n);
                    System.out.println(dateUtil.year+"-"+ dateUtil.month+"-"+ dateUtil.day);
                }
                    break;
            }
            case 2:
            case 3:
            default:
                System.out.println("Wrong Format");
        }
}
}

聚合二Main類:

import java.util.Scanner;

public class Main {
    public static void main(String[] args) {
        int year = 0;
        int month = 0;
        int day = 0;
        Scanner input = new Scanner(System.in);
        int choice = input.nextInt();

        if (choice == 1) { // 測試下n天
            }
        else if (choice == 2) { // 求前n天
            
            }
        else if (choice == 3) {    //求兩個日期相差的天數
            year = Integer.parseInt(input.next());
            month = Integer.parseInt(input.next());
            day = Integer.parseInt(input.next());

            int anotherYear = Integer.parseInt(input.next());
            int anotherMonth = Integer.parseInt(input.next());
            int anotherDay = Integer.parseInt(input.next());

            DateUtil fromDate = new DateUtil(year, month, day);
            DateUtil toDate = new DateUtil(anotherYear, anotherMonth, anotherDay);

            if (fromDate.checkInputValidity() && toDate.checkInputValidity()) {
                System.out.println("The days between " + fromDate.showDate() +
                        " and " + toDate.showDate() + " are:"+fromDate.getDaysofDates(toDate));
            } else {
                System.out.println("Wrong Format");
                System.exit(0);
            }
        }
        else{
            System.out.println("Wrong Format");
            System.exit(0);
        }
    }
}
比較與分析:   剛開始看到這兩個題時,我還沒反應過來是怎麼回事,以為是兩個一樣的題目,只是輸出的方式不一樣而已。後來細看兩個類圖,原來差異在這裡。   聚合一的聚合連線是鏈式連線,環環相扣,無法跨越呼叫。而聚合二是以dataUtil工具類作為連線體,以自身為中心,建立了Year,Month,Day三個物件,方便呼叫。   相似的程式碼我就沒貼上去了,主體Main函式就是這樣的了,雖然看起來有點複雜,但是方便呼叫。   計算下n天或前n天的程式碼就不多重複了,可以看看上一篇blog,那裡有。難的就是計算兩個日期相差幾天,這裡給出一下我寫的參考程式碼:   先比較兩個日期誰前誰後,才好求倆日期相差的天數,畢竟電腦不是人腦,不能一眼就看出誰前誰後。
     public boolean compareDates(DateUtil date)              //比較當前日期與date的大小(先後)
    {
        if (this.year > date.year) return true;
        if (this.year == date.year) {
            if (this.month > date.month) return true;
            if (this.month == date.month) {
                if (this.day >= date.day) return true;
            }
        }
        return false;
    }

    public boolean equalTwoDates(DateUtil date)                 //判斷兩個日期是否相等
    {
        if (date != null) {
            if (year == date.year && month == date.month && day == date.day) {
                return true;
            }
        }
        return false;
    }

    private static final int[] mon = {0, 31, 59, 90, 120, 151, 181, 212, 243, 273, 304, 334};
    public int getDaysofDates(DateUtil date)              //求當前日期與date之間相差的天數
    {
        DateUtil dateUtil1 = this; // 小
        DateUtil dateUtil2 = date; // 大
        if (this.compareDates(date)) {
            dateUtil1 = date;
            dateUtil2 = this;
        }

        int days;
        int leapYearNum = 0;
        for (int i = dateUtil1.getYear(); i < dateUtil2.getYear(); i++) {
            if (isLeapYear(i)) {
                leapYearNum++;
            }
        }

        days = 365 * (dateUtil2.getYear() - dateUtil1.getYear()) + leapYearNum;

        int d1 = mon[dateUtil1.getMonth() - 1] + dateUtil1.getDay() + (dateUtil1.getMonth() > 2 && isLeapYear(dateUtil1.getYear()) ? 1 : 0);
        int d2 = mon[dateUtil2.getMonth() - 1] + dateUtil2.getDay() + (dateUtil2.getMonth() > 2 && isLeapYear(dateUtil2.getYear()) ? 1 : 0);
        return days - d1 + d2;
    }


二·題目集4(7-3)、題目集6(7-6)三種漸進式圖形繼承設計的思路與技術運用(封裝、繼承、多型、介面等)

題目集4(7-3) 圖形繼承 (15 分)

編寫程式,實現圖形類的繼承,並定義相應類物件並進行測試。

  1. 類Shape,無屬性,有一個返回0.0的求圖形面積的公有方法public double getArea();//求圖形面積
  2. 類Circle,繼承自Shape,有一個私有實型的屬性radius(半徑),重寫父類繼承來的求面積方法,求圓的面積
  3. 類Rectangle,繼承自Shape,有兩個私有實型屬性width和length,重寫父類繼承來的求面積方法,求矩形的面積
  4. 類Ball,繼承自Circle,其屬性從父類繼承,重寫父類求面積方法,求球表面積,此外,定義一求球體積的方法public double getVolume();//求球體積
  5. 類Box,繼承自Rectangle,除從父類繼承的屬性外,再定義一個屬性height,重寫父類繼承來的求面積方法,求立方體表面積,此外,定義一求立方體體積的方法public double getVolume();//求立方體體積
  6. 注意:
  • 每個類均有構造方法,且構造方法內必須輸出如下內容:Constructing 類名
  • 每個類屬性均為私有,且必須有getter和setter方法(可用Eclipse自動生成)
  • 輸出的數值均保留兩位小數

主方法內,主要實現四個功能(1-4): 從鍵盤輸入1,則定義圓類,從鍵盤輸入圓的半徑後,主要輸出圓的面積; 從鍵盤輸入2,則定義矩形類,從鍵盤輸入矩形的寬和長後,主要輸出矩形的面積; 從鍵盤輸入3,則定義球類,從鍵盤輸入球的半徑後,主要輸出球的表面積和體積; 從鍵盤輸入4,則定義立方體類,從鍵盤輸入立方體的寬、長和高度後,主要輸出立方體的表面積和體積;

假如資料輸入非法(包括圓、矩形、球及立方體物件的屬性不大於0和輸入選擇值非1-4),系統輸出Wrong Format

輸入格式:

共四種合法輸入

  • 1 圓半徑
  • 2 矩形寬、長
  • 3 球半徑
  • 4 立方體寬、長、高

輸出格式:

按照以上需求提示依次輸出

輸入樣例1:

在這裡給出一組輸入。例如:

1 1.0

輸出樣例1:

在這裡給出相應的輸出。例如:

Constructing Shape
Constructing Circle
Circle's area:3.14

輸入樣例2:

在這裡給出一組輸入。例如:

4 3.6 2.1 0.01211

輸出樣例2:

在這裡給出相應的輸出。例如:

Constructing Shape
Constructing Rectangle
Constructing Box
Box's surface area:15.26
Box's volume:0.09

輸入樣例3:

在這裡給出一組輸入。例如:

2 -2.3 5.110

輸出樣例2:

在這裡給出相應的輸出。例如:

Wrong Format

思路與應用:

  這道題目就是一個簡單的繼承題目,用Main當主類,建立圖形Shape物件,Shape有Circle(圓)和Rectangle(矩形)兩個子類,這兩個子類分別又有個具體的物件子類Ball(球)和Box(立方體)類。且要求構造一個物件就要輸出構造的型別,這就需要在每一個構造方法裡新增一個輸出自己類名的方法。在Circle和Rectangle類裡需要有求面積的方法,Box和Ball除了求表面積外還需要新增求體積的方法。順著這個思路,程式碼也有了雛形,下面就是以繼承為主的程式碼。這裡用到一個程式碼Math.PI,這個程式碼就是數學裡面的π,也就是3.1415926。



程式碼:


import java.util.Scanner;

class Main {

    public static void main(String[] args) {
        int inType;
        Scanner scanner = new Scanner(System.in);
        inType = scanner.nextInt();
        switch (inType) {
            case 1:       //圓類,輸入半徑,輸出面積
                double r = scanner.nextDouble();      //半徑r
                if (r < 0.0) {
                    System.out.println("Wrong Format");
                } else {
                    Circle circle = new Circle();    //circle:圓
                    circle.setRadius(r);
                    System.out.println(String.format("Circle's area:%.2f", circle.getArea()));
                }
                break;


            case 2:         //矩形類,輸入寬和長,輸出面積
                double width = scanner.nextDouble();    //寬
                double length = scanner.nextDouble();   //長
                if (width < 0.0 || length < 0.0) {
                    System.out.println("Wrong Format");
                } else {
                    Rectangle rectangle = new Rectangle();  //rectangle:矩形
                    rectangle.setLength(length);
                    rectangle.setWidth(width);
                    System.out.println(String.format("Rectangle's area:%.2f", rectangle.getArea()));
                }
                break;
            case 3:   //球類,輸入半徑,輸出表面積和體積
                double r2 = scanner.nextDouble();      //球半徑r2
                if (r2 < 0.0) {
                    System.out.println("Wrong Format");
                } else {
                    Ball ball = new Ball();       //ball:球
                    ball.setRadius(r2);
                    System.out.println(String.format("Ball's surface area:%.2f", ball.getArea()));
                    System.out.println(String.format("Ball's volume:%.2f", ball.getVolume()));
                }
                break;
            case 4:      //立方體類,輸入寬,長,高,輸出表面積和體積
                double width2 = scanner.nextDouble();      //寬
                double length2 = scanner.nextDouble();     //長
                double height = scanner.nextDouble();      //高
                if (width2 < 0.0 || length2 < 0.0 || height < 0.0) {
                    System.out.println("Wrong Format");
                } else {
                    Box box = new Box();     //box:盒子,立方體
                    box.setHeight(height);
                    box.setWidth(width2);
                    box.setLength(length2);
                    System.out.println(String.format("Box's surface area:%.2f", box.getArea()));
                    System.out.println(String.format("Box's volume:%.2f", box.getVolume()));
                }
                break;
            default:
                System.out.println("Wrong Format");
        }
    }
}
class Shape //定義一個無自身屬性,有一個返回值為0.0的求面積方法
{

    public Shape()
    {
        System.out.println("Constructing Shape");
    }
    public double getArea()
    {
        return 0.0;
    }
}

class Circle extends Shape//繼承自Shape    圓
{
    public Circle()       //圓
    {
        System.out.println("Constructing Circle");
    }
    private double radius;//新定義一個半徑

    public void setRadius(double radius) {// 設定半徑
        this.radius = radius;
    }

    public double getRadius() {// 獲取半徑
        return radius;
    }
    public double getArea() {     //求圓的面積:π*r*r
        return Math.PI*radius*radius;        //Math.PI是π
    }

}
class Rectangle extends Shape            //矩形
{
    public Rectangle()
    {
        System.out.println("Constructing Rectangle");
    }
    private double width;
    private double length;
    public double getWidth() {
        return width;
    }

    public void setWidth(double width) {
        this.width = width;
    }

    public double getLength() {
        return length;
    }

    public void setLength(double length) {
        this.length = length;
    }
    public double getArea() {        //矩形的面積:a*b
        return width*length;
    }
}
class Ball extends Circle                //球
{
    private double radius2;

    public Ball()
    {
        System.out.println("Constructing Ball");
    }
    public void setRadius(double radius2) {// 設定半徑
        this.radius2 = radius2;
    }

    public double getRadius() {// 獲取半徑
        return radius2;
    }
    public double getArea() {        //球的表面積:4*π*r*r
        return 4.0*Math.PI*radius2*radius2;
    }
    public double getVolume()      //球的體積:4/3  * π * r的立方
    {
        double r2=getRadius();
        return 4.0/3.0*r2*r2*r2*Math.PI;
    }

}
class Box extends Rectangle             //立方體
{
    public Box()
    {
        System.out.println("Constructing Box");
    }
    private double height;
    public double getHeight() {
        return height;
    }
    public void setHeight(double height) {
        this.height = height;
    }
    public double getVolume()         //求立方體的體積a*b*c
    {
        return height*super.getArea();
    }

    public double getArea() {              //求立方體的表面積2*(a*b+a*c+b*c)
        double w2=getWidth();
        double l2=getLength();
        return 2*(w2*l2+w2*height+l2*height);
    }


}
題目集6(7-6) 實現圖形介面及多型性 (30 分)

編寫程式,使用介面及類實現多型性,類圖結構如下所示:

其中:

  • GetArea為一個介面,無屬性,只有一個GetArea(求面積)的抽象方法;
  • Circle及Rectangle分別為圓類及矩形類,分別實現GetArea介面
  • 要求:在Main類的主方法中分別定義一個圓類物件及矩形類物件(其屬性值由鍵盤輸入),使用介面的引用分別呼叫圓類物件及矩形類物件的求面積的方法,直接輸出兩個圖形的面積值。(要求只保留兩位小數)

輸入格式:

從鍵盤分別輸入圓的半徑值及矩形的寬、長的值,用空格分開。

輸出格式:

  • 如果輸入的圓的半徑值及矩形的寬、長的值非法(≤0),則輸出Wrong Format
  • 如果輸入合法,則分別輸出圓的面積和矩形的面積值(各佔一行),保留兩位小數。

輸入樣例1:

在這裡給出一組輸入。例如:

2 3.6 2.45

輸出樣例1:

在這裡給出相應的輸出。例如:

12.57
8.82

輸入樣例2:

在這裡給出一組輸入。例如:

9 0.5 -7.03

輸出樣例2:

在這裡給出相應的輸出。例如:

Wrong Format
思路:   這題和上面的題目有一點差別,根據要求在Main類的主方法中分別定義一個圓類物件及矩形類物件(其屬性值由鍵盤輸入),使用介面的引用分別呼叫圓類物件及矩形類物件的求面積的方法,直接輸出兩個圖形的面積值。在上面的題目為基礎,我們很簡單就可以修改出來,這裡我就不多講了。直接看看程式碼吧。 程式碼:
import java.util.Scanner;
class Main {
    public static void main(String[] args) {
        Scanner scanner = new Scanner(System.in);
                double r = scanner.nextDouble();      //半徑r
        double width = scanner.nextDouble();    //寬
        double length = scanner.nextDouble();   //長
                if (r < 0.0||width <= 0.0 || length <= 0.0) {
                    System.out.println("Wrong Format");
                } else {
                    Circle circle = new Circle();    //circle:圓
                    circle.setRadius(r);
                    Rectangle rectangle = new Rectangle();  //rectangle:矩形
                    rectangle.setLength(length);
                    rectangle.setWidth(width);
                    System.out.println(String.format("%.2f", circle.getArea()));
                    System.out.println(String.format("%.2f", rectangle.getArea()));
                }
        }
    }
class Shape //定義一個無自身屬性,有一個返回值為0.0的求面積方法
{
    public double getArea()
    {
        return 0.0;
    }
}
class Circle extends Shape//繼承自Shape    圓
{
    private double radius;//新定義一個半徑

    public void setRadius(double radius) {// 設定半徑
        this.radius = radius;
    }

    public double getRadius() {// 獲取半徑
        return radius;
    }
    public double getArea() {     //求圓的面積:π*r*r
        return Math.PI*radius*radius;        //Math.PI是π
    }

}
class Rectangle extends Shape            //矩形
{
    private double width;
    private double length;
    public double getWidth() {
        return width;
    }

    public void setWidth(double width) {
        this.width = width;
    }

    public double getLength() {
        return length;
    }

    public void setLength(double length) {
        this.length = length;
    }
    public double getArea() {        //矩形的面積:a*b
        return width*length;
    }
}

三·對題目集6中3次用到的正則表示式技術的分析總結(7.1QQ號校驗 7.3驗證碼校驗 7.4學號校驗)

  QQ號要求:

  • 要求必須是 5-15 位;
  • 0 不能開頭;
  • 必須都是數字;
import java.util.Scanner;
public class Main {
    public static void main(String[] args) {
        Scanner a = new Scanner(System.in);
        String qq = a.nextLine();
        String b = "[1-9][0-9]{4,14}";  //{4,14}表示有4到14個[0-9]
        boolean t = qq.matches(b);  //boolean是java中的布林型(邏輯型)資料型別,在java中boolean值只能是true和false
        if(t)
            System.out.println("你輸入的QQ號驗證成功");
        else
            System.out.println("你輸入的QQ號驗證失敗");
    }

}

  驗證碼要求:

  • 驗證碼是由四位數字或者字母(包含大小寫)組成的字串。 
        String b = "[a-z]|[A-Z]|[0-9]{4}";

  學號要求:

  • 1、2位:入學年份後兩位,例如20年
  • 3、4位:學院程式碼,軟體學院程式碼為20
  • 5位:方向程式碼,例如1為軟體工程,7為物聯網
  • 6位:班級序號
  • 7、8位:學號(序號)
  • 只針對2020級
  • 其中軟體工程專業班級分別為:202011~17、61,物聯網工程專業班級為202071~202073,資料科學與大資料專業班級為202081~82
  • 每個班級學號後兩位為01~40
  • String b = "(2020(11|12|13|14|15|16|17|61|71|72|73|81|82)([0-3][0-9]&&40))";

 總結:

  正則表示式看起來是不是很簡單啊,是的,就是很簡單,但又不是很簡單,正則表示式就我做的這3道題來說,我個人感覺有點難的,因為不熟悉,它靈活多變。

  QQ號,第一個不能為0,所以用[1-9]表示數字1到數字9之間任意一個數字;[0-9]{4,14}表示有4到14個數字,這個數字又是在0~9之間任意取的一個。//這裡就用到了中括號[ ]和大括號{ },還有括號裡面的“-”和“,”,這兩種符號代表的又不一樣。

  驗證碼,[a-z] | [A-Z] | [0-9]表示這字母a到z或者大寫字母A到Z或者數字0到9期間任取一個字元,這裡又用到了“|”這個符號,這個符號表示“或”的意思。

  學號,學號這題我就做錯了幾次,一開始是寫了(2020(11|12|13|14|15|16|17|61|71|72|73|81|82)[0-9]{2})的,後來發現情況不對,這樣學號40號以後的也會算進去,最後兩位我又改成了[0-3][0-9],但是又沒有了40號,要是能加上40號我就完成了,最後我想到了“&&”符號,這個符號的意思就是“和”。

  所以正則表示式看起來很簡單,但是要考慮的東西有點多,容易多加東西進去,所以要記清楚各種符號表達的意思,要理解。


四·題目集5(7-4)中Java集合框架應用的分析總結

7-4 統計Java程式中關鍵詞的出現次數 (25 分)

編寫程式統計一個輸入的Java原始碼中關鍵字(區分大小寫)出現的次數。說明如下:

  • Java中共有53個關鍵字(自行百度)
  • 從鍵盤輸入一段原始碼,統計這段原始碼中出現的關鍵字的數量
  • 註釋中出現的關鍵字不用統計
  • 字串中出現的關鍵字不用統計
  • 統計出的關鍵字及數量按照關鍵字升序進行排序輸出
  • 未輸入原始碼則認為輸入非法

輸入格式:

輸入Java原始碼字串,可以一行或多行,以exit行作為結束標誌

輸出格式:

  • 當未輸入原始碼時,程式輸出Wrong Format
  • 當沒有統計資料時,輸出為空
  • 當有統計資料時,關鍵字按照升序排列,每行輸出一個關鍵字及數量,格式為數量\t關鍵字

輸入樣例:

在這裡給出一組輸入。例如:

//Test public method
public HashMap(int initialCapacity) {
        this(initialCapacity, DEFAULT_LOAD_FACTOR);
    }
    public HashMap(int initialCapacity, float loadFactor) {
        if (initialCapacity < 0)
            throw new IllegalArgumentException("Illegal initial capacity: " +
                                               initialCapacity);
        if (initialCapacity > MAXIMUM_CAPACITY)
            initialCapacity = MAXIMUM_CAPACITY;
        if (loadFactor <= 0 || Float.isNaN(loadFactor))
            throw new IllegalArgumentException("Illegal load factor: " +
                                               loadFactor);
        this.loadFactor = loadFactor;
        this.threshold = tableSizeFor(initialCapacity);
    }
exit

輸出樣例:

在這裡給出相應的輸出。例如:

1    float
3    if
2    int
2    new
2    public
3    this
2    throw
分析總結:

  java的53個關鍵字:"abstract","assert","boolean","break","byte","case","catch", "char","class","const","continue","default","do","double","else", "enum","extends","false","final","finally","float", "for","goto","if","implements","import","instanceof", "int","interface","long","native","new","null","package", "private","protected","public","return","short","static", "strictfp","super","switch","synchronized","this","throw", "throws","transient","true","try","void","volatile","while"

程式碼:
import java.util.*;
import java.util.regex.Matcher;
import java.util.regex.Pattern;

public class Main {
    public static void main(String[] args) {
        Scanner input=new Scanner(System.in);
        String a;
        StringBuilder n=new StringBuilder();
        Map<String, Integer> map=new HashMap<String, Integer>();
        //關鍵字
        String []key= { "abstract","assert","boolean","break","byte","case","catch", "char","class","const","continue","default","do","double","else", "enum","extends","false","final","finally","float", "for","goto","if","implements","import","instanceof", "int","interface","long","native","new","null","package", "private","protected","public","return","short","static", "strictfp","super","switch","synchronized","this","throw", "throws","transient","true","try","void","volatile","while"};
        int j=0;
        for(int i=0;;i++) {
            a=input.nextLine();
            if(a.equals("exit"))     //沒有統計資料,,輸出為空。
                break;
            if(a.matches("(.*)//(.*)"))    //註釋不統計
            {String b[]=a.split("//");
                n.append(b[0]+" ");
            }
            else
            {n.append(a+" ");
            }
        }
        int count=0;
        String s=n.toString();
        Pattern p=Pattern.compile("\"(.*?)\"");
        Matcher m=p.matcher(s);
        while(m.find()){                          //字串內關鍵字測試
            s=s.replace(m.group()," ");
            p=Pattern.compile("\"(.*?)\"");
            m=p.matcher(s);
        }
        p=Pattern.compile("/\\**(.*?)/");
        m=p.matcher(s);
        while(m.find()){                         //兩種註釋測試
            s=s.replace(m.group()," ");
            m=p.matcher(s);
        }
        if(s.isEmpty())                     //未輸入原始碼
        {System.out.println("Wrong Format");
            System.exit(0);
        }
        s= s.replaceAll("[^a-zA-Z]", " ");
        String []s1=s.split("[  ' ']");
        for(int i=0;i<s1.length;i++)
        {
            for( j=0;j<key.length;j++)       //查出出現的關鍵字
                if(s1[i].equals(key[j]))
                {
                    map.put(key[j], 0);
                }
        }
        for( int i = 0;i<s1.length;i++)
        {
            for( j=0;j<key.length;j++)            //統計關鍵字出現的次數
                if(s1[i].equals(key[j]))
                {    count=map.get(key[j]);
                    map.put(key[j], count+1);
                }
        }
        Set set=map.keySet();
        Object[] arr=set.toArray();
        Arrays.sort(arr);
        for(Object k:arr){
            System.out.println(map.get(k)+"\t"+k);
        }
    }
}

總結:

  這次的blog題目集總結歸納,總體來說,完成的還是可以的。在PTA上完成了習題後,過了幾天,我又忘記了很多東西,經過這次總結歸納,我又想起了一部分知識,首先就是正則表示式,還是要多練多記,加以鞏固;其次就是類圖,類圖還是有地方看不懂,接下來還是要重點去複習一下類圖的關係,繼承和多型也是要複習的。

  實驗這種東西,能夠反映出哪裡沒掌握,哪裡出錯。還是要多練習了,但是如果知識不牢固,沒學好,那實驗做起來還是好難的啊。