實(shí)例:加減法小測(cè)驗(yàn)-面向?qū)ο骭第1頁(yè)
實(shí)例:加減法小測(cè)驗(yàn)-面向?qū)ο骭第2頁(yè)
實(shí)例:加減法小測(cè)驗(yàn)-面向?qū)ο骭第3頁(yè)
實(shí)例:加減法小測(cè)驗(yàn)-面向?qū)ο骭第4頁(yè)
實(shí)例:加減法小測(cè)驗(yàn)-面向?qū)ο骭第5頁(yè)
已閱讀5頁(yè),還剩12頁(yè)未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(quán)說(shuō)明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)

文檔簡(jiǎn)介

項(xiàng)目設(shè)計(jì)題目及要求

題目:加減法小測(cè)驗(yàn)。面向小學(xué)1~2年級(jí)學(xué)生,隨機(jī)選擇兩個(gè)整數(shù)和加減法形成算式要求學(xué)生解答。

功能要求:電腦隨機(jī)出10道題,每題10分,程序結(jié)束時(shí)顯示學(xué)生得分;確保算式?jīng)]有超出1~2年級(jí)的水平,只允許進(jìn)行100以內(nèi)的加減法,不允許兩數(shù)之和或之差超出0~100的范圍,負(fù)數(shù)更是不允許的;每道題學(xué)生有三次機(jī)會(huì)輸入答案,當(dāng)學(xué)生輸入錯(cuò)誤答案時(shí),提醒學(xué)生重新輸入,如果三次機(jī)會(huì)結(jié)束則輸出正確答案;對(duì)于每道題,學(xué)生第一次輸入正確答案得10分,第二次輸入正確答案得7分,第三次輸入正確答案得5分,否則不得分;總成績(jī)90以上顯示“SMART”,80-90顯示“GOOD”,70-80顯示“OK”,60-70顯示“PASS”,60以下“TRYAGAIN”

變化擴(kuò)展:

1)允許用戶初始選擇題目類(lèi)型:加法,減法,還是加減法都有。

2)評(píng)判完成后,顯示答錯(cuò)的題,并給出正確答案。

3)若是一組題,可以重復(fù)使用,怎樣處理?

4)界面與應(yīng)用邏輯分離

5)可以設(shè)置參數(shù)

項(xiàng)目的面向?qū)ο笤O(shè)計(jì)

2.1需求分析

1)分析系統(tǒng)的功能需求:

出題:隨機(jī)出題。每題要求:確保算式?jīng)]有超出1~2年級(jí)的水平,只允許進(jìn)行100以內(nèi)的加減法,不允許兩數(shù)之和或之差超出0~100的范圍,負(fù)數(shù)更是不允許的。

答題:每道題學(xué)生有三次機(jī)會(huì)輸入答案,每輸入一次答案,進(jìn)行評(píng)價(jià),若正確顯示正確,若錯(cuò)誤,顯示錯(cuò)誤,并提醒學(xué)生重新輸入答案。若是第三次錯(cuò)誤,則不再給機(jī)會(huì)輸入答案。

答題評(píng)分:每道題,學(xué)生一次做對(duì)得10分,二次做對(duì)得7分,三次做對(duì)得5分,其余不得分;

總評(píng)分:每個(gè)測(cè)試出10題,10題做完過(guò)后給出總評(píng)分??偝煽?jī)90以上顯示“SMART”,80-90顯示“GOOD”,70-80顯示“OK”,60-70顯示“PASS”,60以下“TRYAGAIN”

2)系統(tǒng)流程:

先出完10題然后按順序做題。

首先顯示一個(gè)題目用戶給出答案進(jìn)行評(píng)判。若做題結(jié)束進(jìn)入下一題若沒(méi)有結(jié)束用戶繼續(xù)給出答案進(jìn)行評(píng)判。

做完10題計(jì)算總評(píng)分并分等級(jí)給出評(píng)價(jià)。

流程如圖1所示。

圖1系統(tǒng)流程圖

2.2總體設(shè)計(jì)

方案一:

1)識(shí)別類(lèi)

