利用C語言開發(fā)一個“小學生算術四則運算測試系統(tǒng)”_第1頁
利用C語言開發(fā)一個“小學生算術四則運算測試系統(tǒng)”_第2頁
利用C語言開發(fā)一個“小學生算術四則運算測試系統(tǒng)”_第3頁
利用C語言開發(fā)一個“小學生算術四則運算測試系統(tǒng)”_第4頁
利用C語言開發(fā)一個“小學生算術四則運算測試系統(tǒng)”_第5頁
已閱讀5頁,還剩16頁未讀, 繼續(xù)免費閱讀

下載本文檔

版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領

文檔簡介

1、武漢理工大學華夏學院課程設計課程名稱C語言程序設計目口利用C語言開發(fā)一個“小學生算術四則運算測試系統(tǒng)”專業(yè)電子商務班級1091學號20510809105姓名張宇成績指導教師楊沙、王緒梅2010年6月28日至2010年7月2日課程設計任務書設計題目:利用C語言開發(fā)一個“小學生算術四則運算測試系統(tǒng)”設計目的加深對C語言程序設計課程所學知識的理解;掌握結構化程序設計的基本方法;學會編制結構清晰、風格良好、數(shù)據(jù)結構選擇恰當?shù)腃語言程序;掌握多模塊的C語言程序的調試方法。設計任務(在規(guī)定的時間內完成下列任務)任務描述:利用C語言開發(fā)一個“小學生算術四則運算測試系統(tǒng)”該系統(tǒng)是讓計算機充當一位給小學生布置作

2、業(yè)的算術老師,為學生出題、閱卷該系統(tǒng)應具備以下功能:為小學生出題(分別進行+、一、*、三等不同運算)學生做題后,進行評閱;學生每做一題后,評閱時給出“答題正確,很好”或“答題錯誤,重做”等字樣;力口、減、乘、除運算功能可以自由選擇實現(xiàn);運算數(shù)值可以控制在兩位(或三位)數(shù)的四則運算范圍內。具體要完成的任務是:1完成整個規(guī)定任務的設計及調試,得出正確結果,并經(jīng)教師檢查及答辯;寫出規(guī)范的課程設計說明書;課程設計結束后交設計說明書等文檔和設計內容。設計說明書的主要內容是詳細寫出在設計過程中所用到的主要技術或方法;4從6月28日起,學生每天至少要到設計教室半天以上;課程設計報告按國際通用格式書寫,具體格

3、式要求請在網(wǎng)絡上查閱時間安排6月28日上午1-103教室動員全體學生,給學生下任務書;下午查閱相關資料;6月29日7月1日完成選題的設計及報告的書寫;7月2日上午提交課程設計報告并答辯。指導教師簽名:教研室主任(或責任教師)簽名:2010年6月27日2010年6月27日1、問題描述1.1在最開始設計此程序過程中,我定義的變量flag為字符型,當把原程序段中對應于下面的程序段的程序段改為:scanf(%d,&temp);while(temp!=answer)printf(n答案錯誤,重做n);printf(n請輸入正確的答案:n);scanf(%d,&temp);printf(n繼續(xù)請按y,退出

4、測試請按nn);scanf(%c,&flag);while(flag!=y&flag!=n)printf(n繼續(xù)請按1,退出測試請按0n);scanf(%d,&flag);我將會發(fā)現(xiàn)當我做完一題且做對了的時候,無論我輸入的是y還是n或者是其他的字符,printf(n繼續(xù)請按1,退出測試請按0n)這個提示在屏幕上出現(xiàn)兩次,說明了在第一個scanf(%c,&flag)語句中無論什么,flag!二y&flag!二n都是成立的,這說明了在第一個scanf(%c,&flag)中輸入的字符并沒有賦給flag。為了修改正確,我詢問了指導老師,后來才知道執(zhí)行語句scanf(%d,&temp)時候,小學生會輸入

