一、面向对象程序设计的基本步骤:
(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(" ")); 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; } }