学生成绩管理系统.docx
《学生成绩管理系统.docx》由会员分享,可在线阅读,更多相关《学生成绩管理系统.docx(24页珍藏版)》请在冰豆网上搜索。
学生成绩管理系统
学生管理系统
———学生成绩管理系统
学院计算机科学与技术
专业计算机科学与技术
学号110341202
学生姓名陈格
指导教师姓名沈中林
提目难度综合题
2013年6月1日
一、题目
1)实现对学生信息的查找、添加、删除、修改、浏览、保存、从文件读取功能。
2)使用结构体对学生信息的存储。
3)使用哈希表实现对学生信息的查找、添加、删除、修改、浏览等操作。
4)熟悉使用哈希法,建立哈希表,实现对姓名进行散列法查找。
5)使用文件完成数据的存储与读取,要求每次运行某个模块时将数据读入结构体中,并提供保存选项,将结构体中的数据保存在文件中。
二、问题分析及求解思路
(1)数据结构
学生成绩信息:
typedefstructstudentscore
{charname[10];//定义姓名的字符数组
charnum[20];//定义学号的字符数组
structsubject
{charsubname[20];//定义学科名的字符数组
floatscore;//保存学生各科成绩
}sub[5];//共五门课
doublesum;//总分
structstudentscore*next;
}STUCORE;
(2)本系统涉及的知识点
结构体、数组、循环、函数、指针、链表、文件操作。
(3)原理
除留余数法:
关键字被某个不大于哈希表长m的数P除后所得余数为哈希地址。
H(key)=keyMODP(P<=m)
随机探测再散列法:
选择一个随机函数,取关键字的随机函数值为它的哈希地址,即
Hi=random(key)MODP(P<=m)
其中random为随机函数。
通常用于关键字长度不等时采用此法。
(4)功能要求功能模块
1、建立学生信息,每个学生的信息包括:
学号、姓名、性别、班级、学院
2、用链表的形式对学生信息分别进行查找、添加、删除、修改
3、结果保存在磁盘上
(5)功能模块
(4)算法功能描述
①总体功能说明:
本系统可以做到对1.学生信息:
学号、姓名、性别、学院、班级。
2.学生成绩信息:
学号、姓名、一名学生五门不同学科的学科名及该科成绩。
分别进行添加、修改、查找、删除、保存、载入功能。
②学生成绩信息管理功能说明:
可以添加学生学号、姓名、及对一名学生五门不同学科的学科名及该科成绩。
并可以通过对输入的学生成绩信息进行修改、删除、保存、载入功能并通过学号和姓名两种方式查找,并且对同名的学生也可以进行区分。
并且会保持学好的一致性,保证任意两名学生不会出现学号相重复的情况。
三、主要功能模块流程图(按姓名查找信息的流程图)
while(p!
=NULL)
0
1
按姓名查找流程图
四、主要算法
学生成绩信息管理中各模块的功能说明程序代码设计
一:
结构体:
typedefstructstudentscore
{charname[10];
charnum[20];
structsubject
{charsubname[20];
floatscore;
}sub[5];//保存学生各科成绩
doublesum;//总分
structstudentscore*next;
}STUCORE;
二:
添加学生成绩信息函数:
(voidadd_score())
1)函数原形:
voidadd_score()
2)功能:
采用动态内存分配malloc函数和链表结构。
利用dowhile、while循环结构strcpy函数依次输入学生学号、姓名、及对一名学生五门不同学科的学科名及该科成绩。
将信息保存在内存中建立的链表里。
3)变量及类型:
STUCORE*stu,*p;定义结构体指针
chark;用来接收输入的(y/n)以便通过dowhile判断是否继续添加信息
intflag;定义一个整型变量来判断所添加的学生学号是否已经存在文件中,保证学号唯一性
p=head_2;将结构体下定义的头指针head_2赋给p
4)说明:
执行完输入函数后,会在键盘缓冲区中保存回车键,后面再对字符型变量赋值时,会将缓冲区中的回车键当成数据存入变量中,所以要在某些输入语句后面加getchar()函数。
并在函数调用结束时利用system("cls")执行清屏操作。
添加完成后需要去往文件操作保存。
voidadd_score()//添加学生成绩信息
{STUCORE*stu,*p;chark;p=head_2;intflag=0;
do
{stu=(STUCORE*)malloc(sizeof(STUCORE));
printf("输入学生的成绩信息:
\n");
while(flag==0){printf("请输入学生学号:
");scanf("%s",no);flag=Judge(no);}
strcpy(stu->num,no);printf("请输入学生姓名:
");scanf("%s",stu->name);
printf("请输入第一门课学科名:
");scanf("%s",stu->sub[0].subname);
printf("请输入该课成绩:
");scanf("%f",&stu->sub[0].score);
printf("请输入第二门课学科名:
");scanf("%s",stu->sub[1].subname);
printf("请输入该课成绩:
");scanf("%f",&stu->sub[1].score);
printf("请输入第三门课学科名:
");scanf("%s",stu->sub[2].subname);
printf("请输入该课成绩:
");scanf("%f",&stu->sub[2].score);
printf("请输入第四门课学科名:
");scanf("%s",stu->sub[3].subname);
printf("请输入该课成绩:
");scanf("%f",&stu->sub[3].score);
printf("请输入第五门课学科名:
");scanf("%s",stu->sub[4].subname);
printf("请输入该课成绩:
");scanf("%f",&stu->sub[4].score);
stu->sum=stu->sub[1].score+stu->sub[2].score+stu->sub[3].score+stu->sub[4].score+stu->sub[0].score;
getchar();printf("\t\t输入学生信息完成。
\n");
while(p->next!
=NULL)p=p->next;
p->next=stu;p=stu;p->next=NULL;
printf("\n添加完成后请去往文件管理保存!
\n\n是否继续添加学生信息?
(y/n):
\n");
}while((k=getchar())=='y');
getchar();system("cls");}
三:
删除学生成绩信息函数(voiddel_score())
1)函数原形:
voiddel_score()
2)功能:
利用strcmp函数、dowhile、while循环结构通过学号找到要删除的学生并利用链表执行删除操作。
将信息保存在内存中建立的链表里。
3)变量及类型:
STUCORE*p,*q;定义结构体指针
charno[10];定义输入的待比较变量
chark,ch;用来接收输入的(y/n)以便通过dowhile判断是否删除信息
p=head_2;将结构体下定义的头指针head_2赋给p
4)说明:
执行完删除函数后,会在键盘缓冲区中保存回车键,后面再对字符型变量赋值时,会将缓冲区中的回车键当成数据存入变量中,所以要在某些输入语句后面加getchar()函数。
并在函数调用结束时利用system("cls")执行清屏操作。
删除完成后需要去往文件操作保存。
voiddel_score()//删除学生成绩信息
{STUCORE*p,*q;charno[10];chark,ch;
Do
{p=head_2;printf("\t\t删除学生的详细资料\n\n\n");
printf("请输入要删除学生的学号:
");scanf("%s",no);
while(strcmp(p->num,no)!
=0&&p->next!
=NULL){q=p;p=p->next;}
if(strcmp((p->num),no)==0)
{printf("要删除的学生成绩信息:
");
printf("学号:
%s\n",p->num);printf("姓名:
%s\n",p->name);
printf("%s成绩:
%f\n",p->sub[0].subname,p->sub[0].score);
printf("%s成绩:
%f\n",p->sub[1].subname,p->sub[1].score);
printf("%s成绩:
%f\n",p->sub[2].subname,p->sub[2].score);
printf("%s成绩:
%f\n",p->sub[3].subname,p->sub[3].score);
printf("%s成绩:
%f\n",p->sub[4].subname,p->sub[4].score);
printf("总分:
%lf\n",p->sum);getchar();
printf("\n确定删除吗?
y/n?
\n\n");ch=getchar();
if(ch=='y'){q->next=p->next;printf("\n\t\t\t已删除该学生\n\n");}}
elseprintf("\n\t\t\t没有该学生\n\n");getchar();printf("\n删除完成后请去往文件管理保存!
\n\n是否继续删除其它学生信息?
(y/n?
):
\n");k=getchar();}while(k=='y');
getchar();system("cls");}
四:
修改学生成绩信息函数(voidmodify_score())
1)函数原形:
voidmodify_score()
2)功能:
利用strcmp函数、dowhile、while循环结构通过学号找到要修改的学生并利用链表执行修改操作。
并将修改后的信息保存在内存中建立的链表里。
3)变量及类型:
STUCORE*p;定义结构体指针
charno[10];定义输入的待比较变量
chark;用来接收输入的(y/n)以便通过dowhile判断是否继续修改信息
p=head_2;将结构体下定义的头指针head_2赋给p
4)说明:
执行完修改函数后,会在键盘缓冲区中保存回车键,后面再对字符型变量赋值时,会将缓冲区中的回车键当成数据存入变量中,所以要在某些输入语句后面加getchar()函数。
并在函数调用结束时利用system("cls")执行清屏操作。
修改完成后需要去往文件操作保存。
voidmodify_score()//修改学生成绩信息
{system("cls");STUCORE*p;charno[30];chark;
do
{p=head_2;printf("\t\t修改学生的详细资料\n");
printf("输入学生学号:
");scanf("%s",no);
while(strcmp(p->num,no)!
=0&&p->next!
=NULL){p=p->next;}
if(strcmp((p->num),no)==0)
{printf("要修改的学生的详细资料:
\n");
printf("学号:
%s\n",p->num);printf("姓名:
%s\n",p->name);
printf("%s成绩:
%f\n",p->sub[0].subname,p->sub[0].score);
printf("%s成绩:
%f\n",p->sub[1].subname,p->sub[1].score);
printf("%s成绩:
%f\n",p->sub[2].subname,p->sub[2].score);
printf("%s成绩:
%f\n",p->sub[3].subname,p->sub[3].score);
printf("%s成绩:
%f\n",p->sub[4].subname,p->sub[4].score);
printf("总分:
%lf\n",p->sum);
printf("\n\t\t********根据提示输入修改后的信息**********\n\n");
printf("输入新的学生的成绩信息:
\n");
printf("请输入新的学生学号:
");scanf("%s",p->num);
printf("请输入新的学生姓名:
");scanf("%s",p->name);
printf("请输入第一门课学科名:
");scanf("%s",stu->sub[0].subname);
printf("请输入该课成绩:
");scanf("%f",&stu->sub[0].score);
printf("请输入第二门课学科名:
");scanf("%s",stu->sub[1].subname);
printf("请输入该课成绩:
");scanf("%f",&stu->sub[1].score);
printf("请输入第三门课学科名:
");scanf("%s",stu->sub[2].subname);
printf("请输入该课成绩:
");scanf("%f",&stu->sub[2].score);
printf("请输入第四门课学科名:
");scanf("%s",stu->sub[3].subname);
printf("请输入该课成绩:
");scanf("%f",&stu->sub[3].score);
printf("请输入第五门课学科名:
");scanf("%s",stu->sub[4].subname);
printf("请输入该课成绩:
");scanf("%f",&stu->sub[4].score);
stu->sum=stu->sub[1].score+stu->sub[2].score+stu->sub[3].score+stu->sub[4].score+stu->sub[0].score;}
else
printf("\t\t没有此学生信息!
\n\n");
getchar();printf("\n修改完成后请去往文件管理保存!
\n\n是否继修改学生信息?
(y/n):
\n");k=getchar();}while(k=='y');
getchar();system("cls");}
五:
按学号查找学生成绩信息函数(voidsearch_num())
1)函数原形:
voidsearch_num()
2)功能:
利用strcmp函数、dowhile、while循环结构通过学号找到要查找的学生并将该学生成绩信息显示出来。
3)变量及类型:
STUCORE*p;定义结构体指针
charno[10];定义输入的待比较变量
chark;用来接收输入的(y/n)以便通过dowhile判断是否继续利用学号查询信息
intflag;定义一个整型变量来判断所查找的学生是否存在文件中
p=head_2;将结构体下定义的头指针head_2赋给p
4)说明:
执行完查询函数后,会在键盘缓冲区中保存回车键,后面再对字符型变量赋值时,会将缓冲区中的回车键当成数据存入变量中,所以要在某些输入语句后面加getchar()函数。
并在函数调用结束时利用system("cls")执行清屏操作。
voidsearch_num()//按学号查找学生成绩信息
{STUCORE*p;charno[10];chark;intflag;
do
{p=head_2;flag=0;printf("请输入要查找学生的学号:
");scanf("%s",no);
while(p!
=NULL)
if(strcmp(p->num,no)==0)
{printf("要查询的学生详细资料:
\n");
printf("学号:
%s\n",p->num);printf("姓名:
%s\n",p->name);
printf("%s成绩:
%f\n",p->sub[0].subname,p->sub[0].score);
printf("%s成绩:
%f\n",p->sub[1].subname,p->sub[1].score);
printf("%s成绩:
%f\n",p->sub[2].subname,p->sub[2].score);
printf("%s成绩:
%f\n",p->sub[3].subname,p->sub[3].score);
printf("%s成绩:
%f\n",p->sub[4].subname,p->sub[4].score);
printf("总分:
%lf\n",p->sum);p=p->next;flag=1;}
else
p=p->next;
if(flag==0)printf("\n\t\t\t没有该学生\n\n");getchar();printf("\n是否继续查找其它学生信息?
y/n?
\n");k=getchar();}while(k=='y');
getchar();printf("\n\t\t查看完毕!
按任意键返回");getchar();system("cls");}
六:
按姓名查找学生成绩函数(voidsearch_name())
1)函数原形:
voidsearch_name()
2)功能:
利用strcmp函数、dowhile、while循环结构通过姓名找到要查找的学生并将该学生成绩信息显示出来。
(包括同名的学生)
3)变量及类型:
STUCORE*p;定义结构体指针
charno[10];定义输入的待比较变量
chark;用来接收输入的(y/n)以便通过dowhile判断是否继续利用姓名查询信息
intflag;定义一个整型变量来判断所查找的学生是否存在文件中
p=head_2;将结构体下定义的头指针head_2赋给p
4)说明:
执行完查询函数后,会在键盘缓冲区中保存回车键,后面再对字符型变量赋值时,会将缓冲区中的回车键当成数据存入变量中,所以要在某些输入语句后面加getchar()函数。
并在函数调用结束时利用system("cls")执行清屏操作。
voidsearch_name()//按姓名查找学生成绩
{STUCORE*p;charno[10];chark;intflag;
do
{p=head_2;flag=0;printf("请输入要查找学生的姓名:
");scanf("%s",no);
while(p!
=NULL)
if(strcmp(p->name,no)==0)
{printf("要查询的学生详细资料:
\n");
printf("学号:
%s\n",p->num);printf("姓名:
%s\n",p->name);
printf("%s成绩:
%f\n",p->sub[0].subname,p->sub[0].score);
printf("%s成绩:
%f\n",p->sub[1].subname,p->sub[1].score);
printf("%s成绩:
%f\n",p->sub[2].subname,p->sub[2].score);
printf("%s成绩:
%f\n",p->sub[3].subname,p->sub[3].score);
printf("%s成绩:
%f\n",p->sub[4].subname,p->sub[4].score);
printf("总分:
%lf\n",p->sum);p=p->next;flag=1;}
else
p=p->next;
if(flag==0)printf("\n\t\t\t没有该学生\n\n");getchar();printf("\n是否继续查找其它学生信息?
y/n?
\n");k=getchar();}while(k=='y');
getchar();printf("\n\t\t查看完毕!
按任意键返回");getchar();system("cls");}
七:
查找学生成绩信息函数
voidsearch_score()//查找学生成绩信息
{system("cls");inta;
printf("\t\t**************************************\n");
printf("\t\t**************************************\n");
printf("\t\t\t1:
按学号查找。
\n");printf("\t\t\t2:
按姓名查找。
\n");printf("\t\t\t3:
退出。
\n");
printf("\t\t**************************************\n");
printf("\t\t**************************************\n");
printf("\n\t\t输入一个有效的数字,选择你要做的操作:
\n");scanf("%d",&a);
switch(a)
{case1:
search_num();break;case2:
search_name();break;case3:
score();break;
default:
printf("\t\t\t错误的菜单选项\n\n");break;}}
八:
学生成绩管理函数
voidscore()//学生成绩管理
{system("cls");inta;
printf("\t\t*************学生管理系统**************\n");
printf("\t\t**************************************\n");
printf("\t\t\t1:
查找成绩信息。
\n");printf("\t\t\t2:
添加成绩信息。
\n");
printf("\t\t\t3:
删除成绩信息。
\n");printf("\t\t\t4:
修改成绩信息。
\n");
printf("\t\t\t5:
返回。
\n");
printf("\t\t**************************************\n");
printf("\t\t**************************************\n");printf("\n\t\t输入一个有效的数字,选择你要做的操作:
\n");scanf("%d