實(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è),還剩10頁(yè)未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

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

文檔簡(jiǎn)介

1.項(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以?xún)?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)允許用戶(hù)初始選擇題目類(lèi)型:加法,減法,還是加減法都有。 2)評(píng)判完成后,顯示答錯(cuò)的題,并給出正確答案。 3)若是一組題,可以重復(fù)使用,怎樣處理? 4)界面與應(yīng)用邏輯分離 5)可以設(shè)置參數(shù)2.項(xiàng)目的面向?qū)ο笤O(shè)計(jì)2.1需求分析1)分析系統(tǒng)的功能需求:出題:隨機(jī)出題。每題要求:確保算式?jīng)]有超出1~2年級(jí)的水平,只允許進(jìn)行100以?xún)?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è)題目,用戶(hù)給出答案,進(jìn)行評(píng)判。若做題結(jié)束,進(jìn)入下一題,若沒(méi)有結(jié)束,用戶(hù)繼續(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é)出一道題并讓用戶(hù)做題,并評(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=0;i<MAX_TIMES;i++) { if(doOnceTest()) { score=grade[times-1]; 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[0]),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; else result=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(0),state(0),score(0),que(NULL) { result.reserve(10); } ~Answer(){} voidsetQuestion(Question*q) { que=q; } boolsetResult(intr)//返回值表示本題答題是否結(jié)束 { result.push_back(r); 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=0;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<count-1; } 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+=ans[i].getScore(); } intgetScore() { returntotalSc

溫馨提示

  • 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶(hù)所有。
  • 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ì)用戶(hù)上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶(hù)上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶(hù)因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。

最新文檔

評(píng)論

0/150

提交評(píng)論