南昌航空大學前三次pta作業總結

西阁發表於2024-04-21

一.前言

本學期新增JAVA的面向程式設計課程,為增加學生編寫能力和對學習內容的掌握程度進行一個檢測,開始了本學期的PTA作業,以及接下來我將對此三次作業進行一個總結,講訴自己的學習心得和學習到的知識。

二.題目以及程式碼

(1)第一題如下:
設計實現答題程式,模擬一個小型的測試,要求輸入題目資訊和答題資訊,根據輸入題目資訊中的標準答案判斷答題的結果。
輸入格式:
程式輸入資訊分三部分:
1、題目數量
格式:整數數值,若超過1位最高位不能為0,
樣例:34
2、題目內容
一行為一道題,可以輸入多行資料。
格式:"#N:"+題號+" "+"#Q:"+題目內容+" "#A:"+標準答案
格式約束:題目的輸入順序與題號不相關,不一定按題號順序從小到大輸入。
樣例:#N:1 #Q:1+1= #A:2
#N:2 #Q:2+2= #A:4
3、答題資訊
答題資訊按行輸入,每一行為一組答案,每組答案包含第2部分所有題目的解題答案,答案的順序號與題目題號相對應。
格式:"#A:"+答案內容
格式約束:答案數量與第2部分題目的數量相同,答案之間以英文空格分隔。
樣例:#A:2 #A:78
2是題號為1的題目的答案
78是題號為2的題目的答案
答題資訊以一行"end"標記結束,"end"之後的資訊忽略。
輸出格式:
1、題目數量
格式:整數數值,若超過1位最高位不能為0,
樣例:34
2、答題資訊
一行為一道題的答題資訊,根據題目的數量輸出多行資料。
格式:題目內容+" ~"+答案
樣例:1+1=~2
2+2= ~4
3、判題資訊
判題資訊為一行資料,一條答題記錄每個答案的判斷結果,答案的先後順序與題目題號相對應。
格式:判題結果+" "+判題結果
格式約束:
1、判題結果輸出只能是true或者false,
2、判題資訊的順序與輸入答題資訊中的順序相同
樣例:true false true
設計建議:
以下是針對以上題目要求的設計建議,其中的屬性、方法為最小集,實現程式碼中可根據情況新增所需的內容:
題目類(用於封裝單個題目的資訊):
屬性:題目編號、題目內容、標準答案-standardAnswer
方法:資料讀寫set\get方法、
判題方法(答案-answer):判斷答案-answer是否符合標準答案-standardAnswer
試卷類(用於封裝整套題目的資訊)
屬性:題目列表(題目類的物件集合)、題目數量
方法:判題方法(題號-num、答案-answer):判斷答案-answer是否符合對應題號的題目標準答案-standardAnswer
儲存題目(題號-num、題目-question):將題目儲存到題目列表中,儲存位置與num要能對應
答卷類(用於封裝答題資訊)
屬性:試卷(試卷類的物件)、答案列表(儲存每一題的答案)、判題列表(儲存每一題的判題結果true/false)
方法:判題方法(題號-num):判斷答案列表中第num題的結果是否符合試卷中對應題號的題目標準答案
輸出方法(題號-num):按照題目的格式要求,輸出題號為num的題目的內容和答題結果。
儲存一個答案(題號-num,答案-answer):儲存題號為num的題目的答題結果answer。
對題目的思考:
由設計建議設計類圖

程式碼如下

