C# WinForm答题设计思路(类的设计)

一、面向对象程序设计的基本步骤:

(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;
    }
}

  

 

posted @ 2020-07-05 18:30  pandora2050  阅读(998)  评论(0编辑  收藏  举报