OO第一次部落格作業

_cautious發表於2024-04-21

OO第一次部落格作業

對於Java

目前覺得學的很吃力,比上個學期的C語言難很多,沒有那麼淺顯,必須得下苦功夫,一開始沒聽懂,後來也沒有抓緊跟上.

個人體會:

類和物件:

1,類就像是struct,創造一個群體,物件就是這個群體裡命名的一個角色,它擁有這裡的屬性和行為.

2,類(Class)是物件的藍圖或模板,它定義了物件的屬性和方法。而物件(Object)則是根據類建立的例項。

3,類的定義包括:

屬性(Fields):也稱為成員變數,用於儲存物件的狀態資訊。

方法(Methods):定義了物件可以執行的操作。

建構函式(Constructors):特殊的方法,用於初始化物件的狀態。

巢狀類(Nested Classes):在類內部定義的類。

Java的語法:

1,三個特性:封裝,繼承,多型

2,public和private

3,get和set方法

前言

第一次題目集:

知識點:

1,考核類設計及類間關係設計

2,用正規表示式來做字串操作

題目量:

較少,相對於之後兩次大作業

難度:

較簡單

第二次題目集:

知識點:

1,是第一次大作業增加了多種情況的結果,大體知識點一樣

2,學會用動態陣列或者雜湊表儲存資料

題目量:

中等

難度:

中等

第三次題目集:

知識點:

1,多張試卷、多張答卷的資訊處理,

新增:學生資訊、刪除題目資訊以及多種異常輸入的監測,如答案為空字元、僅有學生資訊沒有答案內容的空白卷、試卷引用、試題引用錯誤等。

2,增加了更多類,依然要用正規表示式.

題目量:

較多

難度:

較大,比較麻煩,但是我幾乎無從下手

設計與分析

我的第二次大作業和第三次大作業最後一題都沒得分,我分析不出什麼情況,我就是無從下手,不知道怎麼佈局,從哪開始寫起.

第一次大作業:

我的程式碼之過了四個測試點,用IDEA生成的類圖

OO第一次部落格作業

類之間簡化的關係圖:

+----------------+ +----------------+ +---------------+

| Question | | ExamPaper | | AnswerSheet |

+----------------+ +----------------+ +---------------+

| - number |<---->| - questions | | - answers |

| - content | | | | - examPaper |

| - standardAnswer| | | +---------------+

+----------------+ +----------------+

^ |

| |

v v

+----------------+ +---------------+

| Main | | java.util |

+----------------+ | Scanner |

| - examPaper | +---------------+

| - answerSheet |

+----------------+

原始碼:

import java.util.ArrayList;

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 checkAnswer(String answer) {

return answer.equals(standardAnswer);

}

public String getContent() {

return content;

}

}

class ExamPaper {

private ArrayList<Question> questions = new ArrayList<>();

public void addQuestion(int number, String content, String standardAnswer) {

Question question = new Question(number, content, standardAnswer);

questions.add(question);

}

public Question getQuestion(int number) {

return questions.get(number - 1);

}

}

class AnswerSheet {

private ExamPaper examPaper;

private ArrayList<String> answers = new ArrayList<>();

public AnswerSheet(ExamPaper examPaper) {

this.examPaper = examPaper;

}

public void addAnswer(String answer) {

answers.add(answer);

}

public void gradeAnswers() {

for (int i = 0; i < answers.size(); i++) {

Question question = examPaper.getQuestion(i + 1);

boolean result = question.checkAnswer(answers.get(i));

System.out.println(question.getContent() + "~" + answers.get(i));

System.out.println(result ? "true" : "false");

}

}

}

public class Main {

public static void main(String[] args) {

Scanner scanner = new Scanner(System.in);

int numQuestions = Integer.parseInt(scanner.nextLine());

ExamPaper examPaper = new ExamPaper();

for (int i = 0; i < numQuestions; i++) {

String line = scanner.nextLine();

String[] parts = line.split("#N:| #Q:| #A:");

int number = Integer.parseInt(parts[1].trim());

String content = parts[2].trim();

String answer = parts[3].trim();

examPaper.addQuestion(number, content, answer);

}

AnswerSheet answerSheet = new AnswerSheet(examPaper);

while (true) {

String answerLine = scanner.nextLine();

if (answerLine.equals("end")) {

break;

}

String answer = answerLine.split("#A:")[1].trim();

answerSheet.addAnswer(answer);

}

answerSheet.gradeAnswers();

scanner.close();

}

}

在這裡我分了題目類,試卷類,答卷類,還有主類,然後判斷輸入和輸出.用了正規表示式來匹配尋找.

第二次大作業:

這次加了一些情況,並且要用雜湊表來儲存陣列,我一開始想用雜湊表,但用不來,最後,然後又去看動態陣列,也是不會,最終就做不出來.

原始碼:

import java.util.*;

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 checkAnswer(String answer) {

return answer.equals(standardAnswer);

}

public String getContent() {

return content;

}

public int getNumber() {

return number;

}

}