點選檢視程式碼
import java.util.ArrayList;
import java.util.List;
import java.util.Scanner;
class Question {
    private int number;
    private String content;
    private String standardAnswer;
    public Question(int number, String content, String standardAnswer) {
        this.number = number;
        this.content = content;
        this.standardAnswer = standardAnswer;
    }
    public boolean judgeAnswer(String answer) {
        return answer.equals(standardAnswer);
    }
    public String getQuestionInfo() {
        return content + "~" + standardAnswer;
    }
}
class TestPaper {
    private List<Question> questionList;
    public TestPaper() {
        this.questionList = new ArrayList<>();
    }
    public void saveQuestion(int number, String content, String standardAnswer) {
        Question question = new Question(number, content, standardAnswer);
        questionList.add(question);
    }
    public boolean judgeAnswer(int number, String answer) {
        Question question = questionList.get(number - 1);
        return question.judgeAnswer(answer);
    }
    public String getQuestionInfo(int number) {
        Question question = questionList.get(number - 1);
        return question.getQuestionInfo();
    }
}
class AnswerSheet {
    private TestPaper testPaper;
    private List<String> answerList;
    public AnswerSheet(TestPaper testPaper) {
        this.testPaper = testPaper;
        this.answerList = new ArrayList<>();
    }
    public void saveAnswer(String answer) {
        answerList.add(answer);
    }
    public boolean judgeAnswer(int number) {
        String answer = answerList.get(number - 1);
        return testPaper.judgeAnswer(number, answer);
    }
    public String getAnswerInfo(int number) {
        return answerList.get(number - 1);
    }
}
public class Main {
    public static void main(String[] args) {
        Scanner scanner = new Scanner(System.in);
        int questionCount = Integer.parseInt(scanner.nextLine());
        TestPaper testPaper = new TestPaper();
        AnswerSheet answerSheet = new AnswerSheet(testPaper);
        int[] number = new int[100];
        String[] content =new String[100];
        String[] standardAnswer =new String[100];
        for (int i = 0; i < questionCount; i++) {
            String[] questionInfo = scanner.nextLine().split("N:|#Q:|#A:");
             number[i] = Integer.parseInt(questionInfo[1].trim());
            content[i] = questionInfo[2].trim();
            standardAnswer[i] = questionInfo[3].trim();
        }
        for (int i = 0; i < questionCount-1; i++) {
            for(int j = 0;j < questionCount-1;j++){
                if(number[j]>number[j+1]){
int a=number[j];number[j]=number[j+1];number[j+1]=a;
String b=content[j];content[j]=content[j+1];content[j+1]=b;
String c=standardAnswer[j];standardAnswer[j]=standardAnswer[j+1];standardAnswer[j+1]=c;
                }
            }
        }
        String answerInfo;
        while (!(answerInfo = scanner.nextLine()).equals("end")) {
            String[] answers = answerInfo.split("#A:");
            for (int i = 2,j=0; i <= answers.length; i=i+1,j++) {
            testPaper.saveQuestion(number[j], content[j], answers[i-1].trim());
                answerSheet.saveAnswer(standardAnswer[j]);
            }
        }
        for (int i = 1; i <= questionCount; i++) {
            System.out.println(testPaper.getQuestionInfo(i));
        }
       for (int i = 1; i < questionCount; i++) {
            if(answerSheet.judgeAnswer(i))
                System.out.print(true+" ");
            else
                System.out.print(false+" ");
        }
        int m= questionCount;
        if(answerSheet.judgeAnswer(m))
                System.out.print(true);
            else
                System.out.print(false);
    }
}

pta測試點案例
image

心得與學習:
在完成Java的第一次作業後,我對Java程式語言有了更深入的瞭解。也更瞭解了類的單一職責和對類的使用,透過解決作業中的問題,我鞏固了對基本語法和邏輯的掌握,並且學會了如何將理論知識應用到實際的程式設計任務中。在作業的過程中,我遇到了一些挑戰,特別是在除錯和理解問題要求方面。但透過查閱資料、向同學請教,以及多次嘗試,我最終克服了困難,完成了作業。
此外,作業完成後,我也意識到自己在程式設計能力、邏輯思維方面還有許多需要提升的地方。因此,我計劃在接下來的學習中加強對Java程式設計的實踐,多做程式設計練習並自主探索一些實際的專案,以提升自己的程式設計水平。我相信,透過不斷的努力和實踐,我一定能夠在Java程式設計領域取得更大的進步。
這次作業讓我意識到了學習程式設計的樂趣和挑戰,並激發了我對Java程式設計的更大興趣。我期待接下來學習更多有關Java程式設計的知識,探索更多有趣的程式設計問題。
(2)第二題如下:
7-4 答題判題程式-2
分數 73
困難
作者 蔡軻
單位 南昌航空大學
設計實現答題程式,模擬一個小型的測試,以下粗體字顯示的是在答題判題程式-1基礎上增補或者修改的內容。
要求輸入題目資訊、試卷資訊和答題資訊,根據輸入題目資訊中的標準答案判斷答題的結果。
輸入格式:
程式輸入資訊分三種,三種資訊可能會打亂順序混合輸入:
1、題目資訊
一行為一道題,可輸入多行資料(多道題)。
格式:"#N:"+題目編號+" "+"#Q:"+題目內容+" "#A:"+標準答案
格式約束:
1、題目的輸入順序與題號不相關,不一定按題號順序從小到大輸入。
2、允許題目編號有缺失,例如:所有輸入的題號為1、2、5,缺少其中的3號題。此種情況視為正常。
樣例:#N:1 #Q:1+1= #A:2
#N:2 #Q:2+2= #A:4
2、試卷資訊
一行為一張試卷,可輸入多行資料(多張卷)。
格式:"#T:"+試卷號+" "+題目編號+"-"+題目分值
題目編號應與題目資訊中的編號對應。
一行資訊中可有多項題目編號與分值。
樣例:#T:1 3-5 4-8 5-2
3、答卷資訊
答卷資訊按行輸入,每一行為一張答卷的答案,每組答案包含某個試卷資訊中的題目的解題答案,答案的順序與試卷資訊中的題目順序相對應。
格式:"#S:"+試卷號+" "+"#A:"+答案內容
格式約束:答案數量可以不等於試卷資訊中題目的數量,沒有答案的題目計0分,多餘的答案直接忽略,答案之間以英文空格分隔。
樣例:#S:1 #A:5 #A:22
1是試卷號
5是1號試卷的順序第1題的題目答案
22是1號試卷的順序第2題的題目答案
答題資訊以一行"end"標記結束,"end"之後的資訊忽略。
輸出格式:
1、試卷總分警示
該部分僅當一張試卷的總分分值不等於100分時作提示之用,試卷依然屬於正常試卷,可用於後面的答題。如果總分等於100分,該部分忽略,不輸出。
格式:"alert: full score of test paper"+試卷號+" is not 100 point
樣例:alert: full score of test paper2 is not 100 points
2、答卷資訊
一行為一道題的答題資訊,根據試卷的題目的數量輸出多行資料。
格式:題目內容+""+答案++""+判題結果(true/false)
約束:如果輸入的答案資訊少於試卷的題目數量,答案的題目要輸"answer is null"
樣例:3+2=5true
4+6=22false.
answer is null
3、判分資訊
判分資訊為一行資料,是一條答題記錄所對應試卷的每道小題的計分以及總分,計分輸出的先後順序與題目題號相對應。
格式:題目得分+" "+....+題目得分+"~"+總分
格式約束:
1、沒有輸入答案的題目計0分
2、判題資訊的順序與輸入答題資訊中的順序相同
樣例:5 8 0~13
根據輸入的答卷的數量以上2、3項答卷資訊與判分資訊將重複輸出。
4、提示錯誤的試卷號
如果答案資訊中試卷的編號找不到,則輸出”the test paper number does not exist”,參見樣例9。
設計建議:
參考答題判題程式-1,建議增加答題類,類的內容以及類之間的關聯自行設計。
對題目的思考:
本題相較於第一題而言增加了分數和對題目的判斷
類圖如下
image

