C語(yǔ)言程序設(shè)計(jì)實(shí)習(xí)報(bào)告 行編輯器 學(xué)生管理系統(tǒng)

上傳人:無(wú)*** 文檔編號(hào):137975528 上傳時(shí)間:2022-08-19 格式:DOC 頁(yè)數(shù):47 大?。?84KB
收藏 版權(quán)申訴 舉報(bào) 下載
C語(yǔ)言程序設(shè)計(jì)實(shí)習(xí)報(bào)告 行編輯器 學(xué)生管理系統(tǒng)_第1頁(yè)
第1頁(yè) / 共47頁(yè)
C語(yǔ)言程序設(shè)計(jì)實(shí)習(xí)報(bào)告 行編輯器 學(xué)生管理系統(tǒng)_第2頁(yè)
第2頁(yè) / 共47頁(yè)
C語(yǔ)言程序設(shè)計(jì)實(shí)習(xí)報(bào)告 行編輯器 學(xué)生管理系統(tǒng)_第3頁(yè)
第3頁(yè) / 共47頁(yè)

下載文檔到電腦,查找使用更方便

10 積分

下載資源

還剩頁(yè)未讀,繼續(xù)閱讀

資源描述:

《C語(yǔ)言程序設(shè)計(jì)實(shí)習(xí)報(bào)告 行編輯器 學(xué)生管理系統(tǒng)》由會(huì)員分享,可在線閱讀,更多相關(guān)《C語(yǔ)言程序設(shè)計(jì)實(shí)習(xí)報(bào)告 行編輯器 學(xué)生管理系統(tǒng)(47頁(yè)珍藏版)》請(qǐng)?jiān)谘b配圖網(wǎng)上搜索。

1、 C程序設(shè)計(jì)實(shí)習(xí)報(bào)告 題目:簡(jiǎn)單的行編輯器(修改版) 學(xué) 院: 專(zhuān) 業(yè): 姓 名: 班級(jí)學(xué)號(hào): 指導(dǎo)教師: 2009年 7 月 3 日 前言 由于我們班選題是題號(hào)和學(xué)號(hào)一一對(duì)應(yīng),所以我抽到了16題,簡(jiǎn)單的行編輯器。剛開(kāi)始時(shí)不知道什么叫行編輯器,以為這個(gè)題目有多么的神秘,第二次實(shí)習(xí)時(shí)老師說(shuō)選這個(gè)題目最好換個(gè)題,與老師交流,老師建議在原有的題目上加些功能。只是還是不知道什么叫行編輯器,上網(wǎng),問(wèn)同學(xué),沒(méi)有一點(diǎn)思路。再一次問(wèn)老師,老師說(shuō)不用管它什么是行編輯器,編輯的目的是為了后面對(duì)文件進(jìn)行處理,于是這一次總算有了新的思

2、路。等到這個(gè)題快要做完時(shí),也明白了為什么老師說(shuō)它太簡(jiǎn)單了,做完后自己感覺(jué)都有串改題目之嫌疑,原題的要求實(shí)在太簡(jiǎn)單了,自己加的功能占了程序的大部分。8天下來(lái)感覺(jué)自己對(duì)C語(yǔ)言以及程序編輯的認(rèn)識(shí)加深了許多。以前覺(jué)得很難的結(jié)構(gòu)體,數(shù)組,文件全部用到了,雖然并不能完全掌握,那也有一些成就感。在這里要感謝老師以及我的同學(xué),在整個(gè)編程中給了我很大的幫助。 目錄 前言 II 目錄 III 1題目要求 - 1 - 2需求分析 - 1 - 3概要設(shè)計(jì) - 1 - 3.1設(shè)計(jì)思想 - 1 - 3.2軟件運(yùn)行與開(kāi)發(fā)平臺(tái) -

3、 2 - 3.3數(shù)據(jù)結(jié)構(gòu) - 2 - 3.4系統(tǒng)結(jié)構(gòu)圖 - 2 - 4詳細(xì)設(shè)計(jì) - 3 - 4.1主函數(shù) - 3 - 4.2各功能模塊設(shè)計(jì) - 4 - (1)輸入模塊 - 4 - (2)瀏覽模塊 - 5 - (3)添加模塊 - 6 - (4)查找模塊 - 8 - (5)修改模塊 - 13 - (6)排序模塊 - 16 - (7)保存模塊 - 19 - 4.3公共函數(shù) - 19 - (1)加載函數(shù) - 19 - (2) 學(xué)號(hào)輸入函數(shù) - 20 - (3)輸入三個(gè)科目分?jǐn)?shù)函數(shù) - 20 - (4)求平均值函數(shù) - 21 - (5)輸入整個(gè)記錄函數(shù) - 21 -

4、 (6)修改整條記錄函數(shù) - 21 - (7)顯示數(shù)據(jù)結(jié)構(gòu)項(xiàng)目 - 22 - (8)顯示一個(gè)記錄的函數(shù) - 22 - 5測(cè)試、結(jié)果進(jìn)行分析 - 23 - 5.1進(jìn)入頁(yè)面 - 23 - 5.2數(shù)據(jù)錄入 - 24 - 5.3數(shù)據(jù)錄入成功,直接返回菜單 - 24 - 5.4不進(jìn)行數(shù)據(jù)錄入,直接進(jìn)入菜單。 - 25 - 5.5瀏覽數(shù)據(jù) - 25 - 5.6添加數(shù)據(jù) - 26 - 5.7瀏覽添加后的數(shù)據(jù) - 26 - 5.8查找—按姓名查找 - 27 - 5.9查找—按學(xué)號(hào)查找 - 27 - 5.10修改—對(duì)分?jǐn)?shù)2進(jìn)行修改 - 28 - 5.11排序——按平均分進(jìn)行排序 -

