C語言課程設(shè)計(jì)報(bào)告--學(xué)生成績管理系統(tǒng)_第1頁
C語言課程設(shè)計(jì)報(bào)告--學(xué)生成績管理系統(tǒng)_第2頁
C語言課程設(shè)計(jì)報(bào)告--學(xué)生成績管理系統(tǒng)_第3頁
C語言課程設(shè)計(jì)報(bào)告--學(xué)生成績管理系統(tǒng)_第4頁
C語言課程設(shè)計(jì)報(bào)告--學(xué)生成績管理系統(tǒng)_第5頁
已閱讀5頁,還剩25頁未讀 繼續(xù)免費(fèi)閱讀

下載本文檔

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

文檔簡介

1、學(xué)生成績管理系統(tǒng)課程設(shè)計(jì)報(bào)告 2010-7-9一、程序整體規(guī)劃:1.系統(tǒng)的基本功能 數(shù)據(jù)的錄入:如錄入學(xué)生的基本信息,以及該學(xué)生選修課程的基本信息; 數(shù)據(jù)的修改:如修改指定學(xué)號(hào)、或者指定姓名的學(xué)生信息,或者修改其選修課程信息; 數(shù)據(jù)的插入:插入某個(gè)學(xué)生信息; 數(shù)據(jù)的查詢:如按學(xué)號(hào)查詢、按姓名查詢等; 數(shù)據(jù)的刪除:如刪除指定學(xué)號(hào)、或者指定姓名的學(xué)生及其選修課程信息; 平均成績的計(jì)算:計(jì)算每個(gè)學(xué)生各門功課的平均成績,并按平均成績從高到低的次序輸出學(xué)生信息; 考慮用文件把數(shù)據(jù)保存起來2、首先是結(jié)構(gòu)體的定義:typedef struct message_student char number6; ch

2、ar name20; char sex4; float subjectnumsubs; float score; float average; int index;student;int numstus; 定義學(xué)生數(shù)目student *pointer; 指向結(jié)構(gòu)體數(shù)組int lens; 次遲到時(shí)候分配內(nèi)存3、部分重要函數(shù)聲明:int menu_select(); 決定主界面的函數(shù) int openfile(student stu); 打開文件的函數(shù)int findrecord(student stud); 查找信息的函數(shù)int writetotext(student stud); 保存文件的函

3、數(shù) void sort(student stu); 查找信息的函數(shù)void deleterecord(student stu,int i); 刪除信息的函數(shù)void addrecord(student stud); 增加學(xué)生信息的函數(shù)void display(student stud,int n1,int n2); 數(shù)據(jù)的顯示函數(shù)void sortnum(student stud); 以下幾個(gè)均為排序函數(shù)void sortnum2(student stud); void sortname(student stud);void sortname2(student stud);void sortc

4、ount(student stud);void sortcount2(student stud);4、設(shè)計(jì)思路1、主函數(shù)以switch和case語句引出其他子函數(shù)。然后進(jìn)行其他子函數(shù)的調(diào)用。2、定義結(jié)構(gòu)體student,讓其包含如姓名性別等基本信息。同時(shí)定義結(jié)構(gòu)體指針,以便后面子函數(shù)對(duì)某一項(xiàng)排序后輸出該學(xué)生的全部信息。LENS給結(jié)構(gòu)體數(shù)組分配內(nèi)存。3、各個(gè)函數(shù)運(yùn)行并相互調(diào)用其他子函數(shù),例如幾個(gè)排序函數(shù)全部被其它函數(shù)調(diào)用并輸出結(jié)果。具體各子函數(shù)之間的關(guān)系見源代碼。4、student stui表示的是一個(gè)結(jié)構(gòu)體,內(nèi)填大于等于0的數(shù),這可以解釋各個(gè)子函數(shù)中出現(xiàn)此類情況:例如strcmp(str,st

5、)=0是該結(jié)構(gòu)體內(nèi)的第i+1個(gè)學(xué)生滿足上述條件。由Studi.變量來引用各結(jié)構(gòu)體中的變量,然后用輸出函數(shù)相應(yīng)輸出該結(jié)構(gòu)體內(nèi)的信息。二 程序模板細(xì)致分析:1.程序涉及的模板:主程序模板. 查詢模塊.刪除模板. 將所有記錄寫入文件.輸出模板.修改信息模板.錄入信息模板. 和排序模板.排序模板可按如下進(jìn)行分類:按學(xué)號(hào):按學(xué)號(hào)降序排序模塊.按學(xué)號(hào)升序排序模塊.按姓名:按姓名降序排序模塊. 按姓名升序排序模塊. 按名次:按名次降序排序模塊. 按名次升序排序模塊. 2.功能結(jié)構(gòu)聯(lián)系圖如下圖所示:主函數(shù)模板增加學(xué)生記錄查詢學(xué)生記錄修改學(xué)生記錄 學(xué)生紀(jì)錄排序保存文件 打開文件 統(tǒng)計(jì)信息 現(xiàn)對(duì)各

