OOP 1~3總結

曼Myyy發表於2024-04-21

oop 1~3總結

前言

  • 知識點
    1.類的基本運用、類與物件的運用、類與陣列的運用、關聯類的使用

    2.介面的初步瞭解與運用
    3.日期類的使用

    這三次作業的最後一題涉及到的知識點比較多,綜合性很強。宏觀上重點考察的是我們對物件導向技術的整體把握,對程式設計原則的理解與使用,同時在細節上也考察了我們對java語法的掌握。例如:用正規表示式處理輸入語句的格式、用陣列、列表或Map對資料進行儲存、用split()函式分割字串等等。在完成作業時,由於題目每次都進行迭代,一次比一次難,涉及到的知識點也一次比一次多。

  • 題量

    整體的題量不算多,但是質量很高,每道題目的側重點都稍有不同。若能認真完成作業上的題目,將每道題都理解透徹,就會對個人能力的提升有極大的幫助。

  • 難度
    對我個人而言,最後一題的難度是非常的大。不僅題幹長難以理解,並且要有宏觀的設計能力,要將不同的類之間的關係理清晰。但是我的基礎比較差,有很多基礎的語法我還沒有搞清楚。再加上這個題目是老師原創的,之前沒有見過類似的,我覺得比較抽象,也增加了題目的難度,完成起來很是困難。

設計與分析

第一次作業 答題判題程式-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

2

3

4

5

類圖:

原始碼如下:

import java.util.Scanner;

class Question {
    int questionNumber;
    String questionContent;
    String standardAnswer;

    public Question() {
    }

    public Question(int questionNumber, String questionContent, String standardAnswer) {
        this.questionNumber = questionNumber;
        this.questionContent = questionContent;
        this.standardAnswer = standardAnswer;
    }

    public void setQuestionContent(String questionContent) {
        this.questionContent = questionContent;
    }

    public String getQuestionContent() {
        return questionContent;
    }
}

class Paper {
    Question[] questions;
    String[] standardAnswers;

    public Paper(int numQuestions) {
        questions = new Question[numQuestions];
        standardAnswers = new String[numQuestions];
    }

    public void addQuestion(Question question, int index) {
        questions[index] = question;
    }

    public void setStandardAnswer(String standardAnswer, int index) {
        standardAnswers[index] = standardAnswer;
    }

    public boolean isCorrectAnswer(AnswerSheet answerSheet, int index) {
        return standardAnswers[index].equals(answerSheet.getAnswer(index));
    }

    public Question getQuestion(int index) {
        return questions[index];
    }
}

class AnswerSheet {
    String[] answers;

    public AnswerSheet(int numQuestions) {
        answers = new String[numQuestions];
    }

    public void setAnswer(String answer, int index) {
        answers[index] = answer;
    }

    public String getAnswer(int index) {
        return answers[index];
    }
}

public class Main {
    public static void main(String[] args) {
        Scanner input = new Scanner(System.in);
        int n = input.nextInt();
        input.nextLine(); // Consume newline
        Paper paper = new Paper(n);
        AnswerSheet answerSheet = new AnswerSheet(n);

        for (int i = 0; i < n; i++) {
            String line = input.nextLine();
            String[] input1 = line.split(" *#N: *| *#A: *| *#Q: *");
            int num1 = Integer.parseInt(input1[1]) - 1;
            String content1 = input1[2];
            String standardAnswer1 = input1[3];
            Question question= new Question(num1, content1, standardAnswer1);
            paper.addQuestion(question, question.questionNumber);
            paper.setStandardAnswer(question.standardAnswer, question.questionNumber);
        }

        String answerInput = input.nextLine();
        String[] answers = answerInput.split(" *#A: *");

        for (int i = 0; i < n; i++) {
            answerSheet.setAnswer(answers[i + 1], i);
        }

        for (int i = 0; i < n; i++) {
            System.out.println(paper.getQuestion(i).getQuestionContent() + "~" + answerSheet.getAnswer(i));
        }

        for (int i = 0; i < n; i++) {
            if (i == n - 1) {
                System.out.print(paper.isCorrectAnswer(answerSheet, i));
            } else {
                System.out.print(paper.isCorrectAnswer(answerSheet, i) + " ");
            }
        }
    }

}