5、28 - 6總結(jié) - 30 - 7參考文獻(xiàn) - 30 - 8附錄 - 31 - 主要程序模塊清單 - 31 - - 43 - 1題目要求 原題:簡(jiǎn)單的行編輯器 【要求】 (1) 設(shè)置一個(gè)簡(jiǎn)單的行編輯器,每行以回車(chē)結(jié)束。 (2) 數(shù)據(jù)以文件形式儲(chǔ)存。 (3) 編輯器具有查找、替換、修改數(shù)據(jù)的功能。 修改后:修改思路是將由行編輯器生成的文件換成有關(guān)結(jié)構(gòu)體的內(nèi)容,建立一個(gè)結(jié)構(gòu)體輸入關(guān)信息,生成文件,再實(shí)現(xiàn)查找、替換、修改數(shù)據(jù)等的功能。這里具體是參考書(shū)上學(xué)生成績(jī)管理系統(tǒng),實(shí)現(xiàn)成績(jī)的錄入,顯示,查找,添加,保存等功能模塊。 2需求分析 根據(jù)題目

6、要求,由于學(xué)生信息是存放在文件中,所以應(yīng)提供文件的輸入、輸出等操作;在程序中需要瀏覽學(xué)生的信息,應(yīng)提供顯示、查找、排序等操作;另外還應(yīng)提供鍵盤(pán)式選擇菜單實(shí)現(xiàn)功能選擇。 3概要設(shè)計(jì) 3.1設(shè)計(jì)思想 由于原題的特點(diǎn),對(duì)題目進(jìn)行了一定的拓展。本著提高自己編程能力,加深對(duì)C語(yǔ)言重點(diǎn)、難點(diǎn)內(nèi)容的理解,添加了關(guān)于結(jié)構(gòu)體、數(shù)組以及文件的運(yùn)用。將程序模塊化,使程序條理清楚,制作簡(jiǎn)單,容易讀懂,并能體會(huì)到程序開(kāi)發(fā)的思想與方法,加深對(duì)C語(yǔ)言編程的認(rèn)識(shí)。 3.2軟件運(yùn)行與開(kāi)發(fā)平臺(tái) C語(yǔ)言,Windows平臺(tái),VC6.0, 3.3數(shù)據(jù)結(jié)構(gòu) 此處選用了結(jié)構(gòu)體的形式來(lái)存放每一個(gè)學(xué)生的信息,對(duì)與若干個(gè)學(xué)生采用

7、了結(jié)構(gòu)體數(shù)組。 3.4系統(tǒng)結(jié)構(gòu)圖 學(xué)生成績(jī)管理系統(tǒng) 數(shù)據(jù)輸入 數(shù)據(jù)顯示 數(shù)據(jù)添加 數(shù)據(jù)查找 數(shù)據(jù)修改 排序 數(shù)據(jù)保存 按姓名查找 按學(xué)號(hào)查找 按分?jǐn)?shù)1排序 按分?jǐn)?shù)2排序 按分?jǐn)?shù)3排序 按平均分排序 4詳細(xì)設(shè)計(jì) 4.1主函數(shù) 主函數(shù)比較簡(jiǎn)單,只提供了輸入和菜單函數(shù)的調(diào)用。各個(gè)功能的模塊用菜單方式選擇。 圖4.1—1 N Y 開(kāi)始 顯示一系列功能選項(xiàng) 輸入n,判斷m是否是1~2 根據(jù)n的值調(diào)用各功能模塊函數(shù) 結(jié)束 【程序】 void main() {int q,w1; printf("\t\t************

8、****行編輯器(修改拓展版)****************\n\n"); printf("\t\t\t\t\t072092\t周磊\t20091002238\n\n"); do { printf("\t\t重新錄入數(shù)據(jù)請(qǐng)按1\t\t進(jìn)入菜單請(qǐng)按2: [ ]\b\b"); scanf("%d",&q); if(q!=1&&q!=2) /*對(duì)選擇數(shù)字作出判斷*/ { w1=1; getchar(); } else w1=0; } while(w1==1); if(q==1) /*i

9、f語(yǔ)句選擇要進(jìn)行的操作*/ enter(); else menu(); } 4.2各功能模塊設(shè)計(jì) (1)輸入模塊 考慮到自己在C學(xué)習(xí)時(shí)遇到的問(wèn)題,以及在考計(jì)算機(jī)二級(jí)時(shí)薄弱的地方,以及聯(lián)系這個(gè)題目的要求,此處選用了結(jié)構(gòu)體的形式來(lái)存放每一個(gè)學(xué)生的信息,對(duì)與若干個(gè)學(xué)生采用了結(jié)構(gòu)體數(shù)組。具體到各個(gè)數(shù)據(jù)的信息,學(xué)號(hào)和姓名采用了字符型數(shù)組,分?jǐn)?shù)為整型,而平均分采用了實(shí)型。 /***************************定義結(jié)構(gòu)體變量*****************************/ struct student { char num[20];/*學(xué)號(hào)*/

10、 char name[100];/*姓名*/ int score[3];/*分?jǐn)?shù)*/ float ave;/*平均分*/ }stu[N]; /*stu[N]中每個(gè)元素對(duì)應(yīng)一個(gè)學(xué)生*/ N采用了宏定義的方式,可以隨時(shí)在源程序中修改。 【程序】 /*************輸入模塊****************/ void enter() Y N 圖4.2—1 開(kāi)始 輸入用戶要輸入學(xué)生記錄的個(gè)數(shù)n 從0~n-1調(diào)用輸入函數(shù)input(i) i!=0嗎? 調(diào)用保存函數(shù)save() 返回主菜單 結(jié)束

