getch();
}
方案二:
1)识别类
将题目独立出来。
从概念上来说题目是独立于解答存在的,将其独立出来作为题目类
Question。
将一个题目的测试作为一个独立的类Answer,记录做题的相关数据,支持相关功
能。
将一个学生的完整测试作为一个类Test,包装整个测试,以对外界提供更高层的抽象。
类结构如图所示。
Answer类与Question类是单向关联关系(使用关系)。
Test类与Question类是一对多的关联关系,与Answer类是一对多关联关系。
2)详细设计
设计时考虑1)可以设置测试题目类型(加法、减法、加减混合),可以设置其它参数
(总题目数,每个题目的最大答题次数,总分,每个题目的每次解答的分数);2)界面与应
用分离。
Question类:
数据成员:
两个操作数,运算符,运算结果。
定义一个静态成员type表示测试的类型,
来决定出题的算法。
功能:
出题。
接口为:
出题
获得结果:
为Answer提供服务,获得结果。
获得题目(字符串):
为了做到与界面分离,只负责业务逻辑,不负责输入输出,因此需要返回题目。
Answer类:
各次的答题结果。
指向当前题目的指针。
数据成员:
本题得分,答题次数,是否答对,定义静态数据成员作为答题参数:
最大答题次数,每次答题的分数。
功能:
提供答题判断,并给分。
接口为:
setQuestion:
关联题目。
setResult:
得到学生的答案并评价:
通过与question的关联获得正确结果,并判断是否作对。
设置相关参数(答题次数,答题状态,得分)
返回本次答题评价
返回获得分数
Test类
数据成员:
本次测试的一组Question(用数组或vector组织),本次测试的解答一组
Answer(用数组或vector组织)。
为类描述测试的进行状态,增加两个数据成员:
当前题目,
是否进入下个题目。
以及测试的所有相关参数。
功能:
对全部测试提供对外包装,描述测试状态。
接口为:
设置参数
出题
返回题目信息
学生给出一个结果是否还有题
方案二:
实现
#include"stdafx.h"
#include
#include
#include
#include
#include
#include
#includevconio.h>
usingnamespacestd;
chartype[2]={'+','-'};
intgrade[3]={10,7,5};
char*evaluation[5]={"SMART""GOOD,""OK","PASS","TRYAGAIN'};
intgetANumber(inta,intb)
{
returnrand()%(b-a)+a;
}
classQuestion
{
private:
inta;
intb;
charc;
intresult;
staticintstyle;
public:
staticvoidsetParam(ints)
{
style=s;
}
Question():
a(0),b(0),c(type[0]),result(0)
}
~Question(){}
voidcreate()
{
while(true)
{createQuestion();
if(testQuestion())break;
}
}
intgetResult()
{
returnresult;
}
stringgetQuestion()
{
charstr[100];
sprintfs(str,"%d%c%d=‘a,c,b);
returnstring(str);
}
private:
void
createQuestion()
JL
a=getANumber(0,100);
b=getANumber(0,100);c=getType();
if(c=='+')
result=a+b;
else
result=a-b;
}
chargetType()//返回题目的运算符(根据要求的测试类型,产生不同的运算符)
{
switch(style)
{
case1:
return'+';
break;
case2:
return'-';
break;
case0:
returntype[getANumber(0,1)];
break;
}
}
booltestQuestion()
{
if((result1OO))returnfalse;
else
returntrue;
}};
intQuestion:
:
style=O;
classAnswer
{
private:
inttimes;
//做题次数
vector>result;
boolstate;
//是否作对
intscore;
//本题得分
Question*que;
staticintmaxTimes;//最大做题次数staticint*grade;//不同次数得分
public:
staticvoidsetParam(intmTint*g)
{
maxTimes=nTgrade=g;
}
Answer():
times(O),state(O),score(O),que(NULL
{
result.reserve(IO);
}
〜Answer(){}
voidsetQuestion(Question*q)
{
que=q;
}]
boolsetResult(intr)//返回值表示本题答题是否结束
{
result.push_back(r);
if(r==que->getResult())
{
state=true;
score=grade[times];
}
times++;
if((state==true)||(times==3))returntrue;//本题结束
else
returnfalse;//本题还有机会
}
stringgetString()
{]
strings1="答对了";
strings2="答错了,请继续回答";strings3="答错了,你没有机会了";if(state)
returns1;
if(times<3)
};
intAnswer:
:
maxTimes=O;
int*Answer:
:
grade=NULL
intcount;
//本次测试的题目数
intstyle;
//本次测试的题目类型,0:
混合,1加,2:
减
intmaxA;II本次测试的每题答题次数
int*sDistribution;II不同次数的成绩分配
inttotalScore;//最后得分
intcurrentQ;//当前题
boolnextQ;//是否进入下一
题
public:
Test():
q(NULL,ans(NULL,totalScore(0),currentQ(O),nextQ(false),count(0),maxA(0),
style(O)
{
}
delete[]ans;
delete[]sDistribution;
}
voidsetParam(intc,intmAintt,int*sd)II设置参数
{
count=c;
style=t;
maxAmA
sDistribution=newint[maxA];
for(inti=0;isDistribution[i]=sd[i];
Question:
:
setParam(style);
Answer:
:
setParam(maxA,sDistribution);
if(q!
=NULL
delete[]q;
if(ans!
=NULL
delete[]ans;
q=newQuestion[count];ans=newAnswer[count];
for(inti=0;i{
ans[i].setQuestion(&q[i]);
}
}
voidsetTest()//岀题
{
for(inti=0;iq[i].create();
}
inthasQuestion()//当前测试,还有题吗?
{
returncurrentQvcount-1;
}
stringgetCurrentQ()//返回当前题目字符串
{
if(nextQ)
currentQ++;
returnq[currentQ].getQuestion();
}
booldoCurrentQ(intre)//当前题目,设置一次结果,返回是否正确
{
if(ans[currentQ].setResult(re))
{
nextQ=true;
returntrue;
}
else
returnfalse;
}
stringgetCurrentAS()
{
returnans[currentQ].getString();
}
voidcomputeScore()
{
for(inti=0;i}
intgetScore()
{
returntotalScore;
}
stringlevel()
{
intlevel=4;
doublet=totalScore*1OO/(sDistribution[0]*count);
switch(t/10)
{
case10:
case9:
level=O;
break;
case8:
level=1;
break;
case7:
level=2;
break;
case6:
level=3;
break;
case5:
level=4;
}returnevaluation[level];
}
};
classUinterfacepublic:
Testt;
voidrun()
{
inti=1,result=-1;
int*p=newint[3];
p[0]=10;p[1]=7;p[2]=5;
t.setParam(10,3,0,p);
deletep;
t.setTest();
while(t.hasQuestion())
{
coutvvivv")"«t.getCurrentQ();while(true)
{
cin>>result;
boolb=t.doCurrentQ(result);cout«t.getCurrentAS()<if(b)
{
i++;
break;
}
}
}
puteScore();
cout«"总分:
"<}
};
intmain(intargc,TCHARargv[])
{
srand(time(NULL);
Uinterfaceui;
ui.run();
return0;
}