《c語(yǔ)言課程設(shè)計(jì)學(xué)生成績(jī)管理系統(tǒng).doc》由會(huì)員分享,可在線閱讀,更多相關(guān)《c語(yǔ)言課程設(shè)計(jì)學(xué)生成績(jī)管理系統(tǒng).doc(34頁(yè)珍藏版)》請(qǐng)?jiān)谘b配圖網(wǎng)上搜索。
______________________________________________________________________________________________________________
目錄
——學(xué)生成績(jī)管理程序
題目要求 ··················· 2
設(shè)計(jì)目的 ··················· 2
總體設(shè)計(jì) ··················· 3
詳細(xì)設(shè)計(jì) ··················· 3
調(diào)試與測(cè)試 ················· 12
源程序 ··················· 14
總結(jié) ··················· 30
學(xué)生成績(jī)管理程序
一. 題目要求
1. 問題描述:
對(duì)在校學(xué)生幾門課程的考試成績(jī)進(jìn)行統(tǒng)一管理.每個(gè)學(xué)生記錄包括學(xué)號(hào),姓名,年齡,數(shù)學(xué),英語(yǔ),物理成績(jī),默認(rèn)以學(xué)號(hào)為序存放.
2. 要求:
(1)一個(gè)文件按以班為單位存儲(chǔ)學(xué)生記錄.
(2)將允許的操作分為四種,以A,B ,C,D,E,F為標(biāo)志:
A:插入一個(gè)學(xué)生記錄;
B:修改學(xué)生記錄;
C:刪除一個(gè)學(xué)生記錄;
D:查找一個(gè)學(xué)生記錄;
E:瀏覽學(xué)生成績(jī):
F:退出
3. 計(jì)算學(xué)生的總成績(jī).
4. 按學(xué)號(hào)排序輸出全班學(xué)生成績(jī)表
.
二. 設(shè)計(jì)目的
根據(jù)題目要求,由于學(xué)生信息是存放在文件中,所以應(yīng)提供文件的輸入,輸出等操作;在程序中需要瀏覽學(xué)生的信息,應(yīng)提供顯示,查找,排序等操作;另外還應(yīng)提供鍵盤式選擇菜單實(shí)現(xiàn)功能選擇.
三. 總體設(shè)計(jì)
根據(jù)上面的需求分析,可以將這個(gè)系統(tǒng)分為以下模塊:輸入模塊,修改模塊,刪除模塊,查找模塊,顯示模塊.
學(xué)生成績(jī)管理系統(tǒng)
數(shù)據(jù)輸入
數(shù)據(jù)顯示
數(shù)據(jù)修改
數(shù)據(jù)刪除
數(shù)據(jù)查找
四. 詳細(xì)設(shè)計(jì)
1. 主函數(shù):
主函數(shù)一般設(shè)計(jì)得比較簡(jiǎn)單,只提供輸入,處理和輸出部分的函數(shù)調(diào)用,其中各功能模塊用菜單方式選擇.
流程圖:
顯示一系列功能模塊
N
輸入n,判斷n是否是A--F
Y
根據(jù)n的值調(diào)用各功能模塊函數(shù)
[程序]:
//#include "head.h"
int menu_select()
{
char c;
printf("\n\n");
printf(" | 1. 增加學(xué)生記錄 5.統(tǒng)計(jì)信息 |\n");
printf(" | 2. 查詢學(xué)生記錄 6.打開文件 |\n");
printf(" | 3. 修改學(xué)生記錄 7.保存文件 |\n");
printf(" | 4. 學(xué)生紀(jì)錄排序 8.顯示記錄 |\n");
printf(" | 0. 退出系統(tǒng) |\n");
printf("\n\n");
printf("請(qǐng)選擇(0-8):");
c=getchar();
getchar();
return (c-'0');
}
2. 輸入模塊:
[分析]:
單獨(dú)看各數(shù)據(jù)信息,學(xué)號(hào),姓名是字符型,可以采用字符型數(shù)組;分?jǐn)?shù)為整數(shù),采用整數(shù);數(shù)據(jù)信息存放在文件中,一條記錄對(duì)應(yīng)一個(gè)學(xué)生,既符合習(xí)慣又方便信息管理.
如果要存放若干學(xué)生信息就用結(jié)構(gòu)體數(shù)組:
void addrecord(student stud[])
{
int i=0,j,num;
char str[5];
if(numstus!=0)
{
printf("已有記錄存在是否覆蓋?(y/n)\n");
gets(str);
if(str[0]=='Y'||str[0]=='y')
i=0;
else i=numstus;
}
printf("請(qǐng)輸入增加的學(xué)生信息條目數(shù):");
scanf("%d",&num);
if(i==0)
numstus=num;
else numstus+=num;
if(numstus>lens)
{
lens+=50;
pointer=(student *)realloc(pointer,lens*LEN);
}
printf("請(qǐng)輸入學(xué)生信息:\n");
for(;i
0)
{
i=menu_select(); /*控制菜單*/
switch(i)
{
case 1:addrecord(pointer);break; /*增加學(xué)生信息*/
case 2:findrecord(pointer);break; /*查詢學(xué)生信息*/
case 3:amendrecord(pointer);break; /*修改學(xué)生信息*/
case 4:sort(pointer);break; /*學(xué)生信息排序*/
case 5:statistic(pointer);break; /*統(tǒng)計(jì)信息*/
case 6:openfile(pointer);break; /*打開文件*/
case 7:writetotext(pointer);break; /*保存文件*/
case 8:display(pointer,0,numstus-1);break; /*顯示記錄*/
case 0:
if(numstus!=0) printf("是否保存當(dāng)前記錄?(y/n)");
gets(str);
if(str[0]=='y'||str[0]=='Y')
writetotext(pointer);
i=-1;break; /*退出系統(tǒng)*/
default:printf("請(qǐng)輸入數(shù)字0~8:\n");i=1; /*輸入錯(cuò)誤*/
}
}
printf("\t\t歡迎再次使用本系統(tǒng)。\n\n");
display1();
}
3. 修改模塊:
[分析]:用戶輸入要修改學(xué)生的學(xué)號(hào),根據(jù)學(xué)生的學(xué)號(hào)等信息查找學(xué)生記錄,并提示用戶修改該記錄的哪部分信息.根據(jù)用戶選擇修改相應(yīng)的信息.
[流程圖]:
輸入要修改的學(xué)號(hào)
找到?
Y N
提示沒有找到
顯示記錄,調(diào)用修改函數(shù)
返回主菜單
繼續(xù)?
Y
N
[程序]:
void xiugai()
{
if((fp=fopen("s_score.txt","rb+"))==NULL||(fp1=fopen("temp.txt","wb+"))==NULL) /*檢查是否出錯(cuò)*/
{
printf("Cannot open this file.\n");
exit(0);
}
printf("\nPLease shuru xiugai xuehao:");
scanf("%d",&i); getchar();
while((fread(&data,sizeof(data),1,fp))==1)
{
j=atoi(data.xuehao);
if(j==i)
{
printf("xuehao:%s\nmingzi:%s\nnianling:%s\n",data.xuehao,data.mingzi,data.nianling);
printf("Please shuru mingzi:");
gets(data.mingzi);
printf("Please shuru shuxue score:");
gets(temp);data.score[0]=atof(temp);
printf("Please input yingyu score:");
gets(temp);data.score[1]=atof(temp);
printf("Please input wuli score:");
gets(temp);data.score[2]=atof(temp);
data.score[3]=data.score[0]+data.score[1]+data.score[2];
} fwrite(&data,sizeof(data),1,fp1);
}
fseek(fp,0L,0); /*將位置指針移到離頭文件0個(gè)字節(jié)處*/
fseek(fp1,0L,0);
while((fread(&data,sizeof(data),1,fp1))==1)
{
fwrite(&data,sizeof(data),1,fp);
}
fclose(fp);
fclose(fp1);
}
4. 刪除模塊:
[分析]:
該模塊的功能是,用戶輸入要?jiǎng)h除的學(xué)生的學(xué)號(hào),根據(jù)學(xué)生學(xué)號(hào)查找記錄并刪除.
[流程圖]:
輸入要?jiǎng)h除的學(xué)號(hào)
找到?
Y N
提示沒有找到
顯示記錄,調(diào)用刪除函數(shù)
返回主菜單
繼續(xù)?
Y
N
[程序]:
void deleterecord(student stu[],int i) /*刪除信息*/
{
int j;
while(i>=0)
{
for(j=i;jstud[i].score)
stud[i].index++;
}
}
5. 查找模塊:
[需求分析]:
該模塊的功能是根據(jù)輸入的學(xué)生的姓名查找對(duì)應(yīng)的記錄,找到以后,顯示相應(yīng)的學(xué)生信息.
[流程圖]:輸入學(xué)生學(xué)號(hào)
返回主菜單
詢問是否繼續(xù)
提示沒有找到
顯示找到的記錄
是否找到學(xué)生記錄
Y N
N
Y
[程序]:
//#include "head.h"
int findrecord(student stud[]) /*查找信息*/
{
char str[2];
int i,num;
if(numstus==0)
{
printf("沒有可被查找的記錄\n");
return -1;
}
else
{
printf("以何種方式查找?\n1.學(xué)號(hào)\t2.姓名\t3.名次\n");
gets(str);
if(str[0]=='1') /*按學(xué)號(hào)查找*/
{
printf("請(qǐng)輸入學(xué)號(hào):");
gets(str);
for(i=0;i<=numstus;i++)
if(strcmp(str,stud[i].number)==0)
{
display(stud,i,i);
break;
}
else continue;
}
else if(str[0]=='2') /*按姓名查找*/
{
printf("請(qǐng)輸入姓名:");
gets(str);
for(i=0;i<=numstus;i++)
if(strcmp(str,stud[i].name)==0)
{
display(stud,i,i);
break;
}
else continue;
}
else if(str[0]=='3') /*按名次查找*/
{
printf("請(qǐng)輸入名次:");
scanf("%d",&num);
getchar();
for(i=0;i<=numstus;i++)
if(num==stud[i].index)
{
display(stud,i,i);
break;
}
else continue;
}
if(i>numstus)
{
printf("沒有查找所要的信息。\n");
return -1;
}
return i;
}
}
6. 顯示模塊:
[需求分析]:
該模塊的功能是顯示所有學(xué)生記錄信息.
[程序]:
void welcome()
{
printf("\t*************************************************************\n");
printf("\t\t\t\t**學(xué)生成績(jī)管理系統(tǒng)**\n\t\t\t\t 傾情奉獻(xiàn) 歡迎使用!\n");
printf("\t*************************************************************\n");
}
void showtable()
{
printf("---------------------------------------------------------------------------------------\n");
printf("學(xué)號(hào)\t姓名\t性別\t語(yǔ)文\t數(shù)學(xué)\t英語(yǔ)\t歷史\t政治\t總分\t平均分\t名次\n");
printf("---------------------------------------------------------------------------------------\n");
}
void display(student stud[],int n1,int n2)
{
int i;
showtable(); /*顯示表頭*/
for(i=n1;i<=n2;i++)
printf("%s\t%s\t%s\t%.2f\t%.2f\t%.2f\t%.2f\t%.2f\t%.2f\t%.2f\t%d\t\n",stud[i].number,stud[i].name,stud[i].sex,stud[i].subject[0],stud[i].subject[1],stud[i].subject[2],stud[i].subject[3],stud[i].subject[4],stud[i].score,stud[i].average,stud[i].index);
/*通過循環(huán)輸出數(shù)據(jù)*/
}
void display1()
{
printf("\t\t本系統(tǒng)由計(jì)科二班制作\n\n");
printf("\t\t制作人員列表: \n\n");
printf("\t\t殷增鋒\t\t\t邵超\n");
printf("\n\n");
getchar();
}
五. 調(diào)試與測(cè)試
在這次課程設(shè)計(jì)中,程序編寫過程中遇到了很多的問題,各種函數(shù)的運(yùn)用也讓人頭疼,在上機(jī)編譯運(yùn)行過程中出現(xiàn)了很多的錯(cuò)誤,例如:各種數(shù)據(jù)類型的定義,函數(shù)的調(diào)用等等。但最終還是在老師同學(xué)的幫助下進(jìn)行了各種代碼的編寫與修改,最終程序成功的運(yùn)行。
下面是各個(gè)模塊的界面圖
(1) 主菜單函數(shù):
(2): 輸入模塊:
(3): 顯示模塊:
(4): 刪除模塊:
(5): 查找模塊:
(6): 修改模塊:
6. 程序源
#ifndef H_STUDENT_HH
#define H_STUDENT_HH
#include "stdio.h"
#include "string.h"
#include "malloc.h"
#define LEN sizeof(struct message_student) /*一個(gè)結(jié)構(gòu)體數(shù)組元素的長(zhǎng)度*/
#define numsubs 5 /*學(xué)科數(shù)目*/
typedef struct message_student /*結(jié)構(gòu)體定義*/
{
char number[6];
char name[20];
char sex[4];
float subject[numsubs];
float score;
float average;
int index;
}student;
extern int numstus; /*學(xué)生數(shù)目*/
extern student *pointer; /*指向結(jié)構(gòu)體數(shù)組*/
extern int lens;
int menu_select(); /*函數(shù)聲明*/
int openfile(student stu[]);
int findrecord(student stud[]);
int writetotext(student stud[]);
void welcome();
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 sortname(student stud[]);
void sortname2(student stud[]);
void sortcount(student stud[]);
void sortcount2(student stud[]);
void statistic(student stud[]);
void display1();
#endif
//#include "head.h"
int menu_select()
{
char c;
printf("\n\n");
printf(" | 1. 增加學(xué)生記錄 5.統(tǒng)計(jì)信息 |\n");
printf(" | 2. 查詢學(xué)生記錄 6.打開文件 |\n");
printf(" | 3. 修改學(xué)生記錄 7.保存文件 |\n");
printf(" | 4. 學(xué)生紀(jì)錄排序 8.顯示記錄 |\n");
printf(" | 0. 退出系統(tǒng) |\n");
printf("\n\n");
printf("請(qǐng)選擇(0-8):");
c=getchar();
getchar();
return (c-'0');
}
//#include "head.h"
int findrecord(student stud[]) /*查找信息*/
{
char str[2];
int i,num;
if(numstus==0)
{
printf("沒有可被查找的記錄\n");
return -1;
}
else
{
printf("以何種方式查找?\n1.學(xué)號(hào)\t2.姓名\t3.名次\n");
gets(str);
if(str[0]=='1') /*按學(xué)號(hào)查找*/
{
printf("請(qǐng)輸入學(xué)號(hào):");
gets(str);
for(i=0;i<=numstus;i++)
if(strcmp(str,stud[i].number)==0)
{
display(stud,i,i);
break;
}
else continue;
}
else if(str[0]=='2') /*按姓名查找*/
{
printf("請(qǐng)輸入姓名:");
gets(str);
for(i=0;i<=numstus;i++)
if(strcmp(str,stud[i].name)==0)
{
display(stud,i,i);
break;
}
else continue;
}
else if(str[0]=='3') /*按名次查找*/
{
printf("請(qǐng)輸入名次:");
scanf("%d",&num);
getchar();
for(i=0;i<=numstus;i++)
if(num==stud[i].index)
{
display(stud,i,i);
break;
}
else continue;
}
if(i>numstus)
{
printf("沒有查找所要的信息。\n");
return -1;
}
return i;
}
}
//#include"head.h"
int openfile(student stu[])
{
int i=0,j;
FILE *fp;
char filename[20],str[2];
if(numstus!=0)
{
printf("已經(jīng)有記錄存在,是否保存?(y/n)");
gets(str);
if(str[0]=='y'||str[0]=='Y')
writetotext(stu);
}
printf("請(qǐng)輸入文件名:");
gets(filename);
numstus=0;
if((fp=fopen(filename,"rb+"))==NULL)
{
printf("無法打開該文件\n");
return(-1);
}
fscanf(fp,"%d",&numstus);
fgetc(fp);
while(i0)
{
temp=*(p+j);
*(p+j)=*(p+j+1);
*(p+j+1)=temp;
}
}
}
void sortnum2(student stud[])
{
int i,j;
student temp;
student *p;
p=stud;
for(i=0;i0)
{
temp=*(p+j);
*(p+j)=*(p+j+1);
*(p+j+1)=temp;
}
}
}
void sortname(student stud[])
{
int i,j;
student temp;
student *p;
p=stud;
for(i=0;i0)
{
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;i0)
{
temp=*(p+j);
*(p+j)=*(p+j+1);
*(p+j+1)=temp;
}
}
}
void sortcount(student stud[])
{
int i,j;
student temp;
student *p;
p=stud;
for(i=0;istud[j].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;istud[j+1].index)
{
temp=*(p+j);
*(p+j)=*(p+j+1);
*(p+j+1)=temp;
}
}
}
//#include"head.h"
void statistic(student stud[]) /*新增功能,輸出統(tǒng)計(jì)信息*/
{
int i,j=0,k=0;
char c1,str[2];
float average[numsubs],sum=0;
if(numstus==0)
printf("沒有可被查找的記錄\n");
else
{
while(1)
{
printf("下面將統(tǒng)計(jì)考試成績(jī)\n");
printf("請(qǐng)選擇你要統(tǒng)計(jì)哪科的成績(jī) 1.A\t2.B\t3.C\t4.D\t5.E\n");
c1=getchar();
printf("\t一共有個(gè)%d記錄\n",numstus); /*總共記錄數(shù)*/
switch(c1)
{
case '1':
for(i=0;istud[i].subject[0]) k=i;
if(stud[j].subject[0]stud[i].subject[1]) k=i;
if(stud[j].subject[1]stud[i].subject[2]) k=i;
if(stud[j].subject[2]stud[i].subject[3]) k=i;
if(stud[j].subject[3]stud[i].subject[4]) k=i;
if(stud[j].subject[4]
void amendrecord(student stud[])
{
char str[5]; /*供用戶輸入*/
int i=-1,j;
if(numstus==0) /*沒有記錄返回*/
printf("沒有可供修改的記錄!");
while(i<0)
{
i=findrecord(stud);
if(i>=0)
{
鏈接地址:http://www.3dchina-expo.com/p-1575144.html