6、個(gè)功能的實(shí)現(xiàn)及個(gè)人認(rèn)為每個(gè)功能中所用到的程序的閃光點(diǎn)和難點(diǎn):1.增加學(xué)生記錄增加學(xué)生記錄已有記錄是否覆蓋當(dāng)輸入數(shù)據(jù)過多時(shí)內(nèi)存的擴(kuò)展輸入數(shù)字為1.0,但是結(jié)果輸出為男.女2已有記錄是否覆蓋:if(numstus!=0) printf(已有記錄存在是否覆蓋?(y/n)n); fflush(stdin); gets(str); if(str0=Y|str0=y) i=0;當(dāng)輸入數(shù)據(jù)過多時(shí)內(nèi)存的擴(kuò)展: (通過定義LENS開辟增加內(nèi)存) if(numstuslens) lens+=50; pointer=(student *)realloc(pointer,lens*LEN);輸入數(shù)字為1.0,但是結(jié)果

7、輸出為男.女: printf(請(qǐng)輸入性別(男/女 1/0):); gets(studi.sex); if(studi.sex0=0) strcpy(studi.sex,女); else strcpy(studi.sex,男);2. 查詢學(xué)生記錄查詢學(xué)生記錄按學(xué)號(hào),姓名,名次進(jìn)行查詢?nèi)绾胃鶕?jù)學(xué)號(hào)輸出其相應(yīng)的成績,性別等例: 按學(xué)號(hào)查找: if(str0=1) printf(請(qǐng)輸入學(xué)號(hào):); fflush(stdin); 亮點(diǎn):清除數(shù)據(jù)緩沖區(qū)間 gets(str); for(i=0;i=numstus;i+) if(strcmp(str,studi.number)=0) 亮點(diǎn):利用該函數(shù)將結(jié)構(gòu)體數(shù)

8、組中相應(yīng)相同項(xiàng)聯(lián)系在一起,確定其相應(yīng)位置,便于輸出。 display(stud,i,i); 子函數(shù)又調(diào)用了其他子函數(shù) break; else continue;3修改學(xué)生記錄 例:int i=-1,j; if(numstus=0) /*沒有記錄返回*/ printf(沒有可供修改的記錄!); while(i=0) printf(要?jiǎng)h除這個(gè)學(xué)生的信息嗎?(y/n); 此處有一個(gè)難點(diǎn)就是while函數(shù)和調(diào)用其他子函數(shù)findrecord,以及解釋為什么一開始要定義i為-1 4.學(xué)生紀(jì)錄排序按學(xué)號(hào):按學(xué)號(hào)降序排序模塊.按學(xué)號(hào)升序排序模塊.按姓名:按姓名降序排序模塊. 按姓名升序排序模塊. 按名次:按

9、名次降序排序模塊. 按名次升序排序模塊.在排序過程中比較名次,成績大小是不難的事情,名字通過STRCMPY函數(shù)來解決排序問題,但排序中的難點(diǎn)在于指針,結(jié)構(gòu)體變量,結(jié)構(gòu)體數(shù)組的綜合應(yīng)用,通過比較你的一組數(shù)據(jù)要輸出所有該成員相應(yīng)的信息,幾個(gè)排序中指針既指明了變量的地址,也指明了結(jié)構(gòu)體數(shù)組的地址。此處感覺很棘手詳細(xì)如下一條典型的例子:(其余的大致相同) student temp; student *p; p=stud; for(i=0;inumstus;i+) for(j=0;j0) temp=*(p+j); *(p+j)=*(p+j+1); *(p+j+1)=temp; 5打開文件和保存文件fge

10、tc(fp); while(inumstus) fscanf(fp,%s,stui.number); fscanf(fp,%s,); fscanf(fp,%s,stui.sex); for(j=0;jnumsubs;j+) fscanf(fp,%f,&stui.subjectj); fscanf(fp,%f,&stui.score); fscanf(fp,%f,&stui.average); fscanf(fp,%d,&stui.index); i+; 打開文件用函數(shù)fopen,fclose實(shí)現(xiàn)文件的打開,文件的關(guān)閉。其中按格式將內(nèi)存中的數(shù)據(jù)轉(zhuǎn)換成對(duì)應(yīng)的ASCII字符,并以碼

