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

下載本文檔

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

文檔簡介

項目設(shè)計題目及要求

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

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

變化擴展:

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

2)評判完成后,顯示答錯的題,并給出正確答案。

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

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

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

項目的面向?qū)ο笤O(shè)計

2.1需求分析

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

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

答題:每道題學(xué)生有三次機會輸入答案,每輸入一次答案,進行評價,若正確顯示正確,若錯誤,顯示錯誤,并提醒學(xué)生重新輸入答案。若是第三次錯誤,則不再給機會輸入答案。

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

總評分:每個測試出10題,10題做完過后給出總評分??偝煽?0以上顯示“SMART”,80-90顯示“GOOD”,70-80顯示“OK”,60-70顯示“PASS”,60以下“TRYAGAIN”

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

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

首先顯示一個題目用戶給出答案進行評判。若做題結(jié)束進入下一題若沒有結(jié)束用戶繼續(xù)給出答案進行評判。

做完10題計算總評分并分等級給出評價。

流程如圖1所示。

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

2.2總體設(shè)計

方案一:

1)識別類

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

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

測試類:對一次測試做一個包裝,其中包括10個題目,以及測試的總分評價。

測試類和題目類之間是個1對多的包含關(guān)系。

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

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

接口:

生成題目。

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

返回成績。

私有成員函數(shù)

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

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

Test類設(shè)計

數(shù)據(jù)成員:多個Question類對象(用數(shù)組組織數(shù)據(jù),用vector組織數(shù)據(jù)),題目數(shù)目,總分,等級,評價。

功能:創(chuàng)建測試題目,啟動測試,總評價。

接口為:

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

啟動測試

返回總分

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

方案一:實現(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〈〈"答錯了,請繼續(xù)回答:";

else

cout〈〈"答錯了,你沒有機會了〃〈〈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〈〈"你的成績?yōu)?〈〈aTest.getScore()〈〈","〈〈aTest.getEvaluation()〈〈endl;getch();

}

方案二:

1)識別類將題目獨立出來。從概念上來說題目是獨立于解答存在的,將其獨立出來作為題目類

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

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

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

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

Question類:

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

功能:出題。

接口為:

出題

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

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

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

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

接口為:

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

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

返回本次答題評價

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

Test類

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

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

接口為:

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

出題

返回題目信息

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

是否還有題

方案二:實現(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()//返回題目的運算符(根據(jù)要求的測試類型,產(chǎ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;//是否作對

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;//本題還有機會

}

stringgetString()

{

strings1="答對了";

strings2=〃答錯了,請繼續(xù)回答〃;

strings3="答錯了,你沒有機會了";

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;//本次測試的題目數(shù)

intstyle;//本次測試的題目類型,0:混合,1:加,2減

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

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

inttotalScore;//最后得分

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

boolnextQ;//是否進入下一題

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)前測試,還有題嗎?

{

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

評論

0/150

提交評論