1、学生成绩管理系统学 生 管 理 系 统 学生成绩管理系统学 院 计算机科学与技术 专 业 计算机科学与技术 学 号 110341202 学 生 姓 名 陈格 指导教师姓名 沈中林 提 目 难 度 综合题 2013 年 6月 1 日一、题目1) 实现对学生信息的查找、添加、删除、修改、浏览、保存、从文件读取功能。2) 使用结构体对学生信息的存储。3) 使用哈希表实现对学生信息的查找、添加、删除、修改、浏览等操作。4) 熟悉使用哈希法,建立哈希表,实现对姓名进行散列法查找。5) 使用文件完成数据的存储与读取,要求每次运行某个模块时将数据读入结构体中,并提供保存选项,将结构体中的数据保存在文件中。二
2、、问题分析及求解思路(1)数据结构 学生成绩信息:typedef struct studentscore char name10; /定义姓名的字符数组 char num20; /定义学号的字符数组 struct subject char subname20;/定义学科名的字符数组float score; /保存学生各科成绩sub5; /共五门课 double sum; /总分 struct studentscore *next;STUCORE;(2)本系统涉及的知识点结构体、数组、循环、函数、指针、链表、文件操作。(3)原理除留余数法: 关键字被某个不大于哈希表长m的数P除后所得余数为哈希地
3、址。 H(key)=key MOD P (P=m)随机探测再散列法:选择一个随机函数,取关键字的随机函数值为它的哈希地址,即 Hi=random(key) MOD P (Pnum,no);printf(请输入学生姓名:);scanf(%s,stu-name); printf(请输入第一门课学科名:);scanf(%s,stu-sub0.subname); printf(请输入该课成绩:);scanf(%f,&stu-sub0.score);printf(请输入第二门课学科名:);scanf(%s,stu-sub1.subname);printf(请输入该课成绩:);scanf(%f,&stu-
4、sub1.score);printf(请输入第三门课学科名:);scanf(%s,stu-sub2.subname);printf(请输入该课成绩:);scanf(%f,&stu-sub2.score);printf(请输入第四门课学科名:);scanf(%s,stu-sub3.subname);printf(请输入该课成绩:);scanf(%f,&stu-sub3.score);printf(请输入第五门课学科名:);scanf(%s,stu-sub4.subname);printf(请输入该课成绩:);scanf(%f,&stu-sub4.score);stu-sum=stu-sub1.s
5、core+stu-sub2.score+stu-sub3.score+stu-sub4.score+stu-sub0.score;getchar();printf(tt输入学生信息完成。n);while(p-next!=NULL)p=p-next;p-next=stu;p=stu;p-next=NULL;printf(n添加完成后请去往文件管理保存!nn是否继续添加学生信息?(y/n):n); while(k=getchar()=y);getchar(); system(cls);三:删除学生成绩信息函数(void del_score())1)函数原形:void del_score()2)功
6、能:利用strcmp函数、do while、while循环结构通过学号找到要删除的学生并利用链表执行删除操作。将信息保存在内存中建立的链表里。3)变量及类型: STUCORE *p,*q; 定义结构体指针 char no10; 定义输入的待比较变量 char k,ch; 用来接收输入的(y/n)以便通过do while判断是否删除信息p=head_2; 将结构体下定义的头指针head_2赋给p4)说明:执行完删除函数后,会在键盘缓冲区中保存回车键,后面再对字符型变量赋值时,会将缓冲区中的回车键当成数据存入变量中,所以要在某些输入语句后面加getchar()函数。并在函数调用结束时利用syste
7、m(cls)执行清屏操作。删除完成后需要去往文件操作保存。void del_score()/删除学生成绩信息 STUCORE *p,*q;char no10;char k,ch; Do p=head_2;printf(tt删除学生的详细资料 nnn); 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(学号:%sn,p-num);printf(姓名:%sn,p-nam
8、e);printf(%s 成绩: %fn,p-sub0.subname,p-sub0.score);printf(%s 成绩: %fn,p-sub1.subname,p-sub1.score);printf(%s 成绩: %fn,p-sub2.subname,p-sub2.score);printf(%s 成绩: %fn,p-sub3.subname,p-sub3.score);printf(%s 成绩: %fn,p-sub4.subname,p-sub4.score);printf(总分:%lfn,p-sum);getchar();printf(n确定删除吗?y/n?nn);ch=getch
9、ar();if(ch=y)q-next=p-next;printf(nttt已删除该学生nn);else printf(nttt没有该学生nn);getchar(); printf(n删除完成后请去往文件管理保存!nn是否继续删除其它学生信息?(y/n?):n);k=getchar();while(k=y);getchar();system(cls);四:修改学生成绩信息函数(void modify_score())1)函数原形:void modify_score()2)功 能:利用strcmp函数、do while、while循环结构通过学号找到要修改的学生并利用链表执行修改操作。并将修改后
10、的信息保存在内存中建立的链表里。3)变量及类型: STUCORE *p; 定义结构体指针 char no10; 定义输入的待比较变量 char k; 用来接收输入的(y/n)以便通过do while判断是否继续修改信息p=head_2; 将结构体下定义的头指针head_2赋给p4)说明:执行完修改函数后,会在键盘缓冲区中保存回车键,后面再对字符型变量赋值时,会将缓冲区中的回车键当成数据存入变量中,所以要在某些输入语句后面加getchar()函数。并在函数调用结束时利用system(cls)执行清屏操作。修改完成后需要去往文件操作保存。void modify_score()/修改学生成绩信息sy
11、stem(cls);STUCORE *p;char no30;char k;dop=head_2;printf(tt修改学生的详细资料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(学号:%sn,p-num);printf(姓名:%sn,p-name);printf(%s 成绩: %fn,p-sub0.subname,p-sub0.score);printf(%s 成绩: %fn
12、,p-sub1.subname,p-sub1.score);printf(%s 成绩: %fn,p-sub2.subname,p-sub2.score);printf(%s 成绩: %fn,p-sub3.subname,p-sub3.score);printf(%s 成绩: %fn,p-sub4.subname,p-sub4.score);printf(总分:%lfn,p-sum);printf(ntt*根据提示输入修改后的信息*nn); printf(输入新的学生的成绩信息:n);printf(请输入新的学生学号:);scanf(%s,p-num);printf(请输入新的学生姓名:);sc
13、anf(%s,p-name);printf(请输入第一门课学科名:);scanf(%s,stu-sub0.subname); printf(请输入该课成绩:);scanf(%f,&stu-sub0.score);printf(请输入第二门课学科名:);scanf(%s,stu-sub1.subname);printf(请输入该课成绩:);scanf(%f,&stu-sub1.score);printf(请输入第三门课学科名:);scanf(%s,stu-sub2.subname);printf(请输入该课成绩:);scanf(%f,&stu-sub2.score);printf(请输入第四门课
14、学科名:);scanf(%s,stu-sub3.subname);printf(请输入该课成绩:);scanf(%f,&stu-sub3.score);printf(请输入第五门课学科名:); scanf(%s,stu-sub4.subname);printf(请输入该课成绩:);scanf(%f,&stu-sub4.score);stu-sum=stu-sub1.score+stu-sub2.score+stu-sub3.score+stu-sub4.score+stu-sub0.score;else printf(tt没有此学生信息!nn);getchar();printf(n修改完成后请
15、去往文件管理保存!nn是否继修改学生信息?(y/n):n);k=getchar();while(k=y);getchar();system(cls);五:按学号查找学生成绩信息函数(void search_num())1)函数原形:void search_num()2)功 能:利用strcmp函数、do while、while循环结构通过学号找到要查找的学生并将该学生成绩信息显示出来。3)变量及类型: STUCORE *p; 定义结构体指针 char no10; 定义输入的待比较变量 char k;用来接收输入的(y/n)以便通过do while判断是否继续利用学号查询信息int flag;
16、定义一个整型变量来判断所查找的学生是否存在文件中p=head_2; 将结构体下定义的头指针head_2赋给p4)说明:执行完查询函数后,会在键盘缓冲区中保存回车键,后面再对字符型变量赋值时,会将缓冲区中的回车键当成数据存入变量中,所以要在某些输入语句后面加getchar()函数。并在函数调用结束时利用system(cls)执行清屏操作。void search_num()/按学号查找学生成绩信息STUCORE *p;char no10;char k;int flag;dop=head_2;flag=0;printf(请输入要查找学生的学号:);scanf(%s,no);while(p!=NULL
17、)if (strcmp(p-num,no)=0)printf(要查询的学生详细资料:n);printf(学号:%sn,p-num);printf(姓名:%sn,p-name);printf(%s 成绩: %fn,p-sub0.subname,p-sub0.score);printf(%s 成绩: %fn,p-sub1.subname,p-sub1.score);printf(%s 成绩: %fn,p-sub2.subname,p-sub2.score);printf(%s 成绩: %fn,p-sub3.subname,p-sub3.score);printf(%s 成绩: %fn,p-sub4
18、.subname,p-sub4.score);printf(总分:%lfn,p-sum);p=p-next;flag=1;else p=p-next;if(flag=0) printf(nttt没有该学生nn);getchar();printf(n是否继续查找其它学生信息?y/n?n);k=getchar();while(k=y);getchar();printf(ntt查看完毕!按任意键返回);getchar();system(cls);六:按姓名查找学生成绩函数(void search_name ())1)函数原形:void search_name()2)功 能:利用strcmp函数、do
19、 while、while循环结构通过姓名找到要查找的学生并将该学生成绩信息显示出来。(包括同名的学生)3)变量及类型: STUCORE *p; 定义结构体指针 char no10; 定义输入的待比较变量 char k;用来接收输入的(y/n)以便通过do while判断是否继续利用姓名查询信息int flag; 定义一个整型变量来判断所查找的学生是否存在文件中p=head_2; 将结构体下定义的头指针head_2赋给p4)说明:执行完查询函数后,会在键盘缓冲区中保存回车键,后面再对字符型变量赋值时,会将缓冲区中的回车键当成数据存入变量中,所以要在某些输入语句后面加getchar()函数。并在函
20、数调用结束时利用system(cls)执行清屏操作。void search_name()/按姓名查找学生成绩STUCORE *p;char no10;char k;int flag;dop=head_2;flag=0;printf(请输入要查找学生的姓名:);scanf(%s,no);while(p!=NULL)if (strcmp(p-name,no)=0)printf(要查询的学生详细资料:n);printf(学号:%sn,p-num);printf(姓名:%sn,p-name);printf(%s 成绩: %fn,p-sub0.subname,p-sub0.score);printf(%
21、s 成绩: %fn,p-sub1.subname,p-sub1.score);printf(%s 成绩: %fn,p-sub2.subname,p-sub2.score);printf(%s 成绩: %fn,p-sub3.subname,p-sub3.score);printf(%s 成绩: %fn,p-sub4.subname,p-sub4.score);printf(总分:%lfn,p-sum);p=p-next;flag=1;else p=p-next;if(flag=0) printf(nttt没有该学生nn);getchar();printf(n是否继续查找其它学生信息?y/n?n)
22、;k=getchar();while(k=y);getchar();printf(ntt查看完毕!按任意键返回);getchar();system(cls);七:查找学生成绩信息函数void search_score()/查找学生成绩信息system(cls);int a;printf(tt*n);printf(tt*n);printf(ttt1:按学号查找。n);printf(ttt2:按姓名查找。n);printf(ttt3:退出。n);printf(tt*n);printf(tt*n);printf(ntt输入一个有效的数字,选择你要做的操作:n);scanf(%d,&a);switch
23、(a)case 1:search_num();break;case 2:search_name();break;case 3:score();break;default:printf(ttt错误的菜单选项nn);break;八:学生成绩管理函数void score()/学生成绩管理system(cls);int a;printf(tt*学生管理系统*n);printf(tt*n);printf(ttt1:查找成绩信息。n);printf(ttt2:添加成绩信息。n);printf(ttt3:删除成绩信息。n);printf(ttt4:修改成绩信息。n);printf(ttt5:返回。n);printf(tt*n);printf(tt*n);printf(ntt输入一个有效的数字,选择你要做的操作:n);scanf(%d
copyright@ 2008-2022 冰豆网网站版权所有
经营许可证编号:鄂ICP备2022015515号-1