c语言课程设计学生成绩管理系统.docx
《c语言课程设计学生成绩管理系统.docx》由会员分享,可在线阅读,更多相关《c语言课程设计学生成绩管理系统.docx(48页珍藏版)》请在冰豆网上搜索。
c语言课程设计学生成绩管理系统
——学生成绩管理程序
题目要求···················2
设计目的···················2
总体设计···················3
详细设计···················3
调试与测试·················12
源程序···················14
总结···················30
学生成绩管理程序
一.题目要求
1.问题描述:
对在校学生几门课程的考试成绩进行统一管理.每个学生记录包括学号,姓名,年龄,数学,英语,物理成绩,默认以学号为序存放.
2.要求:
(1)一个文件按以班为单位存储学生记录.
(2)将允许的操作分为四种,以A,B,C,D,E,F为标志:
A:
插入一个学生记录;
B:
修改学生记录;
C:
删除一个学生记录;
D:
查找一个学生记录;
E:
浏览学生成绩:
F:
退出
3.计算学生的总成绩.
4.按学号排序输出全班学生成绩表
.
二.设计目的
根据题目要求,由于学生信息是存放在文件中,所以应提供文件的输入,输出等操作;在程序中需要浏览学生的信息,应提供显示,查找,排序等操作;另外还应提供键盘式选择菜单实现功能选择.
三.总体设计
根据上面的需求分析,可以将这个系统分为以下模块:
输入模块,修改模块,删除模块,查找模块,显示模块.
学生成绩管理系统
数据输入
数据显示
数据修改
数据删除
数据查找
四.详细设计
1.主函数:
主函数一般设计得比较简单,只提供输入,处理和输出部分的函数调用,其中各功能模块用菜单方式选择.
流程图:
显示一系列功能模块
N
输入n,判断n是否是A--F
Y
根据n的值调用各功能模块函数
[程序]:
//#include"head.h"
intmenu_select()
{
charc;
printf("\n\n");
printf("|1.增加学生记录5.统计信息|\n");
printf("|2.查询学生记录6.打开文件|\n");
printf("|3.修改学生记录7.保存文件|\n");
printf("|4.学生纪录排序8.显示记录|\n");
printf("|0.退出系统|\n");
printf("\n\n");
printf("请选择(0-8):
");
c=getchar();
getchar();
return(c-'0');
}
2.输入模块:
[分析]:
单独看各数据信息,学号,姓名是字符型,可以采用字符型数组;分数为整数,采用整数;数据信息存放在文件中,一条记录对应一个学生,既符合习惯又方便信息管理.
如果要存放若干学生信息就用结构体数组:
voidaddrecord(studentstud[])
{
inti=0,j,num;
charstr[5];
if(numstus!
=0)
{
printf("已有记录存在是否覆盖?
(y/n)\n");
gets(str);
if(str[0]=='Y'||str[0]=='y')
i=0;
elsei=numstus;
}
printf("请输入增加的学生信息条目数:
");
scanf("%d",&num);
if(i==0)
numstus=num;
elsenumstus+=num;
if(numstus>lens)
{
lens+=50;
pointer=(student*)realloc(pointer,lens*LEN);
}
printf("请输入学生信息:
\n");
for(;i{
getchar();
printf("请输入学号:
");
gets(pointer[i].number);
printf("请输入姓名:
");
gets(pointer[i].name);
printf("请输入性别(男/女1/0):
");
gets(pointer[i].sex);
if(pointer[i].sex[0]=='0')strcpy(pointer[i].sex,"女");
elsestrcpy(pointer[i].sex,"男");
printf("请输入各科成绩:
(按“语文,数学,英语,历史,政治”的顺序):
");
stud[i].score=0;
for(j=0;j{
scanf("%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);
getchar();
}
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);break;/*查询学生信息*/
case3:
amendrecord(pointer);break;/*修改学生信息*/
case4:
sort(pointer);break;/*学生信息排序*/
case5:
statistic(pointer);break;/*统计信息*/
case6:
openfile(pointer);break;/*打开文件*/
case7:
writetotext(pointer);break;/*保存文件*/
case8:
display(pointer,0,numstus-1);break;/*显示记录*/
case0:
if(numstus!
=0)printf("是否保存当前记录?
(y/n)");
gets(str);
if(str[0]=='y'||str[0]=='Y')
writetotext(pointer);
i=-1;break;/*退出系统*/
default:
printf("请输入数字0~8:
\n");i=1;/*输入错误*/
}
}
printf("\t\t欢迎再次使用本系统。
\n\n");
display1();
}
3.修改模块:
[分析]:
用户输入要修改学生的学号,根据学生的学号等信息查找学生记录,并提示用户修改该记录的哪部分信息.根据用户选择修改相应的信息.
[流程图]:
输入要修改的学号
YN
Y
N
[程序]:
voidxiugai()
{
if((fp=fopen("s_score.txt","rb+"))==NULL||(fp1=fopen("temp.txt","wb+"))==NULL)/*检查是否出错*/
{
printf("Cannotopenthisfile.\n");
exit(0);
}
printf("\nPLeaseshuruxiugaixuehao:
");
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("Pleaseshurumingzi:
");
gets(data.mingzi);
printf("Pleaseshurushuxuescore:
");
gets(temp);data.score[0]=atof(temp);
printf("Pleaseinputyingyuscore:
");
gets(temp);data.score[1]=atof(temp);
printf("Pleaseinputwuliscore:
");
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个字节处*/
fseek(fp1,0L,0);
while((fread(&data,sizeof(data),1,fp1))==1)
{
fwrite(&data,sizeof(data),1,fp);
}
fclose(fp);
fclose(fp1);
}
4.删除模块:
[分析]:
该模块的功能是,用户输入要删除的学生的学号,根据学生学号查找记录并删除.
[流程图]:
输入要删除的学号
YN
Y
N
[程序]:
voiddeleterecord(studentstu[],inti)/*删除信息*/
{
intj;
while(i>=0)
{
for(j=i;jstu[j]=stu[j+1];
numstus--;
printf("删除成功!
\n");
}
}
voidcount(studentstud[])
{
inti,j;
for(i=0;i{
stud[i].index=1;
for(j=0;jif(stud[j].score>stud[i].score)
stud[i].index++;
}
}
5.查找模块:
[需求分析]:
该模块的功能是根据输入的学生的姓名查找对应的记录,找到以后,显示相应的学生信息.
[流程图]:
YN
N
Y
[程序]:
//#include"head.h"
intfindrecord(studentstud[])/*查找信息*/
{
charstr[2];
inti,num;
if(numstus==0)
{
printf("没有可被查找的记录\n");
return-1;
}
else
{
printf("以何种方式查找?
\n1.学号\t2.姓名\t3.名次\n");
gets(str);
if(str[0]=='1')/*按学号查找*/
{
printf("请输入学号:
");
gets(str);
for(i=0;i<=numstus;i++)
if(strcmp(str,stud[i].number)==0)
{
display(stud,i,i);
break;
}
elsecontinue;
}
elseif(str[0]=='2')/*按姓名查找*/
{
printf("请输入姓名:
");
gets(str);
for(i=0;i<=numstus;i++)
if(strcmp(str,stud[i].name)==0)
{
display(stud,i,i);
break;
}
elsecontinue;
}
elseif(str[0]=='3')/*按名次查找*/
{
printf("请输入名次:
");
scanf("%d",&num);
getchar();
for(i=0;i<=numstus;i++)
if(num==stud[i].index)
{
display(stud,i,i);
break;
}
elsecontinue;
}
if(i>numstus)
{
printf("没有查找所要的信息。
\n");
return-1;
}
returni;
}
}
6.显示模块:
[需求分析]:
该模块的功能是显示所有学生记录信息.
[程序]:
voidwelcome()
{
printf("\t*************************************************************\n");
printf("\t\t\t\t**学生成绩管理系统**\n\t\t\t\t倾情奉献欢迎使用!
\n");
printf("\t*************************************************************\n");
}
voidshowtable()
{
printf("---------------------------------------------------------------------------------------\n");
printf("学号\t姓名\t性别\t语文\t数学\t英语\t历史\t政治\t总分\t平均分\t名次\n");
printf("---------------------------------------------------------------------------------------\n");
}
voiddisplay(studentstud[],intn1,intn2)
{
inti;
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);
/*通过循环输出数据*/
}
voiddisplay1()
{
printf("\t\t本系统由计科二班制作\n\n");
printf("\t\t制作人员列表:
\n\n");
printf("\t\t殷增锋\t\t\t邵超\n");
printf("\n\n");
getchar();
}
五.调试与测试
在这次课程设计中,程序编写过程中遇到了很多的问题,各种函数的运用也让人头疼,在上机编译运行过程中出现了很多的错误,例如:
各种数据类型的定义,函数的调用等等。
但最终还是在老师同学的帮助下进行了各种代码的编写与修改,最终程序成功的运行。
下面是各个模块的界面图
(1)主菜单函数:
(2):
输入模块:
(3):
显示模块:
(4):
删除模块:
(5):
查找模块:
(6):
修改模块:
6.程序源
#ifndefH_STUDENT_HH
#defineH_STUDENT_HH
#include"stdio.h"
#include"string.h"
#include"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[]);
voiddisplay1();
#endif
//#include"head.h"
intmenu_select()
{
charc;
printf("\n\n");
printf("|1.增加学生记录5.统计信息|\n");
printf("|2.查询学生记录6.打开文件|\n");
printf("|3.修改学生记录7.保存文件|\n");
printf("|4.学生纪录排序8.显示记录|\n");
printf("|0.退出系统|\n");
printf("\n\n");
printf("请选择(0-8):
");
c=getchar();
getchar();
return(c-'0');
}
//#include"head.h"
intfindrecord(studentstud[])/*查找信息*/
{
charstr[2];
inti,num;
if(numstus==0)
{
printf("没有可被查找的记录\n");
return-1;
}
else
{
printf("以何种方式查找?
\n1.学号\t2.姓名\t3.名次\n");
gets(str);
if(str[0]=='1')/*按学号查找*/
{
printf("请输入学号:
");
gets(str);
for(i=0;i<=numstus;i++)
if(strcmp(str,stud[i].number)==0)
{
display(stud,i,i);
break;
}
elsecontinue;
}
elseif(str[0]=='2')/*按姓名查找*/
{
printf("请输入姓名:
");
gets(str);
for(i=0;i<=numstus;i++)
if(strcmp(str,stud[i].name)==0)
{
display(stud,i,i);
break;
}
elsecontinue;
}
elseif(str[0]=='3')/*按名次查找*/
{
printf("请输入名次:
");
scanf("%d",&num);
getchar();
for(i=0;i<=numstus;i++)
if(num==stud[i].index)
{
display(stud,i,i);
break;
}
elsecontinue;
}
if(i>numstus)
{
printf("没有查找所要的信息。
\n");
return-1;
}
returni;
}
}
//#include"head.h"
intopenfile(studentstu[])
{
inti=0,j;
FILE*fp;
charfilename[20],str[2];
if(numstus!
=0)
{
printf("已经有记录存在,是否保存?
(y/n)");
gets(str);
if(str[0]=='y'||str[0]=='Y')
writetotext(