程式碼如下

點選檢視程式碼
import java.util.ArrayList;
import java.util.List;
import java.util.Scanner;
class Question {
    private int number;
    private String content;
    private String standardAnswer;
    private int score;
    public Question(int number, String content, String standardAnswer, int score) {
        this.number = number;
        this.content = content;
        this.standardAnswer = standardAnswer;
        this.score = score;
    }
    public boolean judgeAnswer(String answer) {
        return answer.equals(standardAnswer);
    }
    public String getQuestionInfo() {
        return content + "~" + standardAnswer+"~";
    }
    public void setscore(int score){
    this.score = score;
    }
}
class TestPaper {
    private List<Question> questionList;
    public TestPaper() {
        this.questionList = new ArrayList<>();
    }
    public void saveQuestion(int number, String content, String standardAnswer,int score) {
        Question question = new Question(number, content, standardAnswer,score);
        questionList.add(question);
    }
    public boolean judgeAnswer(int number, String answer) {
        Question question = questionList.get(number - 1);
        return question.judgeAnswer(answer);
    }
    public String getQuestionInfo(int number) {
        Question question = questionList.get(number - 1);
        return question.getQuestionInfo();
    }
}
class AnswerSheet {
    private TestPaper testPaper;
    private List<String> answerList;
    public AnswerSheet(TestPaper testPaper) {
        this.testPaper = testPaper;
        this.answerList = new ArrayList<>();
    }
    public void saveAnswer(String answer) {
        answerList.add(answer);
    }
    public boolean judgeAnswer(int number) {
        String answer = answerList.get(number - 1);
        return testPaper.judgeAnswer(number, answer);
    }
    public String getAnswerInfo(int number) {
        return answerList.get(number - 1);
        
    }
}
/*class Answerpaper{
    private Answerpaper answerpaper;
    private List<AnswerSheet> amswerSheetList;
    public Answerpaper(){
        this.answerSheetList = new Arraylist<>();
    }
    public void saveAnswer(TestPaper testPaper){
        AnswerSheet answerSheet = new AnswerSheet(testPaper)
        answerSheetList.add(answerSheet);
    }
    
}*/
public class Main {
    public static void main(String[] args) {
        Scanner scanner = new Scanner(System.in);
        TestPaper testPaper = new TestPaper();
        AnswerSheet answerSheet = new AnswerSheet(testPaper);
        int getscore=0;
        int allscore=0;
        int questionCount = 0;
        int[] number = new int[100];
        String[] content =new String[100];
        String[] standardAnswer =new String[100];
        int[] score = new int[100];
        int[] qnumber = new int[100];
        for (int i = 0;; i++) {
        String input = scanner.nextLine();
        if(input.startsWith("#N")) {
        String[] questionInfo = input.split("N:|#Q:|#A:");
             number[i] = Integer.parseInt(questionInfo[1].trim());
            content[i] = questionInfo[2].trim();
            standardAnswer[i] = questionInfo[3].trim();
            questionCount++;
            }
        else if(input.startsWith("#T")) {
        String[] testInfo = input.split("T:| |-");
        for(int x = 4,y=0;x<=testInfo.length;x=x+2,y++){
            qnumber[y] = Integer.parseInt(testInfo[x-2]);
            score[y]=Integer.parseInt(testInfo[x-1]);
            }
        break;
            }
        }
        for (int i = 0; i < questionCount; i++) {
            int a;
            String b;
        for (int j = 0; i < questionCount; j++){
            if(qnumber[i]==number[j]){
                a = number[j];number[j] = number[i];number[i] = a;
                b = content[j];content[j] = content[i];content[i] = b;
            }
            else
            break;
        }
        }
        
        for (int i = 0;; i++) {
        String input = scanner.nextLine();
        if(input.startsWith("#S")) {
        String[] answerInfo = input.split("S:|#A:");
        for (int x = 3,y=0; x <= answerInfo.length; x=x+1,y++) {
            testPaper.saveQuestion(number[y], content[y], answerInfo[x-1].trim(),score[y]);
                answerSheet.saveAnswer(standardAnswer[y]);
            }
        }
        else if(input.equals("end")) 
            break;
        else
            continue;
        }
        for (int i = 1; i <= questionCount; i++) {
        allscore = score[i-1]+allscore;
        }
        if(allscore!=100)
        System.out.println("alert: full score of test paper1 is not 100 points");
        for (int i = 1; i <= questionCount; i++) {
            System.out.print(testPaper.getQuestionInfo(i));
            if(answerSheet.judgeAnswer(i))
                System.out.println(true);
            else
                System.out.println(false);
        }
        for (int i = 1; i < questionCount; i++) {
            if(answerSheet.judgeAnswer(i)){
            getscore = score[i-1]+getscore;
                System.out.print(score[i-1]+" ");}
            else
                System.out.print("0 ");
        }
            if(answerSheet.judgeAnswer(questionCount)){
            getscore = score[questionCount-1]+getscore;
                System.out.print(score[questionCount-1]+"~");}
            else
                System.out.print("0~");
        System.out.print(getscore);
    }
}