11、{ int i,n; printf("請(qǐng)輸入學(xué)生數(shù)量(0-%d)?:",N-1); scanf("%d",&n); printf("\n請(qǐng)輸入數(shù)據(jù)\n\n"); for(i=0;i

12、 【程序】 /*********瀏覽函數(shù)*********/ void browse()/*瀏覽模塊,前面多次用到*/ { int i,n; n=load(); printf_face(); for(i=0;i

13、n\n"); getch(); menu(); } (3)添加模塊 該模塊的功能是用戶需要增加新的學(xué)生記錄,注意新添加的內(nèi)容不能覆蓋原來(lái)的記錄。 追加模塊流程圖: 圖4.2—3 開(kāi)始 調(diào)用加載函數(shù),并計(jì)算可以記錄的個(gè)數(shù) K==m+n i從n到k調(diào)用輸入函數(shù)input(i) 保存追加的記錄 結(jié)束 輸入用戶要追加學(xué)生記錄個(gè)數(shù) 【程序】 /***************添加模塊********************/ void add() { int i,n,m,k; FILE *fp; n=load(); printf("請(qǐng)輸入添加的學(xué)

14、生個(gè)數(shù)(0-%d)?:",N-1-n); scanf("%d",&m); /*m為添加學(xué)生的個(gè)數(shù)*/ k=m+n-1; for(i=n;i<=k;i++) { printf("\n 輸入第%d個(gè)學(xué)生記錄\n",i-n+1); input(i); /*調(diào)用輸入函數(shù)*/ } if((fp=fopen("zhoulei.txt","ab"))==NULL) { printf("\n文件無(wú)法打開(kāi)\n"); } for(i=n;i<=k;i++) if(fwrite(&stu[i],sizeo

15、f(struct student),1,fp)==0) printf("文件寫(xiě)入錯(cuò)誤\n"); fclose(fp); save(); } (4)查找模塊 該模塊在參考程序上做的一定邏輯上的修改,可以按姓名和按學(xué)號(hào)進(jìn)行查找,找到以后,可進(jìn)行修改和刪除信息的操作。 由于改動(dòng)方便,這里的按姓名和按學(xué)號(hào)查找分了兩個(gè)函數(shù),使函數(shù)比較煩綴,故函數(shù)還可以進(jìn)行優(yōu)化。 圖4.2—4 其他 2 1 開(kāi)始 顯示查找方式 讓用戶選擇 調(diào)用按姓名查找函數(shù)search_name() 調(diào)用按學(xué)號(hào)查找函數(shù)search_no() 結(jié)束 【程序】 a)查找模塊 /*

16、*******查找函數(shù)********/ void search() { int z,w1; do { printf("請(qǐng)輸入查找方式:1).按姓名查找 2).按學(xué)號(hào)查找 [ ]\b\b"); scanf("%d",&z); if(z!=1&&z!=2) /*對(duì)選擇數(shù)字作出判斷*/ { w1=1; getchar(); } else w1=0; } while(w1==1); if(z==1) search_name(); /*調(diào)用按姓名查找程序*/ else search

17、_no(); /*調(diào)用按學(xué)號(hào)查找程序*/ } b) 按姓名查找模塊 這個(gè)是根據(jù)姓名查找到對(duì)應(yīng)的學(xué)生記錄,但在此處程序有一定的缺陷,就是如果有相同的姓名,只能查到最上面的一個(gè),而其他的則不能找到。后來(lái)嘗試修改時(shí)發(fā)現(xiàn),還需要改動(dòng)其他相應(yīng)的函數(shù),故沒(méi)有進(jìn)行下去。 N Y Y N 開(kāi)始 輸入學(xué)生姓名 是否找到此學(xué)生記錄 顯示找到的記錄 提示沒(méi)有找到 詢問(wèn)用戶是否繼續(xù)查找 讓用戶做出選擇 結(jié)束 圖4.2—5 【程序】 /**********按姓名查找***************/ void search_name() { int i,n

18、,k,w1=1,w2,w3,w4; struct student s; n=load(); do { do {k=-1; printf("\n\n請(qǐng)輸入要查找的姓名! 姓名:"); scanf("%s",s.name); /*輸入要修改的數(shù)據(jù)的姓名*/ printf_face(); /*調(diào)用顯示數(shù)據(jù)結(jié)構(gòu)項(xiàng)目的函數(shù)*/ for(i=0;i

19、 /*找到要修改的記錄*/ printf_one(k);break; /*調(diào)用顯示一個(gè)記錄的函數(shù)*/ } if(k==-1) { printf("\n\n記錄不存在!"); printf("\n\n是否繼續(xù)?\n\t1).是 2).否 返回 [ ]\b\b"); scanf("%d",&w1); if(w1==1) search(); else menu(); } } while(k==-1&&w1==1); w4=0;w3=0;

20、if(k!=-1) {printf("\n\n請(qǐng)選擇下一步:\n\t1).查找其他 2).修改 3).刪除 4).返回菜單 [ ]\b\b"); scanf("%d",&w2); switch(w2) { case 2:w3=modify_data(k,n);break; case 3: {printf("\n確定刪除?\n\t1).確定 2).返回 [ ]\b\b"); scanf("%d",&w4); if(w4==1) stu[k].ave=0; break; }

21、 } if(w3==1||w4==1) { save(); printf("\n\n操作成功^_^"); printf("\n\n請(qǐng)選擇下一步:\n\t1).查找其他 2).返回 [ ]\b\b"); scanf("%d",&w2); } } }while(w2==1); menu(); } c) 按學(xué)號(hào)查找模塊 這個(gè)函數(shù)是在按姓名查找模塊的基礎(chǔ)上做了相應(yīng)的改動(dòng),由于學(xué)號(hào)具有唯一性,故不存在查不到相同學(xué)號(hào)的情況。 N Y Y N 開(kāi)始 輸入學(xué)生學(xué)號(hào) 是否找到此學(xué)生記錄 顯示找到的記錄 提示沒(méi)有找到 詢問(wèn)用戶是否繼