5、一個數(shù)字,然后在按回車鍵,在執(zhí)行語句scanf(%c,&flag)時這個是回車鍵被賦給了變量flag,而不是輸入的字符給了變量flag,此時語句flag!二y&flag!二n不成立,就會造成循環(huán)語句while(flag!=y&flag!二n)一定會執(zhí)行一次,也就造成了上述結果。后來我將定義的字符型變量flag改成了整形,并且當輸入1時繼續(xù)做題,當輸入0時退出系統(tǒng),當輸入的其他的數(shù)字時候,就會被提示輸入錯誤,且要求重新輸入。這樣修改后就達到了上述目的。1.2最開始我沒有調用函數(shù)srand(unsigned)time(NULL)結果發(fā)現(xiàn)連續(xù)做兩道相同算法的題目時,兩次的題目完全一樣,也就說明了此程

6、序并不能隨機的出題,后來使用了函數(shù)srand(unsigned)time(NULL)。srand(unsigned)time(NULL)這個函數(shù)調用中使用time(NULL)函數(shù)返回值(當前時間)作實參,初始化隨機數(shù)發(fā)生器。rand()函數(shù)調用返回一個隨機數(shù),理論上說,rand()返回一個隨機數(shù),但是每次調用時,隨機數(shù)發(fā)生器返回的隨機數(shù)序列都是一樣的,所以,用當前時間(time(NULL)返回值)作種子對隨機數(shù)發(fā)生器進行初始化,由于每次當前時間不一樣,所以隨機數(shù)發(fā)生器產(chǎn)生的隨機數(shù)序列不一樣,即rand()函數(shù)調用的返回值不一樣,就達到了得到真隨機數(shù)而不是偽隨機數(shù)的目的,也就成功解決了這個問題。

7、1.3其他的問題描述見附件1中的question_get()函數(shù)中注釋中的問題分析部分。2、詳細設計4.1設計一個函數(shù)intquestion_get();,此函數(shù)的主要功能是為小學生出題(分別進行+,*,/等不同運算),并且保證給出的算式中的數(shù)字和結果均不超過三位數(shù)。系統(tǒng)自動計算出正確的答案,然后此正確的答案賦給變量answer。4.2通過調用函數(shù)srand(unsigned)time(NULL);初始化隨機數(shù)發(fā)生器,使rand()函數(shù)調用的返回值不一樣,這樣就使連續(xù)做同一種算法時,系統(tǒng)兩次給出的算式不相同。4.3程序中有一個while(1)和其循環(huán)體中的if(flag=O)break;語句,

8、學生可以選擇退出程序或者繼續(xù)做題。4.4在main()函數(shù)外定義一個外部變量type,此變量表示小學生選擇題目的類型,當選擇1時候需要做加法運算,選擇2時候做減法運算,選擇3做乘法運算,選擇4做除法運算,當選擇的不是1234中的一個數(shù)時,通過使用while語句要求小學生輸入正確的題目類型代號。4.5提示要求小學生輸入自己的答案,并將小學生輸入的答案賦給變量temp,然后用while(temp!二answer)語句判斷小學生輸入的答案是否與正確答案相同,如果不同則通過此while的循環(huán)體提示答案錯誤,要求重新輸入正確答案,直到輸入的答案正確后提示答案正確;如果小學生一開始輸入的答案是正確的則直接

9、提示答案正確。4.6定義了一個變量flag,當給flag賦值1時可以繼續(xù)做題,賦值為0時通過break語句退出整個循環(huán)while(1),此時也就退出了測試系統(tǒng)。4.7設計函數(shù)question_get(),首先在main()函數(shù)作函數(shù)聲明,然后開始設計此函數(shù),考慮到當小學生輸入數(shù)字1需要做加法運算,輸入2時候做減法運算,輸入時3做乘法運算,輸入4時做除法運算,所以通過條件ifelse語句分情況設計算法。實驗環(huán)境Microsoftvisualc+程序調試源程序:#include#include#includetime.h/用到了time()函數(shù),所以要包含time.h頭文件/srand(time(

