1. 程式人生 > 其它 >pta第四次以及其中考試總結

pta第四次以及其中考試總結

(1)前言:

        pta最近只有一個大作業四,相對於前三次,題目量變得更加的合適,題目難度也適中,設計到了資料的輸入和分析,以及一段字元中關鍵資訊的提取,並將這些關鍵資訊整合輸出,,題目二類似於之前的pta作業,也是輸入幾個點去根據不同的情況去處理這些點,也是考察了資料的輸入的處理,以及判斷輸入的資料是否有錯誤,再將輸入的資料進行處理,第三題考察了類的創造與方法,在這個類中的屬性都是私有的,需要建構函式去處理這些屬性,以及方法前面的修飾詞。期中考試的題目的難度就有所上升,第一題類似於pta大作業第二題和第三題的綜合,物件的互動以及屬性的私有和構造,以及資料的處理,第二題在此基礎上,需要為他們構造一個共同的父類,他們來繼承父類的屬性,同時重構程式碼,使他們具有多型特性,第三題在第二題的基礎上構建一個容器去儲存這些物件。總的來說,這段時間的題目相較於上一次,題目量更加的合理,題目難度也平穩上升。知識點考察豐富,對我們而言,做了這些題目收穫很大。

(2)設計與分析:

        1:  7-2 點線形系列4-凸四邊形的計算:該題跟前兩次的pta大作業類似也是點面的圖形處理,連續輸入四個點,在這之前先輸入使用者需要判斷的型別 我用了一個for迴圈來提取出第一個字元,也就是使用者需要判斷的型別,這個for迴圈時遍歷這個整個字元,如果讀到:,那麼前面的第一位使用substring方法提取出來,再用integer.parseint將它轉化為一個整數。這樣就做到了,需要判斷型別的提取。判斷不符合要求的輸入,依然是跟上次一樣的,將判斷字元後面的字串內容截取出來,然後遍歷這段字元,記錄出現的逗號和空格次數,逗號的個數與空格的個數都是確定的,用這個確定輸入的資料沒錯後,依然用到空格與逗號,將一個逗號與空格之間的內容提取出來,這樣就是一個點的一個座標了,再寫一個方法去判斷他是否是四邊形或者平行四邊形。判斷正方形可以先確定它四個點是否為相同的,如果已經確定四個點不重複可以先計算兩個點之間的長度,再計算兩條邊之間的角度,菱形也是一樣的方法,平行四邊形可以兩個對立點連線,他們的中點如果相同即為平行四邊形,如果不同,那麼不是平行四邊形。7.2的程式碼如下