設計思路:

這道題目我是在老師給出來的設計建議上進行的類設計,分別設計了Question、Paper、和AnswerSheet類。

  • Question類表示一個題目,包含題號、題目內容和標準答案。這個類提供了帶引數的建構函式用於初始化題目物件,以及 getter 和 setter 方法來獲取和設定題目內容。
  • Paper類用於表示整張試卷,包含了題目陣列和標準答案陣列。建構函式接受題目數量作為引數,初始化題目和標準答案陣列。addQuestion()方法接收Question類的物件和其在陣列中的索引位置用來向試卷中新增題目;setStandardAnswer()方法接收傳入的標準答案和索引位置用來向試卷中新增標準答案;isCorrectAnswer() 方法用於判斷學生的答案是否正確。getQuestion() 方法來獲取試卷中的某個題目。
  • AnswerSheet類用於表示學生的答題卡,包含了學生的答案陣列。建構函式接收題目數量作為引數,初始化答案陣列。並且提供了setter和getter方法來獲取和設定學生的答案。
  • Main類包含了 首先從使用者輸入讀取題目數量 n,然後建立試卷物件和答題卡物件。接著透過迴圈讀取使用者輸入的每道題目的資訊,解析後將題目新增到試卷物件中,並設定標準答案。讀取學生的答案輸入後,將學生的答案設定到答題卡物件中。最後迴圈輸出每個題目及對應的學生答案,以及判斷每個學生答案是否正確。

心得:

第一次的作業在第一時間看到的時候很是驚訝,理解能力較差的我連題目都讀不懂,不知道想讓我幹什麼,寫的東西也是一團亂麻,最後截止的時候也沒得到多少分。但是當我現在來總結時,將這道題目重新做了一遍,比較容易就寫出來了並且得到了滿分(我可太開心了嘻嘻)。但是還有需要修改的地方,可以讓程式更加健壯,這部分後面會講到。

第二次作業 答題判題程式-2

以下粗體字顯示的是在答題判題程式-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 points"

樣例:alert: full score of test paper2 is not 100 points

2、答卷資訊

一行為一道題的答題資訊,根據試卷的題目的數量輸出多行資料。

格式:題目內容+""+答案++""+判題結果(true/false)

約束:如果輸入的答案資訊少於試卷的題目數量,答案的題目要輸"answer is null"

樣例:3+2=5true

 **4+6=~22~false.**
      answer is null

3、判分資訊

判分資訊為一行資料,是一條答題記錄所對應試卷的每道小題的計分以及總分,計分輸出的先後順序與題目題號相對應。

格式:題目得分+" "+....+題目得分+"~"+總分

格式約束:

 1、沒有輸入答案的題目計0分

 2、判題資訊的順序與輸入答題資訊中的順序相同

樣例:5 8 0~13

根據輸入的答卷的數量以上2、3項答卷資訊與判分資訊將重複輸出。

4、提示錯誤的試卷號

如果答案資訊中試卷的編號找不到,則輸出”the test paper number does not exist”。

222

333

444

555

666

777

原始碼如下:

試卷題目類(****Question_Paper 新增****):用於儲存試卷中的題目資訊。由於試卷中的題目序

號與題目本身的題號不一致。且題目在不同試卷中的分值可能不一樣,因此,設計試卷題目

類。

踩坑心得

  1. 一開始在寫第一題時,我心情比較焦慮,越是焦慮就越是寫不出來,反而焦慮之感又增多,對做出來這道題目毫無幫助。用的方法總是報錯說陣列越界,但是到最後我也沒找出來原因。這次在重新做的時候冷靜了許多,思路也更加的清晰了。所以面對難題心態一定不能崩掉噢~

改進建議

總結