11、形式輸出到文本文件中保存文件先給所要保存的文件一個(gè)內(nèi)存地址fp,然后將數(shù)據(jù)輸入,數(shù)據(jù)存儲(chǔ)過程中所用到的 fscanf將數(shù)據(jù)通過一個(gè)文件指針指向一個(gè)已打開的文本文件。此處的難點(diǎn)見函數(shù)的整體規(guī)劃的詳細(xì)說明。三、部分運(yùn)行的圖像主界面:紀(jì)錄排序:信息查找和修改文件保存和顯示數(shù)據(jù)統(tǒng)計(jì)四程序主要代碼include stdio.h#include string.h#include malloc.h#define H_STUDENT_HH#define LEN sizeof(struct message_student) /*一個(gè)結(jié)構(gòu)體數(shù)組元素的長度*/#define numsubs 4 /*學(xué)科數(shù)目*/ty

12、pedef struct message_student /*結(jié)構(gòu)體定義*/ char number6; char name20; char sex4; float subjectnumsubs; float score; float average; int index;student;int numstus; /*學(xué)生數(shù)目*/student *pointer; /*指向結(jié)構(gòu)體數(shù)組*/int lens;int menu_select(); /*函數(shù)聲明*/int openfile(student stu);int findrecord(student stud);int writetotex

13、t(student stud);void display1();void showtable();void sort(student stu); void deleterecord(student stu,int i);void addrecord(student stud);void display(student stud,int n1,int n2);void amendrecord(student stud);void count(student stud);void sortnum(student stud);void sortnum2(student stud);void sort

14、name(student stud);void sortname2(student stud);void sortcount(student stud);void sortcount2(student stud);void statistic(student stud);void display1();int menu_select() char c; int num;printf( nn 中南大學(xué)電氣信息類學(xué)生信息管理系統(tǒng) );printf( nn);printf( * 制作人:陳光堯 電氣0916班 學(xué)號(hào)0909091611 n n);printf( nn); printf( *系統(tǒng)功能菜

15、單*n n);printf( - - n);printf( n);printf( n); printf( 1. 增加學(xué)生記錄 5.統(tǒng)計(jì)信息 n);printf( * n); printf( 2. 查詢學(xué)生記錄 6.打開文件 n);printf( * n);printf( 3. 修改學(xué)生記錄 7.保存文件 n);printf( * n);printf( 4. 學(xué)生紀(jì)錄排序 n);printf( * n);printf( n);printf( n); printf(請(qǐng)選擇1-8:); fflush(stdin); c=getchar(); return (c);/*-查詢模塊-*/ int fin

