小學(xué)數(shù)學(xué)學(xué)習(xí)系統(tǒng)C語(yǔ)言課程設(shè)計(jì)報(bào)告,有源代碼_第1頁(yè)
小學(xué)數(shù)學(xué)學(xué)習(xí)系統(tǒng)C語(yǔ)言課程設(shè)計(jì)報(bào)告,有源代碼_第2頁(yè)
小學(xué)數(shù)學(xué)學(xué)習(xí)系統(tǒng)C語(yǔ)言課程設(shè)計(jì)報(bào)告,有源代碼_第3頁(yè)
小學(xué)數(shù)學(xué)學(xué)習(xí)系統(tǒng)C語(yǔ)言課程設(shè)計(jì)報(bào)告,有源代碼_第4頁(yè)
小學(xué)數(shù)學(xué)學(xué)習(xí)系統(tǒng)C語(yǔ)言課程設(shè)計(jì)報(bào)告,有源代碼_第5頁(yè)
已閱讀5頁(yè),還剩24頁(yè)未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

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

文檔簡(jiǎn)介

/課程設(shè)計(jì)報(bào)告課程設(shè)計(jì)名稱:C語(yǔ)言課程設(shè)計(jì)課程設(shè)計(jì)題目:小學(xué)數(shù)學(xué)學(xué)習(xí)系統(tǒng)目錄第1章概要設(shè)計(jì)31.1題目的內(nèi)容與要求31.2總體結(jié)構(gòu)3第2章詳細(xì)設(shè)計(jì)42.1數(shù)據(jù)結(jié)構(gòu)設(shè)計(jì)42.2功能設(shè)計(jì)42.2.1學(xué)生信息存儲(chǔ)模塊42.2.2菜單選擇模塊5第3章調(diào)試分析10第4章使用說(shuō)明11參考文獻(xiàn)19附錄〔源代碼21第1章概要設(shè)計(jì)1.1題目的內(nèi)容與要求內(nèi)容:1.具有隨機(jī)出題功能.且可以選擇難度等級(jí).不要混合運(yùn)算功能;2.自動(dòng)評(píng)分功能.當(dāng)用戶電答題后能給出用戶的分值;3.查看正確答案;4.錯(cuò)題重做功能。要求:用戶登錄;程序采用文本菜單界面。1.2總體結(jié)構(gòu)本程序主要分為5個(gè)模塊〔功能模塊圖見(jiàn)圖1.1:1.學(xué)生信息存儲(chǔ)模塊.2.菜單選擇模塊.3.試題測(cè)試模塊.4.得分與排名模塊小學(xué)數(shù)學(xué)學(xué)習(xí)系統(tǒng)小學(xué)數(shù)學(xué)學(xué)習(xí)系統(tǒng)菜單選擇模塊試題測(cè)試模塊得分與排名模塊學(xué)生信息存儲(chǔ)模塊圖1.1第2章詳細(xì)設(shè)計(jì)2.1數(shù)據(jù)結(jié)構(gòu)設(shè)計(jì)首先定義結(jié)構(gòu)體數(shù)組存儲(chǔ)學(xué)生信息.注冊(cè).錄入學(xué)生個(gè)人信息.將學(xué)生信息儲(chǔ)存在TXT文檔中.用指針寫(xiě)入文件.用while循環(huán)語(yǔ)句開(kāi)始寫(xiě)入測(cè)試等級(jí)難度.保存正確結(jié)果.計(jì)算正確率.最后查看排名。2.2功能設(shè)計(jì)2.2.1學(xué)生信息存儲(chǔ)模塊main函數(shù)實(shí)現(xiàn)程序的菜單操作。根據(jù)用戶選擇的不同選項(xiàng)調(diào)用不同的函數(shù).實(shí)現(xiàn)"注冊(cè)"、"輸入學(xué)號(hào)"、"選擇難度答題"、"返回主菜單"等功能。具體情況流程圖如圖2.1所示:算法1在屏幕上輸出"請(qǐng)注冊(cè)"選項(xiàng);2接受用戶輸入開(kāi)始打開(kāi)studentmessage打開(kāi)studentmessageN打開(kāi)TestResult打開(kāi)TestResult文件NY打開(kāi)打開(kāi)failedResult文件N文件打開(kāi)失??!文件打開(kāi)失?。≥敵?輸入:姓名學(xué)號(hào)"Y輸出"輸入:姓名學(xué)號(hào)"結(jié)束結(jié)束圖2.1開(kāi)始2.2.2菜單選擇模塊開(kāi)始開(kāi)始測(cè)試;2.查看排名;3.錯(cuò)題重做;4.查看結(jié)果;5.結(jié)束測(cè)試。開(kāi)始測(cè)試;2.查看排名;3.錯(cuò)題重做;4.查看結(jié)果;5.結(jié)束測(cè)試。定義choose.time=0定義choose.time=0輸出:"選擇功能"輸出:"選擇功能"輸入:"選擇"輸入:"選擇"如超出范圍,請(qǐng)重新選擇如超出范圍,請(qǐng)重新選擇CChoose=1N2Y2輸入當(dāng)前時(shí)間,讀入且清屏輸入當(dāng)前時(shí)間,讀入且清屏CChooseFunc211圖2.221N21Choose=2Choose=2Choose=3NY清屏清屏清屏清屏Choose=4Choose=4ReworkchooseFunc2SortbychengjiReworkchooseFunc2SortbychengjiY清屏清屏ChooseFun2清屏清屏ChooseFun2ShowresultShowresultChoosefunc2FilecopytestaverFilecopytestaver結(jié)束結(jié)束圖2.3開(kāi)始2.2.3試題測(cè)試模塊開(kāi)始打開(kāi)打開(kāi)TestResult輸入num1,num2,num3num4,m,n,count1=count2=0.average輸入num1,num2,num3num4,m,n,count1=count2=0.average輸出"打開(kāi)文件失敗"輸出"打開(kāi)文件失敗"輸出"加法測(cè)試","被加數(shù)+加數(shù)=結(jié)果","選擇難度","1.簡(jiǎn)單2.一般3.困難"輸出"加法測(cè)試","被加數(shù)+加數(shù)=結(jié)果","選擇難度","1.簡(jiǎn)單2.一般3.困難"讀入數(shù)字且賦值于m讀入數(shù)字且賦值于m超出范圍請(qǐng)重新選擇!超出范圍請(qǐng)重新選擇!根據(jù)m運(yùn)算的難度,及算式的位數(shù)。根據(jù)m運(yùn)算的難度,及算式的位數(shù)。2211圖2.42121讀入結(jié)果讀入結(jié)果結(jié)果正確結(jié)果正確Count2=count2+1;Count2=count2+1;AAverage=count1/count2;Average=count1/count2;Average=count1/count2;輸出正確,錯(cuò)誤,正確率分別為:count1,count2,average輸出正確,錯(cuò)誤,正確率分別為:count1,count2,average結(jié)束結(jié)束圖得分與排名模塊開(kāi)始開(kāi)始寫(xiě)入信息打開(kāi)文件打開(kāi)文件關(guān)閉文件關(guān)閉文件打開(kāi)文件打開(kāi)文件寫(xiě)入結(jié)構(gòu)體數(shù)組寫(xiě)入結(jié)構(gòu)體數(shù)組s[j]<s[j+1]s[j]<s[j+1]是否交換位置交換位置s[i]s[i]圖2.6第3章調(diào)試分析在上機(jī)調(diào)試過(guò)程中遇到許多問(wèn)題:引用庫(kù)函數(shù)的頭文件寫(xiě)成"#include"stdio"";變量int類型未先定義后使用;仔細(xì)思考總結(jié).查閱教材解決;將學(xué)生信息輸入后答題.但發(fā)現(xiàn)無(wú)法進(jìn)行下一步功能;解決辦法:按F10鍵進(jìn)行單步調(diào)試.首先發(fā)現(xiàn)指向文件數(shù)據(jù)的指針沒(méi)有數(shù)據(jù).然后對(duì)文件直接進(jìn)行數(shù)據(jù)加入.發(fā)現(xiàn)其他功能能夠?qū)崿F(xiàn).然后對(duì)指向文件數(shù)據(jù)的指針進(jìn)行修改.發(fā)現(xiàn)無(wú)論怎樣修改數(shù)據(jù)都無(wú)法進(jìn)入到文件.于是對(duì)數(shù)據(jù)輸入函數(shù)進(jìn)行修改.發(fā)現(xiàn)犯了一個(gè)比較低級(jí)的錯(cuò)誤.scanf〔""輸入數(shù)據(jù)時(shí)忘記"&"符號(hào).造成數(shù)據(jù)無(wú)法輸入;使用隨機(jī)數(shù)函數(shù).但是調(diào)試過(guò)程中出現(xiàn)"rand<>未定義".無(wú)法產(chǎn)生隨機(jī)數(shù);解決辦法:查找書(shū)籍.發(fā)現(xiàn)是未使用"rand〔"函數(shù)的頭文件.調(diào)用"#include<stdio.h>"后.隨機(jī)函數(shù)問(wèn)題得以解決;第4章使用說(shuō)明〔1.注冊(cè)。先用Judge〔函數(shù)創(chuàng)建studentmessage.txt文件.直接運(yùn)行cicaidan<>;菜單項(xiàng)。調(diào)用Savemessage<>;進(jìn)行注冊(cè)和保存信息。如圖:〔2.開(kāi)始測(cè)試。注冊(cè)后.顯示主菜單ChooseFunc1<>.如圖:選擇1進(jìn)入開(kāi)始測(cè)試模塊.此時(shí)引入時(shí)間.定義全局變量hour1和min1.scanf<"%d,%d",&hour1,&min1>;手動(dòng)輸入這兩個(gè)數(shù)。如圖:之后出現(xiàn)ChooseFunc2<>菜單功能選擇函數(shù).如圖:這里的五個(gè)選項(xiàng)用while循環(huán)使超出功能范圍的不能實(shí)現(xiàn).重新選擇選項(xiàng)。再用switch語(yǔ)句選擇執(zhí)行功能.case1程序如下:switch<choose> {case1:system<"cls">;printf<"加法測(cè)試:輸入要測(cè)試的題目數(shù)<5/10/20/50/100>:">;scanf<"%d",&thnum>;while<thnum<5||thnum>5&&thnum<10||thnum>10&&thnum<20||thnum>20&&thnum<50||thnum>50&&thnum<100||thnum>100> {printf<"超出功能范圍.請(qǐng)重新選擇<5/10/20/50/100>:">;scanf<"%d",&thnum>; }Addition<thnum>;ChooseFunc2<>;break;}system<"cls">;為系統(tǒng)清屏。其他的選項(xiàng)也是如此。下面以加法為例說(shuō)明一下運(yùn)算程序。加法源程序如下:voidAddition<intnumber>{FILE*fp,*fp2,*fp3;if<<fp=fopen<"TestResult.txt","a">>==NULL> {printf<"打開(kāi)文件失敗\n">;exit<0>; }if<<fp2=fopen<"failedResult.txt","a">>==NULL> {printf<"打開(kāi)文件失敗\n">;exit<0>; }if<<fp3=fopen<"rightResult.txt","a">>==NULL> {printf<"打開(kāi)文件失敗\n">;exit<0>; }intnum1,num2,num3,num4,m,n,count1=0,count2=0;floataverage;srand<time<0>>;fprintf<fp,"加法測(cè)試:\n">;fprintf<fp,"被加數(shù)+加數(shù)=你的結(jié)果是否正確\n">;printf<"\n">;printf<"選擇難度\n">;printf<"1.簡(jiǎn)單\n">;printf<"2.一般\n">;printf<"3.困難\n">;printf<"\n">;printf<"請(qǐng)選擇難度<1/2/3>:">;scanf<"%d",&m>;while<m<1||m>3> {printf<"超出功能范圍.請(qǐng)重新選擇<1/2/3>:">;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>;}num3=num1+num2;printf<"%d+%d=",num1,num2>;scanf<"%d",&num4>;if<num3==num4>{fprintf<fp,"%d+%d=%d√\n",num1,num2,num4>;count1++; }else{fprintf<fp,"%d+%d=%d×\n",num1,num2,num4>;count2++;fprintf<fp3,"%d+%d=%d\n",num1,num2,num3>;fprintf<fp2,"%d+%d=\n",num1,num2>; } }fclose<fp2>;fclose<fp3>;average=float<count1>/float<number>;fprintf<fp,"正確%d道.錯(cuò)誤%d道,正確率為:%f\n\n",count1,count2,average>;A=A+average*100; c=c+1;fclose<fp>;}定義三個(gè)文件指針?lè)謩e指向三個(gè)文件.打開(kāi)文件開(kāi)始記錄數(shù)據(jù)。number為題目數(shù)形參。srand<time<0>>;初始化隨機(jī)數(shù).如果沒(méi)有此語(yǔ)句.則每次運(yùn)行程序時(shí)的隨機(jī)數(shù)是一樣的。fprintf是向指定的文件中輸入.然后開(kāi)始選擇難易程度.同上.先確定可選范圍。用隨機(jī)函數(shù)num1=rand<>%n;num2=rand<>%n;num3=num1+num2;產(chǎn)生兩個(gè)隨機(jī)數(shù)分別給加數(shù)和被加數(shù).num3儲(chǔ)存的是正確答案。為了使1、2、3與難易聯(lián)系起來(lái).使用if<m==1>n=10;if<m==2>n=100;elseif<m==3>n=1000;來(lái)實(shí)現(xiàn)轉(zhuǎn)換.當(dāng)m為1時(shí).將n=10帶入num1=rand<>%n中.將產(chǎn)生一位數(shù)的隨機(jī)數(shù).即簡(jiǎn)單題。同理.當(dāng)m為2時(shí).num1=10+rand<>%<n-10>;num2=10+rand<>%<n-10>;rand<>%〔n-10的隨機(jī)數(shù)的取值范圍是0―89.加上10后取值范圍為10―99.所以將產(chǎn)生兩位數(shù)的隨機(jī)數(shù).即一般題。當(dāng)m為3時(shí).num1=100+rand<>%<n-100>;num2=100+rand<>%<n-100>;同樣rand<>%<n-100>的取值范圍為0―899.加上100后為100―999.所以將產(chǎn)生三位數(shù)的隨機(jī)數(shù).即困難題。此時(shí)出題完畢。將輸入的數(shù)與正確答案相比較.如果正確的話.則將該題存入文件rightResult.txt中;錯(cuò)誤的話.則將該題存入文件failedResult.txt中。用以用戶查看和錯(cuò)題重做模塊。變量count1記錄正確題目的個(gè)數(shù).變量count2記錄錯(cuò)誤題目的個(gè)數(shù)。然后將這兩個(gè)文件關(guān)閉。再算出平均值.并將上面的值放入文件TestResult.txt中.關(guān)閉文件。A和c為全局變量.為后面的排名做準(zhǔn)備。特別注意在除法中.除數(shù)不能為零.所以另外加個(gè)for循環(huán):for<;num2==0;>{num2=rand<>%n;}使分母不出現(xiàn)零。返回主菜單時(shí).會(huì)輸入結(jié)束時(shí)間:之后會(huì)計(jì)算做題時(shí)間:〔3、查看排名模塊。主菜單中選2.調(diào)用sortbychengji<>函數(shù).程序清單:voidsortbychengji<>{ FILE*fp5;inti,j,m,n,N=1;student[0].avscore=A/c;fp5=fopen<"nrecord.txt","a+">;fprintf<fp5,"%s%s%f\n",student[0].name,student[0].num,student[0].avscore>;fclose<fp5>;fp5=fopen<"nrecord.txt","rb">;for<i=0;!feof<fp5>;i++>{fscanf<fp5,"%s%s%f\n",student[i].name,student[i].num,&student[i].avscore>;}fclose<fp5>;m=i;structStudenttemp;for<i=0;i<m;i++> {n=0;for<j=0;j<m-1;j++> if<student[j].avscore<student[j+1].avscore> {n=1; strcpy<,student[j].name>;strcpy<temp.num,student[j].num>;temp.avscore=student[j].avscore;strcpy<student[j].name,student[j+1].name>;strcpy<student[j].num,student[j+1].num>; student[j].avscore=student[j+1].avscore;strcpy<student[j+1].name,>;strcpy<student[j+1].num,temp.num>; student[j+1].avscore=temp.avscore; }if<n=0>break;}printf<"排序結(jié)果由高到低:\n">;printf<"sortnamenumberavscore\n">;for<i=0;i<m;i++>{printf<"第%d名:%s%s%.1f\n",N++,student[i].name,student[i].num,student[i].avscore>;}}定義文件指針*fp5.指向文件nrecord.txt.打開(kāi)并往里寫(xiě)入姓名、學(xué)號(hào)、總平均值.其中姓名和學(xué)號(hào)是調(diào)用注冊(cè)時(shí)輸入進(jìn)結(jié)構(gòu)體的;每進(jìn)行一次不同運(yùn)算.c的值就會(huì)加一.A是平均值之和。關(guān)閉后再以只讀的方式打開(kāi).利用for循環(huán)寫(xiě)入到結(jié)構(gòu)體數(shù)組中.然后再將里面的數(shù)據(jù)按正確率排序.排序方法是冒泡法.結(jié)構(gòu)變量是個(gè)中間變量。n是個(gè)判斷量.初始值為零.若再出現(xiàn)n=0.意味著沒(méi)有交換了.排序已經(jīng)完成。然后用for循環(huán)輸出.每輸出一次.N增加1。運(yùn)行結(jié)果如圖:〔4、錯(cuò)題重做。主菜單選3進(jìn)入錯(cuò)題重做模塊.定義函數(shù)rework<>。程序清單:voidrework<>{ inta; charch; FILE*fp2,*fp3; if<<fp2=fopen<"failedResult.txt","a+">>==NULL> {printf<"打開(kāi)文件失敗\n">;exit<0>; }while<!feof<fp2>> { ch=fgetc<fp2>;printf<"%c",ch>;if<ch=='='>scanf<"%d",&a>; }fclose<fp2>;printf<"請(qǐng)核對(duì)一下正確答案\n">;if<<fp3=fopen<"rightResult.txt","r">>==NULL> {printf<"打開(kāi)文件失敗\n">;exit<0>; }while<!feof<fp3>> {ch=fgetc<fp3>;printf<"%c",ch>;}fclose<fp3>;}定義兩個(gè)文件指針.一個(gè)用來(lái)打開(kāi)failedResult.txt.在依次讀出文件中的數(shù)據(jù).如果出現(xiàn)=號(hào).則可以輸入一個(gè)數(shù).關(guān)閉文件。打開(kāi)rightResult.txt文件顯示錯(cuò)題答案.關(guān)閉文件?!?、查看結(jié)果。清單如下:voidShowResult<>{FILE*fp;if<<fp=fopen<"TestResult.txt","r">>==NULL> {printf<"打開(kāi)文件失敗\n">;exit<0>; }charch;ch=fgetc<fp>;while<ch!=EOF> {putchar<ch>;ch=fgetc<fp>; }fclose<fp>;}打開(kāi)文件TestResult.txt.ch為文件開(kāi)頭字符.while語(yǔ)句當(dāng)文件沒(méi)有到尾時(shí).一直循環(huán).putchar<ch>;為輸出字符.ch=fgetc<fp>得到下一個(gè)字符.關(guān)閉文件。完成查看。運(yùn)行結(jié)果如圖:最后結(jié)束程序.按任意鍵結(jié)束。六、附錄<見(jiàn)附件>參考文獻(xiàn)[1]譚浩強(qiáng).C語(yǔ)言程設(shè)計(jì)〔第四版[M].北京:高等教育出版社,2010[2]張長(zhǎng)海.C語(yǔ)言程設(shè)計(jì)[M].北京:高等教育出版社,2006[3]吳文虎.程序設(shè)計(jì)基礎(chǔ)〔第二版.北京:清華大學(xué)出版社.2004附錄〔源代碼#include<stdio.h>//C語(yǔ)言標(biāo)準(zhǔn)輸入輸出頭文件#include<string.h>//字符串操作需要用到的頭文件#include<stdlib.h>//文件操作需要用到的頭文件#include<time.h>//產(chǎn)生隨機(jī)數(shù)需要用到的頭文件inthour1=0,min1=0,hour2=0,min2=0,c=0;floatA=0;structStudent{charname[21];//姓名charnum[10]; //學(xué)號(hào)floatavscore;}student[30000];//結(jié)構(gòu)體數(shù)組.存儲(chǔ)學(xué)生的信息.在此初定為30000.可改/********************************************************/voidSavemessage<>//保存學(xué)生輸入信息的函數(shù){FILE*fp,*fp1,*fp2;//定義文件指針.//以下判斷文件打開(kāi)與否,"a"方式打開(kāi)則可向文件尾寫(xiě)數(shù)據(jù)if<<fp=fopen<"studentmessage.txt","a">>==NULL>//打開(kāi)文件studentmessage.txt {printf<"打開(kāi)文件失敗\n">;exit<0>;}if<<fp1=fopen<"TestResult.txt","a">>==NULL>//打開(kāi)文件TestResult.txt {printf<"打開(kāi)文件失敗\n">;exit<0>; }if<<fp2=fopen<"failedResult.txt","a">>==NULL>//打開(kāi)文件failedResult.txt {printf<"打開(kāi)文件失敗\n">;exit<0>; }fclose<fp2>;printf<"輸入姓名:">;//以下要學(xué)生輸入個(gè)人信息scanf<"%s",student[0].name>;printf<"輸入學(xué)號(hào):">;scanf<"%s",&student[0].num>;fwrite<&student[0],sizeof<structStudent>,1,fp>;//向文件studentmessage.txt中寫(xiě)入一條記錄.即剛剛輸入的學(xué)生信息fprintf<fp,"\n">;//向文件studentmessage.txt中寫(xiě)入換行符號(hào).換行符不可見(jiàn)fprintf<fp1,"姓名:%s\n",student[0].name>;fclose<fp>;//關(guān)閉文件studentmessage.txt//以下為向文件TestResult.txt中寫(xiě)入剛剛輸入的學(xué)生信息fprintf<fp1,"學(xué)號(hào):%s\n",student[0].num>;fclose<fp1>;//關(guān)閉文件TestResult.txtsystem<"cls">;//清屏}/******************************************************/voidsortbychengji<>{ FILE*fp5;inti,j,m,n,N=1;student[0].avscore=A/c;fp5=fopen<"nrecord.txt","a+">;fprintf<fp5,"%s%s%f\n",student[0].name,student[0].num,student[0].avscore>;//將數(shù)據(jù)寫(xiě)入文件nrecord.txt中fclose<fp5>;fp5=fopen<"nrecord.txt","rb">;for<i=0;!feof<fp5>;i++>{fscanf<fp5,"%s%s%f\n",student[i].name,student[i].num,&student[i].avscore>;}fclose<fp5>;m=i;structStudenttemp;for<i=0;i<m;i++> {n=0;for<j=0;j<m-1;j++> if<student[j].avscore<student[j+1].avscore> {n=1; strcpy<,student[j].name>;//利用結(jié)構(gòu)變量temp實(shí)現(xiàn)數(shù)組元素的交換strcpy<temp.num,student[j].num>;temp.avscore=student[j].avscore;strcpy<student[j].name,student[j+1].name>;strcpy<student[j].num,student[j+1].num>; student[j].avscore=student[j+1].avscore;strcpy<student[j+1].name,>;strcpy<student[j+1].num,temp.num>; student[j+1].avscore=temp.avscore; }if<n=0>break;//若n=0.意味著沒(méi)有交換了.排序已經(jīng)完成}printf<"排序結(jié)果由高到低:\n">;printf<"sortnamenumberavscore\n">;for<i=0;i<m;i++>{printf<"第%d名:%s%s%.1f\n",N++,student[i].name,student[i].num,student[i].avscore>;}}/*******************************************************/voidJudge<>//判斷函數(shù){FILE*fp;//文件指針//以下判斷文件打開(kāi)與否,"r"為只讀打開(kāi)方式if<<fp=fopen<"studentmessage.txt","r">>==NULL>//以下判斷文件打開(kāi)與否//打開(kāi)文件studentmessage.txt {fp=fopen<"studentmessage.txt","w+">;//如果沒(méi)有studentmessage.txt文件.則新建此文件."w+"打開(kāi)方式為新建一個(gè)文件printf<"無(wú)文件記錄.已新建.\n">; }inti=0;charnum1[10];//變量.注冊(cè)的學(xué)號(hào)while<!feof<fp>>//判斷是否到了文件尾 {fread<&student[i],sizeof<structStudent>,1,fp>;//一行一行從文件中讀出學(xué)生信息.保存在結(jié)構(gòu)體數(shù)組student[]中fscanf<fp,"\n">;//讀取換行符i++;//i變量保存學(xué)生記錄個(gè)數(shù) }system<"cls">;//清屏fclose<fp>;}/********************************************************/voidAddition<intnumber>//加法運(yùn)算函數(shù).number為題目數(shù)形參{FILE*fp,*fp2,*fp3;if<<fp=fopen<"TestResult.txt","a">>==NULL> {printf<"打開(kāi)文件失敗\n">;exit<0>;}if<<fp2=fopen<"failedResult.txt","a">>==NULL> {printf<"打開(kāi)文件失敗\n">;exit<0>; }if<<fp3=fopen<"rightResult.txt","a">>==NULL> {printf<"打開(kāi)文件失敗\n">;exit<0>; }intnum1,num2,num3,num4,m,n,count1=0,count2=0;floataverage;//正確率變量.注意是float類型srand<time<0>>;//初始化隨機(jī)數(shù).如果沒(méi)有此語(yǔ)句.則每次運(yùn)行程序時(shí)的隨機(jī)數(shù)是一樣的fprintf<fp,"加法測(cè)試:\n">;//向文件寫(xiě)入fprintf<fp,"被加數(shù)+加數(shù)=你的結(jié)果是否正確\n">;//向文件寫(xiě)入printf<"\n">;printf<"選擇難度\n">;printf<"1.簡(jiǎn)單\n">;printf<"2一般\n">;printf<"3.困難\n">;printf<"\n">;printf<"請(qǐng)選擇難度<1/2/3>:">;scanf<"%d",&m>;while<m<1||m>3>//不在以上所列的功能以內(nèi)時(shí)循環(huán) {printf<"超出功能范圍.請(qǐng)重新選擇<1/2/3>:">;scanf<"%d",&m>; }system<"cls">;//清屏 {if<m==1>n=10;//將m的值轉(zhuǎn)化為對(duì)應(yīng)的n值.從而使隨機(jī)函數(shù)出現(xiàn)1位.2位.3位。if<m==2>n=100;elseif<m==3>n=1000; }for<inti=0;i<number;i++>//小于測(cè)試題目數(shù)時(shí).循環(huán) {if<m==1> {num1=rand<>%n;//產(chǎn)生隨機(jī)數(shù).賦值給num1.作為被加數(shù) num2=rand<>%n;}//產(chǎn)生隨機(jī)數(shù).賦值給num2.作為加數(shù)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>;}num3=num1+num2;//num3保存正確結(jié)果printf<"%d+|%d=",num1,num2>;//在終端屏幕上輸出題目scanf<"%d",&num4>;//你要輸入的計(jì)算結(jié)果if<num3==num4>//正確結(jié)果與你計(jì)算的結(jié)果比較.正確的話 {fprintf<fp,"%d+%d=%d√\n",num1,num2,num4>;//向文件中寫(xiě)入count1++;//變量count1記錄正確題目的個(gè)數(shù) }else//錯(cuò)誤的話.即num1!=num2時(shí) {fprintf<fp,"%d+%d=%d×\n",num1,num2,num4>;count2++;//變量count2記錄錯(cuò)誤題目的個(gè)數(shù)fprintf<fp3,"%d+%d=%d\n",num1,num2,num3>;fprintf<fp2,"%d+%d=\n",num1,num2>; } }fclose<fp2>;fclose<fp3>;average=float<count1>/float<number>;//計(jì)算正確率.注意int整型要轉(zhuǎn)換為float類型fprintf<fp,"正確%d道.錯(cuò)誤%d道,正確率為:%f\n\n",count1,count2,average>; A=A+average*100; c=c+1;fclose<fp>;}/*************************************************************/voidSubtracter<intnumber>//減法運(yùn)算函數(shù).注釋與加法一樣{FILE*fp,*fp2,*fp3;if<<fp=fopen<"TestResult.txt","a">>==NULL> {printf<"打開(kāi)文件失敗\n">;exit<0>; }if<<fp2=fopen<"failedResult.txt","a">>==NULL> {printf<"打開(kāi)文件失敗\n">;exit<0>; }if<<fp3=fopen<"rightResult.txt","a">>==NULL> {printf<"打開(kāi)文件失敗\n">;exit<0>; }intnum1,num2,num3,num4,count1=0,n,m,count2=0;floataverage;srand<time<0>>;fprintf<fp,"減法測(cè)試:\n">;fprintf<fp,"被減數(shù)-減數(shù)=你的結(jié)果是否正確\n">;printf<"\n">;printf<"選擇難度\n">;printf<"1.簡(jiǎn)單\n">;printf<"2.一般\n">;printf<"3.困難\n">;printf<"\n">;printf<"請(qǐng)選擇難度<1/2/3>:">;scanf<"%d",&m>;while<m<1||m>3>//不在以上所列的功能以內(nèi)時(shí)循環(huán) {printf<"超出功能范圍.請(qǐng)重新選擇<1/2/3>:">;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>;}num3=num1-num2;printf<"%d-%d=",num1,num2>;scanf<"%d",&num4>;if<num3==num4> {fprintf<fp,"%d-%d=%d√\n",num1,num2,num4>;count1++; }else {fprintf<fp,"%d-%d=%d×\n",num1,num2,num4>;count2++;fprintf<fp3,"%d-%d=%d\n",num1,num2,num3>;fprintf<fp2,"%d-%d=\n",num1,num2>; }} fclose<fp2>;fclose<fp3>;average=float<count1>/float<number>;fprintf<fp,"正確%d道.錯(cuò)誤%d道,正確率為:%f\n\n",count1,count2,average>;A=A+average*100; c=c+1;fclose<fp>;}/************************************************************/voidMultiplication<intnumber>//乘法運(yùn)算函數(shù).注釋與加法一樣{FILE*fp,*fp2,*fp3;if<<fp=fopen<"TestResult.txt","a">>==NULL> {printf<"打開(kāi)文件失敗\n">;exit<0>; }if<<fp2=fopen<"failedResult.txt","a">>==NULL> {printf<"打開(kāi)文件失敗\n">;exit<0>; }if<<fp3=fopen<"rightResult.txt","a">>==NULL> {printf<"打開(kāi)文件失敗\n">;exit<0>; }intnum1,num2,num3,num4,m,n,count1=0,count2=0;floataverage;srand<time<0>>;fprintf<fp,"乘法測(cè)試:\n">;fprintf<fp,"被乘數(shù)*乘數(shù)=你的結(jié)果是否正確\n">;printf<"\n">;printf<"選擇難度\n">;printf<"1.簡(jiǎn)單\n">;printf<"2.一般\n">;printf<"3.困難\n">;printf<"\n">;printf<"請(qǐng)選擇難度<1/2/3>:">;scanf<"%d",&m>;while<m<1||m>3>//不在以上所列的功能以內(nèi)時(shí)循環(huán) {printf<"超出功能范圍.請(qǐng)重新選擇<1/2/3>:">;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>;}num3=num1*num2;printf<"%d*%d=",num1,num2>;scanf<"%d",&num4>;if<num3==num4> {fprintf<fp,"%d*%d=%d√\n",num1,num2,num4>;count1++; }else {fprintf<fp,"%d*%d=%d×\n",num1,num2,num4>;count2++;fprintf<fp3,"%d*%d=%d\n",num1,num2,num3>;fprintf<fp2,"%d*%d=\n",num1,num2>; } }fclose<fp2>;fclose<fp3>;average=float<count1>/float<number>;fprintf<fp,"正確%d道.錯(cuò)誤%d道,正確率為:%f\n\n",count1,count2,average>; A=A+average*100; c=c+1;fclose<fp>;}/************************************************************/voidDivision<intnumber>//和加法運(yùn)算函數(shù)注釋類似。{FILE*fp,*fp2,*fp3;if<<fp=fopen<"TestResult.txt","a">>==NULL> {printf<"打開(kāi)文件失敗\n">;exit<0>; }if<<fp2=fopen<"failedResult.txt","a">>==NULL> {printf<"打開(kāi)文件失敗\n">;exit<0>; }if<<fp3=fopen<"rightResult.txt","a">>==NULL> {printf<"打開(kāi)文件失敗\n">;exit<0>; }intnum1,num2,m,n,count1=0,count2=0;floatnum3,num4,average;//正確率變量.注意是float類型srand<time<0>>;//初始化隨機(jī)數(shù).如果沒(méi)有此語(yǔ)句.則每次運(yùn)行程序時(shí)的隨機(jī)數(shù)是一樣的fprintf<fp,"除法測(cè)試:\n">;fprintf<fp,"被除數(shù)+除數(shù)=你的結(jié)果是否正確\n">;{printf<"\n">;printf<"選擇難度\n">;printf<"1.簡(jiǎn)單\n">;printf<"2.一般\n">;printf<"3.困難\n">;printf<"\n">;printf<"請(qǐng)選擇難度<1/2/3>:">;scanf<"%d",&m>;while<m<1||m>3>//不在以上所列的功能以內(nèi)時(shí)循環(huán) {printf<"超出功能范圍.請(qǐng)重新選擇<1/2/3>:">;scanf<"%d",&m>; }system<"cls">;//清屏 {if<m==1>n=10;if<m==2>n=100;elseif<m==3>n=1000;}printf<"保留小數(shù)點(diǎn)一位\n">;for<inti=0;i<number;i++>//小于測(cè)試題目數(shù)時(shí).循環(huán) {if<m==1> {num1=rand<>%n;//產(chǎn)生隨機(jī)數(shù).賦值給num1.作為被除數(shù)num2=rand<>%n;}//產(chǎn)生隨機(jī)數(shù).賦值給num2.作為除數(shù)for<;num2==0;> {num2=rand<>%n;}//使分母不出現(xià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>;}num3=<float><num1>/<float><num2>;//num3保存正確結(jié)果printf<"%d/%d=",num1,num2>;//在終端屏幕上輸出題目scanf<"%f",&num4>;//你要輸入的計(jì)算結(jié)果num3=<int><num3*10>/10.0;//實(shí)現(xiàn)保留小數(shù)點(diǎn)一位if<num3==num4>//正確結(jié)果與你計(jì)算的結(jié)果比較.正確的話 {fprintf<fp,"%d/%=%.1f√\n",num1,num2,num4>;count1++;//變量count1記錄正確題目的個(gè)數(shù) }else//錯(cuò)誤的話.即num1!=num2時(shí) {fprintf<fp,"%d/%d=%.1f×\n",num1,num2,num4>;count2++;//變量count2記錄錯(cuò)誤題目的個(gè)數(shù)fprintf<fp3,"%d/%d=%.1f\n",num1,num2,num3>;fprintf<fp2,"%d/%d=\n",num1,num2>; }}fclose<fp2>;fclose<fp3>; }average=float<count1>/float<number>;//計(jì)算正確率.注意int整型要轉(zhuǎn)換為float類型fprintf<fp,"正確%d道.錯(cuò)誤%d道,正確率為:%f\n\n",count1,count2,average>; A=A+average*100; c=c+1;fclose<fp>;}/*************************************************************/voidrework<>//錯(cuò)題重做{ inta; charch; FILE*fp2,*fp3; if<<fp2=fopen<"failedResult.txt","a+">>==NULL> {printf<"打開(kāi)文件失敗\n">;exit<0>; }while<!feof<fp2>> { ch=fgetc<fp2>;printf<"%c",ch>;if<ch=='='>scanf<"%d",&a>; }fclose<fp2>;printf<"請(qǐng)核對(duì)正確答案\n">;if<<fp3=fopen<"rightResult.txt","r">>==NULL> {printf<"打開(kāi)文件失敗\n">;exit<0>; }while<!feof<fp3>> {ch=fgetc<fp3>;printf<"%c",ch>;}fclose<fp3>;}/*************************************************************/voidTestOver<>//程序測(cè)試完畢函數(shù){printf<"\n\n測(cè)試完畢你的測(cè)試結(jié)果保存在%s中\(zhòng)n\n",student[0].num>;//輸出測(cè)試結(jié)果記錄提示}/*************************************************************/voidShowResult<>//顯示測(cè)試結(jié)果函數(shù){FILE*fp;if<<fp=fopen<"TestResult.txt","r">>==NULL> {printf<"打開(kāi)文件失敗\n">;exit<0>; }charch;ch=fgetc<fp>;//文件開(kāi)頭字符while<ch!=EOF>//當(dāng)文件沒(méi)有到尾時(shí).一直循環(huán) {putchar<ch>;//輸出字符ch=fgetc<fp>;//得到下一個(gè)字符 }fclose<fp>;}/**********************************************************/voidFileCopy<>//文件復(fù)制函數(shù).用來(lái)保存測(cè)試結(jié)果.且文件名不能重復(fù).{FILE*in,*out;strcat<student[0].num,".txt">;//將字符串".txt"連接到字符串student[0].num后.即以學(xué)號(hào)為文件名.后綴為.txt的文件中.保存在所存目錄下if<<in=fopen<"TestResult.txt","r">>==NULL> {in=fopen<"TestResult.txt","w+">;printf<"無(wú)文件記錄.已新建.\n">; }if<<out=fopen<student[0].num,"w">>==NULL>//打開(kāi)文件學(xué)號(hào).txt文件."w"方式為只寫(xiě)方式 {printf<"打開(kāi)文件失敗\n">;exit<0>; }while<!feof<in>>//當(dāng)文件TestResult.txt沒(méi)有結(jié)束時(shí)循環(huán)fputc<fgetc<in>,out>;//逐個(gè)字符寫(xiě)入fclose<in>;fclose<out>;}/***********************************************************/voidChooseFunc2<>;//聲明voidChooseFunc1<>//功能選擇函數(shù){printf<"1.開(kāi)始測(cè)試\n">;printf<"2.查看排名\n">;printf<"3.錯(cuò)題重做\n">;printf<"4.查看結(jié)果\n">;printf<"5.結(jié)束測(cè)試\n">;printf<"\n">;intchoose,time=0;printf<"選擇功能:">;scanf<"%d",&choose>;while<choose<1||choose>5>//不在以上所列的功能以內(nèi)時(shí)循環(huán) {printf<"超出功能范圍.請(qǐng)重新選擇<15>:">;scanf<"%d",&choose>; }switch<choose>//switch語(yǔ)句選擇執(zhí)行功能 { case1:system<"cls">; { printf<"輸入當(dāng)前時(shí)間:小時(shí),分鐘">;//開(kāi)始時(shí)間scanf<"%d,%d",&hour1,&min1>;system<"cls">; }ChooseFunc2<>;break;case2:system<"cls">;//清屏sortbychengji<>;ChooseFunc1<>;break;case3:system<"cls">;//清屏rework<>;ChooseFunc1<>;break;case4:system<"cls">;//清屏ShowResult<>;//調(diào)用函數(shù).即輸出測(cè)試結(jié)果ChooseFunc1<>;break;case5:system<"cls">;//清屏FileCopy<>;//復(fù)制測(cè)試結(jié)果TestOver<>;break; }}/*********************************************************/voidcicaidan<>{printf<"****************************\n">;printf<"****************************\n">;printf<"********\n">;printf<"*請(qǐng)先注冊(cè)*\n">;printf<"********\n">;}/*************************************************************/voidChooseFunc2<>//功能選擇函數(shù){printf<"\n">;printf<"1.加法測(cè)試\n">;printf<"2.減法測(cè)試\n">;printf<"3.乘法測(cè)試\n">;

溫馨提示

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

評(píng)論

0/150

提交評(píng)論