小學數學測試系統C課程設計報告及源程序代碼_第1頁
小學數學測試系統C課程設計報告及源程序代碼_第2頁
小學數學測試系統C課程設計報告及源程序代碼_第3頁
小學數學測試系統C課程設計報告及源程序代碼_第4頁
小學數學測試系統C課程設計報告及源程序代碼_第5頁
已閱讀5頁,還剩13頁未讀 繼續免費閱讀

下載本文檔

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

文檔簡介

課程設計報告課程名稱C語言課程設計課題名稱小學數學測試系統專業班級學號姓名指導教師2021年01月06日

湖南工程學院課程設計任務書課程名稱C語言課程設計課題小學數學測試系統專業班級學生姓名學號指導教師審批任務書下達日期2021年12月26日任務完成日期2021年01月06日一、設計內容與設計課題九:小學數學測試系統。具體內容見附錄。2.設計要求:1〕設計正確,方案合理。2〕界面友好,使用方便。3〕程序精煉,構造清晰。4〕上機演示。3.設計報告要求:課程設計報告格式如下:1〕正文格式:一級標題用3號黑體,二級標題用四號宋體加粗,正文用小四號宋體,行距為22。2〕正文內容:課題主要功能、課題功能模塊劃分、主要功能實現、程序調試、總結、附件〔所有程序源代碼,要求對程序寫出必要注釋〕,課程設計報告需5000字左右〔不含附件〕。3〕課程設計報告裝訂順序:封面、任務書、目錄、正文、評分、程序清單附件。二、進度安排星期日〔17周〕星期一〔18周〕星期四〔18周〕星期五〔18周〕星期日〔18周〕14:00-17:0018:00-21:0018:00-21:0018:00-21:00交報告上課時間另外安排。附錄:設計課題九:小學數學測試系統一、問題描述:本系統可以用來進展簡單數學測試,并累計成績,包括用戶注冊、用戶登錄、用戶刪除、題目測試、信息保存等功能。二、功能描述:1、本系統采用構造體數組,每個數據構造應當包括:用戶名、用戶密碼、共測試題目數、答對題目數。2、系統功能:用戶注冊:即添加新用戶名、用戶密碼。用戶登錄:在進展數學測試之前,需進展登錄,假設沒有該用戶,需進展注冊。題目測試:系統自動生成題目(注意題目合理性,題目結果不能是負數,除數不能是0等),用戶給出答案,系統可以自動測試其正確性,同時統計成績。信息保存:當注冊成功、題目測試完畢后將用戶信息及成績保存到文件。e.退出系統。3、系統使用說明:執行一個具體功能之后,程序將重新顯示功能菜單。系統功能并不限于上述,可以對其進展擴大完善,如題目自動生成,可以只是簡單加減乘除運算,也可以生成復雜四那么混合運算。同時,用戶界面友好也很重要,當輸入錯誤答案,需給出提示信息。三、測試數據:用戶>=3,題目數>=5目錄TOC\o"1-1"\u1系統需求分析 62概要設計 63詳細設計 104系統測試 155 課程設計總結 181系統需求分析小學生數學測試系統具有隨機出題,自動評分,查看答案,錯題重做等功能系統;其屬性有:1.主界面設計,選擇各種功能。2.系統隨機出題,顯示算式,含加,減,乘,除四那么運算。3.練習時,系統隨機出題,鍵入答案,可顯示對錯。4.測試時,系統自動出題,每題得分,再統計得分。5.題對錯信息,錯誤給出答案。2概要設計系統功能模塊圖:小學小學數學測試系統學生成績管理模塊測試模塊注冊登錄模塊查看結果模塊錯題重做模塊2.1注冊登錄模塊 提示用戶輸入姓名和學號,如果已經有記錄那么將本次登錄用戶信息追加儲存在文件中,如果沒有記錄,那么創立一個新文件儲存:其模塊圖如下列圖所示:注冊登錄模塊提示輸入姓名學號創立文件記錄學生信息判斷是否有記錄2.注冊登錄模塊提示輸入姓名學號創立文件記錄學生信息判斷是否有記錄進入開場測試菜單后,開場計時,選擇加減乘除四種運算類型,總體來說測試模塊可以分為:加法運算、減法運算、乘法運算、除法運算四局部四局部功能相似選擇類型后,在選擇題數目為〔5,10,20,50,100〕,然后再選擇難度,這時開場做題〔題目利用隨機函數隨機出題〕,然后判斷正誤并給出正確率,錯誤結果存入一個文件中以備錯題重做,將所有做題結果存入另個文件中以便查看結果;測試模塊測試模塊加法運算減法運算乘法運算除法運算2.3學生成績管理模塊 本模塊首先將每次測試同學姓名,學號,成績存入一個文件中,每次測試同學信息不覆蓋之前同學信息,然后將文件中信息讀取到構造體中進展排序,最后利用構造體將排好序成績顯示到屏幕上,其模塊如下所示圖:學生成績管理模塊學生成績管理模塊存入測試學生成績信息查看排名榜創立學生成績信息文件排列順序2.4查看結果模塊 利用測試模塊存儲結果信息文件進展直接讀取,期間用到fgetc函數將文件信息讀取出來,其圖如下列圖所示:查看結果模塊查看結果模塊翻開存儲結果的文件讀取文件2.5錯題重做模塊測試模塊過程已將錯題和錯題答案分別出入到文件中,直接進展翻開存儲錯題文件逐個讀取錯題,這時利用scanf函數輸入答題者答案,最后再翻開儲存錯題答案文件進展核對正確答案,其模塊如下列圖所示:錯題重做模塊讀取錯題錯題重做模塊讀取錯題進展重做核對答案翻開錯題存儲文件系統流程圖:開場開場輸入姓名輸入學號主菜單開始測試查看排名錯題重做查看結果完畢測試加法減法乘法除法選擇題數選擇難度測試退出返回保存3詳細設計3.1登錄功能得具體實現:用到兩個函數Savemessage()和Judge()兩個函數,其中Savemessage()函數用來,保存學生輸入信息,將輸入學生信息保存到studentmessage.txt"和TestResult.txt文件中,保存過程中,先輸入到構造體中,再利用fwrite(&s[0],sizeof(structStudent),1,fp);語句向文件studentmessage.txt中寫入一條記錄,即剛剛輸入學生姓名和學號;利用fprintf(fp1,"登錄完后進入測試界面此時開場計時有語句{printf("請計時輸入開場時間(點,分):");scanf("%d,%d",&hourA,&minA);}進展輸入計時。然后進入測試界面菜單: 3.2測試功能得實現①選測試類型:測試功能菜單分為5個,其中1~4為選擇類型,5返回主菜單;具體實現選擇功能有while(choose<1||choose>5){printf("超出功能范圍,請重新選擇(15):");scanf("%d",&choose);}輸入1~5之間一個數,再用switch(choose){}進展選擇對應功能 如上圖選擇1后進入②選題數目:進展選擇題目數目,輸入要測試題目數被限制(5/10/20/50/100)五個數用句while(thnum<5||thnum>5&&thnum<10||thnum>10&&thnum<||thnum>20&&thnum<50||thnum>50&&thnum<100||thnum>100){printf("超出功能范圍,請重新選擇(5/10/20/50/100):");scanf("%d",&thnum);}由此語句實現對題目數限制,但超出范圍后那么提示重新輸入。在begain()中調用Addition(intnumber)控制循環語句for(inti=0;i<number;i++) {if(m==1){num1=rand()%n;num2=rand()%n;}//產生一位隨機數,num1,num2if(m==2){num1=10+rand()%(n-10);//產生兩位隨機數num1,num2 num2=10+rand()%(n-10);}if(m==3){num1=100+rand()%(n-100);//產生三位隨機數num1,num2 num2=100+rand()%(n-100);}printf(" %d+%d=",num1,num2);scanf("%d",&num4);通過控制循環次數來控制產生題數目.③選難度實現: 利用隨機函數rand()%n;中n不同值產生不同位數隨機書實現難度控制,n=10時用語句num1=rand()%n產生一位數;n=100時用語句num1=10+rand()%(n-10)產生二位數;n=1000時用num1=100+rand()%(n-100)產生三位數;具體有語句printf("請選擇難度:");scanf("%d",&m);system("cls");//清屏{ if(m==1)n=10; if(m==2)n=100;elseif(m==3)n=1000;}for(inti=0;i<number;i++) {if(m==1){num1=rand()%n;num2=rand()%n;}if(m==2){num1=10+rand()%(n-10); num2=10+rand()%(n-10);}if(m==3){num1=100+rand()%(n-100); num2=100+rand()%(n-100);}}實現控制難度,并有rand()%n產生隨機數實現隨機出題功能。④自動評分實現和數據儲存系統會將輸入答案與正確答案進展逐一比擬,如果正確那么將結果只記錄到TestResult.txt中,以便查看結果;如果錯誤,那么將錯誤題正確結果記錄到failedResult.txt中,以便錯題重做,將錯誤題正確結果記錄到rightResult.txt中,TestResult.txt中,以便核對錯題答案,在此過程中系統會自動統計正確結果個數和錯誤個數,從而利用average=float(count1)/float(number);自動得到分數。具體程序如下:if(num3==num4) {fprintf(fp," %d+%d= %d %d \n",num1,num2,num4,num3); count1++;}else{fprintf(fp," %d+%d= %d %d ×\n",num1,num2,num4,num3); fprintf(fp2," %d+%d=\n",num1,num2,num4,num3);fprintf(fp3," %d+%d=%d\n",num1,num2,num3);}}}average=float(count1)/float(number);fprintf(fp," 正確%d道,錯誤%d道,正確率為:%f\n\n",count1,count2,average);A=A+average*100;//總分nu++;//記錄做不同類型題次數以便算平均分⑤減乘除過程和原理和加法一樣其工作界面分別為減法;乘法;除法;除法其它功能得實現與加法一樣只有分母不為零,用num2=n/10+rand()%(n-n/10)語句進展實現,其中rand()%(n-n/10)產生0到n-n/10-1數;n/10+rand()%(n-n/10)產生n/10到n-1數;例如n=100時產生10到99兩位數;從而實現了分母不為零,同時也實現了難度控制。3.3查看結果實現: 測試過程中已經將結果記錄存到TestResult.txt中,只需翻開文件讀取出記錄即可voidShowResult()//顯示測試結果函數{FILE*fp;if((fp=fopen("TestResult.txt","r"))==NULL);exit(0);}charch;ch=fgetc(fp);//文件開頭字符while(ch!=EOF)//當文件沒有到尾時,一直循環{putchar(ch);//輸出字符ch=fgetc(fp);}fclose(fp);}有此函數就可直接讀取查看結果。3.4排名實現此過程中將將每次做題情況及學生信息記錄到文件中,然后再將中一條條記錄讀取到構造體中,用冒泡法進展排序,最后直接從構造體中讀取排好序成績;其具體程序:voidsort()//實現排序{FILE*fp5;inti,j,m;s[0].avscore=A/nu;fp5=fopen("nrecord.txt","a+");fclose(fp5);fp5=fopen("nrecord.txt","rb");for(i=0;!feof(fp5);i++){fscanf(fp5,"%s %s%f\n",s[i].name,s[i].num,&s[i].avscore);}fclose(fp5);m=i;structStudenttemp;for(i=0;i<m;i++){for(j=0;j<m-1;j++) if(s[j].avscore<s[j+1].avscore) {strcpy(,s[j].name);strcpy(temp.num,s[j].num);temp.avscore=s[j].avscore;strcpy(s[j].name,s[j+1].name);strcpy(s[j].num,s[j+1].num); s[j].avscore=s[j+1].avscore;strcpy(s[j+1].name,);strcpy(s[j+1].num,temp.num); s[j+1].avscore=temp.avscore;}}//輸出排名結果 printf******************************************************\n"); printf("查看你排名〔排序結果由高到低):\n"); printf("姓名 學號 分數\n");for(i=0;i<m;i++) {printf(" %s %s%4.2f\n",s[i].name,s[i].num,s[i].avscore);}}錯題重做測試過程中已將錯題和錯題答案分別存入到failedResult.txt和文件中,直接進展翻開存儲錯題文件逐個讀取錯題,這時利用scanf函數輸入答題者答案,最后再翻開儲存錯題答案文件進展核對正確答案具體程序為:voidrework()//錯題重做{inta;charch;FILE*fp2,*fp3; if((fp2=fopen("failedResult.txt","a+"))==NULL) {printf("翻開文件失敗\n");exit(0);} if((fp3=fopen("rightResult.txt","a+"))==NULL) {printf("翻開文件失敗\n");exit(0);}printf("********************錯題重做***************************************\n");while(!feof(fp2))if(ch=='=') scanf("%d",&a);}//輸入答案 fp2=fopen("failedResult.txt","w");//清空之前數據 fclose(fp2); printf("========小朋友請查看正確答案============================\n");while(!feof(fp3)) fclose(fp3);fp3=fopen("rightResult.txt","w");//清空 fclose(fp3);}完畢測試中選擇主菜單完畢功能時,系統那么提示輸入完畢時間,輸入后,系統將自動生成所用時間,然后系統將把學生所有信息記錄到以學生,學號命名文件中.具體實現過程如下;void()//文件復制函數,用來保存測試結果,當然文件名不能重復,{FILE*in,*out;strcat(s[0].num,".txt");//將字符串".txt"連接到字符串student[0].num后,即以學號為文件名,后綴為.txt文件中,保存在工程目錄下if((in=fopen("TestResult.txt","r"))==NULL) {in=fopen("TestResult.txt","w+");printf("無文件記錄,已新建.\n");}if((out=fopen(s[0].num,"w"))==NULL)//翻開文件學號.txt文件〔如030.txt〕,"w"方式為只寫方式 {printf("翻開文件失敗\n");exit(0);}fputc(fgetc(in),out);//逐個字符寫入fclose(in);fclose(out);}voidTestOver()//程序測試完畢函數{printf("\n\n測試完畢你測試結果保存在%s中\n\n",s[0].num);//輸出測試結果記錄提示}4系統測試登錄模塊測試模塊①選測試類型②選題數目③選難度實現4.3查看學生成績模塊錯題重做模塊4.5測試時出現錯誤與分析總結程序設計為構造化和模塊化,用函數間相互調用來實現系統功能,為調試帶來了一定方便。在調試過程中,出現了很多問題,其中文件和構造體之間轉換最為困難,在一段時間內,影響到了錯題重做,排名等功能實現;問題一:程序中屢次用到了文件讀寫,用文件記錄信息,屢次出現讀不出來,記錄不到文件中,還出現亂碼。解決方法:認真學習和反復研究了,文件讀寫函數fprintf,fscanf,fread,fwrite,fgetc,在反復調試中終于解決了此問題。問題二:由于學生信息均記錄在文件中,而文件不能直接排序需轉換到構造體中進展排序,給整個排序過程帶來了相當大困難,出現了轉換不到構造體中,和亂碼現象。 解決方法:首先檢查了為文件是否將信息記錄了下來,確認有數據后,用fscanf,fread,進展了反復更換,此過程中反復運行查看構造體是否有輸出。最終實現了文件與構造體之間數據傳遞,實現了排序功能. 問題三:錯題重做有一定困難,怎樣將錯題一個個及記錄下來,并且能讀出來重新做,產生了一定困難。解決方法:采用了文件記錄錯題和錯題答案,用fgetc函數實現了讀出記錄錯題,從而實現了錯題重做功能。此外在調試過程中也遇到了相當多其他問題,從整體構造設計,到各個功能實現.課程設計總結這次課程設計實驗是對我們進入大學以來學習C語言結果是一次大考驗。自己動手,發現問題和解決問題。并發現了許多自己缺乏,平時沒掌握知識在實踐中暴漏,經過不斷思考,查閱書籍和上網查資料及上機運行,解決了大局部問題,還稍微有些小問題。但是,我相信在今學習中,一定能把它解決好。當今計算機應用在生活中可以說得是無處不在。因此作為二十一世紀大學來說掌握程序開發技術是十分重要,而C語言又是最常見,功能最強大一種高級語言,因此做好C語言課程設計是十分必要。我不僅穩固?C語言程序設計?課程學習內容,掌握設計根本方法,強化上機動手能力。。本次課程設計編寫小學數學測試系統,它具有隨機出題、自動評分、自動排名,查看正確答案、錯題重做等功能,本系統功能強大,程序大,編寫難度相當大,在編程中,很多知識,幾乎是一片空白。不過后來通過書本和網絡慢慢知道了一點。通過這次課程設計,使我更加深刻地體會到c語言程序編寫過程嚴謹與細致,還有無論做任何事都要有耐心。也懂得了理論與實際相結合是很重要,只有理論知識是遠遠不夠,只有把所學理論知識與實踐相結合起來,從理論中得出結論,才能真正為社會效勞,從而提高自己實際動手能力和獨立思考能力在課程設計過程中,收獲知識,提高能力同時,我也學到了很多人生哲理,懂得怎么樣去制定方案,怎么樣去實現這個方案,并掌握了在執行過程中怎么樣去克制心理上不良情緒。因此在以后生活和學習過程中,我一定會把課程設計精神帶到生活中,是生活也更加好。謝謝田教師這幾天時間對我們指導計算機科學與技術系課程設計評分表課程名稱:C語言程序設計項目評價設計方案合理性與創造性設計與調試結果設計說明書質量辯論陳述與答復下列問題情況課程設計周表現情況綜合成績教師簽名:日期:2021.01.10附錄:源程序#include<stdio.h>//C語言標準輸入輸出頭文件#include<string.h>//字符串操作需要用到頭文件#include<stdlib.h>//文件操作需要用到頭文件#include<time.h>//產生隨機數需要用到頭文件floatA=0;intnu=0;inthourA,hourB,minA,minB;structStudent{charname[21];//姓名charnum[10];//學號floatavscore;}s[50];//構造體數組,存儲學生信息,在此初定為50,可改/**/voidSavemessage()//保存學生輸入信息函數{FILE*fp,*fp1;//定義文件指針,//以下判斷文件翻開與否,"a"方式翻開那么可向文件尾寫數據 {printf("翻開文件失敗\n");exit(0);} {printf("翻開文件失敗\n");exit(0);} printf(" 輸入姓名:");//以下為要學生輸入個人信息 scanf("%s",s[0].name); printf(" 輸入學號:"); scanf("%s",&s[0].num);fwrite(&s[0],sizeof(structStudent),1,fp);//向文件studentmessage.txt中寫入一條記錄,即剛剛輸入學生信息 fprintf(fp1," 學號:%s\n",s[0].num);fclose(fp1);system("cls");//清屏}voidJudge()//判斷函數{inti=0;FILE*fp; //文件指針//以下判斷文件翻開與否,"r"為只讀翻開方式printf("\n\n\n");printf("*************************小學數學測試系統********************\n");printf("**\n");printf("**\n");printf("*************************************************************\n");printf("*注冊*\n");printf("**\n");printf("*輸入姓名*\n");printf("**\n");printf("*輸入學號*\n");printf("**\n\n\n"); {fp=fopen("studentmessage.txt","w+"); //如果沒有studentmessage.txt文件,那么新建此文件,"w+"翻開方式為新建一個文件 printf("無文件記錄,已新建.\n");}while(!feof(fp))//判斷是否到了文件尾 {fread(&s[i],sizeof(structStudent),1,fp);//一行一行從文件中讀出學生信息,保存在構造體數組student[]中 fscanf(fp,"\n");//讀取換行符i++;//i變量保存學生記錄個數if(i==50)//當人數滿時即50個人滿時,因為數組下標從0開場,所以當i為29時 {printf("人數已滿,你已無法測試.\n"); fclose(fp); exit(0);}}}/**/voidAddition(intnumber)//加法運算函數,number為題目數形參{ F

溫馨提示

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

評論

0/150

提交評論