OOP1-3次作業
一.前言:
1.第一次PTA:
①題目理解:
第一行匹配一個數字,這個數字是給出題目的個數,#N代表給出的題目樣式,#A代表你給出的答案,然後以end結尾。
②知識點:
一·用正規表示式的匹配(split函式的使用);
二·如何Java中建立一個二維陣列,或者一維陣列;
三·Java中如何將int型轉化成String型別(valueOf,Integer.paseInt);
四·在方法中建立一個物件的例項,要放在構造方法裡面;
③題量:
正常;
④難度:
正常;
2.第二次PTA:
①題目理解:
相對於pta1,他多加了試卷資訊,並且多加了很多錯誤提示,他的輸入可能是不按順序的,三種資訊的打亂混合輸入,所以加強了對正規表示式的應用。
②知識點:
1·正規表示式去匹配一個字串,如何去分組獲得其內容;
2·Arroys.copyOf()函式的使用,獲取下一次的時候應當在new一個物件,否則會將部分資料覆蓋,或者其先擴增一個單位在進行復制;
3·trim()函式的使用
4·去除匹配字串陣列的的null
5·相關的邏輯
6·如何去重寫一個函式toString()
③題量:
我覺得正常,就是大概每個星期自己做,差不多一個星期可以做完,但是有時候一直有的點過不去,就一直卡著;
④難度:
正常;
3.第三次PTA:
①題目理解:
增添了學生資訊和刪除題目資訊這樣造成了我們要去匹配學生資訊,然後找到了這個學生資訊,然後在匹配的題目裡要先在刪除資訊裡查詢到資訊,然後去匹配。
②知識點:
1·日期函式的使用:能直接返回開始時間到末尾時間的天數
2·我們可以那個陣列去儲存我們的得分。
③題量:
還好。
④難度:
偏大,感覺題目敘述的沒有很清楚。
二.內容:
1.第一次PTA:
①題目簡介:
設計實現答題程式,模擬一個小型的測試,要求輸入題目資訊和答題資訊,根據輸入題目資訊中的標準答案判斷答題的結果。
輸入格式:
程式輸入資訊分三部分:
1、題目數量
格式:整數數值,若超過1位最高位不能為0,
2、題目內容
一行為一道題,可以輸入多行資料。
格式:"#N:"+題號+" "+"#Q:"+題目內容+" "#A:"+標準答案
格式約束:題目的輸入順序與題號不相關,不一定按題號順序從小到大輸入。
3、答題資訊
答題資訊按行輸入,每一行為一組答案,每組答案包含第2部分所有題目的解題答案,答案的順序號與題目題號相對應。
②內容實現:
class Title儲存題目資訊,之後可以在questionpaper類中去建立陣列去得到這些資訊;
class AnswerPaper儲存題目的分數,和相關的位置。
class QuestionPaper保留題目資訊和保留題目分數去匹配,如果成功就會儲存題目所得到的分數。
③踩坑心得:
一.
輸入樣例6:
含多餘的空格符。例如:
1
#N:1 #Q: The starting point of the Long March is #A:ruijin
#A:ruijin
end
i=0;
for(i=0;i<retval.length-1;i++) {
title[i] = new Title(retval[i][1], retval[i][2].trim(), retval[i][3]);
// System.out.println(title[i].number + " " + title[i].content + " " + title[i].standardAnswer);
}
他想表達的意思是要把題目中的多餘的空格全部去除,所以應用trim()函式,然後就過了。
二.
我們想在方法裡去儲存這個題目是對的還是錯的,所以我們建立了一個dc陣列,去儲存,一開始我去寫在外面,但是會報錯因為構造方法是初始化如果你不寫在構造方法內,他的num永遠為0;
④改進建議:
提升程式碼的質量然後,仔細釐清程式碼邏輯和之間的關係;
2.第二次PTA:
①題目簡介:
設計實現答題程式,模擬一個小型的測試,以下粗體字顯示的是在答題判題程式-1基礎上增補或者修改的內容。
要求輸入題目資訊、試卷資訊和答題資訊,根據輸入題目資訊中的標準答案判斷答題的結果。
輸入格式:
程式輸入資訊分三種,三種資訊可能會打亂順序混合輸入:
1、題目資訊
一行為一道題,可輸入多行資料(多道題)。
格式:"#N:"+題目編號+" "+"#Q:"+題目內容+" "#A:"+標準答案
2、試卷資訊
一行為一張試卷,可輸入多行資料(多張卷)。
**格式:"#T:"+試卷號+" "+題目編號+"-"+題目分值
3、答卷資訊
答卷資訊按行輸入,每一行為一張答卷的答案,每組答案包含某個試卷資訊中的題目的解題答案,答案的順序與試卷資訊中的題目順序相對應。
格式:"#S:"+試卷號+" "+"#A:"+答案內容
格式約束:答案數量可以不等於試卷資訊中題目的數量,沒有答案的題目計0分,多餘的答案直接忽略,答案之間以英文空格分隔。
輸出格式:
1、試卷總分警示
該部分僅當一張試卷的總分分值不等於100分時作提示之用,試卷依然屬於正常試卷,可用於後面的答題。如果總分等於100分,該部分忽略,不輸出。
格式:"alert: full score of test paper"+試卷號+" is not 100 points"
2、答卷資訊
一行為一道題的答題資訊,根據試卷的題目的數量輸出多行資料。
格式:題目內容+""+答案++""+判題結果(true/false)
約束:如果輸入的答案資訊少於試卷的題目數量,答案的題目要輸"answer is null"
判分資訊為一行資料,是一條答題記錄所對應試卷的每道小題的計分以及總分,計分輸出的先後順序與題目題號相對應。
格式:題目得分+" "+....+題目得分+"~"+總分
根據輸入的答卷的數量以上2、3項答卷資訊與判分資訊將重複輸出。
4、提示錯誤的試卷號
如果答案資訊中試卷的編號找不到,則輸出”the test paper number does not exist”,參見樣例9。
②內容實現:
class Title儲存題目資訊,之後可以在questionpaper類中去建立陣列去得到這些資訊;
class AnswerPaper儲存題目的分數,和相關的位置。
class QuestionPaper保留題目資訊和保留題目分數去匹配,如果成功就會儲存題目所得到的分數。
class Answerfen保留題目的答卷資訊;
③踩坑心得:
一.
int fs[] = new int[1];
int z = 0;
int k = 0;
int p= 0;
int sum=0;
if(z<answerpaper[0].answer.length-1) {
for (k = 0; k < answerfens.length - 1; k++) {
if (answerpaper[0].numberPaper.equals(answerfens[k].numberPaper)) {
for (int j = 0; j < answerfens[k].lengthnumber(); j++) {
for (int m = 0; m < title.length - 1; m++) {
if (answerfens[k].number[j].equals(title[m].number)) {
if (title[m].standardAnswer.equals(answerpaper[0].answer[z])) {
// System.out.println(title[m].content + "~" + answerpaper[0].answer[z] + "~true");
fs[p] = answerfens[k].score2[j];
sum = sum + fs[p];
fs = Arrays.copyOf(fs, fs.length + 1);
p++;
z++;
} else {
// System.out.println(title[m].content + "~" + answerpaper[0].answer[z] + "~false");
fs[p] = 0;
sum = sum + 0;
fs = Arrays.copyOf(fs, fs.length + 1);
p++;
z++;
}
}
}
}
}
}
}
一開始沒注意到這每次都要使其歸零,否則就會產生陣列越界報錯。
二.
{
String[] t=a.split("#T:| |-");
int m=0;
int n=0;
for(int i=2;i<t.length;i++){
if(i%2==0)
{
t2[m]=t[i];//用t2陣列去儲存我們需要的資料因為他的輸入是有規律的一個標題對應一個答案
t2=Arrays.copyOf(t2,t2.length+1);//然後動態增長
m++;
}
else
{
t3[n]=t[i];//同上
t3=Arrays.copyOf(t3,t3.length+1);
n++;
}
}
answerfens[h]=new Answerfen(t[1],t2,t3);//我們把接收到的資料放入到一個答案試卷當中去
t2=new String[1];//為陣列開闢另一個空間,否則當下一次資料要更新的時候,他的資料會被覆蓋,沒有實現儲存
t3=new String[1];//同理
answerfens=Arrays.copyOf(answerfens,answerfens.length+1);
h++;
}
每次我用arroys.copyOf函式動態使陣列長度加一,然後我們要開闢一個新的空間,防止原來的內容被覆寫掉了。
3.第三次PTA:
①題目簡介:
格式:"#X:"+學號+" "+姓名+"-"+學號+" "+姓名....+"-"+學號+" "+姓名
4、答卷資訊
答卷資訊按行輸入,每一行為一張答卷的答案,每組答案包含某個試卷資訊中的題目的解題答案,答案的順序號與試 卷資訊中的題目順序相對應。答卷中:
格式:"#S:"+試卷號+" "+學號+" "+"#A:"+試卷題目的順序號+"-"+答案內容+...
5、刪除題目資訊
刪除題目資訊為獨行輸入,每一行為一條刪除資訊,多條刪除資訊可分多行輸入。該資訊用於刪除一道題目資訊,題目被刪除之後,引用該題目的試卷依然有效,但被刪除的題目將以0分計,同時在輸出答案時,題目內容與答案改為一條失效提示,例如:”the question 2 invalid~0”
輸出格式:
3、判分資訊
判分資訊為一行資料,是一條答題記錄所對應試卷的每道小題的計分以及總分,計分輸出的先後順序與題目題號相對應。
格式:學號+" "+姓名+": "+題目得分+" "+....+題目得分+"~"+總分
4、被刪除的題目提示資訊
當某題目被試卷引用,同時被刪除時,答案中輸出提示資訊。樣例見第5種輸入資訊“刪除題目資訊”。
5、題目引用錯誤提示資訊
試卷錯誤地引用了一道不存在題號的試題,在輸出學生答案時,提示”non-existent question~”加答案。
6、格式錯誤提示資訊
輸入資訊只要不符合格式要求,均輸出”wrong format:”+資訊內容。
如果答卷資訊中試卷的編號找不到,則輸出”the test paper number does not exist”,答卷中的答案不用輸出,參見樣例8。
8、學號引用錯誤提示資訊
如果答卷中的學號資訊不在學生列表中,答案照常輸出,判分時提示錯誤。參見樣例9。
本題暫不考慮出現多張答卷的資訊的情況。
②內容實現:
class Title儲存題目資訊,之後可以在questionpaper類中去建立陣列去得到這些資訊;
class AnswerPaper儲存題目的分數,和相關的位置。
class QuestionPaper保留題目資訊和保留題目分數去匹配,如果成功就會儲存題目所得到的分數。
class Answerfen保留題目的答卷資訊;
class Student 保留學生資訊;
③踩坑心得:
一.
void pdfs(){
int a[] =new int[1];
int numm=0;
int gg=0;
int sum=0;
//首先判斷試卷存不存在
for(int k=0;k<answerfens.length-1;k++){
for(int i=0;i<answerpaper.length-1;i++){
if(answerfens[k].numberPaper.equals(answerpaper[i].textNumber)) {
//判斷學生的學號是否存在
int flag = 0;
for (int l = 0; l < student.studentNumber.length; l++) {
if (answerpaper[i].studentNumber.equals(student.studentNumber[l])) {
flag = 1;
for (int p = 0; p < answerfens[k].number.length; p++) {
int flag3 = 0;//每次迴圈都要賦值為零
for (int q = 0; q < answerpaper[i].titleNumber.length; q++) {
if (answerpaper[i].titleNumber[q].equals(String.valueOf(p + 1))) {
flag3 = 1;
//去判斷這個題目是否被刪
int flag2 = 0;
if (deleteNumber != null) {
for (int r = 0; r < deleteNumber.titlenumber.length; r++) {
if (deleteNumber.titlenumber[r].equals(answerfens[k].number[p])) {
flag2 = 1;
// System.out.println("the question " + answerfens[k].number[p] + " invalid~0");
a[numm]=0;
a=Arrays.copyOf(a,a.length+1);
numm++;
}
}
}
if (flag2 == 0) {
int flag4 = 0;
for (int u = 0; u < title.length - 1; u++) {
if (answerfens[k].number[p].equals(title[u].number)) {
flag4 = 1;
if (answerpaper[i].titleAnswer[p].equals(title[u].standardAnswer)) {
// System.out.println(title[u].content + "~" + answerpaper[i].titleAnswer[q] + "~true");
a[numm]=Integer.valueOf(answerfens[k].score[p]);
a=Arrays.copyOf(a,a.length+1);
numm++;
} else {
// System.out.println(title[u].content + "~" + answerpaper[i].titleAnswer[q] + "~false");
a[numm]=0;
a=Arrays.copyOf(a,a.length+1);
numm++;
}
}
}
if (flag4 == 0) {
// System.out.println("non-existent question~0");
a[numm]=0;
a=Arrays.copyOf(a,a.length+1);
numm++;
}
}
}
}
if (flag3 == 0) {
// System.out.println("answer is null");
a[numm]=0;
a=Arrays.copyOf(a,a.length+1);
numm++;
}
}
}
sum=0;
for(int i11=0;i11<a.length-1;i11++){
sum=sum+a[i11];
}
gg=0;
for(int r=0;r<student.studentNumber.length;r++){
if(answerpaper[i].studentNumber.equals(student.studentNumber[r])){
gg=r;
}
}
//
用迴圈去匹配,每次都要找到特定條件跳出來,所以程式碼邏輯很繞;
三.總結:
一.要懂得基本的工具,和相關函式;
二.要明白程式碼的邏輯,熟悉idea除錯的方法;