PTA測試點
image
心得與體會
完成Java的第二次作業後,我深刻體會到了程式設計能力的持續提升。雖然這次作業完成度不是很高,但在這次作業中,我不僅鞏固了Java語言的基礎知識,還學會了如何對資料進行更加靈活和高效的處理。透過解決作業中的問題,我發現自己在程式設計邏輯和演算法思維方面有了一定的成長,能夠更加熟練地運用迴圈、條件語句等結構來解決問題。
在作業過程中,我遇到了一些挑戰,特別是在設計和最佳化演算法的過程中。透過查閱資料、向同學請教,我逐漸找到了解決問題的思路,並最終完成了作業。這一過程不僅提升了我的程式設計技能,還培養了我的耐心和解決問題的能力。同時,我也意識到在演算法設計和最佳化方面還有許多需要提升的地方,因此我計劃在接下來的學習中多加練習,深入理解資料結構和演算法,並思考如何將它們應用到實際問題中。
這次作業讓我更加深入地感受到了程式設計的樂趣和挑戰,同時也激發了我對程式設計的更大熱情。我期待在接下來的學習中,繼續挑戰更多的程式設計問題,不斷提升自己的程式設計技能,迎接更高階的程式設計挑戰。透過這次作業,我對程式設計有了更加清晰的認識,也明確了自己未來在程式設計學習上的方向和目標。
(3)第三次作業如下:
7-3 答題判題程式-3
分數 84
困難
作者 蔡軻
單位 南昌航空大學
設計實現答題程式,模擬一個小型的測試,以下粗體字顯示的是在答題判題程式-2基礎上增補或者修改的內容,要求輸入題目資訊、試卷資訊、答題資訊、學生資訊、刪除題目資訊,根據輸入題目資訊中的標準答案判斷答題的結果。
輸入格式:
程式輸入資訊分五種,資訊可能會打亂順序混合輸入。
1、題目資訊
題目資訊為獨行輸入,一行為一道題,多道題可分多行輸入。
格式:"#N:"+題目編號+" "+"#Q:"+題目內容+" "#A:"+標準答案
格式約束:
1、題目的輸入順序與題號不相關,不一定按題號順序從小到大輸入。
2、允許題目編號有缺失,例如:所有輸入的題號為1、2、5,缺少其中的3號題。此種情況視為正常。
樣例:#N:1 #Q:1+1= #A:2
#N:2 #Q:2+2= #A:4
2、試卷資訊
試卷資訊為獨行輸入,一行為一張試卷,多張卷可分多行輸入資料。
格式:"#T:"+試卷號+" "+題目編號+"-"+題目分值+" "+題目編號+"-"+題目分值+...
格式約束:
題目編號應與題目資訊中的編號對應。
一行資訊中可有多項題目編號與分值。
樣例:#T:1 3-5 4-8 5-2
3、學生資訊
學生資訊只輸入一行,一行中包括所有學生的資訊,每個學生的資訊包括學號和姓名,格式如下。
格式:"#X:"+學號+" "+姓名+"-"+學號+" "+姓名....+"-"+學號+" "+姓名
格式約束:
答案數量可以不等於試卷資訊中題目的數量,沒有答案的題目計0分,多餘的答案直接忽略,答案之間以英文空格分隔。
樣例:
#S:1 #A:5 #A:22
1是試卷號
5是1號試卷的順序第1題的題目答案
4、答卷資訊
答卷資訊按行輸入,每一行為一張答卷的答案,每組答案包含某個試卷資訊中的題目的解題答案,答案的順序號與試 卷資訊中的題目順序相對應。答卷中:
格式:"#S:"+試卷號+" "+學號+" "+"#A:"+試卷題目的順序號+"-"+答案內容+...
格式約束:
答案數量可以不等於試卷資訊中題目的數量,沒有答案的題目計0分,多餘的答案直接忽略,答案之間以英文空格分隔。
答案內容可以為空,即””。
答案內容中如果首尾有多餘的空格,應去除後再進行判斷。
樣例:
#T:1 1-5 3-2 2-5 6-9 4-10 7-3
#S:1 20201103 #A:2-5 #A:6-4
1是試卷號
20201103是學號
2-5中的2是試卷中順序號,5是試卷第2題的答案,即T中3-2的答案
6-4中的6是試卷中順序號,4是試卷第6題的答案,即T中7-3的答案
注意:不要混淆順序號與題號
5、刪除題目資訊
刪除題目資訊為獨行輸入,每一行為一條刪除資訊,多條刪除資訊可分多行輸入。該資訊用於刪除一道題目資訊,題目被刪除之後,引用該題目的試卷依然有效,但被刪除的題目將以0分計,同時在輸出答案時,題目內容與答案改為一條失效提示,例如:”the question 2 invalid~0”
格式:"#D:N-"+題目號
格式約束:
題目號與第一項”題目資訊”中的題號相對應,不是試卷中的題目順序號。
本題暫不考慮刪除的題號不存在的情況。
樣例:
#N:1 #Q:1+1= #A:2
#N:2 #Q:2+2= #A:4
#T:1 1-5 2-8
#X:20201103 Tom-20201104 Jack
#S:1 20201103 #A:1-5 #A:2-4
#D:N-2
end
輸出
alert: full score of test paper1 is not 100 points
1+1=5false
the question 2 invalid~0
20201103 Tom: 0 0~0
答題資訊以一行"end"標記結束,"end"之後的資訊忽略。
輸出格式:
1、試卷總分警示
該部分僅當一張試卷的總分分值不等於100分時作提示之用,試卷依然屬於正常試卷,可用於後面的答題。如果總分等於100 分,該部分忽略,不輸出。
格式:"alert: full score of test paper"+試卷號+" is not 100 points"
樣例:alert: full score of test paper2 is not 100 points
2、答卷資訊
一行為一道題的答題資訊,根據試卷的題目的數量輸出多行資料。
格式:題目內容+""+答案++""+判題結果(true/false)
約束:如果輸入的答案資訊少於試卷的題目數量,每一個缺失答案的題目都要輸出"answer is null" 。
樣例:
3+2=5true
4+6=22false.
answer is null
3、判分資訊
判分資訊為一行資料,是一條答題記錄所對應試卷的每道小題的計分以及總分,計分輸出的先後順序與題目題號相對應。
格式:學號+" "+姓名+": "+題目得分+" "+....+題目得分+"~"+總分
格式約束:
1、沒有輸入答案的題目、被刪除的題目、答案錯誤的題目計0分
2、判題資訊的順序與輸入答題資訊中的順序相同
樣例:20201103 Tom: 0 0~0
根據輸入的答卷的數量以上2、3項答卷資訊與判分資訊將重複輸出。
4、被刪除的題目提示資訊
當某題目被試卷引用,同時被刪除時,答案中輸出提示資訊。樣例見第5種輸入資訊“刪除題目資訊”。
5、題目引用錯誤提示資訊
試卷錯誤地引用了一道不存在題號的試題,在輸出學生答案時,提示”non-existent question~”加答案。例如:
輸入:
#N:1 #Q:1+1= #A:2
#T:1 3-8
#X:20201103 Tom-20201104 Jack-20201105 Www
#S:1 20201103 #A:1-4
end
輸出:
alert: full score of test paper1 is not 100 points
non-existent question~0
20201103 Tom: 0~0
如果答案輸出時,一道題目同時出現答案不存在、引用錯誤題號、題目被刪除,只提示一種資訊,答案不存在的優先順序最高,例如:
輸入:
#N:1 #Q:1+1= #A:2
#T:1 3-8
#X:20201103 Tom-20201104 Jack-20201105 Www
#S:1 20201103
end
輸出:
alert: full score of test paper1 is not 100 points
answer is null
20201103 Tom: 0~0
6、格式錯誤提示資訊
輸入資訊只要不符合格式要求,均輸出”wrong format:”+資訊內容。
例如:wrong format:2 #Q:2+2= #4
7、試卷號引用錯誤提示輸出
如果答卷資訊中試卷的編號找不到,則輸出”the test paper number does not exist”,答卷中的答案不用輸出,參見樣例8。
8、學號引用錯誤提示資訊
如果答卷中的學號資訊不在學生列表中,答案照常輸出,判分時提示錯誤。參見樣例9。
本題暫不考慮出現多張答卷的資訊的情況。
題目分析以及類圖製作
image
程式碼如下

