PTA7~9題目集總結與歸納
前言:
總結三次題目集的知識點、題量、難度等情況。
目錄:
- 題目集7(7-1)、(7-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圖形名稱2:面積值2 …圖形名稱n:面積值n
,注意,各圖形輸出之間用空格分開,且輸出最後存在一個用於分隔的空格; - 排序後的各圖形型別及面積,格式同排序前的輸出;
- 所有圖形的面積總和,格式為
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 圖形卡片分組遊戲掌握類的繼承、多型性使用方法以及介面的應用。 具體需求參考作業指導書。
輸入格式:
- 在一行上輸入一串數字(1~4,整數),其中,1代表圓形卡片,2代表矩形卡片,3代表三角形卡片,4代表梯形卡片。各數字之間以一個或多個空格分隔,以“0”結束。例如:
1 3 4 2 1 3 4 2 1 3 0
- 根據第一行數字所代表的卡片圖形型別,依次輸入各圖形的相關引數,例如:圓形卡片需要輸入圓的半徑,矩形卡片需要輸入矩形的寬和長,三角形卡片需要輸入三角形的三條邊長,梯形需要輸入梯形的上底、下底以及高。各資料之間用一個或多個空格分隔。
輸出格式:
- 如果圖形數量非法(<=0)或圖形屬性值非法(數值<0以及三角形三邊不能組成三角形),則輸出
Wrong Format
。 - 如果輸入合法,則正常輸出,所有數值計算後均保留小數點後兩位即可。輸出內容如下:
- 排序前的各圖形型別及面積,格式為
[圖形名稱1:面積值1圖形名稱2:面積值2 …圖形名稱n:面積值n ]
,注意,各圖形輸出之間用空格分開,且輸出最後存在一個用於分隔的空格,在結束符“]”之前; - 輸出分組後的圖形型別及面積,格式為
[圓形分組各圖形型別及面積][矩形分組各圖形型別及面積][三角形分組各圖形型別及面積][梯形分組各圖形型別及面積]
,各組內格式為圖形名稱:面積值
。按照“Circle、Rectangle、Triangle、Trapezoid”的順序依次輸出; - 各組內圖形排序後的各圖形型別及面積,格式同排序前各組圖形的輸出;
- 各組中面積之和的最大值輸出,格式為
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 分)編寫程式,實現圖形類的繼承,並定義相應類物件並進行測試。
- 類Shape,無屬性,有一個返回0.0的求圖形面積的公有方法
public double getArea();//求圖形面積
- 類Circle,繼承自Shape,有一個私有實型的屬性radius(半徑),重寫父類繼承來的求面積方法,求圓的面積
- 類Rectangle,繼承自Shape,有兩個私有實型屬性width和length,重寫父類繼承來的求面積方法,求矩形的面積
- 類Ball,繼承自Circle,其屬性從父類繼承,重寫父類求面積方法,求球表面積,此外,定義一求球體積的方法
public double getVolume();//求球體積
- 類Box,繼承自Rectangle,除從父類繼承的屬性外,再定義一個屬性height,重寫父類繼承來的求面積方法,求立方體表面積,此外,定義一求立方體體積的方法
public double getVolume();//求立方體體積
- 注意:
- 每個類均有構造方法,且構造方法內必須輸出如下內容:
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上完成了習題後,過了幾天,我又忘記了很多東西,經過這次總結歸納,我又想起了一部分知識,首先就是正則表示式,還是要多練多記,加以鞏固;其次就是類圖,類圖還是有地方看不懂,接下來還是要重點去複習一下類圖的關係,繼承和多型也是要複習的。
實驗這種東西,能夠反映出哪裡沒掌握,哪裡出錯。還是要多練習了,但是如果知識不牢固,沒學好,那實驗做起來還是好難的啊。