16、drecord(student stud) /*查找信息*/ system(cls); char str20; int i,num; if(numstus=0) printf(沒有可被查找的記錄n); printf(按回車鍵退出); fflush(stdin); getchar(); return -1; else printf(以何種方式查找?n1.學(xué)號(hào)t2.姓名t3.名次n); fflush(stdin); gets(str); if(str0=1) /*按學(xué)號(hào)查找*/ printf(請(qǐng)輸入學(xué)號(hào):); fflush(stdin); gets(str); for(i=0;i=numstus;

17、i+) if(strcmp(str,studi.number)=0) display(stud,i,i); break; else continue; else if(str0=2) /*按姓名查找*/ printf(請(qǐng)輸入姓名:); gets(str); for(i=0;i=numstus;i+) if(strcmp(str,)=0) display(stud,i,i); break; else continue; else if(str0=3) /*按名次查找*/ printf(請(qǐng)輸入名次:); fflush(stdin); scanf(%d,&num); for(i=

18、0;inumstus) printf(沒有查找所要的信息。n); printf(按回車鍵退出); fflush(stdin); getchar(); return -1; return i; int openfile(student stu) int i=0,j; FILE *fp; char filename20,str2; if(numstus!=0) printf(已經(jīng)有記錄存在,是否保存?(y/n); fflush(stdin); gets(str); if(str0=y|str0=Y) writetotext(stu); printf(請(qǐng)輸入文件名:); fflush(stdin);

19、 gets(filename); numstus=0; if(fp=fopen(filename,rb+)=NULL) printf(無法打開該文件n); return(-1); fscanf(fp,%d,&numstus); fgetc(fp); while(inumstus) fscanf(fp,%s,stui.number); fscanf(fp,%s,); fscanf(fp,%s,stui.sex); for(j=0;jnumsubs;j+) fscanf(fp,%f,&stui.subjectj); fscanf(fp,%f,&stui.score); fscan

20、f(fp,%f,&stui.average); fscanf(fp,%d,&stui.index); i+; fclose(fp); printf(文件讀取成功n); printf(是否顯示紀(jì)錄?(y/n); fflush(stdin); gets(str); if(str0=y|str0=Y) display(stu,0,numstus-1); if(str0!=y&str0!=Y&str0!=n&str0!=N) printf(請(qǐng)輸入n或者y!); gets(str); if(str0=y|str0=Y) display(stu,0,numstus-1); return(0);/*-排序模

21、塊-*/ void sort(student stud) int i,j=0; char str5; student *p; p=stud; if(numstus=0) printf(沒有可供查詢的記錄!); while(1) for(i=0;i+) printf( 請(qǐng)輸入查詢方式:); printf((直接輸入回車則結(jié)束查詢操作)n); printf(1.按照學(xué)號(hào)t); printf(2.按照姓名t); printf(3.按照名次n); fflush(stdin); gets(str); if(strlen(str)=0) break; if(str0=1) printf(請(qǐng)輸入排序次序:n

22、); printf(1.升序排列t); printf(2.降序排列n); gets(str); if(str0=1) sortnum2(p); else sortnum(p); display(stud,0,numstus-1); else if(str0=2) printf(請(qǐng)輸入排序次序:n); printf(1.升序排列t); printf(2.降序排列n); gets(str); if(str0=1) sortname2(p); else sortname(p); display(stud,0,numstus-1); else if(str0=3) printf(請(qǐng)輸入排序次序:n);

23、 printf(1.升序排列t); printf(2.降序排列n); gets(str); if(str0=1) sortcount2(p); else sortcount(p); display(stud,0,numstus-1); else printf(請(qǐng)輸入13); printf(是否退出排序?(y/n); gets(str); if(str0=y|str0=Y) break; return; /*-按學(xué)號(hào)降序排序模塊-*/ void sortnum(student stud) int i,j; student temp; student *p; p=stud; for(i=0;inu

24、mstus;i+) for(j=0;j0) temp=*(p+j); *(p+j)=*(p+j+1); *(p+j+1)=temp; /*-按學(xué)號(hào)升序排序模塊-*/ void sortnum2(student stud) int i,j; student temp; student *p; p=stud; for(i=0;inumstus;i+) for(j=0;j0) temp=*(p+j); *(p+j)=*(p+j+1); *(p+j+1)=temp; /*-按姓名降序排序模塊-*/ void sortname(student stud) int i,j; student temp; s

25、tudent *p; p=stud; for(i=0;inumstus;i+) for(j=0;j0) temp=*(p+j); *(p+j)=*(p+j+1); *(p+j+1)=temp; /*-按姓名升序排序模塊-*/ void sortname2(student stud) int i,j; student temp; student *p; p=stud; for(i=0;inumstus;i+) for(j=0;j0) temp=*(p+j); *(p+j)=*(p+j+1); *(p+j+1)=temp; /*-按名次降序排序模塊-*/ void sortcount(studen

26、t stud) int i,j; student temp; student *p; p=stud; for(i=0;inumstus;i+) for(j=0;jstudj.index) temp=*(p+j); *(p+j)=*(p+j+1); *(p+j+1)=temp; /*-按名次升序排序-*/ void sortcount2(student stud) int i,j; student temp; student *p; p=stud; for(i=0;inumstus;i+) for(j=0;jstudj+1.index) temp=*(p+j); *(p+j)=*(p+j+1);

27、 *(p+j+1)=temp; void statistic(student stud) /*新增功能,輸出統(tǒng)計(jì)信息*/ int i,j=0,k=0; char c1,str2; float averagenumsubs,sum=0; if(numstus=0) printf(沒有可被查找的記錄n); else while(1) printf(下面將統(tǒng)計(jì)考試成績n); printf(請(qǐng)選擇你要統(tǒng)計(jì)哪科的成績 1.At2.Bt3.Ct4.Dtn); fflush(stdin); c1=getchar(); printf(t一共有個(gè)%d記錄n,numstus); /*總共記錄數(shù)*/ switch(

28、c1) case 1: for(i=0;istudi.subject0) k=i; if(studj.subject0studi.subject0) j=i; average0=sum/numstus; printf(t科目A的最高分:n); /*最高分*/ printf(tt學(xué)號(hào):%s 姓名:%s 分?jǐn)?shù):%.2fn,studj.number,,studj.subject0); printf(t科目A的最低分是:n); /*最低分*/ printf(tt學(xué)號(hào):%s 姓名:%s 分?jǐn)?shù):%.2fn,studk.number,,studk.subject0);

