C語言課程設(shè)計(jì)學(xué)生成績(jī)管理系統(tǒng)+源碼
《C語言課程設(shè)計(jì)學(xué)生成績(jī)管理系統(tǒng)+源碼》由會(huì)員分享,可在線閱讀,更多相關(guān)《C語言課程設(shè)計(jì)學(xué)生成績(jī)管理系統(tǒng)+源碼(25頁珍藏版)》請(qǐng)?jiān)谘b配圖網(wǎng)上搜索。
1、簡(jiǎn)易教學(xué)管理系統(tǒng)的設(shè)計(jì)與實(shí)現(xiàn)【摘要】:本系統(tǒng)可以實(shí)現(xiàn)簡(jiǎn)易的學(xué)生成績(jī)管理,功能有限,主要功能包括讀取文件中存放的學(xué)生成績(jī)單,并對(duì)其求每個(gè)人的平均分,然后按照平均分對(duì)其排名;另外還可以計(jì)算每門課程的平均分和標(biāo)準(zhǔn)差,并按照成績(jī)對(duì)學(xué)生劃分區(qū)段,將處理后的結(jié)果可以保存在新建的一個(gè)文件中,方便查看;通過此系統(tǒng)還可以將每個(gè)同學(xué)的成績(jī)單單獨(dú)的輸出到文件中,保存在一個(gè)指定的文件夾中;值得一提的是次系統(tǒng)還可以按照特定的要求進(jìn)行數(shù)據(jù)篩選,比如屏幕顯示有不及格科目的同學(xué)的信息,屏幕顯示符合設(shè)定的優(yōu)等生的條件的學(xué)生;最后本系統(tǒng)還實(shí)現(xiàn)了顯示每門課程的成績(jī)分布圖(橫向的)。 一、設(shè)計(jì)思路 程序設(shè)計(jì)一般有兩個(gè)部分組成,算法和
2、數(shù)據(jù)結(jié)構(gòu),合理的選擇和實(shí)現(xiàn)一個(gè)數(shù)據(jù)結(jié)構(gòu)和車?yán)镞@些數(shù)據(jù)結(jié)構(gòu)具有同樣的重要性。在這個(gè)學(xué)生成績(jī)管理系統(tǒng)中,算法都很簡(jiǎn)單,基本上沒有什么很復(fù)雜的算法,難點(diǎn)主要在數(shù)據(jù)結(jié)構(gòu)上面,因?yàn)檫@個(gè)系統(tǒng)涉及到得數(shù)據(jù)比較多,很多數(shù)據(jù)很容易混淆,所以,我設(shè)計(jì)了三個(gè)數(shù)據(jù)結(jié)構(gòu),分別如下:/定義常數(shù)#define MAX 100#define KCS 5/實(shí)際課程數(shù)int k;struct Stu_Data_1char Elem15;struct Stu_Data_2char cou10;double ave;double bzc;int best;int better;int good;int pass;int fail;s
3、truct Stu_Creditchar NO10;char course10;char cerdit10;首先是定義常量,這些常量的目的主要是為了程序的通用性和易修改性設(shè)計(jì),#define KCS 5; 的目的是預(yù)先估計(jì)課程數(shù)目,在次設(shè)計(jì)成常量,方便擴(kuò)展和修改,使其實(shí)用性更強(qiáng),#define MAX 100; 的目的是預(yù)先估計(jì)學(xué)生的人數(shù)。第一個(gè)數(shù)據(jù)結(jié)構(gòu)是:Stu_Data_1,這個(gè)數(shù)據(jù)結(jié)構(gòu)式本系統(tǒng)的核心,主要負(fù)責(zé)從文件中逐行讀取數(shù)據(jù)放入其Elem中,用這個(gè)數(shù)據(jù)結(jié)構(gòu)定義一個(gè)二維的數(shù)組,就可以很方便的對(duì)文件中的數(shù)據(jù)進(jìn)行管理了,使整個(gè)函數(shù)的設(shè)計(jì)容易了很多。第二個(gè)數(shù)據(jù)結(jié)構(gòu)是:Stu_Data_2,這
4、個(gè)數(shù)據(jù)結(jié)構(gòu)的主要作用是用于存放對(duì)學(xué)生的成績(jī)處理后的結(jié)果的。char cou10;存放課程名稱,double ave;存放每科的平均分,double bzc;存放每科得標(biāo)準(zhǔn)差,下面的用于存放不同等級(jí)人數(shù)。第三個(gè)數(shù)據(jù)結(jié)構(gòu)是:Stu_Credit,這個(gè)數(shù)據(jù)結(jié)構(gòu)主要負(fù)責(zé)將存放在文件中的各門課程所對(duì)應(yīng)的學(xué)分讀取出來,方便在程序執(zhí)行中使用,用,NO來存放 課程編號(hào),用 char course10來存放課程名稱,用 char cerdit10; 在存放最重要的課程學(xué)分,此數(shù)據(jù)結(jié)構(gòu)主要用于在主函數(shù)中計(jì)算每個(gè)學(xué)生的加權(quán)平均分,在其他函數(shù)中基本上很好調(diào)用。流程圖開始讀取成績(jī)文件是否成功讀取學(xué)分文件是否成功進(jìn)入DO
5、WHILE循環(huán)MENU126534按平均分排名對(duì)學(xué)生成績(jī)進(jìn)行綜合分析保存每位同學(xué)成績(jī)顯示不及格學(xué)生顯示優(yōu)等生名單打印成績(jī)分布圖退出程序q結(jié)束否否二、主要函數(shù)及其功能 1、void Rank_List(int num,struct Stu_Data_1 stuMAXKCS+2,double average ,int n),按平均分給每個(gè)同學(xué)進(jìn)行排序,然后保存到另一個(gè)文件中; 2、void Ave_Sta_dev(struct Stu_Data_1 stuMAXKCS+2,int n),求各科的總體均分和標(biāo)準(zhǔn)差,結(jié)果存放在新建的一個(gè)文件中; 3、void Score_List(struct Stu
6、_Data_1 stuMAXKCS+2, int n,double average, int num),保存所有學(xué)生的成績(jī)單,將所有的成績(jī)單存放在一個(gè)指定的文件夾中; 4、void Unpass_List(struct Stu_Data_1 stuMAXKCS+2,struct Stu_Credit xuefen,int n),屏幕顯示所有不及格的人的不及格科目; 5、void Excellence_List(struct Stu_Data_1 stuMAXKCS+2,int num,double average,int n),找出優(yōu)等生,并將他們保存到新建的文件中; 6、void Distr
7、ibution(struct Stu_Data_1 stuMAXKCS+2,int n),繪制學(xué)生成績(jī)柱狀分布圖 7、void Menu(),主菜單函數(shù),主要用于調(diào)出主菜單;三、系統(tǒng)詳細(xì)設(shè)計(jì)及實(shí)現(xiàn)過程 程序采用模塊化設(shè)計(jì),主函數(shù)是程序的入口,個(gè)模塊獨(dú)立,可分塊調(diào)試。While()循環(huán)保證程序的循環(huán)運(yùn)行;通過函數(shù)switch()使得到得返回值調(diào)用相應(yīng)的各功能函數(shù),程序的主菜單如下: 總體來說,這個(gè)系統(tǒng)可以分為七個(gè)功能模塊,其分別是:計(jì)算每個(gè)學(xué)生的加權(quán)平均分并進(jìn)行排名,計(jì)算每門課程的總體均分,標(biāo)準(zhǔn)差以及分組情況,打印出每個(gè)學(xué)生的成績(jī)單,顯示有不及格科目的學(xué)生,顯示符合優(yōu)等生條件的學(xué)生和繪制每門課程
8、的分布圖。1、主函數(shù)功能實(shí)現(xiàn) 主函數(shù)首先是要求輸入存放學(xué)生成績(jī)的文件,然后在讀取每門課程所對(duì)應(yīng)的學(xué)分,其界面如下: 如果輸入的文件名不正確,則會(huì)提示重新輸入文件名,知道輸入正確的文件名,即讀取文件中的數(shù)據(jù)成功,讀取到數(shù)據(jù)后在主函數(shù)中會(huì)對(duì)其進(jìn)行處理,分別計(jì)算出其平均分和排名。2、計(jì)算加權(quán)平均分模塊 此模塊的功能主要是通過函數(shù)void Rank_List(int num,struct Stu_Data_1 stuMAXKCS+2,double average ,int n),來實(shí)現(xiàn)的,其基本實(shí)現(xiàn)思路是: 直接將在主函數(shù)中計(jì)算好的排名,在加上一些信息保存到新建的一個(gè)文件中,其執(zhí)行完后如下: 如果在這
9、個(gè)界面選擇y,則會(huì)通過系統(tǒng)調(diào)用打開對(duì)應(yīng)的文件。關(guān)閉文件后可以進(jìn)行下一步操作。3、計(jì)算各科均分及標(biāo)準(zhǔn)差和分組情況模塊這個(gè)模塊要實(shí)現(xiàn)的功能很多,主要是通過void Ave_Sta_dev(struct Stu_Data_1 stuMAXKCS+2,int n),函數(shù)來實(shí)現(xiàn)的。其處理完后保存到文件中,其格式如下:4、打印出每個(gè)學(xué)生的成績(jī)單這個(gè)模塊相對(duì)比較難一點(diǎn),主要是要建立一個(gè)文件夾,在本系統(tǒng)中通過:system(md score),來建立一個(gè)文件夾,建立好文件夾后然后按照一定得規(guī)則保存到這個(gè)新建的文件夾中,文件的前面的名字是自己輸入的,其界面如下:5、顯示不及格學(xué)生的信息這個(gè)功能很簡(jiǎn)單,主要是通過
10、函數(shù)int check(int k ,struct Stu_Data_1 stuMAXKCS+2)函數(shù)判斷給定的數(shù)據(jù)是否存在不及格科目;然后通過void Unpass_List(struct Stu_Data_1 stuMAXKCS+2,struct Stu_Credit xuefen,int n)函數(shù)顯示在屏幕上面;方便查看,這個(gè)部分不保存到文件中,顯示界面如下: 6、顯示優(yōu)等生學(xué)生的信息這個(gè)模塊和上面的基本上一樣,首先通過:int yds(int k ,struct Stu_Data_1 stuMAXKCS+2,int num,double average)來判斷給定的學(xué)生是否滿足優(yōu)等生的
11、條件。然后通過 void Excellence_List(struct Stu_Data_1 stuMAXKCS+2,int num,double average,int n)來顯示在屏幕上,其見面如下: 7、繪制各科成績(jī)的分布圖 這個(gè)模塊主要是通過一個(gè)簡(jiǎn)單的算法實(shí)現(xiàn)的,具體算法可以查看源代碼,其基本實(shí)現(xiàn)思想是:先確定不同分?jǐn)?shù)段的人數(shù),然后按照人數(shù)的多少來打印特定的一個(gè)符號(hào),其符號(hào)是:printf();其分布圖如下: 四、數(shù)據(jù)測(cè)試 數(shù)據(jù)測(cè)試基本上在上面的實(shí)現(xiàn)中都已經(jīng)說明的很清楚了,下面附上處理后的各個(gè)數(shù)據(jù)文件的截圖: 按照加權(quán)平均分排名的結(jié)果:各科目的總體分布情況:各個(gè)學(xué)生的成績(jī)單如下: St
12、u_Date.h#define MAX 100#define KCS 5/實(shí)際課程數(shù)int k;struct Stu_Data_1char Elem15;struct Stu_Creditchar NO10;char course10;char cerdit10;struct Stu_Data_2char cou10;double ave;double bzc;int best;int better;int good;int pass;int fail;void Rank_List(int num,struct Stu_Data_1 stuMAXKCS+2,double average ,in
13、t n)/按平均分排名FILE *fp;int j; if(fp=fopen(Data1.txt,wb)=NULL) printf(此文件不可以打開,保存失敗n); exit(1); fprintf(fp,名次 );for(j=0;jKCS+2;j+) fprintf(fp,%-9s,stu0j.Elem ); fprintf(fp,平均分); fprintf(fp,rn); for(k=1;kn;k+) fprintf(fp,%-6d,numk); for(j=0;jKCS+2;j+) fprintf(fp,%-9s,stukj.Elem ); fprintf(fp,%-6.1f,avera
14、gek); fprintf(fp,rn); fclose(fp); printf(保存成功n);/-void Ave_Sta_dev(struct Stu_Data_1 stuMAXKCS+2,int n)/求各科平均分、標(biāo)準(zhǔn)差double ss,m;struct Stu_Data_2 daKCS+2; FILE *fp; if(fp=fopen(Data2.txt,wb)=NULL) printf(此文件不可以打開,保存失敗n); exit(1); int a; for(a=1;aKCS+1;a+) strcpy(daa.cou,stu0a+1.Elem); /-for(a=2;aKCS+2
15、;a+)for(k=1,m=0;kn;k+) m=m+atoi(stuka.Elem);daa-1.ave=m/(n-1);/計(jì)算各科平均分/-for(k=1;kKCS+1;k+)dak.best=0;dak.better=0;dak.good=0;dak.fail=0;dak.pass=0;for(a=2;aKCS+2;a+)for(k=1;k=90) daa-1.best+;/優(yōu)秀if(atoi(stuka.Elem)=80) daa-1.better+;/良好 if(atoi(stuka.Elem)=70) daa-1.good+;/中等if(atoi(stuka.Elem)=60) d
16、aa-1.pass+;/及格if(atoi(stuka.Elem)60) daa-1.fail+;/不及格/科目分等級(jí)/- for(a=2;aKCS+2;a+)for(k=1,ss=0;kn;k+)ss+=(atof(stuka.Elem)-daa-1.ave)*(atof(stuka.Elem)-daa-1.ave);daa-1.bzc=sqrt(ss/(n-1);/求出各科標(biāo)準(zhǔn)差/- fprintf(fp,編號(hào) 課程名稱 平均分 標(biāo)準(zhǔn)差 優(yōu)秀 良好 中等 及格 不及格n); fprintf(fp,rn); for(k=1;kKCS+1;k+) fprintf(fp,%-6d%-10s%-8
17、.1f%-10.2f%-5d%-5d%-6d%-6d%-6dn,k,dak.cou,dak.ave,dak.bzc,dak.best,dak.better,dak.good,dak.pass,dak.fail ); fprintf(fp,rn); fclose(fp); printf(保存成功n);/- int check(int k ,struct Stu_Data_1 stuMAXKCS+2) int a; for(a=2;aKCS+2;a+)if(atof(stuka.Elem)92) return 1;if(numk88)for(a=2;a=99) return 1;return 0;
18、/-void Score_List(struct Stu_Data_1 stuMAXKCS+2, int n,double average, int num) int a;char no5; char clas10=; printf(請(qǐng)輸入班級(jí)名:);scanf(%s,clas); system(md score); for(k=1;kn;k+) itoa(k,no,10); char filename20=; char add20=score; strcpy(add+strlen(add),clas); strcpy(filename+strlen(filename),add); strcp
19、y(filename+strlen(filename),no); strcpy(filename+strlen(filename),.txt); FILE *fp; if(fp=fopen(filename,wb)=NULL) printf(此文件不可以打開,保存失敗n); exit(1); for(int j=0;jKCS+2;j+) fprintf(fp,%-9s,stu0j.Elem ); fprintf(fp,平均分 名次); fprintf(fp,rn); for(a=0;aKCS+2;a+) fprintf(fp,%-9s,stuka.Elem ); fprintf(fp,%-8.
20、2f,averagek); fprintf(fp,%-6d,numk); fprintf(fp,rn); fclose(fp); printf(文件已保存到程序跟目錄下SCORE文件夾里.n);/打印每個(gè)學(xué)生的成績(jī)單/-void Unpass_List(struct Stu_Data_1 stuMAXKCS+2,struct Stu_Credit xuefen,int n)int a,p;int check(int k ,struct Stu_Data_1 stuMAXKCS+2);printf(學(xué)號(hào) 姓名 課程名稱(學(xué)分):成績(jī) 課程名稱(學(xué)分):成績(jī) 課程名稱(學(xué)分):成績(jī)n);for(k
21、=1;kn;k+)if(check(k,stu)printf(%-6s%-8s,stuk0.Elem,stuk1.Elem);for(a=2,p=0;aKCS+2;a+)if(atof(stuka.Elem)3)printf(n );printf(%-9s(%s):%-5s,stu0a.Elem,xuefena-1.cerdit,stuka.Elem);p=p%3;printf(%-9s(%s):%-5s,stu0a.Elem,xuefena-1.cerdit,stuka.Elem);printf(n);/顯示不及格的同學(xué)/-void Excellence_List(struct Stu_Da
22、ta_1 stuMAXKCS+2,int num,double average,int n)int a;int yds(int k ,struct Stu_Data_1 stuMAXKCS+2,int num,double average) ;/-if(KCS5)FILE *fp;if(fp=fopen(Data3.txt,wb)=NULL) printf(此文件不可以打開,保存失敗n); exit(1); fprintf(fp,名次 );for(int j=0;jKCS+2;j+) fprintf(fp,%-9s,stu0j.Elem );fprintf(fp,平均分);fprintf(fp
23、,rn);for(k=1;kn;k+)if(yds(k,stu,num,average)fprintf(fp,%-6d,numk);for(a=0;aKCS+2;a+) fprintf(fp,%-9s,stuka.Elem );fprintf(fp,%-6.1f,averagek);fprintf(fp,rn);fclose(fp);printf(n由于科目過多屏幕無法正常顯示,數(shù)據(jù)以保存到文件Data3.txt中,是否現(xiàn)在打開(y/n);char z;scanf(%c,&z);if(z=y) printf(n請(qǐng)關(guān)閉文件,使程序繼續(xù)執(zhí)行。n);system(Data3.txt);return;
24、/當(dāng)科目大于5時(shí)執(zhí)行該IF/-printf(名次 );for(int j=0;jKCS+2;j+) printf(%-9s,stu0j.Elem ); printf(平均分);printf(n);for(k=1;kn;k+)if(yds(k,stu,num,average)printf(%-6d,numk);for(a=0;aKCS+2;a+) printf(%-9s,stuka.Elem );printf(%-6.2f,averagek);printf(n);/顯示優(yōu)等生/-void Menu() system(cls); printf (n -n); printf (| 1-保存學(xué)生排名后
25、成績(jī)單 |n); printf (| 2-保存學(xué)生成績(jī)分布情況 |n); printf (| 3-打印每位同學(xué)的成績(jī) |n); printf (| 4-顯示存在不及格科目同學(xué) |n); printf (| 5-顯示優(yōu)等生名單 |n); printf (| 6-顯示分布圖 |n); printf (| Q-quit |n); printf ( -n); printf (Please input Keyn);void Distribution(struct Stu_Data_1 stuMAXKCS+2,int n)int c,j,figure11=0;for(c=2;cKCS+2;c+)print
26、f(= %s成績(jī)分布圖 =n,stu0c.Elem );for(k=1;k11;k+) figurek=0;for(k=1;k-1;a-) if(a = 10)printf(100 :);elseprintf(%d-%d :,a*10,(a*10)+9);for(int b=0;bfigurea;b+)printf();printf(nn);printf(按任意鍵打印下一科的分布圖.n);getch(); MAIN.CPP#include stdio.h#include stdlib.h#include string.h#include conio.h#include math.h#inclu
27、de Stu_Data.h main()char x,z;int i,j,k,numMAX;/num-存放名次double m,averageMAX,qKCS+2;/average- 存放每位學(xué)生平均分 q-用于計(jì)算平均分struct Stu_Data_1 stuMAXKCS+2;/stu-存放學(xué)生各科成績(jī)struct Stu_Credit CreKCS+2;/Cre-存放個(gè)科學(xué)分char File_130,File_230;/-FILE *fp;printf(請(qǐng)輸入存放學(xué)生成績(jī)的文件的完整路徑.nn例如C盤下TC文件夾的xx0702.txt,格式為:c:tcxx0702.txtnn);pri
28、ntf(若文件與程序在同一文件夾下可直接輸入文件名。nn);LP:printf(文件路徑:);scanf(%s,File_1);if(fp=fopen(File_1,rb)=NULL)printf(打開文件失敗!nn);printf(請(qǐng)重新輸入nn);goto LP;i=0;while(!feof(fp)for(j=0;jKCS+2;j+)fscanf(fp,%sn,stuij.Elem );i+;fclose(fp);printf(n讀取成功!nn);printf(按任意鍵繼續(xù).nn);getch();/-printf(請(qǐng)輸入存放學(xué)科學(xué)分的文件的完整路徑.nn例如C盤下TC文件夾的xx070
29、2.txt,格式為:c:tcxx0702.txtnn);printf(若文件與程序在同一文件夾下可直接輸入文件名。nn);Lp:printf(文件路徑:);scanf(%s,File_2);if(fp=fopen(File_2,rb)=NULL)printf(打開文件失敗!nn);printf(請(qǐng)重新輸入nn);goto Lp; k=0;while(!feof(fp)fscanf(fp,%s%s%sn,&Crek.NO,&Crek.course,&Crek.cerdit);k+;fclose(fp);printf(n讀取成功!n);printf(n按任意鍵進(jìn)入主菜單.);getch();/-f
30、or(q0=0,k=1;kKCS+2;k+) q0+=atof(Crek.cerdit);/將學(xué)分總和存入q0for(k=1;kKCS+2;k+) qk=atof(Crek.cerdit)/q0;/求出權(quán)值for(k=1;ki;k+)averagek=0;for(j=2;jKCS+2;j+) averagek+=atof(stukj.Elem) *qj-1;/求出加權(quán)平均分/-int a;for(k=1;ki;k+) numk=1; for(a=1;ai;a+) if(averagekaveragea) numk+; /求出名次/-doMenu();fflush(stdin);x=getch(
31、);switch(x)case 1 : Rank_List(num,stu,average,i);printf(n數(shù)據(jù)已經(jīng)保存到程序根目錄下Data1.txt文件中,是否現(xiàn)在打開文件?(y/n):);scanf(%c,&z);if(z=y) printf(n請(qǐng)關(guān)閉文件,使程序繼續(xù)執(zhí)行。n);system(Data1.txt);printf(n按任意鍵返回主菜單.);getch();break;case2:Ave_Sta_dev(stu,i);printf(n數(shù)據(jù)已經(jīng)保存到程序根目錄下Data2.txt文件中,是否現(xiàn)在打開文件?(y/n):);scanf(%c,&z);if(z=y) print
32、f(n請(qǐng)關(guān)閉文件,使程序繼續(xù)執(zhí)行。n);system(Data2.txt);printf(n按任意鍵返回主菜單.);getch();break;case3:Score_List(stu,i,average,num);printf(n按任意鍵返回主菜單.);getch();break;case4:system(cls);printf(.含不及格科目學(xué)生名單.n);Unpass_List(stu,Cre,i);printf(n按任意鍵返回主菜單.);getch();break;case5:system(cls);printf(.優(yōu)等生學(xué)生名單.n);Excellence_List(stu,num,average,i);printf(n按任意鍵返回主菜單.);getch();break;case6:Distribution(stu,i);while(x!=q);-25-
- 溫馨提示:
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ì)自己和他人造成任何形式的傷害或損失。