版權(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)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 病理生理學(xué)課件凝血和抗凝血平衡紊亂
- 一年級語文下冊《語文園地六》課件
- 《心血管急癥》課件
- 固定收益點評報告:把握跨年后的信用配置窗口
- 單位管理制度展示大全【職員管理】
- 《小米手機演講》課件
- 2025年宏觀經(jīng)濟展望:積極有為乘風(fēng)破浪
- 單位管理制度品讀選集員工管理十篇
- 新型環(huán)保油漆技術(shù)改造項目可行性研究報告
- 中國次硝酸鉍片行業(yè)市場調(diào)查研究及發(fā)展戰(zhàn)略規(guī)劃報告
- 2023-2024學(xué)年安徽省安慶市高一上學(xué)期期末聯(lián)考生物試題(解析版)
- 學(xué)術(shù)不端行為治理研究
- 廣東省廣州市海珠區(qū)2023-2024學(xué)年九年級上學(xué)期期末物理試題(含答案)
- 企業(yè)文化、戰(zhàn)略與電力能源知識參考題庫練習(xí)卷含答案(一)
- GB/T 45083-2024再生資源分揀中心建設(shè)和管理規(guī)范
- 植樹問題專項講義(五大類型+方法+練習(xí)+答案)六年級數(shù)學(xué)小升初總復(fù)習(xí)
- 沖上云霄-飛機鑒賞智慧樹知到期末考試答案2024年
- 江蘇省常州市溧陽市2023-2024學(xué)年八年級上學(xué)期1月期末英語試題
- 二年級勞動教學(xué)工作總結(jié)doc
- 標(biāo)識牌項目備案申請(模板范本)
- 2022年政府補助收入的會計處理和稅務(wù)籌劃
評論
0/150
提交評論