29、 printf(t科目A的平均分是 %5.2fn,average0); /*平均分*/ break; case 2: for(i=0;istudi.subject1) k=i; if(studj.subject1studi.subject1) j=i; average1=sum/numstus; printf(t科目B的最高分:n); /*最高分*/ printf(tt學(xué)號(hào):%s 姓名:%s 分 printf(t科目B的最低分是:n); /*最低分*/ printf(tt學(xué)號(hào):%s 姓名:%s 分?jǐn)?shù):%.2fn,studk.number,,studk.subject1);

30、printf(t科目B的平均分是 %5.2fn,average1); /*平均分*/ break; case 3: for(i=0;istudi.subject2) k=i; if(studj.subject2studi.subject2) j=i; average2=sum/numstus; printf(t科目C的最高分:n); /*最高分*/ printf(tt學(xué)號(hào):%s 姓名:%s 分?jǐn)?shù):%.2fn,studj.number,,studj.subject2); printf(t科目C的最低分是:n); /*最低分*/ printf(tt學(xué)號(hào):%s 姓名:%s 分?jǐn)?shù):

31、%.2fn,studk.number,,studk.subject2); printf(t科目C的平均分是 %5.2fn,average2); /*平均分*/ break; case 4: for(i=0;istudi.subject3) k=i; if(studj.subject3studi.subject3) j=i; average3=sum/numstus; printf(t科目D的最高分:n); /*最高分*/ printf(tt學(xué)號(hào):%s 姓名:%s 分?jǐn)?shù):%.2fn,studj.number,,studj.subject3); printf

32、(t科目D的最低分是:n); /*最低分*/ printf(tt學(xué)號(hào):%s 姓名:%s 分?jǐn)?shù):%.2fn,studk.number,,studk.subject3); printf(t科目D的平均分是 %5.2fn,average3); /*平均分*/ break; default:printf(輸入錯(cuò)誤!請(qǐng)輸入14之間的數(shù)n); sum=0; getchar(); printf(是否繼續(xù)進(jìn)行統(tǒng)計(jì)?(y/n); gets(str); if(str0=y|str0=Y) ; else break; /*-將所有記錄寫入文件-*/ int writetotext(student

33、 stud) /*將所有記錄寫入文件*/ int i=0,j; FILE *fp; char filename20; printf(輸入文件名稱:); gets(filename); fp=fopen(filename,w); fprintf(fp,%dn,numstus); while(inumstus) fprintf(fp,%s %s %s ,studi.number,,studi.sex); for(j=0;jnumsubs;j+) fprintf(fp,%f ,studi.subjectj); fprintf(fp,%f %f %d ,studi.score,st

34、udi.average,studi.index); i+; fclose(fp); printf(已成功存儲(chǔ)!n); display(stud,0,numstus-1); numstus=0; return 0;void showtable() printf(-n); printf(學(xué)號(hào)t姓名t性別tAtBtCtDt總分t平均分t名次n); printf(-n); /*-輸出模塊-*/ void display(student stud,int n1,int n2) int i; showtable(); /*顯示表頭*/ for(i=n1;i=n2;i+) printf(%st%st%st%

35、.2ft%.2ft%.2ft%.2ft%.2ft%.2ft%dtn,studi.number,,studi.sex,studi.subject0,studi.subject1,studi.subject2,studi.subject3,studi.score,studi.average,studi.index); /*通過循環(huán)輸出數(shù)據(jù)*/ printf(按回車鍵退出); getchar(); /*-修改信息模塊-*/ void amendrecord(student stud) char str5; /*供用戶輸入*/ int i=-1,j; if(numstus=0) /*沒有記錄返回*/ printf(沒有可供修改的記錄!); while(i=0) printf(要?jiǎng)h除這個(gè)學(xué)生的信息嗎?(y/n); gets(str); if(str0=y|str0=Y) deleterecord(s

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 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ì)自己和他人造成任何形式的傷害或損失。

最新文檔

評(píng)論

0/150

提交評(píng)論