問(wèn)題中出現(xiàn)了題目,解答,測(cè)試等事物。將題目和解答的數(shù)據(jù)及功能合并,作為題目類(lèi)將測(cè)試作為一個(gè)類(lèi)。

題目類(lèi):表示一個(gè)題目,及相關(guān)的解答狀況。

測(cè)試類(lèi):對(duì)一次測(cè)試做一個(gè)包裝,其中包括10個(gè)題目,以及測(cè)試的總分評(píng)價(jià)。

測(cè)試類(lèi)和題目類(lèi)之間是個(gè)1對(duì)多的包含關(guān)系。

2)詳細(xì)設(shè)計(jì)

Question類(lèi)設(shè)計(jì)數(shù)據(jù)成員:兩個(gè)操作數(shù),運(yùn)算符,運(yùn)算結(jié)果;本題得分,答題次數(shù),是否答對(duì)。功能:負(fù)責(zé)出一道題并讓用戶做題,并評(píng)價(jià)。

接口:

生成題目。

答題(顯示題目,支持做題,支持得分)。

返回成績(jī)。

私有成員函數(shù)

生成題目數(shù)據(jù)。(私有)

判斷題目是否符合要求。(私有)

Test類(lèi)設(shè)計(jì)

數(shù)據(jù)成員:多個(gè)Question類(lèi)對(duì)象(用數(shù)組組織數(shù)據(jù),用vector組織數(shù)據(jù)),題目數(shù)目,總分,等級(jí),評(píng)價(jià)。

功能:創(chuàng)建測(cè)試題目,啟動(dòng)測(cè)試,總評(píng)價(jià)。

接口為:

創(chuàng)建題目(或放在構(gòu)造函數(shù)中)

啟動(dòng)測(cè)試

返回總分

返回評(píng)判結(jié)果(獲得評(píng)判)

方案一:實(shí)現(xiàn)

#include〈iostream〉

#include〈cstdlib〉

#include<ctime〉

#include〈conio.h〉usingnamespacestd;

chartype[2]={,+,,,_,};

intgrade[3]={10,7,5};

char*evaluation[5]={"SMART","GOOD","OK","PASS","TRYAGAIN"};constintMAX_TIMES=3;

intgetACount(inta,intb)

{

returnrand()%(b_a)+a;

}

classQuestion

{

private:

inta;

intb;

charc;

intresult;

//

intscore;

inttimes;

intstate;

intresults[MAX_TIMES];

voidAQuestion()

{

a=getACount(0,100);

b=getACount(0,100);

c=type[getACount(0,2)];

if(c=='+')

result=a+b;

else

result=a—b;

}

booltestAQuestion()

{

if((result〈0)||(result〉100))

returnfalse;

else

returntrue;

}

booldoOnceTest()

{

cout<〈a〈〈c〈〈b〈〈"=";

cin〉〉results[times];

if(results[times]==result)

state—1;

else

state—0;

times++;

returnstate;

}

public:

Question():a(0),b(0),c('+'),result(0),times(0),state(0),score(0)

{

}

voidcreateQuestion()

{

while(true)

{

AQuestion();

if(testAQuestion())

break;

}

}

voiddoATest()

{

for(inti=O;i〈MAX_TIMES;i++)

{

if(doOnceTest())

{

score=grade[timesT];

break;

}

else

{

if(i<2)

cout〈〈"答錯(cuò)了,請(qǐng)繼續(xù)回答:";

else

cout〈〈"答錯(cuò)了,你沒(méi)有機(jī)會(huì)了〃〈〈endl;

}

}

}

intgetScore()

{

returnscore;

}

};

classTest

{

private:

Question*q;

intcount;

intscore;

intlevel()

{

intlevel=4;

switch(score/10)

{

{

case10:

case9:

level=0;

break;

case8:

level=1;

break;

case7:

level=2;

break;

case6:

level=3;

break;

case5:

level=4;

}

returnlevel;

}

public:

Test(intc=10):count(c),score(0)

{

q=newQuestion[c];

}

intgetScore()

{

returnscore;

}

char*getEvaluation()

{

returnevaluation[level()];

}

voidrunTest()

{

for(inti=0;i〈count;i++)

{

q[i].createQuestion();q[i].doATest();score=score+q[i].getScore();

}

}

};

intmain()

srand((unsigned)time(NULL));

TestaTest;

aTest.runTest();

cout〈〈"你的成績(jī)?yōu)?〈〈aTest.getScore()〈〈","〈〈aTest.getEvaluation()〈〈endl;getch();

}