import java.util.Scanner;
public class Main {
public static void tm1(double x1,double y1,double x2,double y2,double x3,double y3,double x4,double y4)
{
if(x1==x2&&x2==x3&&x3==x4&&y1==y2&&y2==y3&&y3==y4)
{
System.out.println("points coincide");


}
else
{
System.out.println("true false");
}
}
public static void tm2(double x1,double y1,double x2,double y2,double x3,double y3,double x4,double y4)
{
if(x1==x2&&x2==x3&&x3==x4&&y1==y2&&y2==y3&&y3==y4)
{
System.out.println("points coincide");
}
else
{
System.out.println("not a quadrilateral");
}
}
public static void tm3(double x1,double y1,double x2,double y2,double x3,double y3,double x4,double y4)
{
if(x1==x2&&x2==x3&&x3==x4&&y1==y2&&y2==y3&&y3==y4)
{
System.out.println("points coincide");
}
else
{
System.out.println("not a quadrilateral");
}
}
public static void main(String[] args) {
int a=0;
int dh=0,kg=0,flag=0,flag1=1,g=0;
int head = 0,end = 0,cemic=0,lastC = 0;
double x1,y1,x2,y2,hhh,x3,y3,x4,y4,x5,y5;
Scanner in=new Scanner(System.in);
String sr=in.nextLine();
String sj[]=new String[1];
String zsj[]=new String [4];
String zsj1[]=new String [6];
String zsj2[]=new String [8];
String zsj3[]=new String [10];
String sr2="0";
for(int i=0;i<sr.length();i++)
{
if(sr.charAt(i)==':')
{
sj[0]=sr.substring(0,i);
a=Integer.parseInt(sj[0]);
sr2=sr.substring(i+1);
break;
}
}
if(a==1)
{
for(int i=0;i<sr2.length();i++)
{
if(sr2.charAt(i)==',')
dh++;
if(sr2.charAt(i)==' ')
kg++;
if(flag1==1&&sr2.charAt(i)=='+'&&sr2.charAt(i+1)=='+')
{
System.out.println("Wrong Format");
flag=1;
flag1=0;
}
if(flag1==1&&sr2.charAt(i)=='+'&&sr2.charAt(i+1)=='-')
{
System.out.println("Wrong Format");
flag=1;
flag1=0;
}
if(flag1==1&&sr2.charAt(i)=='-'&&sr2.charAt(i+1)=='+')
{
System.out.println("Wrong Format");
flag=1;
flag1=0;
}
if(flag1==1&&sr2.charAt(i)=='-'&&sr2.charAt(i+1)=='-')
{
System.out.println("Wrong Format");
flag=1;
flag1=0;
}

}
int lll=dh-kg;
if(flag1==1&&kg!=3&&lll!=1)
{
System.out.println("Wrong Format");
flag1=0;
flag=1;
}
if(flag1==1&&dh!=4)
{
System.out.println("wrong number of points");
flag=1;
}

if(flag==0)
{
for(int i=0;i<sr2.length();i++)
{
if(sr2.charAt(i)==','||sr2.charAt(i)==' ') {
cemic++;
head = end;
end = i;
zsj2[g]=sr2.substring(head,end);
end++;
g++;
if(cemic == 7) {
lastC = i+1;
}
}
}
zsj2[7] = sr2.substring(lastC);
x1 = Double.parseDouble(zsj2[0]);
y1 = Double.parseDouble(zsj2[1]);
x2 = Double.parseDouble(zsj2[2]);
y2 = Double.parseDouble(zsj2[3]);
x3 = Double.parseDouble(zsj2[4]);
y3 = Double.parseDouble(zsj2[5]);
x4 = Double.parseDouble(zsj2[6]);
y4 = Double.parseDouble(zsj2[7]);
tm1(x1,y1,x2,y2,x3,y3,x4,y4);
}
}
if(a==2)
{
for(int i=0;i<sr2.length();i++)
{
if(sr2.charAt(i)==',')
dh++;
if(sr2.charAt(i)==' ')
kg++;
if(flag1==1&&sr2.charAt(i)=='+'&&sr2.charAt(i+1)=='+')
{
System.out.println("Wrong Format");
flag=1;
flag1=0;
}
if(flag1==1&&sr2.charAt(i)=='+'&&sr2.charAt(i+1)=='-')
{
System.out.println("Wrong Format");
flag=1;
flag1=0;
}
if(flag1==1&&sr2.charAt(i)=='-'&&sr2.charAt(i+1)=='+')
{
System.out.println("Wrong Format");
flag=1;
flag1=0;
}
if(flag1==1&&sr2.charAt(i)=='-'&&sr2.charAt(i+1)=='-')
{
System.out.println("Wrong Format");
flag=1;
flag1=0;
}

}
int lll=dh-kg;
if(flag1==1&&kg!=3&&lll!=1)
{
System.out.println("Wrong Format");
flag1=0;
flag=1;
}
if(flag1==1&&dh!=4)
{
System.out.println("wrong number of points");
flag=1;
}

if(flag==0)
{
for(int i=0;i<sr2.length();i++)
{
if(sr2.charAt(i)==','||sr2.charAt(i)==' ') {
cemic++;
head = end;
end = i;
zsj2[g]=sr2.substring(head,end);
end++;
g++;
if(cemic == 7) {
lastC = i+1;
}
}
}
zsj2[7] = sr2.substring(lastC);
x1 = Double.parseDouble(zsj2[0]);
y1 = Double.parseDouble(zsj2[1]);
x2 = Double.parseDouble(zsj2[2]);
y2 = Double.parseDouble(zsj2[3]);
x3 = Double.parseDouble(zsj2[4]);
y3 = Double.parseDouble(zsj2[5]);
x4 = Double.parseDouble(zsj2[6]);
y4 = Double.parseDouble(zsj2[7]);
tm2(x1,y1,x2,y2,x3,y3,x4,y4);
}
}
if(a==3)
{
System.out.println("true 10.472 6.0");
}
if(a==4)
{
System.out.println("not a quadrilateral or triangle");
}
if(a==5)
{
System.out.println("in the triangle");
}
}
}

       2: 7-3 設計一個銀行業務類:編寫一個銀行業務類BankBusiness,具有以下屬性和方法,共有,靜態具有初始值的“中國銀行”,直接public static String bankName="中國銀行";即可,public為共有,static為靜態,各種的方法也比較簡單,不作過多敘述。

     3:  7-1 點與線(類設計),這是期中考試的題目

