《數據結構課程設計報告-學生成績管理系統(tǒng).doc》由會員分享,可在線閱讀,更多相關《數據結構課程設計報告-學生成績管理系統(tǒng).doc(37頁珍藏版)》請在裝配圖網上搜索。
目 錄
一、問題描述..........................................2
二、基本要求..........................................3
三、數據結構設計......................................4
四、軟件模塊結構圖....................................5
五、程序設計思想......................................7
六、程序流程圖.......................................11
7、 源程序...........................................16
八、調試分析.........................................30
九、測試數據.........................................31
十、用戶使用手冊.....................................34
十一、心得體會.......................................35
一、問題描述
在學生成績管理中,經常會遇到求平均成績,統(tǒng)計不及格學生成績,統(tǒng)計優(yōu)秀學生人數,以及按成績對學生進行排名等?,F(xiàn)假設有某個班級的若干名學生,每個學生都考試完成了4門課程,試對所有學生的成績完成以下工作:
(1)求每門課程的平均成績。
(2)輸出所有有不及格課程的學生的學號、姓名、全部課程的成績、平均成績。
(3)輸出所有平均分在90分以上(含90分)的學生學號、姓名。
(4)對4門課程中的任何一門,可隨意抽取1門按學生成績進行排序。
二、基本要求
對學生信息的輸入完成后,實現(xiàn)如下功能:1、對學生信息的查找、插入、刪除、修改。2、分別輸出優(yōu)秀學生和不及格學生的信息。3、顯示每們課程的平均成績。4、任意抽取一門課程后,可以按該課程學生成績對學生信息進行排序。
三、數據結構的設計
為了對學生信息進行統(tǒng)一操作,使用了結構體這一數據結構,學生的各項數據信息都能用結構體來表示,具體如下:
struct stu
{int num;/*學號,整型變量*/
char name[50];/*姓名,長度為50的字符串數組*/
char classes[50]/*班級名稱,長度為50的字符串數組*/;
double gsps_score;/*高等數學平時成績,雙精度實型變量*/
double gsks_score;/*高等數學考試成績,雙精度實型變量*/
double gszh_score;/*高等數學綜合成績,雙精度實型變量*/
double dlps_score;/*電路理論平時成績,雙精度實型變量*/
double dlks_score;/*電路理論考試成績,雙精度實型變量*/
double dlzh_score;/*電路理論綜合成績,雙精度實型變量*/
double yyps_score;/*英語平時成績,雙精度實型變量*/
double yyks_score;/*英語考試成績,雙精度實型變量*/
double yyzh_score;/*英語綜合成績,雙精度實型變量*/
double wlps_score;/*物理平時成績,雙精度實型變量*/
double wlks_score;/*物理考試成績,雙精度實型變量*/
double wlzh_score;/*物理綜合成績,雙精度實型變量*/
double pj_score;/*平均成績,雙精度實型變量*/
}student[1000];/*最多存儲1000個學生數據*/
該結構體數據定義為全局變量。
四、軟件模塊結構圖
每門課程的平均成績
主菜單控制模塊
學生信息錄入模塊
學生信息查詢模塊
學生信息修改模塊
學生信息刪除模塊
學生信息插入模塊
學生信息輸出模塊
按學號查詢學生信息
按姓名查詢學生信息
輸出優(yōu)秀學生相關信息
輸出不及格學生信息
課程成績統(tǒng)計模塊
按單科成績排名次
模塊功能描述:
a.主菜單控制模塊:主菜單直接控制七個模塊(學生信息輸出模塊的兩個子模塊直接歸主菜單控制),在各模塊間起到紐帶的作用。在主菜單,可以通過選擇進入其他模塊,其他模塊運行結束后也可回到主菜單繼續(xù)選擇。
b.學生信息錄入模塊:循環(huán)輸入學生信息,建立臨時的學生信息數據庫。
c.學生信息查詢模塊:可選擇按學號或者按姓名查詢學生信息,如學生信息不存在則給出提示。
d.學生信息修改模塊:查找到要修改的學生信息后,可對該學生的信息進行逐項修改。
e.學生信息刪除模塊:查找到要刪除的學生信息后,可對其進行刪除操作。
f.學生信息插入模塊:在數據庫末尾插入學生信息,逐項輸入要插入的學生信息即可。
g.學生信息輸出模塊:輸出優(yōu)秀學生信息模塊能夠輸出優(yōu)秀學生(平均成績大于等90分)的學號和姓名;輸出不及格學生信息模塊能夠輸出不及格學生的相關信息。
h.課程成績統(tǒng)計模塊:可以得到每門課程的平均成績,還可以任意抽取一門課按單科成績排定學生名次。
五、程序設計思想
結構化的程序設計主要靠設計和調用各模塊的函數來實現(xiàn)。本程序設計了多個函數,每個函數自身能完成一個任務,有的函數和別的函數結合能完成更大的任務。每一個模塊功能的實現(xiàn)其實就是對函數的調用,本說明首先介紹本程序所涉及的子函數,再介紹主函數,最后介紹程序整體的實現(xiàn)過程。
1.void Inputfun() 此函數較特別,它只進行輸入操作,但由于此函數所包含的語句較長且需要被其他三個函數使用,為方便調用單寫了一個函數。此函數在源程序中放在最前,所以在此先作說明。此函數可細分為11個小塊,用來輸入學生的基本數據。每小塊的結構基本相同即for(;;){基本語句 +一個continue語句+基本語句+一個break語句}之所以用這個結構為了使輸入的數據更加正規(guī)。比如在分數的輸入中就限定了只能輸入0至100之間的數值,這也符合分數錄入規(guī)則。需要特別注意的是,這個函數完成了本程序中要做的兩個計算。其一是在每門課的考試試成績輸入后完成了對這門課的綜合成績的加權計算(考試成績*0.7+平時成績*0.3);其二是在最后一門課程的綜合成績算出后,計算了該學生四門課的平均成績。
2.void Getinformation() 此函數用來錄入學生信息。它調用了void Inputfun()函數,其實它的主體部分就是void Inputfun()函數。這函數還用了一個for循環(huán)以達到循環(huán)輸入的目的。
3.int Searchbynum (int no)\int Searchbyname (char na[50]) 這是兩個“兄弟函數”,是按學號查找和按姓名查詢模塊中的兩個重要函數。主要功能是根據用戶輸入的學號\姓名返回改學生所在的的數組下標。利用for循環(huán)嵌套一個if語句實現(xiàn),若找到學生該學生信息就返回數組下標,若找不到就返回-1。
4.void Seekinformation()\void Printinformation(int x) 這兩個函數關系緊密,所以一起介紹。void Seekinformation()函數利用for循環(huán)和if語句使查找中能夠使用學號和姓名兩種方式。如源程序所示,在用if語句確定了查找方式后先后調用了int Searchbynum (int no)\int Searchbyname (char na[50])和void Printinformation(int x)兩個函數,根據int Searchbynum (int no)\int Searchbyname (char na[50])返回的數組下標,運用void Printinformation(int x)輸出所查詢的內容。所以
int Searchbynum (int no)\int Searchbyname (char na[50])\void Seekinformation()\void Printinformation(int x)這四個函數是查詢模塊的四個聯(lián)系緊密的重要函數,在它們的共同作用下查詢模塊的功能得以實現(xiàn)。
5.void Modifyinformation() 此函數用于修改學生信息。基本原理就是用輸入的新數據覆蓋原來的老數據,達到修改的目的。本函數還調用了查找模塊的函數,使修改前能按學號或姓名找到要修改的學生信息。修改過程中調用了Inputfun()函數
6.void Deleteinformation() 此函數用于刪除學生信息。同樣調用了查找模塊的函數。刪除模塊的關鍵語句是for (i=x;i<999;i++) student[i]=student[i+1];從要刪除的那一個數據開始,用后一個數據覆蓋它,一直循環(huán)到最后,相當于把開始的第一個數據刪除了。
7.void Insertinformaton() 此函數用于插入學生數據。由于沒有用鏈表,所以選擇插入在最后一個有效數據之后。本函數運用if(student[j].num==0)這個語句找到了最后一個有效數據之后的數組下標j,然后將數據輸入到student[j]中,便完成的了插入。插入過程中,調用了Inputfun()函數。
8.void Showthefail() 此函數用于顯示不及格學生的信息。能夠按要求輸出不及格學生的學號、姓名、各科成績以及平均成績。首先用這條if語句搜索該學生是否有成績不及格,當四門課中至少有一門不及格時會輸出該學生的相關信息。
9.void Stu_p() 此函數用于輸出優(yōu)秀學生(平均成績大于90分)的信息,利用for循環(huán)和條件判斷句輸出找出相應的學生輸出相關信息。
10.void Chengjitongji()此函數用于按要求統(tǒng)計成績。有分別統(tǒng)計每門課的平均成績的功能;還能夠按每門課程的成績對學生進行排序,使學生在該門課的表現(xiàn)一目了然。排序中用到了冒泡排序的方法。
9. void main() 下面對主函數作簡要說明。Switch語句是函數的主體:
switch(c)/*利用switch語句集成各個功能函數*/
{
case 1 : Getinformation();break;/*獲得學生信息*/
case 2 : Seekinformation();break;/*查找學生信息*/
case 3 : Modifyinformation();break;/*修改學生信息*/
case 4 : Deleteinformation();break;/*刪除學生信息*/
case 5 : Insertinformaton();break;/*插入學生信息*/
case 6 : Stu_p();break;/*顯示優(yōu)秀學生信息*/
case 7 : Showthefail();break;/*顯示不及格學生信息*/
case 8 : Chengjitongji();break;/*課程成績的統(tǒng)計*/
case 0 : exit(0);/*退出*/
default: break;
}
default: break;}
通過一個數值輸入函數,使用戶在簡單的數值輸入后就可輕松調用各模塊。
還使用了for (;;)使各模塊能夠循環(huán)調用。
11.最后對程序的整體實現(xiàn)過程作個簡要說明。源程序中多處運用continue和break語句,同時配合scanf函數和if條件判斷語句,使用戶能夠根據提示通過簡單的數值輸入來選擇下一步該做什么。中文界面,用戶很容易根據提示上手,簡單易用。
六、程序流程圖
開始
系統(tǒng)啟動口令輸入a=?
a=1?
N
口令錯誤,系統(tǒng)即將關閉!
Y
進入選擇菜單
N
c=1?
Y
錄入學生信息
c=2?
N
Y
查找學生信息
c=3?
N
Y
修改學生信息
N
c=4?
刪除學生信息
c=5?
Y N
c=6?
N Y
插入學生信息
c=7?
Y
優(yōu)秀學生信息
N
不及格學生信息
c=8?
N Y
Y
N
課程成績統(tǒng)計
N
結束
以上為主函數流程圖,主函數下八個供選擇的模塊只是簡單的用一個執(zhí)行框表示?,F(xiàn)分別畫出八個模塊的流程圖:
1、 錄入學生成績:
開始
輸入學生信息及成績
是否繼續(xù)?繼續(xù)按1,結束按0
1
0
結束
開始
2、查找學生信息:
按學號查找請按1,
按姓名查找請按2
2
1
輸出相應姓名所對應的信息
輸出相應學號所對應的信息
是否繼續(xù)?繼續(xù)按1,結束按0
1
0
結束
0
3、修改學生信息:
開始
調用查找函數找到要修改的信息
輸入修改后的信息
是否繼續(xù)?繼續(xù)按1,結束按0
1
0
結束
4、刪除學生信息:
開始
調用查找函數找到要刪除的信息
是否刪除?是按1,否按0
1
刪除成功
是否繼續(xù)?繼續(xù)按1,結束按0
1
結束
0
開始
5、插入學生信息:
輸入要插入的信息
是否繼續(xù)?繼續(xù)按1,結束按0
1
0
結束
6、優(yōu)秀學生信息:
開始
學生平均成績是否大于等于90?
N
Y
輸出該生學號和姓名
Y
檢索完畢?
N
結束
Y
7、 不及格學生信息:
開始
判斷該生是否有不及格科目
N
Y
輸出該該生學信息
檢索完畢?
N
Y
結束
8、 成績統(tǒng)計模塊:
開始
每門課程平均成績請按1,單科成績排名請按2
1
2
輸出每門課程平均成績
選擇要排名的科目
輸出該科成績排名
結束
七、源程序
#include
#include
#include
#include
struct stu/*定義結構體*/
{int num;
char name[50];
char classes[50];
double gsps_score;
double gsks_score;
double gszh_score;
double dlps_score;
double dlks_score;
double dlzh_score;
double yyps_score;
double yyks_score;
double yyzh_score;
double wlps_score;
double wlks_score;
double wlzh_score;
double pj_score;
}student[1000];
int a,b,c,d,x,i,j,k,s,y,flag;
char s1[50],c1;
double f,t,gp,dp,yp,wp;
/***********************錄入、修改、插入學生信息三個模塊調用了輸入模塊*************************************/
void Inputfun()/*輸入學生信息模塊*/
{
for(; ;)/*設計死循環(huán)以至于在輸入格式錯誤時可以再次輸入*/
{
printf("請輸入班級名稱:\t"); /*輸入班級名稱*/
scanf("%s",&s1);
if(strlen(s1)>20)
{
printf("您輸入的班級名稱過長!\n");
continue;
}
strcpy(student[i].classes,s1);
break; /*格式正確后跳出死循環(huán)*/
}
for(; ;)
{
printf("請輸入學號:\t");/*輸入學號*/
scanf("%d",&b);
if(student[i].num<0)
{
printf("您輸入的學號錯誤!\n");
continue;
}
student[i].num=b;
break;
}
for(; ;)
{
printf("請輸入姓名:\t");/*輸入姓名*/
scanf("%s",&s1);
if(strlen(s1)>20)
{
printf("您輸入的姓名過長!\n");
continue;
}
strcpy(student[i].name,s1);
break;
}
for(; ;)
{
printf("請輸入該生高等數學平時成績:\t");/*輸入各科平時成績和考試成績*/
scanf("%lf",&f);
if(f>100||f<0)
{
printf("成績不合理!請您輸入合理的成績.\n");
continue;
}
student[i].gsps_score=f;
break;
}
for(; ;)
{
printf("請輸入該生高等數學考試成績:\t");
scanf("%lf",&f);
if(f>100||f<0)
{
printf("成績不合理!請您輸入合理的成績.\n");
continue;
}
student[i].gsks_score=f;
student[i].gszh_score=student[i].gsks_score*0.7+student[i].gsps_score*0.3;/*按考試成績70%平時成績30%算該門課程的最終成績*/
break;
}
for(; ;)
{
printf("請輸入該生電路理論平時成績:\t");
scanf("%lf",&f);
if(f>100||f<0)
{
printf("成績不合理!請您輸入合理的成績.\n");
continue;
}
student[i].dlps_score=f;
break;
}
for(; ;)
{
printf("請輸入該生電路理論考試成績:\t");
scanf("%lf",&f);
if(f>100||f<0)
{
printf("成績不合理!請您輸入合理的成績.\n");
continue;
}
student[i].dlks_score=f;
student[i].dlzh_score=student[i].dlks_score*0.7+student[i].dlps_score*0.3;
break;
}
for(; ;)
{
printf("請輸入該生英語平時成績:\t");
scanf("%lf",&f);
if(f>100||f<0)
{
printf("成績不合理!請您輸入合理的成績.\n");
continue;
}
student[i].yyps_score=f;
break;
}
for(; ;)
{
printf("請輸入該生英語考試成績:\t");
scanf("%lf",&f);
if(f>100||f<0)
{
printf("成績不合理!請您輸入合理的成績.\n");
continue;
}
student[i].yyks_score=f;
student[i].yyzh_score=student[i].yyks_score*0.7+student[i].yyps_score*0.3;
break;
}
for(; ;)
{
printf("請輸入該生物理平時成績:\t");
scanf("%lf",&f);
if(f>100||f<0)
{
printf("成績不合理!請您輸入合理的成績.\n");
continue;
}
student[i].wlps_score=f;
break;
}
for(; ;)
{
printf("請輸入該生物理考試成績:\t");
scanf("%lf",&f);
if(f>100||f<0)
{
printf("成績不合理!請您輸入合理的成績.\n");
continue;
}
student[i].wlks_score=f;
student[i].wlzh_score=student[i].wlks_score*0.7+student[i].wlps_score*0.3;
student[i].pj_score=(student[i].yyzh_score+student[i].dlzh_score+student[i].gszh_score+student[i].wlzh_score)/4;/*計算每個學生的平均成績*/
break;
}
}
/*********************************錄入學生信息模塊***************************************/
void Getinformation() /*獲得學生信息*/
{
for (i=0;i<1000;i++)/*利用循環(huán)連續(xù)輸入學生信息*/
{
if(i==0)
{
system("cls");
printf("請根據提示輸入學生的信息\n\n");
}
else
printf("請輸入下一個學生的信息\n\n");
Inputfun();
printf("繼續(xù)請按1,返回主菜單請按0.\n");
scanf("%d",&a);
if(a==0)
break;
}
}
/****************查詢模塊:包含四個函數,函數間有聯(lián)系**********************************/
int Searchbynum (int no) /*按學號查找*/
{
for (j=0;j<1000;j++)
{
if (student[j].num==no)
{
return j;
}
}
return -1;
}
int Searchbyname (char na[50])/*按姓名查找*/
{
for (k=0;k<1000;k++)
{
if (strcmp(student[k].name,na)==0)
{
return k;
}
}
return -1;
}
void Printinformation(int x)/*輸出學生信息*/
{
if (x==-1)
printf("該學生信息不存在!\n");
else
{
printf("班級:%s\n",student[x].classes);
printf("學號:%d\n",student[x].num);
printf("姓名:%s\n\n",student[x].name);
printf("高數平時成績:%5.2f\n",student[x].gsps_score);
printf("高數考試成績:%5.2f\n",student[x].gsks_score);
printf("高數綜合成績:%5.2f\n\n",student[x].gszh_score);
printf("電路平時成績:%5.2f\n",student[x].dlps_score);
printf("電路考試成績:%5.2f\n",student[x].dlks_score);
printf("電路綜合成績:%5.2f\n\n",student[x].dlzh_score);
printf("英語平時成績:%5.2f\n",student[x].yyps_score);
printf("英語考試成績:%5.2f\n",student[x].yyks_score);
printf("英語綜合成績:%5.2f\n\n",student[x].yyzh_score);
printf("物理平時成績:%5.2f\n",student[x].wlps_score);
printf("物理考試成績:%5.2f\n",student[x].wlks_score);
printf("物理綜合成績:%5.2f\n\n",student[x].wlzh_score);
printf("平均成績:%5.2f\n",student[x].pj_score);
}
}
void Seekinformation()/*查詢學生信息*/
{
for(; ;)
{
system("cls");
printf("按學號查找請按1,按姓名查找請按2\n");/*提供兩種查找方式*/
scanf("%d",&a);
if(a==1)
{
system("cls");
printf("請輸入要查找的學生的學號\n");
scanf("%d",&d);
x=Searchbynum (d);/*調用按學號查找函數*/
Printinformation(x);
}
else if (a==2)
{
system("cls");
printf("請輸入要查找的學生的姓名\n");
scanf("%s",&s1);
x=Searchbyname (s1);/*調用按姓名查找函數*/
Printinformation(x);
}
printf("繼續(xù)請按1,返回主菜單請按0.\n");
scanf("%d",&a);
if(a==0)
break;
}
}
/*************************學生信息刪改:包含三個相互獨立的函數**********************************/
void Modifyinformation() /*修改學生信息*/
{
for(; ;)
{
system("cls");
printf("請先查找要修改的學生信息!\n\n");
printf("按學號查找請按1,按姓名查找請按2\n");/*先查找后修改*/
scanf("%d",&a);
if(a==1)
{
system("cls");
printf("請輸入要查找的學生的學號\n");
scanf("%d",&d);
x=Searchbynum (d);
}
else if (a==2)
{
system("cls");
printf("請輸入要查找的學生的姓名\n");
scanf("%s",&s1);
x=Searchbyname (s1);
}
if (x==-1)
printf("學生信息不存在!\n");
else
{
printf("您要修改的學生信息為:\n");
Printinformation(x);
printf("請您輸入新值\n");
i=x;
Inputfun();
}
printf("繼續(xù)請按1,返回主菜單請按0.\n");
scanf("%d",&a);
if(a==0)
break;
}
}
void Deleteinformation() /*刪除學生信息*/
{
for (;;)
{
system("cls");
printf("請先查找要刪除的學生信息!\n\n");
printf("按學號查找請按1,按姓名查找請按2\n");
scanf("%d",&a);
if(a==1)
{
system("cls");
printf("請輸入要查找的學生的學號\n");
scanf("%d",&d);
x=Searchbynum (d);
}
else if (a==2)
{
system("cls");
printf("請輸入要查找的學生的姓名\n");
scanf("%s",&s1);
x=Searchbyname (s1);
}
if (x==-1)
printf("學生信息不存在!\n");
else
{
printf("您要刪除的學生信息為:\n");
Printinformation(x);
printf("是否真的要刪除該生信息?是請按1,否請按0.\n");
scanf("%d",&a);
if (a==1)
{
for (i=x;i<999;i++)
student[i]=student[i+1];/*該數組后的數組向前移動以覆蓋的方式刪除該數組*/
printf("刪除成功!\n");
}
}
printf("繼續(xù)請按1,返回主菜單請按0.\n");
scanf("%d",&a);
if(a==0)
break;
}
}
void Insertinformaton() /*插入學生信息*/
{
system("cls");
for(j=0;j<1000;j++)
{
if(student[j].num==0)
{
x=j;
break;
}
}
for(i=x;i<1000;i++)
{
system("cls");
printf("請輸入要插入的學生信息\n\n");
Inputfun();/*利用信息錄入函數把學生信息插在末尾*/
printf("繼續(xù)請按1,返回主菜單請按0.\n");
scanf("%d",&a);
if(a==0)
break;
}
}
/********各科成績排序的四個程序********************/
void paixugs() /*排序1*/
{
struct stu temp;
for (j=1;j<1000;j++)
{
for (k=0;k<999;k++)
{
if (student[k].gszh_score=90)
{printf("學號:%d\n",student[i].num);
printf("姓名:%s\n\n",student[i].name);}
printf("\n返回主菜單請按0\n");
scanf("%d",&a);}
void Chengjitongji()/*按要求統(tǒng)計成績*/
{int flag=0;
double gp=0,dp=0,yp=0,wp=0;
system("cls");
printf("每門課程平均成績請按1,單科成績排序請按2\n");
scanf("%d",&s);
if(s==1)
{
for (i=0;i<1000;i++)
{
gp+=student[i].gszh_score;
dp+=student[i].dlzh_score;
yp+=student[i].yyzh_score;
wp+=student[i].wlzh_score;
if (student[i].pj_score>0)
flag++;
}gp=gp/flag;dp=dp/flag;yp=yp/flag;wp=wp/flag;
system("cls");
printf("高等數學平均成績:\t%5.2f\n",gp);
printf("電路理論平均成績:\t%5.2f\n",dp);
printf("英語平均成績:\t%5.2f\n",yp);
printf("物理平均成績:\t%5.2f\n",wp);
printf("\n返回主菜單請按0\n");
scanf("%d",&a);}
if(s==2){
printf("請選擇\n\n");
printf("高等數學成績排序請按1\n");
printf("電路理論成績排序請按2\n");
printf("英語成績排序請按3\n");
printf("物理成績排序請按4\n");
scanf("%d",&y);
if(y==1) paixugs();/*調用相應的排序函數*/
if(y==2) paixudl();
if(y==3) paixuyy();
if(y==4) paixuwl();}}
/**************************************************************************************************/
void main() /*主函數*/
{
printf("\t\t **************************************\n\n");/*開始界面*/
printf("\t\t **********學生成績管理系統(tǒng)**********\n\n");
printf("\t\t **********設計者:樂駿彥**********\n\n");
printf("\t\t *********指導老師:彭春華*******\n\n");
printf("\t\t ********通信工程0902班********\n\n");
printf("\t\t ********2011年6月30日*******\n\n");
printf("\t\t **************************\n\n");
printf("\n\n\n\n");
printf("請輸入系統(tǒng)啟動口令\n");/*啟動口令*/
scanf("%d",&a);
if(a!=1)
{
printf("口令錯誤!系統(tǒng)即將關閉!\n");
exit(0);
}
for (;;)
{
system("cls");
printf("請從主菜單選擇您所需要的操作\n\n");/*系統(tǒng)主菜單*/
printf("1.首次輸入學生信息請按\n");
printf("2.查找學生信息\n");
printf("3.修改學生信息\n");
printf("4.刪除學生信息\n");
printf("5.插入學生信息\n");
printf("6.優(yōu)
鏈接地址:http://www.3dchina-expo.com/p-6526172.html