方案二:

1)識(shí)別類(lèi)將題目獨(dú)立出來(lái)。從概念上來(lái)說(shuō)題目是獨(dú)立于解答存在的,將其獨(dú)立出來(lái)作為題目類(lèi)

Question。將一個(gè)題目的測(cè)試作為一個(gè)獨(dú)立的類(lèi)Answer,記錄做題的相關(guān)數(shù)據(jù),支持相關(guān)功能。將一個(gè)學(xué)生的完整測(cè)試作為一個(gè)類(lèi)Test,包裝整個(gè)測(cè)試,以對(duì)外界提供更高層的抽象。類(lèi)結(jié)構(gòu)如圖所示。

Answer類(lèi)與Question類(lèi)是單向關(guān)聯(lián)關(guān)系(使用關(guān)系)。Test類(lèi)與Question類(lèi)是一對(duì)多的關(guān)聯(lián)關(guān)系,與Answer類(lèi)是一對(duì)多關(guān)聯(lián)關(guān)系。

2)詳細(xì)設(shè)計(jì)設(shè)計(jì)時(shí)考慮1)可以設(shè)置測(cè)試題目類(lèi)型(加法、減法、加減混合),可以設(shè)置其它參數(shù)

(總題目數(shù),每個(gè)題目的最大答題次數(shù),總分,每個(gè)題目的每次解答的分?jǐn)?shù));2)界面與應(yīng)用分離。

Question類(lèi):

數(shù)據(jù)成員:兩個(gè)操作數(shù),運(yùn)算符,運(yùn)算結(jié)果。定義一個(gè)靜態(tài)成員type表示測(cè)試的類(lèi)型,來(lái)決定出題的算法。

功能:出題。

接口為:

出題

獲得結(jié)果:為Answer提供服務(wù),獲得結(jié)果。

獲得題目(字符串):為了做到與界面分離,只負(fù)責(zé)業(yè)務(wù)邏輯,不負(fù)責(zé)輸入輸出,因此需要返回題目。

Answer類(lèi):數(shù)據(jù)成員:本題得分,答題次數(shù),是否答對(duì),各次的答題結(jié)果。指向當(dāng)前題目的指針。定義靜態(tài)數(shù)據(jù)成員作為答題參數(shù):最大答題次數(shù),每次答題的分?jǐn)?shù)。

功能:提供答題判斷,并給分。

接口為:

setQuestion:關(guān)聯(lián)題目。

setResult:得到學(xué)生的答案并評(píng)價(jià):通過(guò)與question的關(guān)聯(lián)獲得正確結(jié)果,并判斷是否作對(duì)。設(shè)置相關(guān)參數(shù)(答題次數(shù),答題狀態(tài),得分)

返回本次答題評(píng)價(jià)

返回獲得分?jǐn)?shù)

Test類(lèi)

數(shù)據(jù)成員:本次測(cè)試的一組Question(用數(shù)組或vector組織),本次測(cè)試的解答一組Answer(用數(shù)組或vector組織)。為類(lèi)描述測(cè)試的進(jìn)行狀態(tài),增加兩個(gè)數(shù)據(jù)成員:當(dāng)前題目,是否進(jìn)入下個(gè)題目。以及測(cè)試的所有相關(guān)參數(shù)。

功能:對(duì)全部測(cè)試提供對(duì)外包裝,描述測(cè)試狀態(tài)。

接口為:

設(shè)置參數(shù)

出題

返回題目信息

學(xué)生給出一個(gè)結(jié)果

是否還有題

方案二:實(shí)現(xiàn)

#include"stdafx.h"

#include〈iostream〉

#include<strstream〉

#include<cstdlib〉

#include<ctime〉

#include<string〉

#include<vector〉

#include〈conio.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[O]),result(0)

{

}

~Question(){}

voidcreate()