點選檢視程式碼

import java.util.ArrayList;
import java.util.List;
import java.util.Scanner;
class Question {
    private int number;
    private String content;
    private String standardAnswer;
    public Question(int number, String content, String standardAnswer) {
        this.setNumber(number);
        this.setContent(content);
        this.setStandardAnswer(standardAnswer);
    }
	public String getStandardAnswer() {
		return standardAnswer;
	}
	public void setStandardAnswer(String standardAnswer2) {
		this.standardAnswer = standardAnswer2;
	}
	public int getNumber() {
		return number;
	}
	public void setNumber(int number) {
		this.number = number;
	}
	public String getContent() {
		return content;
	}
	public void setContent(String content) {
		this.content = content;
	}
	@Override
	public String toString() {
		if(this.content.startsWith("exi")) {
			return "non-existent question~0";
		}	
		else if(this.content.startsWith("the")) {
			return "the question "+this.number+" invalid~0";
		}
		else
		return content + "~";
	}
}
class Questionscore{
    private int questionnumber;
    private int score;
	public Questionscore(int questionnumber,int score) {
	this.setQuestionnumber(questionnumber);
	this.setScore(score);
	}
	public int getQuestionnumber() {
		return questionnumber;
	}
	public void setQuestionnumber(int questionnumber) {
		this.questionnumber = questionnumber;
	}
	public int getScore() {
		return score;
	}
	public void setScore(int score) {
		this.score = score;
	}
}
class TestPaper {
    private int number;
    private ArrayList<Questionscore> questionscorelist;
	public TestPaper(int number) {
		this.setNumber(number);
        this.questionscorelist = new ArrayList<>();
	}
    public void saveQuestionscore(int questionnumber,int score) {
        Questionscore questionscore = new Questionscore( questionnumber, score);
        questionscorelist.add(questionscore);
    }
	public int getNumber() {
		return number;
	}
	public void setNumber(int number) {
		this.number = number;
	}
	public void  print() {
		int a=0;
		for(int x=0;x<questionscorelist.size();x++) {
			a=a+questionscorelist.get(x).getScore();
		}
		if(a!=100&&this.number!=0)
	System.out.println("alert: full score of test paper"+this.number+" is not 100 points");
	}
	public int getquestionscorelistlength() {
		return questionscorelist.size();
	}
	public Questionscore getScore(int x) {
		return questionscorelist.get(x);
	}
}
class Studentanswer{
	private int number;
	private String answer;
	private int gainscore;
	public Studentanswer(int number,String answer) {
		this.setNumber(number);
		this.setAnswer(answer);
		this.setGainscore(0);
	}
	public int getNumber() {
		return number;
	}
	public void setNumber(int number) {
		this.number = number;
	}
	public String getAnswer() {
		return answer;
	}
	public void setAnswer(String answer) {
		this.answer = answer;
	}
	public int getGainscore() {
		return gainscore;
	}
	public void setGainscore(int gainscore) {
		this.gainscore = gainscore;
	}	
}
class AnswerSheet {
	private int number;
	private String studentId;
    private ArrayList<Studentanswer> studentanswerlist;
    private ArrayList<Question> questionlist = new ArrayList<>();
    private ArrayList<Student> studentlist = new ArrayList<>();
    private TestPaper testpaper=new TestPaper(0); 
    public AnswerSheet() {
    	
    }
	public AnswerSheet(int number,String studenttID,ArrayList<Question> questionlist,ArrayList<Student> studentlist,TestPaper testpaper) {
	this.setNumber(number);
	this.setStudentId(studenttID);
    this.studentanswerlist = new ArrayList<>();
    this.questionlist = questionlist;
    this.studentlist = studentlist;
    this.testpaper = testpaper;
	}
    public void saveStudentanswer(int number,String answer) {
    	Studentanswer studentanswer= new Studentanswer( number, answer);
    	studentanswerlist.add(studentanswer);
    }
	public int getNumber() {
		return number;
	}
	public void setNumber(int number) {
		this.number = number;
	}
	public String getStudentId() {
		return studentId;
	}
	public void setStudentId(String studentId) {
		this.studentId = studentId;
	}
	public int allscore() {
		int a=0;
		for(int x = 0;x<studentanswerlist.size();x++) {
			a = a+studentanswerlist.get(x).getGainscore();
		}
		return a;
	}
	public void printcontent() {	
		if(this.number == testpaper.getNumber()) {
		for(int i=0;i<testpaper.getquestionscorelistlength();i++) {
			int m = 0;
			int n=0;
            int p=0;
			for(int x=0;x<studentanswerlist.size();x++) {
				if(studentanswerlist.get(x).getNumber()==i+1) {
					for(int y = 0;y<questionlist.size();y++) {
						if(testpaper.getScore(i).getQuestionnumber()==questionlist.get(y).getNumber()) {
							if(questionlist.get(y).getContent().startsWith("the")||questionlist.get(y).getContent().startsWith("exi")) {
								System.out.println(questionlist.get(y).toString());
                                p=1;
								continue;
								}
							if(studentanswerlist.get(x).getAnswer().equals(questionlist.get(y).getStandardAnswer())) {
								studentanswerlist.get(x).setGainscore(testpaper.getScore(x).getScore());
								System.out.println(questionlist.get(y).toString()+studentanswerlist.get(x).getAnswer()+"~"+true);
								}
							else
								System.out.println(questionlist.get(y).toString()+studentanswerlist.get(x).getAnswer()+"~"+false);
                              p=1;
						}
					}
                    if(p==0)
                System.out.println("non-existent question~0");
					m=1;
				}			
			}
			if(m==0) {
//				for(int y = 0;y<questionlist.size();y++) {
//					if(testpaper.getScore(i).getQuestionnumber()==questionlist.get(y).getNumber()) {
//						System.out.println("answer is null");
//						n=1;
//					}
//				}	
//			if(n==0)
				System.out.println("answer is null");	
			}
		}
	}
	}
	public void printscore() {
		if(this.number == testpaper.getNumber()) {
			int a=0;
		for(int x = 0;x<studentlist.size();x++) {
			if(this.studentId.equals(studentlist.get(x).getStudentId())) {
				System.out.print(studentlist.get(x).toString());
				a=1;
			}
			}
		if(a==1) {
		for(int i=0;i<testpaper.getquestionscorelistlength();i++) {
			int m = 0;
			for(int x=0;x<studentanswerlist.size();x++) {
				if(studentanswerlist.get(x).getNumber()==i+1) {
			if(i==testpaper.getquestionscorelistlength()-1)
				System.out.print(studentanswerlist.get(x).getGainscore()+"~");
			else
				System.out.print(studentanswerlist.get(x).getGainscore()+" ");			
		    m=1;
        }
			}
            if(m==0){
            if(i==testpaper.getquestionscorelistlength()-1)
				System.out.print("0~");
			else
				System.out.print("0 ");
            }
		}
	System.out.print(this.allscore());
	}
		else if(this.studentId!=null)
			System.out.print(this.studentId+" not found");
		}
		else
			System.out.print("The test paper number does not exist");
			
	}
	public void deletequestion(int number,Question question) {
		for(int x=0;x<questionlist.size();x++) {
			if(number==questionlist.get(x).getNumber()) {
				 questionlist.remove(x);
				questionlist.add(question);
				}
		}
	}
	public void check() {
		for(int x = 0;x<questionlist.size();x++) {
			int a=0;
			int b=questionlist.get(x).getNumber();
			for(int y = 0;y<testpaper.getquestionscorelistlength();y++) {
				if(questionlist.get(x).getNumber()==testpaper.getScore(y).getQuestionnumber())
					a=1;
			}
			if(a==0) {
				
				Question question = new Question(b,"exi","0");
				this.deletequestion(b, question);
			}
		}
	}
}
class Student{
	private String studentId;
	private String name;
	public Student(String studentId,String name) {
		this.setStudentId(studentId);
		this.setName(name);

	}
	public String getStudentId() {
		return studentId;
	}
	public void setStudentId(String studentId) {
		this.studentId = studentId;
	}
	public String getName() {
		return name;
	}
	public void setName(String name) {
		this.name = name;
	}
	public String toString() {
		return studentId+" "+name+": ";
	}
		
}
public class Main {
    public static void main(String[] args) {
        Scanner scanner = new Scanner(System.in);
        ArrayList<Question> questionlist = new ArrayList<>();
        ArrayList<Student> studentlist = new ArrayList<>();
        TestPaper testpaper = new TestPaper(0) ;
        AnswerSheet answersheet = new AnswerSheet();
        String input;
        int question2 =0;
        int question1=1;
        for(int x=0;;x++) {
        	input = scanner.nextLine();
        	if(input.startsWith("#N:")) {
        	if(question2==0) {
       String[] questionInfo = input.split("N:|#Q:|#A:");
       if(questionInfo.length!=4) {
    	   Question question = new Question(question1,"exi","0");
           questionlist.add(question);   
    	   System.out.println("wrong format:"+input); 
    	   continue;
       }
       int number = Integer.parseInt(questionInfo[1].trim());
      String content = questionInfo[2].trim();
      String standardAnswer = questionInfo[3].trim();
      Question question = new Question(number,content,standardAnswer);
       questionlist.add(question);
       question1=question1+1;
        	}
        	}
        else if(input.startsWith("#T:")) {
   	   String[] testInfo = input.split(":| |-");
   	   testpaper = new TestPaper(Integer.parseInt(testInfo[1].trim()));
   	for(int y = 2;y<testInfo.length;y=y+2){
   	   testpaper.saveQuestionscore(Integer.parseInt(testInfo[y].trim()), Integer.parseInt(testInfo[y+1].trim()));
   	}
   	question2=1;
   	}
        else if(input.startsWith("#X:")) {
        String[] studentInfo = 	input.split(":| |-");
     for(int y = 1;y<studentInfo.length;y=y+2){
    	 Student student = new Student(studentInfo[y].trim(),studentInfo[y+1].trim());
        studentlist.add(student);
        	}       		
        	}
        else if(input.startsWith("#S:")) {
       	String[] answersheetInfo = 	input.split(":| |-");
       	answersheet = new AnswerSheet(Integer.parseInt(answersheetInfo[1].trim()),answersheetInfo[2].trim(),questionlist,studentlist,testpaper);
     for(int y = 4;y<answersheetInfo.length;y=y+3){
        answersheet.saveStudentanswer(Integer.parseInt(answersheetInfo[y].trim()),answersheetInfo[y+1].trim());
           	}
        	}
        else if(input.startsWith("#D:")) {
     	String[] deleteInfo = input.split("-");	
     	int number = Integer.parseInt(deleteInfo[1].trim());
     	Question question = new Question(number,"the","0");
     	answersheet.deletequestion(number, question);
        	}
        else if(input.startsWith("end"))
        		break;
            else
                System.out.println("wrong format:"+input);
        }
      answersheet.check();  
     testpaper.print();
     answersheet.printcontent();
     answersheet.printscore();
    }
}

