学生成绩管理系统.docx
《学生成绩管理系统.docx》由会员分享,可在线阅读,更多相关《学生成绩管理系统.docx(24页珍藏版)》请在冰豆网上搜索。
![学生成绩管理系统.docx](https://file1.bdocx.com/fileroot1/2023-2/22/e4673cc1-0254-4d8a-9c22-1f46a71eaf81/e4673cc1-0254-4d8a-9c22-1f46a71eaf811.gif)
学生成绩管理系统
级语言程序设计实验报告
班级:
计算机科学与技术姓名:
学号:
课程名称
高级语言程序设计
实验项目
学生成绩管理系统
实验项目类型
验证
演示
综合
设计
指导教师
成绩
一、实验目的
(1)综合运用C语言的知识,用模块化程序设计思想分析系统所要实现的功能,运用函数实现各功能模块,再通过相应的流程控制语句在主函数中实现所有功能。
(2)会用结构体正确描述每一条学生记录的信息,掌握用结构体数组或单链表结构存储所处理的数据。
(3)能通过文件实现数据的永久性存储,以及通过文件减少键盘录入操作。
(4)设计友好的人机交互菜单,通过相应的流程图控制语句的正确使用,在主函数中根据选择强调用实现各功能的函数,从而实现一个完整的小型管理系统。
二、实验步骤
1.定义学生结构体类型structstudent,每个学生包括学号,姓名,性别,几门功课(课程门数自己定义),总分。
为存储一批学生数据(学生人数可由用户确定),可以定义该类型的一维数组或以该类型为数据类型定义单链表结构。
结构体类型的定义如下如:
#defineN1000
#defineM3
structStudent
{
intnum;
charname[20];
charsex[4];
intscore[M];
inttotal;
}stu[N];
2.输入若干学生的信息(人数自定,这里总分不能输入,需要通过计算求得),并按学号升序输出所有学生的完整信息到屏幕,并将结果写到文件stu_info.dat中。
以写的方式创建文件stu_info.da,并检查创建是否成功:
FILE*fp;
if((fp==fopen("stu_info.dat","r"))==NULL)
{
Printf("cannotopenfile!
");
Exit(0);
}
将结构体数组中的学生信息顺序地输入到文件stu_info.da。
这样的操作我给它声明了一个函数,函数声明如下:
voidinput(structStudentst[],intn);
3.根据总分,选择一种排序方法按总分由高到低排名,用一个函数来实现,函数声明在下面,给出每个学生的名次,并将每个学生的学号,姓名,名次这3个信息写入到rank.dat文件中。
一般来说,只要是按序输入的话,名次就很好给出。
FILE*fp;
fp=fopen("Q:
\\rank.dat","wb");
if(fp==NULL)
{
printf("不能打开文件!
\n");
exit
(1);
}
voidsort_sum(structStudentst[],intn);
4.对学生信息的查找可以有多中方法,在这里我用折半查找和顺序查找这两种方法,自己定义两个函数分别实现两种功能。
注意查找的学生学号肯定是已经写入到stu_info.da文件中,下面是两个函数的声明,具体代码在源程序中:
voidseek_1(structStudentst[],intno,intn);
voidseek_2(structStudentst[],intno,intn);
5.对学生信息的更新包括插入,删除,修改等操作,将用三个函数分别来实现这些功能。
(1).增加一条学生信息时,先根据学号找到要插入的位置(数组下标),然后插入,插入点后的个数组的下标加1,如果结构体数组有n个学生信息,则结果数组中的学生信息个数为n+1,注意n+1<=N;
(2).删除一条学生信息时,先根据学号找到要删除的位置(数组下标),然后删除指定元素,删除点后的个数组的下标减1,如果结构体数组有n个学生信息,则结果数组中的学生信息个数为n-1;
(3)修改一条学生信息时,先根据学号找到要修改元素的位置(数组下标),然后对指定元素(结构体变量)的每个成员分别修改。
这个3个函数的声明如下:
voiddel(structStudentst[],intno,intn);
voidins(structStudentst[],intno,intn);
voidmod(structStudentst[],intno,intn);
6.在main()函数中设计一个菜单对以上模块选择执行,实现完整的学生成绩管理系统。
#include
#include
intmain()
{
intchoice,i,n;
printf("******************************************************\n\n");
printf("欢迎进入学生成绩管理系统\n\n");
printf("******************************************************\n\n");
menu();
while
(1)
{
printf("请选择:
");
scanf("%d",&choice);
switch(choice)
{
case1:
printf("请输入你将要录入学生的个数:
");
scanf("%d",&n);
input(stu,n);
menu();
break;
case2:
printf("按总分排序后如下:
\n");
sort_sum(stu,n);
printf("\n");
menu();
break;
case3:
printf("\n请输入你要查找的学生的学号:
\n");
scanf("%d",&i);
seek_1(stu,i,n);
menu();
break;
case4:
printf("\n请输入你要查找的学生的学号:
\n");
scanf("%d",&i);
seek_2(stu,i,n);
menu();
break;
case5:
printf("\n请输入要删除的学生的学号:
");
scanf("%d",&i);
del(stu,i,n);
menu();
break;
case6:
printf("\n请输入你要插入的学生的学号:
\n");
scanf("%d",&i);
ins(stu,i,n);
menu();
break;
case7:
printf("\n请输入你要修改的学号:
");
scanf("%d",&i);
mod(stu,i,n);
menu();
break;
case8:
printf("\n打印n个学生信息:
\n");
print(stu,n);
menu();
break;
case0:
exit(0);
default:
printf("errorinput!
请重输!
");
}
}
return0;
}可以声明一个menu()函数。
voidmenu()
{
printf("1.录入学生信息\n");
printf("2.根据总分排序\n");
printf("3.用折半查找学生信息\n");
printf("4.用顺序法查找学生信息\n");
printf("5.根据学号删除学生信息\n");
printf("6.根据学号插入学生信息\n");
printf("7.根据学号修改学生信息\n");
printf("8.打印n个学生信息\n");
printf("0.退出\n");
}
7.需要同学们自己定义的函数的原型如下:
voidinput(structStudentst[],intn);
voidsort_sum(structStudentst[],intn);
voidseek_1(structStudentst[],intno,intn);
voidseek_2(structStudentst[],intno,intn);
voiddel(structStudentst[],intno,intn);
voidins(structStudentst[],intno,intn);
voidmod(structStudentst[],intno,intn);
voidprint(structStudentst[],intn);
三.程序源代码:
#include
#include
#include
#include
#include
#defineN1000
#defineM3
voidmenu();
voidinput(structStudentst[],intn);
voidsort_sum(structStudentst[],intn);
voidseek_1(structStudentst[],intno,intn);
voidseek_2(structStudentst[],intno,intn);
voiddel(structStudentst[],intno,intn);
voidins(structStudentst[],intno,intn);
voidmod(structStudentst[],intno,intn);
voidprint(structStudentst[],intn);
structStudent
{
intnum;
charname[20];
charsex[4];
intscore[M];
inttotal;
}stu[N];
intmain()
{
intchoice,i,n;
printf("*******************************************************\n\n");
printf("欢迎进入学生成绩管理系统\n\n");
printf("*******************************************************\n");
menu();
while
(1)
{
printf("请选择:
");
scanf("%d",&choice);
switch(choice)
{
case1:
printf("请输入要录入学生的个数:
");
scanf("%d",&n);
input(stu,n);
menu();
break;
case2:
printf("按总分排序后如下:
\n");
sort_sum(stu,n);
printf("\n");
menu();
break;
case3:
printf("\n请输入你要查找的学生的学号:
\n");
scanf("%d",&i);
seek_1(stu,i,n);
menu();
break;
case4:
printf("\n请输入你要查找的学生的学号:
\n");
scanf("%d",&i);
seek_2(stu,i,n);
menu();
break;
case5:
printf("\n请输入要删除的学生的学号:
");
scanf("%d",&i);
del(stu,i,n);
menu();
break;
case6:
printf("\n请输入你要插入的学生的学号:
\n");
scanf("%d",&i);
ins(stu,i,n);
menu();
break;
case7:
printf("\n请输入你要修改的学号:
");
scanf("%d",&i);
mod(stu,i,n);
menu();
break;
case8:
printf("\n打印n个学生信息:
\n");
print(stu,n);
menu();
break;
case0:
exit(0);
default:
printf("errorinput!
请重新输入!
");
}
}
return0;
}
voidmenu()
{
printf("1.录入学生信息\n");
printf("2.根据总分排序\n");
printf("3.用折半查找学生信息\n");
printf("4.用顺序法查找学生信息\n");
printf("5.根据学号删除学生信息\n");
printf("6.根据学号插入学生信息\n");
printf("7.根据学号修改学生信息\n");
printf("8.打印n个学生信息\n");
printf("0.退出\n");
}
voidinput(structStudentst[],intn)
{
inti=0,j;
charch;
FILE*fp;
fp=fopen("F:
\\stu_info.dat","wb");
if(fp==NULL)
{
printf("不能打开文件!
\n");
exit
(1);
}
printf("\t\t\t\t1.录入学员信息\n");
do
{
printf("\t\n输入第%d个学生的信息\n",i+1);
printf("输入学生学号:
");
scanf("%d",&st[i].num);
fflush(stdin);
printf("输入学生姓名:
");
fflush(stdin);
gets(st[i].name);
printf("输入学生性别:
");
fflush(stdin);
gets(st[i].sex);
printf("输入学生成绩:
\n");
fflush(stdin);
for(j=0;jscanf("%d",&st[i].score[j]);
fflush(stdin);
fwrite(&stu,sizeof(stu),1,fp);
printf("是否继续输入?
(Y/N)");
fflush(stdin);
ch=getchar();
if(ch=='N'&&ch=='n')
break;
else
i++;
fflush(stdin);
}while(ifclose(fp);
}
voidsort_sum(structStudentst[],intn)
{
inti,j,sum=0,k;
structStudenttemp;
FILE*fp;
fp=fopen("F:
\\stu_info.dat","wb");
if(fp==NULL)
{
printf("不能打开文件!
\n");
exit
(1);
}
for(i=0;i{
for(j=0;jsum+=st[i].score[j];
st[i].total=sum;
sum=0;
}
for(i=0;i{
for(j=n-1;j>i;j--)
if(st[j].total>st[j-1].total)
{
temp=st[j-1];
st[j-1]=st[j];
st[j]=temp;
}
}
printf("\n\t所有学生的个人信息如下\n");
for(i=0;i{
k=i+1;
printf("\n学号:
%5姓名:
%4s性别:
%3s名次:
%5d\n",st[i].num,st[i].name,st[i].sex,k);
fwrite(&st,sizeof(stu),1,fp);
printf("这个学生的各门成绩如下:
\n");
for(j=0;jprintf("%5d",st[i].score[j]);
}
printf("\n\n\t\t\t按任意键返回主菜单...\n");
fclose(fp);
}
voidseek_1(structStudentst[],intno,intn)
{
intstart,end,flag=1,i,j,ans;
for(start=0,end=n;start<=end;)
{
i=start+(end-start)/2;
if(no==st[i].num)
{
printf("%d",i+1);
break;
}
elseif(noend=i-1;
else
start=i+1;
}
if(i{
flag=0;
printf("学号:
%5d姓名:
%4s性别:
%3s\n",st[i].num,st[i].name,st[i].sex);
printf("这个学生的各门成绩如下:
\n");
for(j=0;jprintf("%5d",st[i].score[j]);
printf("\n");
}
if(flag)
{
system("cls");
printf("没有你要查找的学生\n");
}
printf("按1返回主菜单\n");
scanf("%d",&ans);
if(ans==1)
{
system("cls");
}
}
voidseek_2(structStudentst[],intno,intn)
{
inti,j,a,flag=1;
for(i=0;i{
if(st[i].num==no)
{
flag=0;
printf("\n学号:
%5d姓名:
%4s性别:
%3s\n",st[i].num,st[i].name,st[i].sex);
printf("这个学生的各门成绩如下:
\n");
for(j=0;jprintf("%5d",st[i].score[j]);
printf("\n");
break;
}
}
if(flag)
{
system("cls");
printf("\n\n\t\t\t没有你要查找的学生\n");
}
printf("\n\n\t\t\t按1返回主菜单\n");
scanf("%d",&a);
if(a==1)
{
system("cls");
}
}
voiddel(structStudentst[],intno,intn)
{
inti,j,flag=1;
charans1,ans3;
do
{
for(i=0;i{
if(st[i].num==no)
{
flag=0;
printf("删除前此学号学生的有关信息如下:
\n");
printf("\n学号:
%5d姓名:
%4s性别:
%3s\n",st[i].num,st[i].name,st[i].sex);
printf("删除前此学号学生的各门成绩如下:
\n");
for(j=0;jprintf("%5d",st[i].score[j]);
printf("\n");
break;
}
}
if(flag)
{
printf("\n\n没有您输入的学号!
");
break;
}
}while(flag);
printf("\n是否真的要删除此学生的所有信息:
Y/N\b");
fflush(stdin);
ans1=getchar();
printf("\n");
if(ans1=='Y')
{
for(i=0;ist[i]=st[i+1];
n--;
printf("\n您已删除该学生学员信息!
");
printf("\n\n\t\t\t是否继续删除?
Y/N\b");
fflush(stdin);
ans3=getchar();
while(ans3=='Y')
{
system("cls");
del(stu,i,n);
}
system("cls");
}
else
{
system("cls");
}
}
voidins(structStudentst[],intno,intn)
{
inti;
printf("\n\t请输入你要插入的学生的姓名:
\n");
scanf("%s",&st[no].name);
fflush(stdin);
printf("\n\t请输入你要插入的学生的性别:
\n");
scanf("%s",&st[no].sex);
fflush(stdin);
printf("\n\t请输入你要插入的学生的各门成绩:
\n");
for(i=0;iscanf("%d",&st[no].score[i]);
printf("你要插入的学生的信息成功!
\n");
}
voidmod(structStudentst[],intno,intn)
{
inti,j,x,flag=1;
charans1,ans3;
do
{
for(i=0;i{
if(st[i].num==no)
{
flag=0;
printf("修改前此学号学生的有关信息如下:
\n");
printf("学号:
%5d姓名:
%4s性别:
%3s\n",st[i].num,st[i].name,st[i].sex);
printf("修改前此学号学生的各门成绩如下:
\n");
for(j=0;jprintf("%5d",st[i].score[j]);
printf("\n");
break;
}
}
if(flag)
{
printf("没有您输入的学号!
\n");
menu();
}
}while(flag);