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生成的類圖
類之間簡化的關係圖:
+----------------+ +----------------+ +---------------+
| 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;因為我不會,我只能參考了.
踩坑心得:
第一次的大作業:
我的作答實現了題目要求的功能,但存在一些問題.
題目類(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,我現在進度落後有點大,現在開始趕.