PTA測試點
image
心得與學習體會
對與本題,我發現了前面兩題的程式碼的重大錯誤,方法的缺乏導致了main函式的過於冗長,同時也發現了第二題之所以沒有拿下大多測試點的原因在於對題目的理解不到位,所以在本題當中我減少了main函式的長度
增加了多個類,從而達到了簡化的效果,但我仍明白對於大多數的部分我仍沒有處理到位,在往後的學習中我會不斷再修改程式碼,從而增強程式碼的可讀性。
這次完成作業的同時,也激勵了我對程式設計的熱趣,希望在日後的學習中能不斷學習與進步

三.學習大總結

在學習Java程式設計的過程中,我獲益良多。Java作為一門廣泛使用的程式語言,其靈活性和強大的功能使得它成為了我進入程式設計世界的理想選擇。透過學習Java,我掌握了物件導向程式設計(OOP)的基本概念和實踐技能,這使得我能夠更好地組織和管理程式碼,提高了程式碼的可重用性和可維護性。

在學習的過程中,我深入瞭解並掌握了Java語言的基本語法、資料結構、異常處理、多執行緒程式設計和網路程式設計等方面的知識。透過編寫各種不同型別的專案,我對Java語言的應用有了更加深入的瞭解,同時也提高了我的問題解決能力和演算法設計能力。

在學習過程中也遇到了一些困難,特別是在理解和運用一些高階特性和設計模式時。然而,透過堅持不懈地學習和不斷實踐,我成功地克服了這些障礙,並積累了寶貴的經驗。此外,我也逐漸意識到程式設計不僅僅是編寫程式碼,更重要的是如何設計出高效、可靠且易於維護的程式,這需要在實際專案中不斷實踐和總結經驗。

總的來說,學習Java程式設計讓我受益匪淺。我不僅掌握了一門流行的程式語言,也鍛鍊了自己的邏輯思維和問題解決能力。我對未來在軟體開發領域的職業發展充滿信心,期待能夠運用所學知識,創造出更多有價值的程式和解決方案。同時,我也意識到程式設計是一個持續學習和不斷進步的過程,我將繼續努力學習,不斷提升自己的程式設計技能,迎接未來的挑戰。

相關文章