学生成绩管理系统.docx
- 文档编号:6417259
- 上传时间:2023-01-06
- 格式:DOCX
- 页数:21
- 大小:111.94KB
学生成绩管理系统.docx
《学生成绩管理系统.docx》由会员分享,可在线阅读,更多相关《学生成绩管理系统.docx(21页珍藏版)》请在冰豆网上搜索。
学生成绩管理系统
数据结构
课程设计说明书
学生姓名:
学院:
专业:
题目:
学生成绩管理系统
成绩
指导教师
2011年1月6日
1设计目的:
《数据结构》课程主要介绍最常用的数据结构,阐明各种数据结构内在的逻辑关系,讨论其在计算机中的存储表示,以及在其上进行各种运算时的实现算法,并对算法的效率进行简单的分析和讨论。
进行数据结构课程设计要达到以下目的:
⏹了解并掌握数据结构与算法的设计方法,具备初步的独立分析和设计能力;
⏹初步掌握软件开发过程的问题分析、系统设计、程序编码、测试等基本方法和技能;
⏹提高综合运用所学的理论知识和方法独立分析和解决问题的能力;
训练用系统的观点和软件开发一般规范进行软件开发,培养软件工作者所应具备的科学的工作方法和作风。
…………………………..
2.设计内容和要求
现有学生成绩信息文件1(1.txt),内容如下
姓名 学号 语文 数学 英语
张明明 01 67 78 82
李成友 02 78 91 88
张辉灿 03 68 82 56
王露 04 56 45 77
陈东明 05 67 38 47
…. .. .. .. …
学生成绩信息文件2(2.txt),内容如下:
姓名 学号 语文 数学 英语
陈果 31 57 68 82
李华明 32 88 90 68
张明东 33 48 42 56
李明国 34 50 45 87
陈道亮 35 47 58 77
…. .. .. .. …
试编写一管理系统,要求如下:
1) 实现对两个文件数据进行合并,生成新文件3.txt
2) 抽取出三科成绩中有补考的学生并保存在一个新文件4.txt
3) 对合并后的文件3.txt中的数据按总分降序排序
4) 输入一个学生姓名后,能查找到此学生的信息并输出结果
5) 要求使用结构体,链或数组等实现上述要求.
…………………………
3.本设计所采用的数据结构
数据结构折半插入排序,直接排序,通过调用函数查找,从结构体数组中查找。
……………………….
4.功能模块详细设计
4.1详细设计思想
为了实现“学生成绩管理系统”,结合其设计要求及内容,有如下的详细设计思想。
为了达到要求所说的界面美观,大方,故决定将文件1.txt和文件2.txt中的内容清晰的显示在界面上,便于使用者跟直观可见的看到程序的执行流程。
首先,利用malloc函数在成绩文件的顶部申请空间,用于存放文件的标题。
之后并将标题保存到hxy中。
再次申请空间,有fscanf将文件的数据输入到文件中去。
运用printf将成绩文件1.txt和2.txt打印到屏幕上。
其次,新建一个文件3.txt。
利用while循环和fprintf将文件1.txt和文件2.txt存入文件3.txt中。
并将文件3.txt打印到屏幕上。
进行两种排序,即“直接插入排序”和“折半插入排序”。
再次,利用while循环和if语句,查找出需要补考的学生,将需要补考的学生(即成绩中有不及格成绩的学生)存入文件4.txt中,并打印到屏幕上。
最后,通过输入学生姓名,查找到所需要查找的学生。
各模块实现:
第一项:
合并文件1.txt和文件2.txt
#include
#include
#include
charhxy[50];//成绩文件顶部的标题用hxy保存
typedefstructstudent//单个学生成绩的记录
{
charname[10];//姓名
intnumber;//学号
intchinese;//语文
intmath;//数学
intenglish;//英语
structstudent*next;
}student,*gradelist;
gradelistfileread(char*adress)//读取成绩文件
{
FILE*fp;
if((fp=fopen(adress,"r"))==NULL)//打开文件
{
printf("文件打开出错");
exit(0);
}
gradelistfile=(student*)malloc(sizeof(student));//申请空间
file->next=NULL;
student*p=file;//操作指针
intn=0;//循环标记,具体作用是在第一次循环时方便处理标题
while(!
feof(fp))
{
if(n==0)
{
fgets(hxy,50,fp);//处理标题,并且文件指针移到第二行
}
if(n==1)//申请空间
{
(p->next)=(student*)malloc(sizeof(student));
p=p->next;
p->next=NULL;
}
fscanf(fp,"%s%d%d%d%d",p->name,&p->number,&p->chinese,&p->math,&p->english);//将文件的数据输入到链表中
n=1;
}
if(fclose(fp))//关闭文件
{
printf("文件关闭失败");
exit(0);
}
returnfile;
}
voidFilePrint(gradelistfile)//将成绩文件打印到屏幕上
{
student*p=file;
printf("%s\n",hxy);//打印标题
while(p->next!
=NULL)
{
printf("%6s%2d%d%d%d\n",p->name,p->number,p->chinese,p->math,p->english);//循环打印
p=p->next;
}
}
第二项:
生成新文件3.txt
voidmerger()//合并文件
{
char*address1="1.txt",*address2="2.txt",*address3="3.txt";
gradelistfile1=fileread(address1),file2=fileread(address2);
FILE*fp;
if((fp=fopen("3.txt","w+"))==NULL)//先新建一个3.txt,然后将1.txt和2.txt的内容输入到里面
{
printf("合并成绩文档失败,原因:
建立文档出错");
exit(0);
}
student*p1=file1,*p2=file2;
fprintf(fp,"%s",hxy);//先输入标题
while(p1->next!
=NULL)
{
fprintf(fp,"%6s%2d%d%d%d\n",p1->name,p1->number,p1->chinese,p1->math,p1->english);
//将文件1.txt内容输入到文件3.txt中
p1=p1->next;
}
while(p2->next!
=NULL)
{
fprintf(fp,"%6s%2d%d%d%d\n",p2->name,p2->number,p2->chinese,p2->math,p2->english);
//输入2.txt内容输入到文件3.txt中
p2=p2->next;
}
if(fclose(fp))
{
printf("文件关闭失败");
exit(0);
}
}
第三项:
直接插入排序和折半插入排序
if(i==1)//直接插入排序
{
for(intk=2;k<=n;++k)
{
if(L.r[k].totalgrade { L.r[0]=L.r[k]; L.r[k]=L.r[k-1]; for(intj=k-2;L.r[0].totalgrade { L.r[j+1]=L.r[j]; } L.r[j+1]=L.r[0]; } } } if(i==2)//折半插入排序 { intm; for(intk=2;k<=n;++k) { L.r[0]=L.r[k]; intlow=1,high=k-1; while(low<=high) { m=(low+high)/2; if(L.r[0].totalgrade high=m-1; else low=m+1; } for(intj=k-1;j>=high+1;--j) L.r[j+1]=L.r[j]; L.r[high+1]=L.r[0]; } } for(intq=n;q>=1;q--)//将排序好的内容输入到3.txt { fprintf(fp,"%6s%2d%d%d%d\n",L.r[q].name,L.r [q].number,L.r[q].chinese,L.r[q].math,L.r[q].english); } if(fclose(fp)) { printf("文件关闭失败"); exit(0); } } 第四项: 查找学生 voidsearch(char*name)//按姓名查找 { gradelistfile=fileread("3.txt"); student*p=file; while(p->next! =NULL) { if(strcmp(name,p->name)==0) { printf("%6s%2d%d%d%d\n",p->name,p->number,p->chinese,p ->math,p->english); return; } p=p->next; } printf("查无此人,请确定名字输入正确\n"); exit(0); } 流程图: ………………………. 4.2核心代码 #include #include #include charhxy[50];//成绩文件顶部的标题用hxy保存 //(以下为建立结构体structstudent) typedefstructstudent//单个学生成绩的记录 { charname[10];//姓名 intnumber;//学号 intchinese;//语文 intmath;//数学 intenglish;//英语 structstudent*next; }student,*gradelist; gradelistfileread(char*adress)//读取成绩文件 { FILE*fp; if((fp=fopen(adress,"r"))==NULL)//打开文件 { printf("文件打开出错"); exit(0); } gradelistfile=(student*)malloc(sizeof(student));//申请空间 file->next=NULL; student*p=file;//操作指针 intn=0;//循环标记,具体作用是在第一次循环时方便处理标题 while(! feof(fp)) { if(n==0) { fgets(hxy,50,fp);//处理标题,并且文件指针移到第二行 } if(n==1)//申请空间 { (p->next)=(student*)malloc(sizeof(student)); p=p->next; p->next=NULL; } fscanf(fp,"%s%d%d%d%d",p->name,&p->number,&p->chinese,&p->math,&p->english);//将文件的数据输入到链表中 n=1; } if(fclose(fp))//关闭文件 { printf("文件关闭失败"); exit(0); } returnfile; } voidFilePrint(gradelistfile)//将成绩文件打印到屏幕上 { student*p=file; printf("%s\n",hxy);//打印标题 while(p->next! =NULL) { printf("%6s%2d%d%d%d\n",p->name,p->number,p->chinese,p->math,p->english);//循环打印 p=p->next; } } voidmerger()//合并文件 { char*address1="1.txt",*address2="2.txt",*address3="3.txt"; gradelistfile1=fileread(address1),file2=fileread(address2); FILE*fp; if((fp=fopen("3.txt","w+"))==NULL)//先新建一个3.txt,然后将1.txt和2.txt的内容输入到里面 { printf("合并成绩文档失败,原因: 建立文档出错"); exit(0); } student*p1=file1,*p2=file2; fprintf(fp,"%s",hxy);//先输入标题 while(p1->next! =NULL) { fprintf(fp,"%6s%2d%d%d%d\n",p1->name,p1->number,p1->chinese,p1->math,p1->english);//将1.txt输入到文件3.txt中 p1=p1->next; } while(p2->next! =NULL) { fprintf(fp,"%6s%2d%d%d%d\n",p2->name,p2->number,p2->chinese,p2->math,p2->english);//将2.txt输入到文件3.txt中 p2=p2->next; } if(fclose(fp)) { printf("文件关闭失败"); exit(0); } } voidextract()//抽取补考的成绩记录 { char*address4="4.txt",*address3="3.txt"; FILE*fp; if((fp=fopen("4.txt","w+"))==NULL)//新建文件4.txt { printf("抽取补考学生成绩记录建立新文件失败"); exit(0); } gradelistfile3=fileread(address3); student*p=file3; fprintf(fp,"%s",hxy);//先输入标题 while(p->next! =NULL) { if((p->chinese)<60||(p->math)<60||(p->english)<60)//补考条件 { fprintf(fp,"%6s%2d%d%d%d\n",p->name,p->number,p->chinese,p->math,p->english); } p=p->next; } if(fclose(fp)) { printf("文件关闭失败"); exit(0); } } voidsort(inti) { char*address3="3.txt"; gradelistfile3=fileread(address3);//先将3.txt读入链表 student*p=file3; if(remove("3.txt"))//删除3.txt { printf("删除文件出错"); exit(0); } intn=0;//学生个数 FILE*fp; if((fp=fopen("3.txt","w+"))==NULL)//新建一个空的3.txt { printf("新建文件出错"); exit(0); } fprintf(fp,"%s",hxy);//标题输入 while(p->next! =NULL) { n++; p=p->next; } typedefstruct//新建一个结构数组 { inttotalgrade; charname[10]; intnumber; intchinese; intmath; intenglish; }gradenote;//成绩记录 typedefstruct { gradenoter[100];//初始化了100了空间 }grade_list;//待排序成绩表 grade_listL; p=file3; for(intt=1;t<=n;t++,p=p->next)//将链表的内容复制到结构数组里 { strcpy(L.r[t].name,p->name); L.r[t].number=p->number; L.r[t].chinese=p->chinese; L.r[t].math=p->math; L.r[t].english=p->english; L.r[t].totalgrade=p->chinese+p->math+p->english; } if(i==1)//直接插入排序 { for(intk=2;k<=n;++k) { if(L.r[k].totalgrade { L.r[0]=L.r[k]; L.r[k]=L.r[k-1]; for(intj=k-2;L.r[0].totalgrade { L.r[j+1]=L.r[j]; } L.r[j+1]=L.r[0]; } } } if(i==2)//折半插入排序 { intm; for(intk=2;k<=n;++k) { L.r[0]=L.r[k]; intlow=1,high=k-1; while(low<=high) { m=(low+high)/2; if(L.r[0].totalgrade high=m-1; else low=m+1; } for(intj=k-1;j>=high+1;--j) L.r[j+1]=L.r[j]; L.r[high+1]=L.r[0]; } } for(intq=n;q>=1;q--)//将排序好的内容输入到3.txt { fprintf(fp,"%6s%2d%d%d%d\n",L.r[q].name,L.r [q].number,L.r[q].chinese,L.r[q].math,L.r[q].english); } if(fclose(fp)) { printf("文件关闭失败"); exit(0); } } voidsearch(char*name)//按姓名查找学生 { gradelistfile=fileread("3.txt"); student*p=file; while(p->next! =NULL) { if(strcmp(name,p->name)==0) { printf("%6s%2d%d%d%d\n",p->name,p->number,p->chinese,p ->math,p->english); return; } p=p->next; } printf("查无此人,请确定名字输入正确\n"); exit(0); } voidmain(void) { intchioce; gradelistfile1=fileread("1.txt"),file2=fileread("2.txt"); printf("现有成绩记录文件1\n"); printf("*********************************************************\n"); FilePrint(file1); printf("*********************************************************\n"); printf("现有成绩记录文件2\n"); printf("*********************************************************\n"); FilePrint(file2); printf("*********************************************************\n"); printf("第一步,合并成绩记录文件\n"); merger(); printf("合并成功\n"); system("PAUSE"); printf("现有合并后的成绩记录文件3\n"); printf("*********************************************************\n"); gradelistfile3=fileread("3.txt"); FilePrint(file3); printf("*********************************************************\n"); printf("第二步,抽取补考成绩记录\n"); extract(); system("PAUSE"); printf("现有补考成绩记录文件4\n"); printf("*********************************
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 学生 成绩管理系统
![提示](https://static.bdocx.com/images/bang_tan.gif)