班级学生成绩管理系统Word下载.docx
《班级学生成绩管理系统Word下载.docx》由会员分享,可在线阅读,更多相关《班级学生成绩管理系统Word下载.docx(18页珍藏版)》请在冰点文库上搜索。
![班级学生成绩管理系统Word下载.docx](https://file1.bingdoc.com/fileroot1/2023-5/11/d0316b1b-32f3-45ee-abbc-a65df7d8416c/d0316b1b-32f3-45ee-abbc-a65df7d8416c1.gif)
学生签名:
一、需求分析
经过对程序设计题目的分析可知,整个程序的设计实现大致分为六个模块,其中每一个模块对应一个函数,他们的功能分别是:
添加学生数据函数(add),删除数据函数(del),排序函数(sort),成绩查询函数(query)以及显示学生信息函数(show)。
1、添加学生数据函数主要实现程序最初运行时学生数据的录入以及其后的运行中学生数据的追加功能;
2、删除学生数据函数实现的功能是按照学号对学生的数据记录进行删除;
3、排序函数按照题目的具体要求实现的是总成绩的递减排序以及名次显示,其中总成绩相同者名次相同;
4、成绩查询函数允许按照学号对学生的各科成绩进行查询;
5、显示函数实现的是显示目前所有的有效学生记录信息。
除上面介绍的功能之外,程序还具有退出功能,可以在程序的一次运行当中循环执行所有的功能,并根据需要终止程序的执行。
每一个学生记录都包含学号、姓名,以及英语、计算机和数学三门成绩,在程序当中,将学生记录类型定义为结构体类型,添加以及追加的学生信息直接写入E盘的student。
dat文件中,其他函数每次对学生记录的访问,其数据来源都是student。
dat文件,这样做不但可以保证学生数据的一致性,而且可以对学生数据进行永久保存,保存每次运行程序都可以采用原来的数据。
二、程序流程图
1、程序总体结构图
当
(1)
输入值n=1?
真假
添加
数据
函数
Add()
n=2?
真假
显示
Shou()
n=3?
删除
del()
n=4?
真假
排序
sort()
n=5?
查询
query()
退出
图1程序总体结构图
2、具体功能框图
(1)添加学生数据函数add
以写方式打开e:
\\student.dat文件不成功
输出文件
打开失败
输入录入学生数量n
循环变量i=0;
return;
i〈M时
输入学号,姓名和
三门成绩
学生信息写入文件i++
关闭文件
图2添加学生数据
(2)删除学生记录函数del
打开并读取e:
\\student。
dat文件
循环变量i=0;
输入待删除的学生学号
当i<
M—1时
真Stud[i]与number相等?
假
break;
i++
j=i+i
当j<
M
数组元素依次前移j++
真以写的方式打开e:
\\student.dat文件?
假
i=0
显示打开文件
当i〈=M—2
记录写回文件i++
return;
关闭文件
图3删除学生记录
(3)总分排序函数sort
循环变量i=0,j=0
打开并读取文件e:
student.dat
当i〈=M—1
当j〈M—1—i
真第j总分〈第j+1总分?
交换两个成绩j++
j++
真以写的方式打开文件成功?
显示打开文件失败!
当i=0
return;
写入文件并输出,
显示名次i++
关闭文件
图4总分排序
三、核心技术的实现说明及相应程序段
本程序主要由六个自定义函数和一个主函数组成,其中主函数以菜单的形式调用其他函数来实现要求的所有功能。
在这些函数当中,添加数据函数、删除数据函数和排序函数是程序中较为核心的部分,下面分别进行说明。
1、添加数据函数
添加数据分为两种情况,其一是在学生文件(student.dat)不存在的情况下,首先由程序创建一个新文件,并将录入的学生信息写入该文件当中。
具体的程序段如下:
voidadd()/*tianjiaxueshengxixin*/
{FILE*fp;
inti,n;
printf("
shurutianjiaxueshengxinxideshuliang\n”);
scanf("
%d"
&n);
for(i=0;
i<
n;
i++)
{printf("
enterstudents’numnameenglishcomputermath\n”);
%d%s%d%d%d”,&
stud[i]。
num,stud[i].name,&stud[i]。
english,&stud[i]。
computer,&stud[i]。
math);
}
{if((fp=fopen("
e:
\\student.dat"
,”w+"
))==NULL)
{
printf(”cannotopenthefile”);
}
M;
i++)
if(fwrite(&stud[i],sizeof(structstudent),1,fp)!
=1)
filewriteerror\n”);
fclose(fp);
}
}
2、删除数据函数
该函数的核心内容是删除算法以及最终对源文件的更新.该函数执行时,首先将文件中的学生信息读入数组当中,并由用户输入待删除学生的学号,而后按照该学号进行查找,如果文件中存在该学生的数据,则采用删除算法删除。
对学生信息的具体删除算法是在结构体数组中实现的,当学生的信息被找到后,位于数组中该学生后面的学生记录依次向前移动一个元素的位置,这些操作完成后,要删除的学生信息就被后面的数组元素覆盖掉了,也就实现了删除。
在数组中删除学生信息后,还要将更改后的信息重新写回文件当中,以保证数据的一致性。
具体程序段如下:
voiddel()/*xinxishanchuhanshu*/
{structstudentstud[M];
intnumber;
FILE*fp;
inti,j;
fp=fopen(”e:
dat”,"
r+"
);
for(i=0;
M;
fread(&
stud[i],sizeof(structstudent),1,fp);
shuruyaoshanchuxinxidexueshengxuehao”);
scanf(”%d"
&
number);
i++)
if(number==stud[i].num)break;
for(j=i+1;
j<
j++)
{stud[j—1].num=stud[j]。
num;
strcpy(stud[j—1].name,stud[j]。
name);
stud[j-1].english=stud[j]。
english;
stud[j—1].computer=stud[j]。
computer;
stud[j—1]。
math=stud[j]。
math;
if((fp=fopen("
e:
\\student.dat”,"
{printf(”cannotopenthefile!
"
);
else
i〈M—1;
fwrite(&stud[i],sizeof(structstudent),1,fp);
fclose(fp);
shanchuchenggong\n”);
3、总分排序函数
对于总分的排序采用的排序算法是冒泡法排序,其中总分的求得是在排序的过程中实现的,整个排序过程在结构体数组stud中实现,由于排序算法涉及到两个数组元素的信息交换,因此还需要定义一个中间变量来协助。
排序函数使学生数据的排列顺序发生了变化,因此也需要队员文件进行更新,此外,对于学生排序后名次的确定,仅在结果输出时予以显示,并未将名次信息写入源文件.
具体的程序段如下:
voidsort()
{FILE*fp;
structstudentstud[M],student2;
inti,j;
fp=fopen(”e:
”r+"
i〈M-1;
stud[i],sizeof(structstudent),1,fp);
for(j=0;
M—1-i;
j++)
{
if(stud[j]。
english+stud[j].computer+stud[j]。
math<
stud[j+1]。
english+stud[j+1].computer+stud[j+1].math)
{student2。
num=stud[j].num;
strcpy(student2.name,stud[j].name);
student2.english=stud[j]。
english;
student2。
computer=stud[j]。
computer;
math=stud[j].math;
stud[j]。
num=stud[j+1]。
num;
strcpy(stud[j].name,stud[j+1]。
name);
stud[j].english=stud[j+1].english;
stud[j]。
computer=stud[j+1].computer;
stud[j].math=stud[j+1]。
math;
stud[j+1]。
num=student2.num;
strcpy(stud[j+1]。
name,student2.name);
stud[j+1]。
english=student2。
stud[j+1].computer=student2。
stud[j+1].math=student2.math;
if((fp=fopen("
”w”))==NULL)
{printf("
cannotopenthefile”);
j=1;
i〈M-1;
{fwrite(&stud[i],sizeof(structstudent),1,fp);
if(stud[i].english+stud[i].computer+stud[i]。
math==stud[i+1]。
english+stud[i+1]。
computer+stud[i+1]。
math)
printf(”%d%d%s%d%d%d%d\n"
,j,stud[i].num,stud[i]。
name,stud[i]。
english,stud[i].computer,stud[i].math,stud[i]。
english+stud[i].computer+stud[i].math);
%d%d%s%d%d%d%d\n”,j++,stud[i].num,stud[i].name,stud[i]。
english,stud[i]。
computer,stud[i]。
math,stud[i].english+stud[i]。
computer+stud[i]。
math);
四、个人总结
通过这次课设,使我又学到了很多东西,使我感觉到C语言是一门特别有意思的学科,它我帮我们把复杂的问题简单化,特别是switch函数,冒泡排序法的,以及模块式设计思想是我这次收益最大的地方,switch可用为制作目录,是对模块化的基础,而冒泡法是种十分有效的排序方法,.当然有的地方还不是很熟练,还是同学们的帮助和上网查的资料。
我要努力学好这们课程,希望以后能独立完成一个设计。
五、参考文献
1谭浩强.C程序设计.北京:
清华大学出版社,2005
2刘成等.C语言程序设计实验指导与习题集.北京:
中国铁道出版社,2006
六、源程序
#include<
stdio。
h〉
#include<
string。
h>
#defineM4
structstudent
{intnum;
charname[20];
intenglish;
intcomputer;
intmath;
}stud[M];
voidmenu();
voidadd();
voiddel();
voidsort();
voidquery();
voidshow();
main()
{
intn;
while
(1)
{
menu();
printf(”\npleaseenterthenumberyouchose\n"
n);
switch(n)
{case1:
add();
break;
case2:
show();
break;
case3:
del();
case4:
sort();
case5:
query();
case6:
exit(0);
voidmenu()
printf(”\n1tianjiaxueshengshuju"
\n2xianshixueshengshuju"
printf(”\n3shanchuxueshengshuju”);
\n4zongchengjipaixu"
\n5chengjichaxun”);
\n6tuichuxitong"
{FILE*fp;
printf(”shurutianjiaxueshengxinxideshuliang\n"
scanf(”%d”,&
n);
n;
{printf(”enterstudents’numnameenglishcomputermath\n"
%d%s%d%d%d”,&
stud[i]。
num,stud[i]。
name,&
stud[i].english,&
computer,&
stud[i]。
w+"
cannotopenthefile"
i〈M;
if(fwrite(&stud[i],sizeof(structstudent),1,fp)!
filewriteerror\n"
voidshow()
{structstudentstud[M];
inti;
FILE*fp;
fp=fopen("
dat”,”r”);
{fread(&stud[i],sizeof(structstudent),1,fp);
%d%d%s%d%d%d\n”,i+1,stud[i].num,stud[i].name,stud[i].english,stud[i]。
computer,stud[i]。
fclose(fp);
voiddel()/*xinxishanchuhanshu*/
{structstudentstud[M];
FILE*fp;
fread(&stud[i],sizeof(structstudent),1,fp);
printf(”shuruyaoshanchuxinxidexueshengxuehao"
if(number==stud[i]。
num)break;
{stud[j—1]。
num=stud[j]。
strcpy(stud[j-1]。
name,stud[j]。
stud[j—1]。
english=stud[j]。
stud[j—1].computer=stud[j].computer;
math=stud[j].math;
dat"
,”r+"
{printf("
cannotopenthefile!
”);
M—1;
fwrite(&stud[i],sizeof(structstudent),1,fp);
shanchuchenggong\n"
structstudentstud[M],student2;
stud[i],sizeof(structstudent),1,fp);
M—1-i;
if(stud[j].english+stud[j]。
computer+stud[j].math〈stud[j+1].english+stud[j+1].computer+stud[j+1].math)
{student2.num=stud[j]。
strcpy(student2。
name,stud[j]。
english=stud[j].english;
computer=stud[j]。
math=stud[j]。
stud[j].num=stud[j+1]。
strcpy(stud[j].name,stud[j+1]。
stud[j]。
english=stud[j+1].english;
stud[j]。
computer=stud[j+1].computer;
stud[j].math=stud[j+1].math;
stud[j+1]。
num=student2.num;
strcpy(stud[j+1].name,student2。
stud[j+1].computer=puter;
math=student2。
if((fp=fopen(”e:
\\student.dat”,"
w"
{fwrite(&stud[i],sizeof(structstudent),1,fp);
if(stud[i]。
english+stud[i].computer+stud[i]。
math==stud[i+1]。
english+stud[i+1].computer+stud[i+1].math)
printf(”%d%d%s%d%d%d%d\n"
j,stud[i]。
num,stud[i]。
name,stud[i].english,stud[i].computer,stud[i].math,stud[i]。
printf(”%d%d%s%d%d%d%d\n”,j++,stud[i]。
num,stud[i].name,stud[i].english,stud[i]。
computer,stud[i].math,stud[i].english+stud[i]。
computer+stud[i].math);
voidquery()
{
structstudentstud[M];
dat”,”r"
M-1;