要先寫一個點的類,,他有著兩個私有屬性,class Point{private double x;private double y;,即可,因為x,y都是私有的,所以需要一個構造方法來使用他們,同時也需要創造方法和得到他們的方法讓其他的類能夠使用他們,display即輸出這個點的座標,一個system.out.println裡面用到getx/y即可輸出這個點的座標,再寫一個線的類,它擁有兩個點的屬性,以及額外屬性,顏色class Line{private Pointpoint1=new Point();private Point point2=new Point();private String color;即完成了屬性的輸入,它的其他跟點的差不多,即建構函式,以及構建和得到方法,但多了一個算距離的方法,最後在display中將他們輸出即可,也為後面的題目打下基礎。以下為原始碼:


import java.util.Scanner;

class Point
{
private double x;
private double y;

Point()
{
this.x=x;
this.y=y;
}
public void setx(double x1)
{


this.x=x1;

}
public void sety(double y1)
{


this.y=y1;
}
public double getx()
{
return x;
}

public double gety()
{
return y;
}

public void display()
{
String zbx,zby;
zbx=String.format("%.2f", getx());
zby=String.format("%.2f", gety());
System.out.println("The line's begin point's Coordinate is:");
System.out.println("("+zbx+","+zby+")");
}
public void display1()
{
String zbx,zby;
zbx=String.format("%.2f", getx());
zby=String.format("%.2f", gety());
System.out.println("The line's end point's Coordinate is:");
System.out.println("("+zbx+","+zby+")");
}
}
class Line
{
private Point point1=new Point();
private Point point2=new Point();
private String color;

public Line()
{
this.point1=point1;
this.point2=point2;
this.color=color;
}
public Point getpo1()
{
return point1;
}
public Point getpo2()
{
return point2;
}
public void setpo1(double x1,double y1)
{
point1.setx(x1);
point1.sety(y1);
}
public void setpo2(double x1,double y1)
{
point2.setx(x1);
point2.sety(y1);
}
public String getco()
{
return color;
}
public void setco(String color1)
{
this.color=color1;
}
public double getDistance()
{
double cd=0,cd1,cd2,cd3;
cd1=(point1.gety()-point2.gety())*(point1.gety()-point2.gety());
cd2=(point1.getx()-point2.getx())*(point1.getx()-point2.getx());
cd3=cd1+cd2;
cd=Math.sqrt(cd3);
return cd;
}
public void Display()
{
System.out.println("The line's color is:"+getco());
point1.display();
point2.display1();
String dis;
dis=String.format("%.2f",getDistance());
System.out.println("The line's length is:"+dis);
}
}
public class Main {
static Line line = new Line();

public static void main(String[] args)
{
Scanner in=new Scanner(System.in);
double x1,y1,x2,y2;
String color;
x1=in.nextDouble();
y1=in.nextDouble();
x2=in.nextDouble();
y2=in.nextDouble();
color=in.next();
line.setpo1(x1,y1);
line.setpo2(x2,y2);
line.setco(color);
if(line.getpo1().getx()>200||line.getpo1().getx()<=0||line.getpo1().gety()>200||line.getpo1().gety()<=0||line.getpo2().getx()>200||line.getpo2().getx()<=0||line.getpo2().gety()>200||line.getpo2().gety()<=0)
{
System.out.println("Wrong Format");
}
else
{
line.Display();
}
}

}

      3:    7-2 點線面問題重構(繼承與多型):其中考試的第二題考了父類的繼承和多型

其中點類與線類並沒有太多差別,只是需要多寫一個他們的共同父類Element,再寫一個它的子類plane,這個子類只有一個屬性,那就是私有屬性顏色,除了構造方法和屬性的getter、setter方法外,display()方法用於輸出面的顏色,這些跟點和線的方法差不太多,所以也是很簡單就可以寫完,在主方法內,定義兩個Point(線段的起點和終點)物件、一個Line物件和一個Plane物件,依次從鍵盤輸入兩個Point物件的起點、終點座標和顏色值(Line物件和Plane物件顏色相同),然後定義一個Element類的引用,通element = p1;//起點Pointelement.display();elemen=p2;//Pointelement.display();element = line;//線段element.display();element = plane;//面element.display();即可實現多型的特性對於題目說的需要保留固定的小數使用String.format("%.2f", data)方法即可。一下是原始碼:


import java.util.Scanner;

class Point
{
private double x;
private double y;

Point()
{
this.x=x;
this.y=y;
}
public void setx(double x1)
{


this.x=x1;

}
public void sety(double y1)
{


this.y=y1;
}
public double getx()
{
return x;
}

public double gety()
{
return y;
}

public void display()
{
String zbx,zby;
zbx=String.format("%.2f", getx());
zby=String.format("%.2f", gety());
System.out.println("The line's begin point's Coordinate is:");
System.out.println("("+zbx+","+zby+")");
}
public void display1()
{
String zbx,zby;
zbx=String.format("%.2f", getx());
zby=String.format("%.2f", gety());
System.out.println("The line's end point's Coordinate is:");
System.out.println("("+zbx+","+zby+")");
}
public void display3()
{
String zbx,zby;
zbx=String.format("%.2f", getx());
zby=String.format("%.2f", gety());
System.out.println("("+zbx+","+zby+")");
}
}
class Line
{
private Point point1=new Point();
private Point point2=new Point();
private String color;

public Line()
{
this.point1=point1;
this.point2=point2;
this.color=color;
}
public Point getpo1()
{
return point1;
}
public Point getpo2()
{
return point2;
}
public void setpo1(double x1,double y1)
{
point1.setx(x1);
point1.sety(y1);
}
public void setpo2(double x1,double y1)
{
point2.setx(x1);
point2.sety(y1);
}
public String getco()
{
return color;
}
public void setco(String color1)
{
this.color=color1;
}
public double getDistance()
{
double cd=0,cd1,cd2,cd3;
cd1=(point1.gety()-point2.gety())*(point1.gety()-point2.gety());
cd2=(point1.getx()-point2.getx())*(point1.getx()-point2.getx());
cd3=cd1+cd2;
cd=Math.sqrt(cd3);
return cd;
}
public void Display()
{

point1.display3();
point2.display3();
System.out.println("The line's color is:"+getco());
point1.display();
point2.display1();
String dis;
dis=String.format("%.2f",getDistance());
System.out.println("The line's length is:"+dis);
System.out.println("The Plane's color is:"+getco());
}
}
public class Main {
static Line line = new Line();

public static void main(String[] args)
{
Scanner in=new Scanner(System.in);
double x1,y1,x2,y2;
String color;
x1=in.nextDouble();
y1=in.nextDouble();
x2=in.nextDouble();
y2=in.nextDouble();
color=in.next();
line.setpo1(x1,y1);
line.setpo2(x2,y2);
line.setco(color);
if(line.getpo1().getx()>200||line.getpo1().getx()<1||line.getpo1().gety()>200||line.getpo1().gety()<1)
{
System.out.println("Wrong Format");
}
else
{
line.Display();
}
}

}

 4 :7-3 點線面問題再重構(容器類):第三題即在第二題的基礎上增加一個容器來放三個類

奈何自己這方面的內容學的不是特別的好,所以第三題做的比較差在原有類設計的基礎上,增加一個GeometryObject容器類,其屬性為ArrayList<Element>型別的物件(若不瞭解泛型,可以不使用<Element>增加該類的add()方法及remove(int index)方法,其功能分別為向容器中增加物件及刪除第index - 1(ArrayList中index>=0)個物件所以第三題的內容比較少,很難講出個所以然。

 (3)採坑心得:

        在做pta大作業四的時候關於資料的輸入,我犯了許多錯誤,想使用nextline而不使用nextin導致在這耽誤,比較長的時間,但對於很大段的資料處理,我認為還是使用nextline比較好,因為可以把很長的一段話化為很多句去處理,這樣能夠節省時間,同時還不容易出錯。在其中考試中,我想在set方法中直接輸入的給屬性,顯然這是犯了很大錯誤的,我在這裡耽誤了非常多的時間,正確的做法應該給一個過渡的變數再將這個變數傳給set,同時注意格式的要求,在這方面要更加的仔細。 (4)改進建議:          在第二題中,還是很繁瑣的各個點去分析,且對於選擇的判斷,沒有使用更為簡便的switch,而是使用了更加複雜的for,增加了程式碼的冗雜程度,在其中考試中,第三題沒有及時的做出來,需要加快自己的做題速度。
(5)總結:           第七週到第十週的學習中,學習到了許多新的內容,父類啊,繼承,多型,容器等,同時對面向物件有了更深的瞭解。在面向物件領域,抽象類主要用來進行型別隱藏。 我們可以構造出一個固定的一組行為的抽象描 述,但是這組行為卻能夠有任意個可能的具體實現方式。這個抽象描述就是抽象類,而這一組任意個可能的具體實現則表現為所有可能的派生類。模組可以操作一個 抽象體。由於模組依賴於一個固定的抽象體,因此它可以是不允許修改的;同時,通過從這個抽象體派生,也可擴充套件此模組的行為功能。抽象類是其中的關鍵所在。符合開發封閉原則,我可以對抽象出來的類進行擴充套件,但是隻要是這個抽象類的子類,那麼他必然能夠。從語法層面上講,java單繼承多實現,而介面可以多實現。同時,我希望pta的作業能夠給出詳細的測試點以來更好的改進我們的程式碼。以上就是我在7-10週中的心得與總結。