版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡介
目錄問題的描述總體設(shè)計(jì)思路功能模塊的具體設(shè)計(jì)功能模塊的調(diào)試及測試五、參考資料六、分工與合作七、總結(jié)一問題的描述1.項(xiàng)目開發(fā)的目標(biāo):程序運(yùn)行后,能夠在屏幕上顯示主菜單,查詢某學(xué)生的成績,修改某學(xué)生的成績,以及添加新的學(xué)生成績記錄,能夠在完成運(yùn)行后退出程序。2.基本要求 1)能夠?qū)崿F(xiàn)學(xué)號、成績、專業(yè)和五門功課成績的錄入;2)能夠?qū)崿F(xiàn)添加、刪除、修改學(xué)生記錄;3)能夠計(jì)算某學(xué)生的總分和平均分;4)能夠按照總分排序輸出。二總體設(shè)計(jì)思路本系統(tǒng)首先設(shè)計(jì)出了主函數(shù),然后根據(jù)去要實(shí)現(xiàn)的功能分別設(shè)計(jì)了,排列、刪除、查找、修改、添加功能的子函數(shù)。排列函數(shù)執(zhí)行前先執(zhí)行構(gòu)造鏈表的子函數(shù),然后通過返回的鏈表首指針按總分排列、顯示出學(xué)生記錄。刪除函數(shù)的設(shè)計(jì)是首先從文件內(nèi)找到要刪除的人,然后將其標(biāo)志位置零,這樣在其他子函數(shù)不會對該記錄進(jìn)行操作。查找是先打開文件,用一個字符串對比的方法找出用戶要查找的人,然后打印出來。修改也是先打開文件,用一個字符串對比的方法找出用戶要修改的人,并將該記錄讀入內(nèi)存,進(jìn)行修改,然后寫入磁盤原位置。添加函數(shù)是通過追加方式打開文件,并寫入一條記錄,從而實(shí)現(xiàn)添加功能。下面是總的程序流程圖: 開始 開始 執(zhí)行init1()函數(shù)執(zhí)行init1()函數(shù)執(zhí)行chuangjian()函數(shù) 執(zhí)行chuangjian()函數(shù)選擇C 選擇C調(diào)用retrieve1()函數(shù)調(diào)用makelist()函數(shù)調(diào)用retrieve2()函數(shù)調(diào)用system(cls)函數(shù)調(diào)用shanchu()函數(shù)調(diào)用xiugai2()函數(shù)調(diào)用xiugai1()函數(shù)調(diào)用調(diào)用retrieve1()函數(shù)調(diào)用makelist()函數(shù)調(diào)用retrieve2()函數(shù)調(diào)用system(cls)函數(shù)調(diào)用shanchu()函數(shù)調(diào)用xiugai2()函數(shù)調(diào)用xiugai1()函數(shù)調(diào)用tianjia()函數(shù)調(diào)用displaystu()函數(shù)調(diào)用displaylist()函數(shù)三.功能模塊的具體設(shè)計(jì)1.界面分析 a.開始界面輸入文件名并創(chuàng)建紀(jì)錄:如果文件不存在則會進(jìn)行創(chuàng)建。b.功能選擇界面根據(jù)輸入的字符進(jìn)行不同的操作。c.查找功能:通過n:用姓名來查找學(xué)生的成績記錄通過m:用學(xué)號來查找學(xué)生的成績記錄d.排列功能:通過s按總分從高到低排列輸出學(xué)生成績記錄e.添加功能:通過a添加學(xué)生成績記錄f.修改功能界面:通過x按姓名修改學(xué)生記錄或通過y按學(xué)號修改學(xué)生記錄d.刪除功能界面:g.通過p清除屏幕數(shù)據(jù)并重新出現(xiàn)提示信息2.程序設(shè)計(jì)主要內(nèi)容.#include<stdio.h>#include<string.h>#include<stdlib.h>#include<windows.h>#defineSWN5/*課程數(shù)*/#defineNAMELEN20/*姓名最大字符數(shù)*/#defineMAJORLEN20/*專業(yè)名稱最大字符數(shù)*/#defineCODELEN10/*學(xué)號最大字符數(shù)*/#defineFNAMELEN80/*文件名最大字符數(shù)*/#defineBUFLEN80/*緩沖區(qū)最大字符數(shù)*/charsubject[SWN][NAMELEN+1]={"高等數(shù)學(xué)","線性代數(shù)","c語言","大學(xué)物理","概率論"};charstuf[FNAMELEN];inttotal[SWN];/*各課程總分*/intn;longk;charz;/*聲明結(jié)構(gòu)體*/structrecord{ charname[NAMELEN+1]; charmajor[MAJORLEN+1]; charcode[CODELEN+1]; intmarks[SWN]; inttotal; floatave; intflag;}stu;structnode{charname[NAMELEN+1];/*姓名*/charmajor[MAJORLEN+1];charcode[CODELEN+1];/*學(xué)號*/intmarks[SWN];/*各課程成績*/inttotal;/*總分*/floatave;intflag;structnode*next;/*后續(xù)表元指針*/}*head;/*鏈表首指針*//*添加學(xué)生記錄*/inttianjia(char*stuf){ inti,j; FILE*fp; structrecords; fp=fopen(stuf,"a+"); printf("\n請輸入您想要添加的記錄數(shù):"); scanf("%d",&n); for(i=0;i<n;i++) { printf("\n"); s.total=0; printf("請輸入第%d名學(xué)生的姓名:",i+1); scanf("%s",&); printf("請輸入該學(xué)生的專業(yè):"); scanf("%s",&s.major); printf("請輸入該學(xué)生的學(xué)號:"); scanf("%s",&s.code); s.flag=1; for(j=0;j<SWN;j++) { printf("請輸入%s分?jǐn)?shù):",subject[j]); scanf("%d",&s.marks[j]); s.total=s.total+s.marks[j]; } s.ave=s.total/5.0; fwrite(&s,sizeof(structrecord),1,fp); } fclose(fp);}/*按姓名修改學(xué)生記錄*/intxiugai1(char*stuf,char*buf){ intj; FILE*fp; structrecords; charc; if((fp=fopen(stuf,"r+"))==NULL) { printf("Can'topenfile%s.\n",stuf); return0; } while(fread(&s,sizeof(structrecord),1,fp)==1) { if(strcmp(,buf)==0) { if(s.flag==0) {printf("學(xué)生%s不在文件%s中.\n",buf,stuf);break;} k=ftell(fp); fseek(fp,k-(long)(sizeof(structrecord)),0); printf("輸入一個命令修改下列項(xiàng)目,或退出修改!\n"); puts("n:姓名."); puts("m:專業(yè)."); puts("c:學(xué)號."); puts("u:高等數(shù)學(xué)成績."); puts("v:線性代數(shù)成績."); puts("z:c語言成績."); puts("x:大學(xué)物理成績."); puts("y:概率論成績"); puts("p:清屏"); puts("q:退出修改."); while(1) { puts("請輸入命令來修改記錄或退出修改!:"); getchar(z); scanf("%c",&c);/*輸入選擇命令*/ if(c=='q'||c=='Q') { system("cls"); printf("\n"); puts("==========."); puts("結(jié)束修改!"); puts("=========="); init(); printf("\n"); puts("現(xiàn)在您可以通過輸入一個命令來管理這些記錄"); puts("n:通過姓名查找成績記錄."); puts("c:通過學(xué)號查找成績記錄."); puts("s:按總分從高到低列出所有成績記錄."); puts("a:添加學(xué)生記錄."); puts("x:按姓名修改學(xué)生記錄."); puts("y:按學(xué)號修改學(xué)生記錄."); puts("d:按姓名刪除學(xué)生記錄."); puts("p:清屏."); puts("q:退出系統(tǒng)!"); break;/*q,結(jié)束程序運(yùn)行*/ } switch(c) { case'N': case'n': printf("請輸入新姓名:\n"); scanf("%s",&);printf("\n");break; case'M': case'm': printf("請輸入新專業(yè):\n"); scanf("%s",&s.major);printf("\n");break; case'C': case'c': printf("請輸入新學(xué)號:\n"); scanf("%s",&s.code);printf("\n");break; case'u': case'U': printf("請輸入新成績:\n"); scanf("%d",&s.marks[0]);printf("\n");break; case'v': case'V': printf("請輸入新成績:\n"); scanf("%d",&s.marks[1]);printf("\n");break; case'z': case'Z': printf("請輸入新成績:\n"); scanf("%d",&s.marks[2]);printf("\n");break; case'x': case'X': printf("請輸入新成績:\n"); scanf("%d",&s.marks[3]);printf("\n");break; case'y': case'Y': printf("請輸入新成績:\n"); scanf("%d",&s.marks[4]);break; case'p': case'P': system("cls"); printf("輸入一個命令修改下列項(xiàng)目,或退出修改!\n"); puts("n:姓名."); puts("m:專業(yè)."); puts("c:學(xué)號."); puts("u:高等數(shù)學(xué)成績."); puts("v:線性代數(shù)成績."); puts("z:c語言成績."); puts("x:大學(xué)物理成績."); puts("y:概率論成績"); puts("p:清屏"); puts("q:退出修改.");break; } } s.total=0; for(j=0;j<SWN;j++) s.total=s.total+s.marks[j]; s.ave=s.total/5.0; fwrite(&s,sizeof(structrecord),1,fp); fclose(fp); } } }/*按學(xué)號修改學(xué)生記錄*/intxiugai2(char*stuf,char*buf){ intj; FILE*fp; structrecords; charc; if((fp=fopen(stuf,"r+"))==NULL) { printf("Can'topenfile%s.\n",stuf); return0; } while(fread(&s,sizeof(structrecord),1,fp)==1) { if(strcmp(s.code,buf)==0) { if(s.flag==0) {printf("學(xué)生%s不在文件%s中.\n",buf,stuf);break;} k=ftell(fp); fseek(fp,k-(long)(sizeof(structrecord)),0); printf("輸入一個命令修改下列項(xiàng)目,或退出修改!\n"); puts("n:姓名."); puts("m:專業(yè)."); puts("c:學(xué)號."); puts("u:高等數(shù)學(xué)成績."); puts("v:線性代數(shù)成績."); puts("z:c語言成績."); puts("x:大學(xué)物理成績."); puts("y:概率論成績"); puts("p:清屏"); puts("q:退出修改."); while(1) { puts("請輸入命令來修改記錄或退出修改!:"); getchar(z); scanf("%c",&c);/*輸入選擇命令*/ if(c=='q'||c=='Q') { system("cls"); printf("\n"); puts("==========."); puts("結(jié)束修改!"); puts("=========="); init(); printf("\n"); puts("現(xiàn)在您可以通過輸入一個命令來管理這些記錄"); puts("n:通過姓名查找成績記錄."); puts("c:通過學(xué)號查找成績記錄."); puts("s:按總分從高到低列出所有成績記錄."); puts("a:添加學(xué)生記錄."); puts("x:按姓名修改學(xué)生記錄."); puts("y:按學(xué)號修改學(xué)生記錄."); puts("d:按姓名刪除學(xué)生記錄."); puts("p:清屏."); puts("q:退出系統(tǒng)!"); break;/*q,結(jié)束程序運(yùn)行*/ } switch(c) { case'N': case'n': printf("請輸入新姓名:\n"); scanf("%s",&);printf("\n");break; case'M': case'm': printf("請輸入新專業(yè):\n"); scanf("%s",&s.major);printf("\n");break; case'C': case'c': printf("請輸入新學(xué)號:\n"); scanf("%s",&s.code);printf("\n");break; case'u': case'U': printf("請輸入新成績:\n"); scanf("%d",&s.marks[0]);printf("\n");break; case'v': case'V': printf("請輸入新成績:\n"); scanf("%d",&s.marks[1]);printf("\n");break; case'z': case'Z': printf("請輸入新成績:\n"); scanf("%d",&s.marks[2]);printf("\n");;break; case'x': case'X': printf("請輸入新成績:\n"); scanf("%d",&s.marks[3]);printf("\n");break; case'y': case'Y': printf("請輸入新成績:\n"); scanf("%d",&s.marks[4]);printf("\n");break; case'P': case'p': system("cls"); printf("輸入一個命令修改下列項(xiàng)目,或退出修改!\n"); puts("n:姓名."); puts("m:專業(yè)."); puts("c:學(xué)號."); puts("u:高等數(shù)學(xué)成績."); puts("v:線性代數(shù)成績."); puts("z:c語言成績."); puts("x:大學(xué)物理成績."); puts("y:概率論成績"); puts("p:清屏"); puts("q:退出修改.");printf("\n");break; } } s.total=0; for(j=0;j<SWN;j++) s.total=s.total+s.marks[j]; s.ave=s.total/5.0; fwrite(&s,sizeof(structrecord),1,fp); fclose(fp); } }return0; }/*刪除學(xué)生記錄*/intshanchu(char*stuf,char*buf){ intnum=0,j; FILE*fp; structrecords; charc; if((fp=fopen(stuf,"r+"))==NULL) { printf("Can'topenfile%s.\n",stuf); return0; } while(fread(&s,sizeof(structrecord),1,fp)==1) { if(strcmp(,buf)==0) { k=ftell(fp); fseek(fp,k-(long)(sizeof(structrecord)),0); s.flag=0; fwrite(&s,sizeof(structrecord),1,fp); fclose(fp); break; } } puts(" ****************"); puts(" *刪除記錄成功*"); puts(" ****************"); printf("\n"); return0;}/*構(gòu)造鏈表*/structnode*makelist(char*stuf){ FILE*fp;structrecords;structnode*p,*u,*v,*h;inti;if((fp=fopen(stuf,"r"))==NULL){ printf("Can'topenfile%s.\n",stuf); returnNULL;}h=NULL;p=(structnode*)malloc(sizeof(structnode));while(fread((structrecord*)p,sizeof(structrecord),1,fp)==1){ v=h; while(v&&p->total<=v->total) { u=v; v=v->next; } if(v==h) h=p; else u->next=p; p->next=v; p=(structnode*)malloc(sizeof(structnode));}free(p);fclose(fp);returnh;}/*創(chuàng)建學(xué)生記錄*/intchuangjian(){ structrecords; charcj; intn,i,j; FILE*fp; label:printf("請輸入您要操作的記錄文件名:"); scanf("%s",stuf); if((fp=fopen(stuf,"r"))==NULL) { printf("該文件不存在,您是否要創(chuàng)建它?(Y/N)"); getchar(); cj=getchar(); if(cj=='Y'||cj=='y') { fp=fopen(stuf,"w"); printf("\n請輸入您想要創(chuàng)建的記錄數(shù):"); scanf("%d",&n); for(i=0;i<n;i++) { printf("\n"); s.total=0; printf("請輸入第%d名學(xué)生的姓名:",i+1); scanf("%s",&); printf("請輸入該學(xué)生的專業(yè):"); scanf("%s",&s.major); printf("請輸入該學(xué)生的學(xué)號:"); scanf("%s",&s.code); s.flag=1; for(j=0;j<SWN;j++) { printf("請輸入%s分?jǐn)?shù):",subject[j]); scanf("%d",&s.marks[j]); s.total=s.total+s.marks[j]; s.ave=s.total/5.0; } fwrite(&s,sizeof(structrecord),1,fp); } fclose(fp); } elsegotolabel; } getchar(); return0;}/*順序顯示鏈表各表元*/intdisplaylist(structnode*h){while(h!=NULL){ displaystu((structrecord*)h); printf("\n"); h=h->next;}return0;}/*顯示學(xué)生記錄*/intdisplaystu(structrecord*p){ if(p->flag==1) { inti; printf("\nName:%s\n",p->name); printf("Major:%s\n",p->major); printf("Code:%s\n",p->code); printf("Marks:\n"); for(i=0;i<SWN;i++) printf("%-15s:%4d\n",subject[i],p->marks[i]); printf("Total:%4d\n",p->total); printf("Ave:%6.2f%\n",p->ave); } return0;}/*按姓名查找記錄*/intretrieve1(char*stuf,char*buf){ FILE*fp; intc=0; structrecords; if((fp=fopen(stuf,"r"))==NULL) { printf("無法打開文件%s.\n",stuf); return0; } while(fread(&s,sizeof(structrecord),1,fp)==1) { if((strcmp(,buf)==0)&&s.flag==1) { displaystu(&s); c++; } } fclose(fp); if(c==0) printf("學(xué)生%s不在文件%s中.\n",buf,stuf); return1;}/*按學(xué)號查找記錄*/intretrieve2(char*stuf,char*buf){ FILE*fp; intc=0; structrecords; if((fp=fopen(stuf,"r"))==NULL) { printf("無法打開文件%s.\n",stuf); return0; } while(fread(&s,sizeof(structrecord),1,fp)==1) { if((strcmp(s.code,buf)==0)&&s.flag==1) { displaystu(&s); c++; } } fclose(fp); if(c==0) printf("學(xué)生%s不在文件%s中.\n",buf,stuf); return1;}/*操作函數(shù)*/intoperate(){ inti,j; charc,buf[BUFLEN]; printf("\n"); puts("現(xiàn)在您可以通過輸入一個命令來管理這些記錄"); puts("n:通過姓名查找成績記錄."); puts("c:通過學(xué)號查找成績記錄."); puts("s:按總分從高到低列出所有成績記錄."); puts("a:添加學(xué)生記錄."); puts("x:按姓名修改學(xué)生記錄."); puts("y:按學(xué)號修改學(xué)生記錄."); puts("d:按姓名刪除學(xué)生記錄"); puts("p:清屏."); puts("q:退出系統(tǒng)!"); while(1) { puts("請輸入命令:"); scanf("%c",&c);/*輸入選擇命令*/ if(c=='q'||c=='Q') { printf("\n"); system("cls"); puts("*********************"); puts("*感謝使用*"); puts("**"); puts("*再見??!*"); puts("*********************"); break;/*q,結(jié)束程序運(yùn)行*/ } switch(c) { case'n':/*按學(xué)生的姓名尋找記錄*/ case'N': printf("請輸入您想要查找的學(xué)生的姓名:"); scanf("%s",buf); retrieve1(stuf,buf); break; case'c':/*按學(xué)生的學(xué)號尋找記錄*/ case'C': printf("請輸入您想要查找的學(xué)生的學(xué)號:"); scanf("%s",buf); retrieve2(stuf,buf); break; case's':/*按總分從高到低排列顯示*/ case'S': if((head=makelist(stuf))!=NULL) displaylist(head); break; case'A':/*添加學(xué)生記錄*/ case'a':tianjia(stuf);break; case'X': case'x': printf("請輸入您想要修改的學(xué)生記錄的姓名:"); scanf("%s",buf); printf("\n"); xiugai1(stuf,buf);break;/*按姓名修改學(xué)生記錄*/ case'Y': case'y': printf("請輸入您想要修改的學(xué)生記錄的學(xué)號:"); scanf("%s",buf); printf("\n"); xiugai2(stuf,buf);break;/*按學(xué)號修改學(xué)生記錄*/ case'D': case'd': printf("請輸入您想要刪除的學(xué)生記錄的姓名:"); scanf("%s",buf); shanchu(stuf,buf);break;/*按姓名刪除學(xué)生記錄*/ case'P': case'p': system("cls"); init(); printf("\n"); puts("現(xiàn)在您可以通過輸入一個命令來管理這些記錄"); puts("n:通過姓名查找成績記錄."); puts("c:通過學(xué)號查找成績記錄."); puts("s:按總分從高到低列出所有成績記錄."); puts("a:添加學(xué)生記錄."); puts("x:按姓名修改學(xué)生記錄."); puts("y:按學(xué)號修改學(xué)生記錄."); puts("d:按姓名刪除學(xué)生記錄"); puts("p:清屏."); puts("q:退出系統(tǒng)!"); } }return0;}intinit1(){ printf("==============================================\n"); printf("歡迎使用學(xué)生成績管理系統(tǒng)!\n\n"); printf("請先輸入一個需要操作的文件名,若該文件不存在\n\t\t則會進(jìn)行創(chuàng)建!如:D:\\123.txt\n"); printf("==============================================\n\n"); return0;}intinit(){ printf("==============================================\n\n"); printf("歡迎使用學(xué)生成績管理系統(tǒng)!\n\n"); printf("==============================================\n\n"); return0;} intmain(){ init1(); chuangjian(); operate(); return0;}3.算法流程圖a.主函數(shù)模塊流程圖 執(zhí)行init1()函數(shù)執(zhí)行init1()函數(shù)開始 執(zhí)行chuangjian()函數(shù) 執(zhí)行chuangjian()函數(shù) 執(zhí)行operate執(zhí)行operate()函數(shù)結(jié)束是I結(jié)束是If語句判斷否否 選擇C調(diào)用retrieve1()函數(shù)調(diào)用makelist()函數(shù)調(diào)用retrieve2()函數(shù)調(diào)用system(cls)函數(shù)調(diào)用shanchu()函數(shù)調(diào)用xiugai2()函數(shù)調(diào)用xiugai1()函數(shù)調(diào)用選擇C調(diào)用retrieve1()函數(shù)調(diào)用makelist()函數(shù)調(diào)用retrieve2()函數(shù)調(diào)用system(cls)函數(shù)調(diào)用shanchu()函數(shù)調(diào)用xiugai2()函數(shù)調(diào)用xiugai1()函數(shù)調(diào)用tianjia()函數(shù)調(diào)用displaystu()函數(shù)調(diào)用displaylist()函數(shù)b.retrieve1(),retrieve2()查找函數(shù)流程圖開始 開始IIf語句判斷執(zhí)行printf()函數(shù)是執(zhí)行printf()函數(shù)是結(jié)束結(jié)束否否while語句判斷while語句判斷IIf語句判
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 旅游景區(qū)樁基夯擴(kuò)樁施工合同
- 城市輕軌站點(diǎn)熱熔標(biāo)線施工合同
- 電動玩具用電施工合同
- 衢州市商務(wù)中心租賃合同
- 精密儀器維修員聘用合同協(xié)議
- 舞蹈表演中心租賃協(xié)議模板
- 甜品店廚房裝潢施工合同工程
- 電力工程招投標(biāo)廉政協(xié)議范本
- 戶外拓展訓(xùn)練山坡地租賃協(xié)議
- 辦公室弱電工程合同范本
- 民法典合同編解讀之合伙合同
- 高中英語學(xué)習(xí)情況問卷調(diào)查表及調(diào)查報(bào)告
- 《微電影制作教程》第五章
- GRR計(jì)算公式表格
- 梅毒診斷標(biāo)準(zhǔn)
- 2023年catti三級筆譯綜合能力考試試題及答案解析
- 幸運(yùn)的內(nèi)德(一年級繪本閱讀)課件
- 急性缺血性腦卒中急診急救中國專家共識
- Python語言基礎(chǔ)與應(yīng)用學(xué)習(xí)通超星課后章節(jié)答案期末考試題庫2023年
- 六年級上冊英語說課稿- Module 6 Unit 2 I've got a stamp from China. -外研社(三起)
- 住宅室內(nèi)裝飾裝修管理辦法
評論
0/150
提交評論