22、續(xù)查找 讓用戶做出選擇 結(jié)束 圖4.2—6 【程序】 /*********按學(xué)號(hào)查找程序***********/ void search_no() { int i,n,k,w1=1,w2,w3,w4; struct student s; n=load(); do { do {k=-1; printf("/n/n請(qǐng)輸入要查找的學(xué)號(hào)! 學(xué)號(hào):"); scanf("%s",s.num); printf_face(); for(i=0;i

23、 {k=i; printf_one(k);break; } if(k==-1) { printf("\n\n記錄不存在!"); printf("\n\n是否繼續(xù)?\n\t1).是 2).否 返回 [ ]\b\b"); scanf("%d",&w1); if(w1==1) search(); else menu(); } } while(k==-1&&w1==1); w4=0;w3=0; if(k!=-1) {printf("\n\n請(qǐng)選擇下一步:\n\

24、t1).查找下一個(gè) 2).修改 3).刪除 4).返回菜單 [ ]\b\b"); scanf("%d",&w2); switch(w2) { case 2:w3=modify_data(k,n);break; case 3: {printf("\n確定刪除?\n\t1).確定 2).返回 [ ]\b\b"); scanf("%d",&w4); if(w4==1) stu[k].ave=0; break; } } if(w3==1||w4==1) { sa

25、ve(); printf("\n\n操作成功^_^"); printf("\n\n請(qǐng)選擇下一步:\n\t1).查找其他 2).返回 [ ]\b\b"); scanf("%d",&w2); } } }while(w2==1); menu(); } /*********瀏覽函數(shù)*********/ void browse()/*瀏覽模塊,前面多次用到*/ { int i,n; n=load(); printf_face(); for(i=0;i

26、 { printf("任意鍵繼續(xù)\n"); getch(); puts("\n\n"); } printf_one(i); } printf("\n\t共有%d條記錄.\n",n); printf("\n任意鍵返回\n\n"); getch(); menu(); } (5)修改模塊 該模塊首先要顯示所有學(xué)生的信息,并采用分屏顯示。顯示完所有記錄后,用戶輸入要修改的學(xué)生的學(xué)號(hào),根據(jù)學(xué)號(hào)查找學(xué)生記錄,并提示用戶修改該記錄的哪部分信息。 N Y Y N 開(kāi)始 顯示所有記錄,讓用戶看哪條信息需要修改 輸入要修改的學(xué)號(hào) i!=0嗎