{

while(true)

{

createQuestion();

if(testQuestion())break;

}

}

intgetResult()

{

returnresult;

}

stringgetQuestion()

{

charstr[100];

sprintf_s(str,"%d%c%d=",a,c,b);returnstring(str);

}

private:

voidcreateQuestion()

{

a=getANumber(0,100);

b=getANumber(0,100);

c=getType();

if(c=='+')

result=a+b;

elseresult=a—b;

}

chargetType()//返回題目的運(yùn)算符(根據(jù)要求的測(cè)試類(lèi)型,產(chǎn)生不同的運(yùn)算符){

switch(style)

{

case1:

return'+';

break;

case2:

return'-';

break;

case0:

returntype[getANumber(0,1)];break;

}

}

booltestQuestion()

{

if((result〈0)||(result〉100))

returnfalse;

else

returntrue;

}

};

intQuestion::style=0;

classAnswer

{

private:

inttimes;//做題次數(shù)

vector〈int〉result;

boolstate;//是否作對(duì)

intscore;//本題得分

Question*que;

staticintmaxTimes;//最大做題次數(shù)

staticint*grade;//不同次數(shù)得分

public:

staticvoidsetParam(intmT,int*g)

{

maxTimes=mT;

grade=g;

}

Answer():times(O),state(0),score(0),que(NULL)

{

result.reserve(IO);

}

~Answer(){}

voidsetQuestion(Question*q)

{

que=q;

}

boolsetResult(intr)//返回值表示本題答題是否結(jié)束

{

result.push_back();

if(r==que-〉getResult())

{

state=true;score=grade[times];

}

times++;

if((state==true)||(times==3))

returntrue;//本題結(jié)束

else

returnfalse;//本題還有機(jī)會(huì)

}

stringgetString()

{

strings1="答對(duì)了";

strings2=〃答錯(cuò)了,請(qǐng)繼續(xù)回答〃;

strings3="答錯(cuò)了,你沒(méi)有機(jī)會(huì)了";

if(state)

returns1;

if(times<3)

returns2;

else

returns3;

}

intgetScore()

{

returnscore;

}

};

intAnswer::maxTimes=O;int*Answer::grade=NULL;

classTest

{

private:

Question*q;

Answer*ans;

intcount;//本次測(cè)試的題目數(shù)

intstyle;//本次測(cè)試的題目類(lèi)型,0:混合,1:加,2減

intmaxA;//本次測(cè)試的每題答題次數(shù)

int*sDistribution;//不同次數(shù)的成績(jī)分配

inttotalScore;//最后得分

intcurrentQ;//當(dāng)前題

boolnextQ;//是否進(jìn)入下一題

public:

Test():q(NULL),ans(NULL),totalScore(0),currentQ(0),nextQ(false),count(0),maxA(0),style(0)

{

}

~Test()

{

delete]]q;

delete]]ans;

delete[]sDistribution;

}

voidsetParam(intc,intmA,intt,int*sd)//設(shè)置參數(shù)

{

count=c;

style=t;

maxA=mA;

sDistribution=newint[maxA];

for(inti=0;i〈maxA;i++)

sDistribution[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〈count;i++)

{

}

ans[i].setQuestion(&q[i]);

}

voidsetTest()//出題

{

for(inti=0;i〈count;i++)

q[i].create();

}

inthasQuestion()//當(dāng)前測(cè)試,還有題嗎?

{

returncurrentQ〈countT;

}

stringgetCurrentQ()//返回當(dāng)前題目字符串

{

if(nextQ)

currentQ++;

returnq[currentQ].getQuestion();

}

booldoCurrentQ(intre)//當(dāng)前題目,設(shè)置一次結(jié)果,返回是否正確{

if(ans[currentQ].setResult(re))

{

nextQ=true;

returntrue;

}

else

returnfalse;

}

stringgetCurrentAS()

{

returnans[currentQ].getString();

}

voidcomputeScore()

{

for(inti=0;i〈count;i++)

totalScore

溫馨提示

  • 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒(méi)有圖紙預(yù)覽就沒(méi)有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫(kù)網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。

評(píng)論

0/150

提交評(píng)論