一、面向對象程序設計的基本步驟:
(1)分析項目中有那些類(或對象)參與程序。
對象選擇的標准:
1、這個對象必須參與程序的運行;
2、這個對象有對象的基本特征;
3、對象必須是項目強相關的對象。
初步找到的:試卷、試題、計算機、考生、答案、題干、選項。。。
篩選后:
試卷類:本項目中只有一張試卷(后續擴展可以做成多套試卷)
試題類:包括題干、選項、答案
答案類:包括正確答案、答案分析、所選答案(答案和試題是關聯的)
邊界類:項目主界面(負責和用戶交互,完成對象關聯)
(2)分析項目中類或對象之間的關系,分析結果:
試卷->試題:一張試卷包含若干試題,一對多。試題在試卷中應該以集合對象形式存在。
試題->答案:一道試題有一個答案,一對一。答案對象應該在試題中以對象屬性形式存在。
邊界類->試卷:一個窗體中有一個試卷對象。
二、設計類
1、設計答案類。屬性:正確答案、所選答案、答案分析。
2、設計試題類。屬性:試題編號、題干、選擇A、B、C、D、答案對象(類似數據庫外鍵)
3、設計試卷類。屬性:試題集合list<T> 方法:(1)抽取試題(2)題目選擇(3)獲取得分。
4、設計邊界類。屬性:試卷對象,試題序號。事件:(1)抽取試題(2)題目選擇(3)提交試卷
三、創建類
1、Answer類
[Serializable] public class Answer { public string AnswerAnalysis{get;set;} = string.Empty; public string SelectedAnswer{get;set;} = string.Empty; public string RightAnswer{get;set;} = string.Empty; }
2、Question類
[Serializable] public class Question { public Question() { this.QAnswer = new Answer(); } public int QuestionID {get;set;} public string QuestionTitle {get;set;} public string OptionA {get;set;} public string OptionB {get;set;} public string OptionC {get;set;} public string OptionD {get;set;} public Answer QAnswer {get;set;} }
3、Paper類
using System.IO; using System.Runtime.Serialization.Formatters.Binary; public class Paper { public Paper() { this.questions = new List<string[]>(); } private List<string[]> questions; public List<string[]> Questions { get{return this.questions;} } //提取試題 public void ExtractQuestionByOrign() { FileStream fs = new FileStream("Question.txt",FileMode.Open); StreamReader sr = new StreamReader(fs,Encoding.GetEncoding("utf-8")); string questionString = sr.ReadToEnd(); string[] questionArr = questionString.Split(Convert.ToChar("&")); string[] question = null; for(int i=0;i<questionArr.Length;++i) { questions = questionArr[i].Trim().Split(Convert.ToChar("\r")); this.questions.Add(new Questions() { QuestionTitle = questions[0].Trim(), OptionA = question[1].Trim(), OptionB = question[2].Trim(), OptionC = question[3].Trim(), OptionD = question[4].Trim(), QAnswer = new Answer() { RigthAnswer = question[5].Trim() } }); } sr.Close(); fs.Close(); } //生成序列化文件 public void CreateSerializableFile() { FileStream fs = new FileStream("Question.obj",FileMode.Create); BinaryFormatter formatter = new BinaryFormatter(); formatter.Serialize(fs,this.questions); fs.Close(); } //提取文件 public void ExtractbySerializableFile() { FileStream fs = new FileStream("Question.obj",FileMode.Open); BinaryFormatter formatter = new BinaryFormatter(); this.questions = (List<Question>)formatter.Deserialize(fs); fs.Close(); } //獲取得分 public int GetScore() { int score = 0; foreach(Question item in this.questions) { if(item.QAnswer.SelectedAnswer == string.Empty) continue; if(item.QAnswer.SelectedAnswer.Equals(item.QAnswer.RightAnswer)) score += 5; } return score; } }