27、? 顯示找到的記錄,調(diào)用修改函數(shù) 提示沒(méi)有找到 詢問(wèn)用戶是否繼續(xù)修改 返回主菜單 結(jié)束 圖4.2—7 【程序】 /*************修改函數(shù)***********/ void modify() { struct student s; int i,n,k,w0=1,w1,w2=0; n=load(); do { k=-1; printf_face(); /*調(diào)用顯示數(shù)據(jù)結(jié)構(gòu)項(xiàng)目函數(shù)*/ for(i=0;i

28、/*目的是分屏顯示*/ { printf("\n\n記住你要修改的學(xué)號(hào).任意鍵繼續(xù) ..."); getch(); puts("\n\n"); } printf_one(i); /*調(diào)用顯示一個(gè)記錄的函數(shù)*/ } do { printf("\n\n請(qǐng)輸入你想要修改的學(xué)號(hào):"); scanf("%s",s.num); /*輸入要修改的數(shù)據(jù)的學(xué)號(hào)*/ for(i=0;i

29、 { k=i; /*找到要修改的記錄*/ s=stu[i]; /*備份當(dāng)次要修改的學(xué)生記錄stu[i]*/ } if(k==-1) printf("\n\n記錄不存在!"); /*當(dāng)k=-1表示沒(méi)有找到*/ } while(k==-1); printf_face(); printf_one(k); w1=modify_data(k,n); /*修改學(xué)生記錄并返回保存控制值*/ if(w1==1) { prin

30、tf("\n操作成功^_^.\n\n是否繼續(xù)修改?\n\n\t1).是2).返回并保存\t[ ]\b\b"); scanf("%d",&w0); w2=1; /*用來(lái)控制保存,使w2=1是標(biāo)記已有過(guò)的修改*/ } else { w0=0; if(w2==1) stu[k]=s; } if(w0!=1&&w2==1) save();/*w2不等于1表示在此次之前沒(méi)有修改過(guò),這是就保存用戶已確認(rèn)的修改并返回*/ } while(w0==1); printf("\n\n你所修改的內(nèi)容不存在

31、"); menu(); } (6)排序模塊 該模塊在原有的排序模塊上做了一定的修改,可以按照分?jǐn)?shù)1,、分?jǐn)?shù)2、分?jǐn)?shù)3以及平均數(shù)進(jìn)行由大到小的排序。這里選擇了冒泡法排序。 由于改動(dòng)方便,這里的4種排序方法在程序上其實(shí)是大同小異,因此程序還需進(jìn)行一定的優(yōu)化。 還有一個(gè)問(wèn)題就是排序結(jié)束后不能直接瀏覽,需要手動(dòng)調(diào)用瀏覽模塊。其原因是在排序后調(diào)用了保存函數(shù),而保存函數(shù)保存完畢要直接返回主菜單。如果先進(jìn)行瀏覽的話,所顯示內(nèi)容不是排序后的。 非1~4 1~4 開(kāi)始 顯示要進(jìn)行的排序方式 用戶做出選擇 調(diào)用相應(yīng)的函數(shù) 結(jié)束 圖4.2—8 【程序】 a) 排序模塊 /

32、********************排序模塊********************/ void order() { int m; printf("請(qǐng)選擇排序方式:1).按分?jǐn)?shù)1排序 2).按分?jǐn)?shù)2排序 3).按分?jǐn)?shù)3排序 4).按平均分排序\n\n"); scanf("%d",&m); switch(m) { case 1:order_score1();break;/*分?jǐn)?shù)1*/ case 2:order_score2();break;/*分?jǐn)?shù)2*/ case 3:order_score3();break;/*分?jǐn)?shù)3*/ case

33、 4:order_ave();break; /*平均分*/ } } b) 按四種方式排序 圖4.2—9 開(kāi)始 用冒泡法排序 保存 返回主菜單 結(jié)束 /*********按平均分排序*****************/ void order_ave() { int i,j,n; struct student s; n=load(); for(i=0;i

34、u[i] =stu[j]; stu[j] =s; } } save(); puts("\n\n"); menu(); } /*********按分?jǐn)?shù)1排序*****************/ void order_score1() { int i,j,n; struct student s; n=load(); for(i=0;i

35、[i] =stu[j]; stu[j] =s; } } save(); puts("\n\n"); menu(); } /*********按分?jǐn)?shù)2排序*****************/ void order_score2() { int i,j,n; struct student s; n=load(); for(i=0;i

36、] =stu[j]; stu[j] =s; } } save(); puts("\n\n"); menu(); } /*********按分?jǐn)?shù)3排序*****************/ void order_score3() { int i,j,n; struct student s; n=load(); for(i=0;i

37、 =stu[j]; stu[j] =s; } } save(); puts("\n\n"); menu(); } (7)保存模塊 這個(gè)模塊單獨(dú)放在菜單里其實(shí)有點(diǎn)綴余,因?yàn)槊總€(gè)對(duì)文件進(jìn)行寫(xiě)入或修改的操作都單獨(dú)進(jìn)行了保存。這里文件的讀寫(xiě)全用的是二進(jìn)制,所以保存的文件直接以文本打開(kāi)后會(huì)出現(xiàn)亂碼。 【程序】 /************************保存函數(shù)*******************************/ void save()/*存儲(chǔ)函數(shù)*/ { int i; FILE *fp; if((fp=fopen("zhou

38、lei.txt","w"))==NULL) /*按只寫(xiě)方式打開(kāi)文件*/ { printf("文件無(wú)法打開(kāi)\n");/*防止文件為空,并報(bào)錯(cuò)*/ } for(i=0;i

39、保存成功!\n\n按任意鍵繼續(xù)\n\n"); getch(); menu(); } /*一般的保存模塊,用于各種變動(dòng)之后,文件的保存*/ 4.3公共函數(shù) 這里都是些在每個(gè)模塊都可能用到的公共函數(shù) (1)加載函數(shù) /********加載函數(shù)********/ int load() { FILE *fp; int i; if((fp=fopen("zhoulei.txt","rb"))==NULL) /*以只讀方式打開(kāi)一個(gè)二進(jìn)制文件*/ { printf("\n無(wú)法打開(kāi)文件\n"); return NULL; }

40、for(i=0;!feof(fp);i++) fread(&stu[i],sizeof(struct student),1,fp); fclose(fp); return(i-1); /*返回記錄個(gè)數(shù)*/ } (2) 學(xué)號(hào)輸入函數(shù) /**********學(xué)號(hào)輸入函數(shù)************/ void no_input(int i,int n) /*i表示第i個(gè)學(xué)生的信息,n表示比較到第n個(gè)學(xué)生*/ { int j,k,w1; do {w1=0; printf("學(xué)號(hào):"); scanf("%s",stu[i].num);

41、 for(j=0;stu[i].num[j]!='\0';j++) /*學(xué)號(hào)輸入函數(shù),作了嚴(yán)格的規(guī)定*/ if(stu[i].num[j]<'0'||stu[i].num[j]>'9') /*判斷學(xué)號(hào)是否為數(shù)字*/ { puts("輸入錯(cuò)誤!僅可輸入(0-9),請(qǐng)重新輸入!\n"); w1=1;break; } if(w1!=1) for(k=0;k

42、 puts("此記錄已存在,請(qǐng)重新輸入!\n"); w1=1;break; } } while(w1==1); } (3)輸入三個(gè)科目分?jǐn)?shù)函數(shù) /***i表示第i個(gè)學(xué)生記錄****/ void score_input(int i) { int j; for(j=0;j<3;j++) { printf("分?jǐn)?shù) %d:",j+1); scanf("%d",&stu[i].score[j]);/*循環(huán)語(yǔ)句依次輸入三個(gè)分?jǐn)?shù)*/ } } (4)求平均值函數(shù) /********求平均值函數(shù)*********/ void avera

43、ge(int i) { int j,sum; for(sum=0,j=0;j<3;j++) sum+=stu[i].score[j]; stu[i].ave=(float)(sum/3.0);/*循環(huán)語(yǔ)句求平均值,強(qiáng)制類(lèi)型轉(zhuǎn)換成浮點(diǎn)型*/ } (5)輸入整個(gè)記錄函數(shù) /**********輸入整個(gè)記錄函數(shù)**************/ void input(int i) { no_input(i,i); /*****調(diào)用學(xué)號(hào)輸入函數(shù)******/ printf("姓名:"); scanf("%s",stu[i].name); sc

44、ore_input(i); /*****調(diào)用分?jǐn)?shù)輸入函數(shù)******/ average(i); /*****調(diào)用求平均值函數(shù)******/ } (6)修改整條記錄函數(shù) /***************修改整條記錄函數(shù)****************/ int modify_data(int i,int n) /*修改第i個(gè)記錄*/ {int c,w1; do { puts("\n請(qǐng)選擇修改方式\n\n 1).學(xué)號(hào) 2).姓名 3).分?jǐn)?shù)1 4).分?jǐn)?shù)2 5).分?jǐn)?shù)3 6).所有分?jǐn)?shù) 7).所有數(shù)據(jù) 8).取消并返回");

45、printf("請(qǐng)選擇:[ ]\b\b"); scanf("%d",&c); if(c>8||c<1) {puts("\n選擇錯(cuò)誤,請(qǐng)重新輸入!"); getchar(); /*當(dāng)輸入是字符時(shí)可以防止是死循環(huán)*/ } }while(!(c<=8&&c>=1)); do { switch(c) /*選擇要修改的項(xiàng)目*/ { case 1:no_input(i,n);break; case 2:printf("姓名:");scanf("%s",stu[i].name);break; ca

46、se 3:printf("分?jǐn)?shù)1:");scanf("%d",&stu[i].score[0]);break; case 4:printf("分?jǐn)?shù)2:");scanf("%d",&stu[i].score[1]);break; case 5:printf("分?jǐn)?shù)3:");scanf("%d",&stu[i].score[2]);break; case 6:score_input(i);break; case 7:input(i);break; } if(c>2&&c<7) average(i); puts("\n新數(shù)據(jù):\n"); printf_face(

47、); /*顯示數(shù)據(jù)結(jié)構(gòu)項(xiàng)目*/ printf_one(i); /*修改后的數(shù)據(jù)讓用戶確認(rèn)*/ printf("\n是否確定?\n\n\t1).是 2).否,重新修改 3).直接返回 [ ]\b\b"); scanf("%d",&w1); }while(w1==2); return(w1); /*返回控制值*/ } (7)顯示數(shù)據(jù)結(jié)構(gòu)項(xiàng)目 /*********顯示數(shù)據(jù)結(jié)構(gòu)項(xiàng)目函數(shù)******/ void printf_face() /**顯示數(shù)據(jù)結(jié)構(gòu)項(xiàng)目函數(shù)**/ { pri

48、ntf("\n\t學(xué)號(hào)\t姓名 分?jǐn)?shù)1 分?jǐn)?shù)2 分?jǐn)?shù)3 平均\n"); } (8)顯示一個(gè)記錄的函數(shù) /********顯示一個(gè)記錄的函數(shù)***********/ void printf_one(int i) { int j; printf("%11s\t%-17s",stu[i].num,stu[i].name ); for(j=0;j<3;j++) printf("%9d",stu[i].score[j]); printf("\t%9.2f\n",stu[i].ave); /*保留兩位小數(shù)*

49、/ } 5測(cè)試、結(jié)果進(jìn)行分析 5.1進(jìn)入頁(yè)面 選擇1是重新錄入數(shù)據(jù),不管原文件是否有內(nèi)容,都會(huì)進(jìn)行覆蓋。 選擇2直接進(jìn)入主菜單,可對(duì)原有文件進(jìn)行數(shù)據(jù)處理。 圖5—1 5.2數(shù)據(jù)錄入 圖5—2 5.3數(shù)據(jù)錄入成功,直接返回菜單 圖5—3 5.4不進(jìn)行數(shù)據(jù)錄入,直接進(jìn)入菜單。 圖5—4 5.5瀏覽數(shù)據(jù) 圖5—5 5.6添加數(shù)據(jù) 圖5—6 5.7瀏覽添加后的數(shù)據(jù) 圖5—7 5.8查找—按姓名查找 圖5—8 5.9查找—按學(xué)號(hào)查找 圖5—9 5.10修改—對(duì)分?jǐn)?shù)2進(jìn)行修改 圖5—10 5.11排序——按平均分進(jìn)行排序

50、 這里的一個(gè)問(wèn)題是排序完了程序沒(méi)有自動(dòng)進(jìn)行瀏覽,需要手動(dòng)調(diào)用瀏覽函數(shù) 圖5—11 5.12退出 圖5—12 6總結(jié) 8天的實(shí)習(xí)是短暫的,頭兩天主要是對(duì)C語(yǔ)言的快速?gòu)?fù)習(xí)以及對(duì)題目的分析,第三天才開(kāi)始進(jìn)行程序的編寫(xiě)。而最后一天主要是進(jìn)行了界面的優(yōu)化。從剛開(kāi)始為了完成這項(xiàng)任務(wù)而實(shí)習(xí),變成了為了鍛煉自己,提高C語(yǔ)言編程能力而實(shí)習(xí)。 8天下來(lái)感覺(jué)自己對(duì)C語(yǔ)言以及程序編輯的認(rèn)識(shí)加深了許多。以前覺(jué)得很難的結(jié)構(gòu)體,數(shù)組,文件全部用到了,雖然并不能完全掌握,那也有一些成就感。先說(shuō)中間遇到的小問(wèn)題,幾乎每一個(gè)模塊的錄入,都會(huì)因?yàn)橥思臃痔?hào),忘了加括號(hào),忘了加引號(hào)而出錯(cuò),雖然好解決,但浪費(fèi)了很

51、大的時(shí)間,去修改語(yǔ)法上的錯(cuò)誤。然后就是邏輯錯(cuò)誤的修改,現(xiàn)在意識(shí)到,如果自己實(shí)在找不到錯(cuò)誤的話,就主動(dòng)找別人看一下,打破了自己思維定勢(shì),也許別人會(huì)很快的找到。程序的注釋也是同樣重要,編完一段程序再反過(guò)來(lái)看的時(shí)候,沒(méi)有注釋有時(shí)會(huì)出現(xiàn)看不懂自己編的程序的情況。還有一個(gè)收獲就是當(dāng)自己遇到什么不懂時(shí),要積極的和同學(xué)們一起討論,這樣從中學(xué)到的就不只是你不懂的問(wèn)題。 編程讓人最感到快樂(lè)的就是一個(gè)個(gè)的改掉上百的錯(cuò)誤,然后運(yùn)行出想要的結(jié)果,那種心情是無(wú)法用言語(yǔ)來(lái)描述的。 雖然最后完成了自己的題目,但總感覺(jué)我們C語(yǔ)言編程的能力還是僅僅在皮毛上,程序很大一部分參考了書(shū)上,尤其是算法的設(shè)計(jì),自己做的就是搭建一個(gè)框

52、架。路漫漫其修遠(yuǎn)兮,今后還有很多的東西等著我們?nèi)W(xué)習(xí),希望通過(guò)這次的實(shí)習(xí),我們能更容易的學(xué)習(xí)其他程序的編寫(xiě),爭(zhēng)取做到學(xué)以致用。 最后再一次感謝整個(gè)過(guò)程中幫助我的老師和同學(xué)們。 7參考文獻(xiàn) [1] 張冬梅 劉遠(yuǎn)興 陳晶 王媛妮 編著,《C語(yǔ)言課程設(shè)計(jì)與程序指導(dǎo)》,中國(guó)鐵道出版社,2008年7月第一版。 [2] 作者:譚浩強(qiáng) 《C程序設(shè)計(jì)》(第三版),清華大學(xué)出版社,2005年7月第三版 8附錄 主要程序模塊清單 #include #include #include #include #defi

53、ne N 50 void save(); void enter(); void input(int i); void no_input(int i,int n); void score_input(int i); void average(int i); void menu(); void browse(); int modify_data(int i,int n); void printf_face(); void search(); void add(); void modify(); int load(); void order(); void print

54、f_one(int i); void search_name(); void search_no(); void order_ave(); void order_score1(); void order_score2(); void order_score3(); void main() {int q,w1; printf("\t\t****************行編輯器(修改拓展版)****************\n\n"); printf("\t\t\t\t\t072092\t周磊\t20091002238\n\n"); do { printf(

55、"\t\t重新錄入數(shù)據(jù)請(qǐng)按1\t\t進(jìn)入菜單請(qǐng)按2: [ ]\b\b"); scanf("%d",&q); if(q!=1&&q!=2) /*對(duì)選擇數(shù)字作出判斷*/ { w1=1; getchar(); } else w1=0; } while(w1==1); if(q==1) /*if語(yǔ)句選擇要進(jìn)行的操作*/ enter(); else menu(); } /***************************定義結(jié)構(gòu)體變量***************************

56、**/ struct student { char num[20];/*學(xué)號(hào)*/ char name[100];/*姓名*/ int score[3];/*分?jǐn)?shù)*/ float ave;/*平均分*/ }stu[N]; /*stu[N]中每個(gè)元素對(duì)應(yīng)一個(gè)學(xué)生*/ /****************************輸入模塊*************************************/ void enter() { int i,n; printf("請(qǐng)輸入學(xué)生數(shù)量(0-%d)?:",N-1); scanf("%d",&n);

57、 printf("\n請(qǐng)輸入數(shù)據(jù)\n\n"); for(i=0;i

58、 score_input(i); /*****調(diào)用分?jǐn)?shù)輸入函數(shù)******/ average(i); /*****調(diào)用求平均值函數(shù)******/ } /**********學(xué)號(hào)輸入函數(shù)************/ void no_input(int i,int n) /*i表示第i個(gè)學(xué)生的信息,n表示比較到第n個(gè)學(xué)生*/ { int j,k,w1; do {w1=0; printf("學(xué)號(hào):"); scanf("%s",stu[i].num); for(j=0;stu[i].num[j]!='\0';j++) /*學(xué)號(hào)輸入函數(shù),作

59、了嚴(yán)格的規(guī)定*/ if(stu[i].num[j]<'0'||stu[i].num[j]>'9') /*判斷學(xué)號(hào)是否為數(shù)字*/ { puts("輸入錯(cuò)誤!僅可輸入(0-9),請(qǐng)重新輸入!\n"); w1=1;break; } if(w1!=1) for(k=0;k

60、 } } while(w1==1); } /********輸入三個(gè)科目分?jǐn)?shù)函數(shù)*********/ /***i表示第i個(gè)學(xué)生記錄****/ void score_input(int i) { int j; for(j=0;j<3;j++) { printf("分?jǐn)?shù) %d:",j+1); scanf("%d",&stu[i].score[j]);/*循環(huán)語(yǔ)句依次輸入三個(gè)分?jǐn)?shù)*/ } } /********求平均值函數(shù)*********/ void average(int i) { int j,sum; for(sum=0,j=0;

61、j<3;j++) sum+=stu[i].score[j]; stu[i].ave=(float)(sum/3.0);/*循環(huán)語(yǔ)句求平均值,強(qiáng)制類(lèi)型轉(zhuǎn)換成浮點(diǎn)型*/ } /************************保存函數(shù)*******************************/ void save()/*存儲(chǔ)函數(shù)*/ { int i; FILE *fp; if((fp=fopen("zhoulei.txt","w"))==NULL) /*按只寫(xiě)方式打開(kāi)文件*/ { printf("文件無(wú)法打開(kāi)\n");/*防止文件為空,并報(bào)錯(cuò)*/

62、 } for(i=0;i

63、的保存*/ /********菜單**********/ void menu() { int n,w; printf("\t\t***************菜單***************\n\n"); printf("\t0.瀏覽"); printf("\t1.添加"); printf("\t2.查找"); printf("\t3.修改"); printf("\t4.排序"); printf("\t5.保存"); printf("\t6.退出"); do { printf("\n\n\t請(qǐng)選擇(0-6)")

64、; scanf("%d",&n); if(n<0||n>6) /*對(duì)選擇的數(shù)字作出判斷*/ {printf("輸入錯(cuò)誤,請(qǐng)重新輸入"); w=1;getchar();} else {w=0;} }while(w==1); switch(n) {case 0:browse();break; /*瀏覽*/ case 1:add();break; /*添加*/ case 2:search();break; /*查找*/ case 3:modify();break; /*修改*/ cas

65、e 4:order();break; /*排序*/ case 5:save(); break; /*保存*/ case 6:exit(0);break; /*推出*/ } } /***************添加模塊********************/ void add() { int i,n,m,k; FILE *fp; n=load(); printf("請(qǐng)輸入添加的學(xué)生個(gè)數(shù)(0-%d)?:",N-1-n); scanf("%d",&m); /*m為添加學(xué)生的個(gè)數(shù)*/ k=m+n

66、-1; for(i=n;i<=k;i++) { printf("\n 輸入第%d個(gè)學(xué)生記錄\n",i-n+1); input(i); /*調(diào)用輸入函數(shù)*/ } if((fp=fopen("zhoulei.txt","ab"))==NULL) { printf("\n文件無(wú)法打開(kāi)\n"); } for(i=n;i<=k;i++) if(fwrite(&stu[i],sizeof(struct student),1,fp)==0) printf("文件寫(xiě)入錯(cuò)誤\n"); fclose(fp); save(); } /********加載函數(shù)********/ int load() { FILE *fp; int i; if((fp=fopen("zhoulei.txt","rb"))==NULL) /*以只讀方式打開(kāi)一個(gè)二進(jìn)制文件*/ { printf("\n無(wú)法打開(kāi)文件\n"); return NULL; } for(i=0;!feof(f

展開(kāi)閱讀全文
溫馨提示:
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. 裝配圖網(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ì)自己和他人造成任何形式的傷害或損失。

相關(guān)資源

更多
正為您匹配相似的精品文檔
關(guān)于我們 - 網(wǎng)站聲明 - 網(wǎng)站地圖 - 資源地圖 - 友情鏈接 - 網(wǎng)站客服 - 聯(lián)系我們

copyright@ 2023-2025  zhuangpeitu.com 裝配圖網(wǎng)版權(quán)所有   聯(lián)系電話:18123376007

備案號(hào):ICP2024067431號(hào)-1 川公網(wǎng)安備51140202000466號(hào)


本站為文檔C2C交易模式,即用戶上傳的文檔直接被用戶下載,本站只是中間服務(wù)平臺(tái),本站所有文檔下載所得的收益歸上傳人(含作者)所有。裝配圖網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)上載內(nèi)容本身不做任何修改或編輯。若文檔所含內(nèi)容侵犯了您的版權(quán)或隱私,請(qǐng)立即通知裝配圖網(wǎng),我們立即給予刪除!

五月丁香婷婷狠狠色,亚洲日韩欧美精品久久久不卡,欧美日韩国产黄片三级,手机在线观看成人国产亚洲