10、NULL)中的time(NULL)就是time函數(shù)調用inttype;main()intquestion_get();/函數(shù)聲明intanswer;inttemp;intflag;退出0type=l非0type=20type=3非0b=0a=0非000)c!=00printf(n%d+%d=?”,a,b);return(a+breturn(c);question_get()函數(shù)”,b+c,b);printf(n%d-%d=?/printf(n%d*%d=?,a,b);c=rand()%500printf(”n%d/%d=?,b*return(c);a=rand()%999;b=999-a;函數(shù)

11、調用處inta,b,c;a=rand()%500;b=rand()%999;c=999-b;c=rand()%c;b=rand()%500;b=1000/a;b=rand()%500;b=rand()%bc=1000/b;a=rand()%50函數(shù)調用處函數(shù)調用處函數(shù)調用處return(a*b)break;X:ProgramFiPesWC*1學生算術四則運算測試系統(tǒng)請禰選擇測試題目的種紅只需輸入數(shù)字代號匸:L加法茲撼法漢乘法鋰除法1G4*-730?朋輸人惋的答菸77-1答棊正晩很好繼續(xù)測試請按退出洌試請按回=1也你選澤測試題目的種無只需輸入數(shù)宇代號三丄加法址磁法3泰鉉銳除法RC:Program

12、FllesVCXMyProjecrtsXxcXDebugxc.e?e繼韁測試請按:L亠退出測試請按0=1請飾選扌睪測試題目的種類,只需輸人數(shù)字代號占1-ioii誠法3乘法4除法232X2=?請輸入飾的答案二8答秦正磺,很好継績測試請按:L亠退出測試請按0=1請你選癢測試題目的種糞,只需輸入裁字代號*:L加法2減法3乘法4除法H1_4425=?請輸入你的答案=CiXPnogramFilesVCFv1yProjecs3ccDebngXc-exe”青你選擇測試題目的種類,只需輸入數(shù)字代號:加法誠法3乘法4除法S酎入代號錯誤,請童新輸人數(shù)字代號二L加法送-誠法3乘法4降法r?0035=?E青輸人你的答

13、乗=Q0忖累正確,很好継綾扌則試請按:L亠退出測試請按日=0Press日n_yke_ytocont:nue4.心得體會5.1在我們設計程序時候,將一個大的問題分成幾個模塊,運用不同的函數(shù)將這些模塊分別設計出來,然后運用函數(shù)調用,我們就可以將這些功能不同的模塊聯(lián)系在一起。5.2在設計程序過程中,我原先定義的變量flag為字符型,當輸入y時繼續(xù)做下題,輸入n時退出系統(tǒng),我發(fā)現(xiàn)無論按哪個字母,在看結果時候發(fā)現(xiàn)有兩條繼續(xù)測試請按1,退出測試請按0:語句輸出,后來經(jīng)過老師的講解我明白了,在連續(xù)的2個scanf函數(shù)中,以字符形式輸入第一個scanf函數(shù)時候,回車鍵會以字符形式存儲在第二個scanf函數(shù)中。

14、5.3要使計算機自動為學生出題,使用了函數(shù)srand(unsigned)time(NULL);這個函數(shù)調用中使用time(NULL)函數(shù)返回值(當前時間)作實參,初始化隨機數(shù)發(fā)生器。rand()函數(shù)調用返回一個隨機數(shù),理論上說,rand()返回一個隨機數(shù),但是每次調用時,隨機數(shù)發(fā)生器返回的隨機數(shù)序列都是一樣的,所以,用當前時間(time(NULL)返回值)作種子對隨機數(shù)發(fā)生器進行初始化,由于每次當前時間不一樣,所以隨機數(shù)發(fā)生器產(chǎn)生的隨機數(shù)序列不一樣,即rand()函數(shù)調用的返回值不一樣,就達到了得到真隨機數(shù)而不是偽隨機數(shù)的目的。5.4深知自己技術水平還不高,編這樣的程序遇到了很多困難,但我相信

15、經(jīng)過今后的不斷學習,我的變成能力會有很大的提高。srand(unsigned)time(NULL);/*srand(unsigned)time(NULL);這個函數(shù)調用中使用time(NULL)函數(shù)返回值(當前時間)作實參,初始化隨機數(shù)發(fā)生器。*/*rand()函數(shù)調用返回一個隨機數(shù),理論上說,rand()返回一個隨機數(shù),但是每次調用時,隨機數(shù)發(fā)生器返回的隨機數(shù)序列都是一樣的,所以,用當前時間(time(NULL)返回值)作種子對隨機數(shù)發(fā)生器進行初始化,由于每次當前時間不一樣,所以隨機數(shù)發(fā)生器產(chǎn)生的隨機數(shù)序列不一樣,即rand()函數(shù)調用的返回值不一樣,就達到了得到真隨機數(shù)而不是偽隨機數(shù)的目的

16、。*/printf(ttt小學生算術四則運算測試系統(tǒng)n);while(1)printf(n請你選擇測試題目的種類,只需輸入數(shù)字代號:n);printf(nl.加法2.減法3.乘法4.除法n);scanf(%d,&type);while(type!=1&type!=2&type!=3&type!=4)/*如果你不是輸入的1234中的一個,則需要重新輸入*/printf(n輸入代號錯誤,請重新輸入數(shù)字代號:n);printf(nl.加法2.減法3.乘法4.除法n);scanf(%d,&type);answer=question_get();/*通過函數(shù)調用返回計算機算出的正確答案*/printf(

17、n請輸入你的答案:n);scanf(%d,&temp);/學生輸入自己的答案while(temp!二answer)/*判斷學生的答案是否與正確的答案相同,若不同則需要輸入正確答案,直到答案正確*/printf(n答案錯誤,重做n);printf(n請輸入正確的答案:n);scanf(%d,&temp);printf(n答案正確,很好n);printf(n繼續(xù)測試請按1,退出測試請按0:n);scanf(%d,&flag);while(flag!=1&flag!=0)printf(n繼續(xù)測試請按1,退出測試請按0:n);scanf(%d,&flag);if(flag=0)break;intque

18、stion_get()/*此函數(shù)作用為為小學生出題,并返回計算機算出的正確答案*/inta,b,c;if(type=1)a二rand()%999;/a二rand()%999則a定小于999b=999-a;/等效于數(shù)學中a+b=999b=rand()%b;/*b=rand()%b將b=999-a帶入,得b=rand()%(999-a),b等于一個隨機數(shù)對999-a取余,則b定小于999-a,即b999-a,也即保證了a+b999*/printf(n%d+%d=?,a,b);return(a+b);/*問題分析:如果將if(type=l)整體改為:if(type=1)a=rand()%999;b=

19、rand()%999;printf(n%d+%d=?,a,b);return(a+b);會發(fā)現(xiàn)有時候做加法運算時,a+b的和會超過999,原因在于a和b均為小于999的數(shù),但a+b可以超過999,如:998+998二?b=999-a;b=rand()%b;這兩條語句成功解決了a+b可能大于999的問題*/elseif(type=2)b=rand()%999;/b小于999c=999-b;/等效于數(shù)學中c+b=999c=rand()%c;/將c=999-b代入其,得c=rand()%(999-b),從而保證c小于999-b,即c999-b,也就保證b+c999printf(n%d-%d二?,b+

20、c,b);/b+c已經(jīng)保證小于999了return(c);/*問題分析:如果此程序段改為:elseif(type=2)b=rand()%999;c=rand()%999;printf(n%d-%d=?,c,b);return(b-c);則在做減法運算的時候可能會出現(xiàn)一個小的數(shù)減一個較大的數(shù)而造成結果為負數(shù),例如:400-800=?原程序段中c=999-b;和c二rand()%c;成功將c定為了比b小的數(shù),從而不會出現(xiàn)負數(shù)*/elseif(type=3)a二rand()%500;/*a小于500由于a有可能等于0,如果a=0,那么后面的語句b=1000/a不能執(zhí)行*/while(a=0)/此循環(huán)

21、保證a不等于0且a小于500a=rand()%500;b=1000/a;/等效于數(shù)學中b*a=1000b=rand()%b;/*將b=1000/a代入b=rand()%b,得b=rand()%(1000/a),則b一定小于1000/a,即b1000/a,也就保證了a*b1000*/printf(n%d*%d二?,a,b);/前面保證了a*b1000return(a*b);/*問題分析:如果此程序段改為:elseif(type=3)a=rand()%500;b=rand()%500;printf(n%d*%d=?,a,b);return(a*b);則在做乘法時候可能會出現(xiàn)乘積大于999的情況例如

22、:499*499=?原程序段很好解決了這個問題,還可以將a=rand()%500;和b=rand()%500;語句改為a=rand()%30和b=rand()%33;不過這樣改不會出現(xiàn)乘數(shù)和被乘數(shù)至少有一個大于33的情況,例如:45*458=?*/elseb=rand()%500;/b小于500由于b有可能等于0,如果b=0,那么后面的語句c=1000/b不能執(zhí)行while(b=0)/此循環(huán)保證b不等于0且b小于500b=rand()%500;c=1000/b;/等效于數(shù)學中b*c=1000while(1)/保證執(zhí)行循環(huán)體后c不等于0c=rand()%c;/將c=1000/b代入,得c=ran

23、d()%(1000/b),則c一定小于1000/b,保證了b*c1000if(c!=0)/保證c不等于0break;printf(n%d/%d二?,b*c,b);/前面已近保證b*c1000且c已近保證不等于0,若沒有保證c不等于0,則會return(c);/*問題分析:如果將此程序段改為:elseb=rand()%500;while(1)c=rand()%500;if(c!=0)break;printf(n%d/%d=?,b*c,b);return(c);因為b=rand()%500;所以b有可能為0,所以b*c為0,所以在做除法的時候會出現(xiàn)0除以0的情況,例如0/0=?這樣的計算在數(shù)學中沒

24、有意義,而計算機返回的答案是0*/設計過程中現(xiàn)場提問(或答辯)記載:除法運算中是如何保證算法除盡的?答:除法程序段為:elseb=rand()%500;while(b=O)此循環(huán)保證b不等于0且b小于500b=rand()%500;c=1000/b;while(l)c=rand()%c;if(c!=0)break;printf(%d/%d=?,b*c,b);return(c);rand()返回一個隨機正整數(shù),利用隨機數(shù)對500求余數(shù),所得的余數(shù)賦給b,則b是小于500的正整數(shù),通過循環(huán)保證b不等于0,將語句c=1000/b;代入語句c=rand()%c;中,則可以認為c=rand()%(100

25、0/b),那么c一定是小于1000/b的正整數(shù),且b*c一定小于999。通過循又環(huán)保證了c不等于0,printf(%d/%d=?,b*c,b);語句中b*c為一整數(shù),用它除以整數(shù)b,則答案為整數(shù)c,所以除法運算可以除盡。如果要求系統(tǒng)規(guī)定小學生做完多少道題目后(例如20道題后)自動退出系統(tǒng)且需要統(tǒng)計小學生做對以及做錯的個數(shù),如何實現(xiàn)?答:只需要將main()函數(shù)修改為:main()intquestion_get();intanswer;inttemp;intn=1;intright;intwrong;intflag;srand(unsigned)time(NULL);printf(ttt小學生算術四則運算測試系統(tǒng)n);right=0;wrong=0;while(nv=20)printf(n請你選擇測試題目的種

溫馨提示

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

評論

0/150

提交評論