class TestPaper {

private Map<Integer, Question> questions = new HashMap<>();

private Map<Integer, List<TestScore>> scores = new HashMap<>();

private int totalScore;

public void addQuestion(Question question) {

questions.put(question.getNumber(), question);

}

public void addScore(int testNumber, int questionNumber, int score) {

if (!scores.containsKey(testNumber)) {

scores.put(testNumber, new ArrayList<>());

}

TestScore testScore = new TestScore(questionNumber, score);

scores.get(testNumber).add(testScore);

totalScore += score;

}

public boolean checkAnswer(int testNumber, int questionNumber, String answer) {

Question question = questions.get(questionNumber);

if (question != null) {

return question.checkAnswer(answer);

}

return false;

}

public void printAlertIfNecessary() {

if (totalScore != 100) {

System.out.println("alert: full score of test paper" + scores.keySet().iterator().next() + " is not 100 points");

}

}

public void printAnswersAndScores(int testNumber) {

List<TestScore> testScores = scores.get(testNumber);

if (testScores == null) {

System.out.println("The test paper number does not exist");

return;

}

StringBuilder sb = new StringBuilder();

for (TestScore ts : testScores) {

System.out.println(questions.get(ts.getQuestionNumber()).getContent() + "~" + ts.getAnswer() + "~" + ts.isCorrect());

sb.append(ts.getScore()).append(" ");

}

System.out.println(sb.toString() + "~" + totalScore);

}

}

class TestScore {

private int questionNumber;

private String answer;

private int score;

private boolean correct;

public TestScore(int questionNumber, String answer, int score) {

this.questionNumber = questionNumber;

this.answer = answer;

this.score = score;

this.correct = true; // Assume correct until checked

}

public TestScore(int questionNumber, int score) {

this(questionNumber, "answer is null", score);

}

public String getAnswer() {

return answer;

}

public int getScore() {

return score;

}

public int getQuestionNumber() {

return questionNumber;

}

public boolean isCorrect() {

return correct;

}

public void setCorrect(boolean correct) {

this.correct = correct;

}

}

public class Main {

public static void main(String[] args) {

Scanner scanner = new Scanner(System.in);

Map<Integer, TestPaper> testPapers = new HashMap<>();

int currentTestNumber = -1;

TestPaper currentTestPaper = null;

while (scanner.hasNextLine()) {

String line = scanner.nextLine().trim();

if (line.equals("end")) {

break;

}

switch (line.substring(0, 2)) {

case "#N":

String[] parts = line.split(" ");

int number = Integer.parseInt(parts[0].substring(2));

String content = parts[1].substring(3);

String answer = parts[2].substring(3);

Question question = new Question(number, content, answer);

currentTestPaper.addQuestion(question);

break;

case "#T":

parts = line.split(" ");

String[] scores = parts[1].split("-");

currentTestNumber = Integer.parseInt(parts[0].substring(2));

currentTestPaper = new TestPaper();

for (String score : scores) {

String[] scoreParts = score.split("-");

int questionNumber = Integer.parseInt(scoreParts[0]);

int scoreValue = Integer.parseInt(scoreParts[1]);

currentTestPaper.addScore(currentTestNumber, questionNumber, scoreValue);

}

testPapers.put(currentTestNumber, currentTestPaper);

currentTestPaper.printAlertIfNecessary();

break;

case "#S":

parts = line.split(" ");

currentTestNumber = Integer.parseInt(parts[0].substring(2));

currentTestPaper = testPapers.get(currentTestNumber);

String[] answers = parts[1].substring(3).split(" ");

int answerIndex = 0;

for (TestScore ts : currentTestPaper.scores.get(currentTestNumber)) {

if (answerIndex < answers.length) {

String studentAnswer = answers[answerIndex];

boolean correct = currentTestPaper.checkAnswer(currentTestNumber, ts.getQuestionNumber(), studentAnswer);

ts.setCorrect(correct);

answerIndex++;

} else {

ts.setCorrect(false); // No answer for this question

}

}

break;

default:

System.out.println("Invalid input format");

break;

}

}

scanner.close();

// Print the answers and scores

for (TestPaper testPaper : testPapers.values()) {

testPaper.printAnswersAndScores(currentTestNumber);

}

}

}

我定義了三個類:Question、TestPaper和TestScore。Question類用於儲存題目資訊,TestPaper類用於儲存題目、分數以及答案的檢查和列印,TestScore類用於儲存題目的得分資訊。

主類Main使用Scanner來讀取輸入,並根據輸入的型別建立相應的Question和TestPaper物件。當讀取到答卷資訊時,它會檢查答案並設定TestScore物件的correct屬性。最後,對於每個TestPaper物件,程式會列印出題目內容、答案、判題結果和得分資訊。

Main類是程式的入口點,它使用Scanner來讀取使用者輸入。程式的執行流程如下:

初始化一個Scanner物件來讀取輸入。

建立一個HashMap來儲存不同試卷的TestPaper物件。

使用while迴圈來連續讀取輸入,直到讀取到"end"標記。

根據輸入的前兩個字元(識別符號),決定如何處理當前行的輸入:

題目資訊(#N):解析題目編號、內容和標準答案,建立Question物件,並新增到當前TestPaper中。

試卷資訊(#T):解析試卷號和題目的分值,初始化一個新的TestPaper物件,並將其儲存到testPapers對映中。

答卷資訊(#S):解析答卷的試卷號,獲取對應的TestPaper物件。然後讀取答案,並更新TestScore物件的correct屬性。

在讀取完所有輸入後,關閉Scanner物件。

遍歷testPapers對映中的所有TestPaper物件,並呼叫它們的printAnswersAndScores方法來列印每個題目的答案和得分資訊。

第三次大作業:

增加了更多的情況,要設計更多的類,涉及的類

題目類(Question):用於儲存一道題目的資訊以及處理的方法。(與系列 1 相同,無變化)

private int num;// 題號

private String content, // 題目內容

standardAnswer;// 標準答案

boolean matchingStandardAnswers(String answer):判斷是否符合標準答案

(新增)boolean isValid=true;//是否是有效的題目

(新增)void disabled() //當題目被刪除,設定題目為失效狀態

(新增)ArrayList<Answer> answers //記錄所有引用了該題目的答案

試卷題目類(

Question_Paper):用於儲存試卷中的題目資訊。由於試卷中的題目序號與題

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

int p_q_num;//試卷中題目的順序號

Question question;//題目類的物件,儲存題目資訊

int question_score;// 題目分值

int judge_markAnswer(String answer) // 判斷題目得分

試卷類(

TestPaper):儲存和處理一張試卷的資訊以及處理的方法,

int questionNum;// 題目數量

HashMap<String, Question_Paper> questions;//題目清單

void inputQuestion(int num, Question question):新增一道題目

void printQuestions():輸出題目的內容~標準答案

boolean markQuestion(int num, String answer):判斷第 num 題的正確性。

int sum-儲存總分

int questionQuantity-儲存題目數量

int getSum():獲得總分

答案類(

Answer):用於儲存答卷中一道答案的資訊。

Question_Paper question;

String answer;

boolean mark;// 每一題的正確性

int score=0;// 每一題的得分

void calScore()//計算得分

(新增)void disable() //答案對應的題目失效,判分為 0

答卷類(

AnswerPaper):儲存和處理一張答卷的資訊以及處理的方法

TestPaper paper;//試卷資訊

String[] answers;//每一題的答案資訊boolean[] marks;//每一題的判題結果(對/錯)

void printQ_A(int num):輸出第 num 題的題目和答案(卷面答案,非標準答案)

boolean getJudge(int num):獲得第 num 題的判題結果

void printJudges() :// 輸出所有的得分以及總分,以空格分隔

(新增)String stuNum;// 學號

(新增)void printErrorNumQuestion(Answer answer) // 輸出試卷中錯誤題目

號的題目

(新增)void printInvalidQuestion(Answer answer)// 輸出失效題目資訊

學生類(

Student)(新增):儲存學生的資訊

String stuNum, stuName;因為我不會,我只能參考了.

428e452c4e761ae248714f1f003c76c

踩坑心得:

第一次的大作業:

我的作答實現了題目要求的功能,但存在一些問題.

題目類(Question): 實現正確,封裝了題目的編號、內容和標準答案,並且提供了檢查答案的方法。

試卷類(ExamPaper): 我的程式碼中,addQuestion 方法正確地將題目新增到了列表中。但是,getQuestion 方法存在問題。題目的輸入順序與題號不相關,因此不能簡單地透過 number - 1 來獲取題目。我應該使用一個 HashMap 或 TreeMap 來儲存題目,以確保可以根據題號快速檢索。

答卷類(AnswerSheet): 類的實現基本正確,但是缺少了儲存判題結果的功能。最好新增一個 ArrayList<Boolean> 來儲存每個答案的判題結果,並在 gradeAnswers 方法中填充這個列表。

主類(Main): 主類中,讀取了題目數量並建立了 ExamPaper 例項。但是,題目內容的解析方式需要改進,因為 split 方法中的正規表示式分割符需要用雙豎線 || 而不是管道 |。此外,addAnswer 方法在 AnswerSheet 類中正確地新增了答案。

判題和輸出: 在 gradeAnswers 方法中,需要先檢查 examPaper.getQuestion(i + 1) 是否返回了 null,如果是,則不能進行判題。另外,輸出格式需要調整,以符合題目要求的輸出樣例。

第二次大作業:

發現一個問題,程式碼中,TestPaper類中的questions對映用於儲存題目資訊。但是,因為題目的輸入順序與題號不相關,可能存在題目編號的缺失,需要對映能夠根據題目編號快速檢索對應的Question物件。

第三次大作業:不怎麼會寫.

改進建議,總結

1,要自己趕上進度,不會的要抓緊自學,碰到一個大的題目無從下手,可以試著拆分,或者再練幾個小型的綜合設計類題.

2,學會了Java大的基本的一些知識框架,但正則還是一點點

3,要再補上一些知識點

4,對教學的建議:不是很習慣這個上課模式,散,雜,學的感覺不實.

5,我現在進度落後有點大,現在開始趕.

相關文章