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
類圖:
原始碼如下:
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”。
原始碼如下:
試卷題目類(****Question_Paper 新增****):用於儲存試卷中的題目資訊。由於試卷中的題目序
號與題目本身的題號不一致。且題目在不同試卷中的分值可能不一樣,因此,設計試卷題目
類。
踩坑心得
- 一開始在寫第一題時,我心情比較焦慮,越是焦慮就越是寫不出來,反而焦慮之感又增多,對做出來這道題目毫無幫助。用的方法總是報錯說陣列越界,但是到最後我也沒找出來原因。這次在重新做的時候冷靜了許多,思路也更加的清晰了。所以面對難題心態一定不能崩掉噢~