c语言课程设计学生成绩管理系统Word文档下载推荐.docx
《c语言课程设计学生成绩管理系统Word文档下载推荐.docx》由会员分享,可在线阅读,更多相关《c语言课程设计学生成绩管理系统Word文档下载推荐.docx(36页珍藏版)》请在冰豆网上搜索。
根据上面的需求分析,可以将这个系统分为以下模块:
输入模块,修改模块,删除模块,查找模块,显示模块.
学生成绩管理系统
数据输入
数据显示
数据修改
数据删除
数据查找
四.详细设计
1.主函数:
主函数一般设计得比较简单,只提供输入,处理和输出部分的函数调用,其中各功能模块用菜单方式选择.
流程图:
显示一系列功能模块
N
输入n,判断n是否是A--F
Y
根据n的值调用各功能模块函数
[程序]:
//#include"
head.h"
intmenu_select()
{
charc;
printf("
\n\n"
);
|1.增加学生记录5.统计信息|\n"
|2.查询学生记录6.打开文件|\n"
|3.修改学生记录7.保存文件|\n"
|4.学生纪录排序8.显示记录|\n"
|0.退出系统|\n"
请选择(0-8):
"
c=getchar();
getchar();
return(c-'
0'
}
2.输入模块:
[分析]:
单独看各数据信息,学号,姓名是字符型,可以采用字符型数组;
分数为整数,采用整数;
数据信息存放在文件中,一条记录对应一个学生,既符合习惯又方便信息管理.
如果要存放若干学生信息就用结构体数组:
voidaddrecord(studentstud[])
inti=0,j,num;
charstr[5];
if(numstus!
=0)
已有记录存在是否覆盖?
(y/n)\n"
gets(str);
if(str[0]=='
Y'
||str[0]=='
y'
)
i=0;
elsei=numstus;
请输入增加的学生信息条目数:
scanf("
%d"
&
num);
if(i==0)
numstus=num;
elsenumstus+=num;
if(numstus>
lens)
lens+=50;
pointer=(student*)realloc(pointer,lens*LEN);
请输入学生信息:
\n"
for(;
i<
numstus;
i++)
请输入学号:
gets(pointer[i].number);
请输入姓名:
gets(pointer[i].name);
请输入性别(男/女1/0):
gets(pointer[i].sex);
if(pointer[i].sex[0]=='
)strcpy(pointer[i].sex,"
女"
elsestrcpy(pointer[i].sex,"
男"
请输入各科成绩:
(按“语文,数学,英语,历史,政治”的顺序):
stud[i].score=0;
for(j=0;
j<
numsubs;
j++)
%f"
stud[i].subject[j]);
/*计算总分*/
stud[i].score+=stud[i].subject[j];
stud[i].average=stud[i].score/numsubs;
/*计算平均分*/
count(stud);
/*附名次*/
display(stud,0,numstus-1);
intnumstus;
intlens;
student*pointer;
voidmain()
inti=1;
charstr[2];
lens=100;
pointer=(student*)malloc(lens*LEN);
/*分配内存*/
numstus=0;
welcome();
/*欢迎界面*/
while(i>
0)
i=menu_select();
/*控制菜单*/
switch(i)
case1:
addrecord(pointer);
break;
/*增加学生信息*/
case2:
findrecord(pointer);
/*查询学生信息*/
case3:
amendrecord(pointer);
/*修改学生信息*/
case4:
sort(pointer);
/*学生信息排序*/
case5:
statistic(pointer);
/*统计信息*/
case6:
openfile(pointer);
/*打开文件*/
case7:
writetotext(pointer);
/*保存文件*/
case8:
display(pointer,0,numstus-1);
/*显示记录*/
case0:
=0)printf("
是否保存当前记录?
(y/n)"
i=-1;
/*退出系统*/
default:
请输入数字0~8:
i=1;
/*输入错误*/
\t\t欢迎再次使用本系统。
display1();
3.修改模块:
用户输入要修改学生的学号,根据学生的学号等信息查找学生记录,并提示用户修改该记录的哪部分信息.根据用户选择修改相应的信息.
[流程图]:
输入要修改的学号
YN
voidxiugai()
if((fp=fopen("
s_score.txt"
"
rb+"
))==NULL||(fp1=fopen("
temp.txt"
wb+"
))==NULL)/*检查是否出错*/
Cannotopenthisfile.\n"
exit(0);
\nPLeaseshuruxiugaixuehao:
i);
while((fread(&
data,sizeof(data),1,fp))==1)
j=atoi(data.xuehao);
if(j==i)
xuehao:
%s\nmingzi:
%s\nnianling:
%s\n"
data.xuehao,data.mingzi,data.nianling);
Pleaseshurumingzi:
gets(data.mingzi);
Pleaseshurushuxuescore:
gets(temp);
data.score[0]=atof(temp);
Pleaseinputyingyuscore:
data.score[1]=atof(temp);
Pleaseinputwuliscore:
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个字节处*/
fseek(fp1,0L,0);
data,sizeof(data),1,fp1))==1)
fwrite(&
data,sizeof(data),1,fp);
fclose(fp);
fclose(fp1);
4.删除模块:
该模块的功能是,用户输入要删除的学生的学号,根据学生学号查找记录并删除.
输入要删除的学号
voiddeleterecord(studentstu[],inti)/*删除信息*/
intj;
for(j=i;
stu[j]=stu[j+1];
numstus--;
删除成功!
voidcount(studentstud[])
inti,j;
for(i=0;
stud[i].index=1;
if(stud[j].score>
stud[i].score)
stud[i].index++;
5.查找模块:
[需求分析]:
该模块的功能是根据输入的学生的姓名查找对应的记录,找到以后,显示相应的学生信息.
intfindrecord(studentstud[])/*查找信息*/
inti,num;
if(numstus==0)
没有可被查找的记录\n"
return-1;
else
以何种方式查找?
\n1.学号\t2.姓名\t3.名次\n"
1'
)/*按学号查找*/
=numstus;
if(strcmp(str,stud[i].number)==0)
display(stud,i,i);
elsecontinue;
elseif(str[0]=='
2'
)/*按姓名查找*/
if(strcmp(str,stud[i].name)==0)
3'
)/*按名次查找*/
请输入名次:
if(num==stud[i].index)
if(i>
numstus)
没有查找所要的信息。
returni;
6.显示模块:
该模块的功能是显示所有学生记录信息.
voidwelcome()
\t*************************************************************\n"
\t\t\t\t**学生成绩管理系统**\n\t\t\t\t倾情奉献欢迎使用!
voidshowtable()
---------------------------------------------------------------------------------------\n"
学号\t姓名\t性别\t语文\t数学\t英语\t历史\t政治\t总分\t平均分\t名次\n"
voiddisplay(studentstud[],intn1,intn2)
inti;
showtable();
/*显示表头*/
for(i=n1;
=n2;
%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);
/*通过循环输出数据*/
voiddisplay1()
\t\t本系统由计科二班制作\n\n"
\t\t制作人员列表:
\t\t殷增锋\t\t\t邵超\n"
五.调试与测试
在这次课程设计中,程序编写过程中遇到了很多的问题,各种函数的运用也让人头疼,在上机编译运行过程中出现了很多的错误,例如:
各种数据类型的定义,函数的调用等等。
但最终还是在老师同学的帮助下进行了各种代码的编写与修改,最终程序成功的运行。
下面是各个模块的界面图
(1)主菜单函数:
(2):
输入模块:
(3):
显示模块:
(4):
删除模块:
(5):
查找模块:
(6):
修改模块:
6.程序源
#ifndefH_STUDENT_HH
#defineH_STUDENT_HH
#include"
stdio.h"
string.h"
malloc.h"
#defineLENsizeof(structmessage_student)/*一个结构体数组元素的长度*/
#definenumsubs5/*学科数目*/
typedefstructmessage_student/*结构体定义*/
charnumber[6];
charname[20];
charsex[4];
floatsubject[numsubs];
floatscore;
floataverage;
intindex;
}student;
externintnumstus;
/*学生数目*/
externstudent*pointer;
/*指向结构体数组*/
externintlens;
intmenu_select();
/*函数声明*/
intopenfile(studentstu[]);
intfindrecord(studentstud[]);
intwritetotext(studentstud[]);
voidwelcome();
voiddisplay1();
voidshowtable();
voidsort(studentstu[]);
voiddeleterecord(studentstu[],inti);
voidaddrecord(studentstud[]);
voiddisplay(studentstud[],intn1,intn2);
voidamendrecord(studentstud[]);
voidcount(studentstud[]);
voidsortnum(studentstud[]);
voidsortnum2(studentstud[]);
voidsortname(studentstud[]);
voidsortname2(studentstud[]);
voidsortcount(studentstud[]);
voidsortcount2(studentstud[]);
voidstatistic(studentstud[]);
#endif
intopenfile(studentstu[])
inti=0,j;
FILE*fp;
charfilename[20],str[2];
已经有记录存在,是否保存?
writetotext(stu);
请输入文件名:
gets(filename);
if((fp=fopen(filename,"
))==NULL)
无法打开该文件\n"
return(-1);
fscanf(fp,"
numstus);
fgetc(fp);
while(i<
%s"
stu[i].number);
stu[i].name);
stu[i].sex);
stu[i].subject[j]);
stu[i].score);
stu[i].average);
stu[i].index);
i++;
文件读取成功\n"
是否显示纪录?
display(stu,0,numstus-1);
return(0);
voidsort(studentstud[])
inti,j=0;
student*p;
p=stud;
没有可供查询的记录!
while
(1)
;
请输入查询方式:
(直接输入回车则结束查询操作)\n"
1.按照学号\t"
2.按照姓名\t"
3.按照名次\n"
if(strlen(str)==0)break;
请输入排序次序:
1.升序排列\t"
2.降序排列\n"
sortnum2(p);
sortnum(p);
display(stud,0,n