数据结构课程报告.docx
《数据结构课程报告.docx》由会员分享,可在线阅读,更多相关《数据结构课程报告.docx(31页珍藏版)》请在冰豆网上搜索。
数据结构课程报告
数据结构
课程设计报告
设计题目:
学生成绩管理系统
专业:
计算机科学与技术
班级:
2013级
*******
*******
2014年12月12日
指导教师评语
指导教师:
年月日
成绩评定
学号
姓名
任务分工
成绩
1.设计内容
1.1问题描述
本系统用于学生成绩管理,能够实现对学生相关数据文件的合并;并能够查找出需要补考的学生;实现对合并后的数据按总分进行降序排序,系统采用的排序方式有快速排序和选择排序;并能够通过输入学生名字查找到本学生的相关信息,采用的排序方法有直接从文件中读取一个数据后进行比较查找,然后再读取一个数据,依次进行方法,另外还有利用在排序过程中存入内存中的数据进行查找。
系统采用结构体数组来存储从文件中读入的信息,进行相关的处理后再通过读写入文件的方式把结构体中的数据写入相应的文件。
关键词:
结构体数组,快速排序,选择排序
1.2设计要求
(1)输入数据到TXT文件里,可以在程序中直接利用并查询数据。
(2)在程序中输入并查询相应数据。
1.3开发环境
本程序开发环境为DEV C++。
1.4研究思路
本次课程设计的意义在于加深对于数据结构的了解,加强对于数据结构的应用。
本系统实现了学生成绩管理系统所需的相关功能,其中的功能主要分为五项:
1)实现对两个文件数据进行合并,生成新文件3.txt
2)抽取出三科成绩中有补考的学生并保存在一个新文件4.txt
3)对合并后的文件3.txt中的数据按总分降序排序
4)输入一个学生姓名后,能查找到此学生的信息并输出结果
5)退出系统
系统在windows7环境下,DEV C++编译器条件下采用c++语言实现。
在存储方面,系统主要的特色是采用结构体数组进行存储。
排序方面,系统采用了快速排序,选择排序。
查找方面,系统采用边读文件边查找的方法,同时还提供了直接从在排序过程中已存入结构体中的学生数据中进行查找。
系统使用了灰色背景,绿色字休,采用一个统一的主程序菜单,供用户选择所需要使用的功能,同时在每一项功能的具体执行中,提供了相关的操作提示信息,引导用户进行操作,使本系统具有了良好的用户交流界面。
2.设计步骤
2.1需求分析
学生成绩管理系统对于学生众多,管理起来麻烦的各个高校有着重大意义。
学生成绩管理系统,可以将学生成绩系统的整合到一起,是查询学生成绩的快捷手段,同时,该系统也可以将不合格学生分类开来,方便统计。
2.2概要设计
本系统要求实现具体的五项功能,根据提供的这五项功能,运行时系统提供了相应的功能菜单,选择不同的选项来实现相应的功能。
对于第一项功能,采用了读文件和写文件的方式,边读边写,合并两个文件成为一个文件。
第二项功能,采用结构体数组存入从文件中读入的数据,再通过对于数据中的相关成绩判断该学生是否需要补考,如果需要补考则将其信息写入另外一个文件。
第三项功能采用快速排序和选择排序的方法按总分对学生数据进行排序。
第四项功能采用了二种查找的方法。
第五项功能通过调用函数exit(0)退出程序。
2.3详细设计
针对每一项功能,有着相应的实现方法:
(1)第一项功能,实现对两个文件数据进行合并,生成新文件3.txt。
调用函数Unitedfile()来实现,函数以读的方式打开1.txt文件,以写的方式打开3.txt文件,从1.txt读入一个数据并写入3.txt文件,直到遇到1.txt文件结束。
关闭1.txt文件,再以读的方式打开2.txt文件,用上述方式直到遇到2.txt文件结束。
关闭2.txt,3.txt文件。
实现对于文件的合并。
voidUnitedfile()//合并1.txt和2.txt为3.txt
{
FILE*fp,*p;
Studentstudd;
fp=fopen("1.txt","r");//以读的方式打开1.txt
p=fopen("3.txt","w");//以写的方式打开3.txt
while(fscanf(fp,"%s%s%d%d%d",studd.name,studd.id,&studd.chinese,&studd.math,&studd.english)!
=EOF)
{
fprintf(p,"%-6s%-6s%-6d%-6d%-6d\n",studd.name,studd.id,studd.chinese,studd.math,studd.english);
}//读取1.txt的数据进入结构体中,写入3.txt,继续读取直结束
fclose(fp);//关闭文件1.txt
fp=fopen("2.txt","r");//以写的方式打开2.txt
while(fscanf(fp,"%s%s%d%d%d",studd.name,studd.id,&studd.chinese,&studd.math,&studd.english)!
=EOF)
{
fprintf(p,"%-6s%-6s%-6d%-6d%-6d\n",studd.name,studd.id,studd.chinese,studd.math,studd.english);
}
fclose(fp);
fclose(p);
}
(2)第二项功能,抽取出三科成绩中有补考的学生并保存在一个新文件4.txt。
调用函数findout()来实现。
函数以读的方式打开3.txt文件,以写的方式打开4.txt文件。
读入3.txt文件的一个数据到结构体studd中,判断学生信息中语、数和英语中是否具有不及格的,如果有,则将数据写入4.txt中,直至遇到3.txt文件结束。
voidfindout()//抽取出三科成绩中有补考的学生并保存在一个新文件4.txt
{
FILE*fp,*p;
Studentstudd;
fp=fopen("3.txt","r");
p=fopen("4.txt","w");
//从3.txt中读入学生数据进结构体,判断是否有不及格的课程,如果有,则写入文件4.txt中
while(fscanf(fp,"%s%s%d%d%d",studd.name,studd.id,&studd.chinese,&studd.math,&studd.english)!
=EOF)
{
if(studd.chinese<60||studd.english<60||studd.math<60)
{
fprintf(p,"%-6s%-6s%-6d%-6d%-6d\n",studd.name,studd.id,studd.chinese,studd.math,studd.english);
}
}
fclose(fp);
fclose(p);
}
(3)第三项功能,对合并后的文件3.txt中的数据按总分降序排序。
调用函数sortfile()来实现。
函数提供了两种排序方法,通过调用函数kuaisu()来实现快速排序,通过调用函数xuanze()来实现选择排序。
voidsortfile()//提供两种排序方法
{
charc;
cout<<"请选择排序方法:
"<cout<<"1.选择排序"<cout<<"2.快速排序"<cin>>c;
switch(c)
{
case'1':
xuanze();//选择排序
break;
case'2':
kuaisu();//快速排序
break;
}
}
选择排序
voidxuanze()//对合并后的文件3.txt中的数据按总分降序排序
{
intj,k,max1,sum1,sum2,q;
i=0;
Studenttemp;
FILE*fp;
fp=fopen("3.txt","r");
i=0;
while(fscanf(fp,"%s%s%d%d%d",stud[i].name,stud[i].id,&stud[i].chinese,&stud[i].math,&stud[i].english)!
=EOF)
{
i++;
}//从3.txt中读入数据进结构体数组stud中
fclose(fp);
for(j=0;j{
max1=j;
sum1=stud[j].math+stud[j].english+stud[j].chinese;
for(k=j+1;k
{
sum2=stud[k].math+stud[k].english+stud[k].chinese;
if(sum1{
max1=k;
sum1=sum2;
}
}
if(max1!
=j)
{
temp=stud[max1];
stud[max1]=stud[j];
stud[j]=temp;
}
stud[j].sum=sum1;
}
fp=fopen("3.txt","w");//将排序后的数据写入3.txt中
for(q=0;q
{
fprintf(fp,"%-8s%-8s%-8d%-8d%-8d%-8d\n",stud[q].name,stud[q].id,stud[q].chinese,stud[q].math,stud[q].english,stud[q].sum);
}
fclose(fp);
}
快速排序
intPartition(intlow,inthigh)
{
intpivotkey;
Studenttemp;
temp=stud[low];
pivotkey=stud[low].sum;
while(low{
while(lowstud[low]=stud[high];
while(low=pivotkey)++low;
stud[high]=stud[low];
}
stud[low]=temp;
returnlow;
}
voidQSort(intlow,inthigh)//快速排序
{
intprivotloc;
if(low{
privotloc=Partition(low,high);
QSort(low,privotloc-1);
QSort(privotloc+1,high);
}
}
voidkuaisu()//读取文件,快速排序,将结果写入3.txt
{
inti,low,high;
FILE*fp;
fp=fopen("3.txt","r");
i=0;
while(fscanf(fp,"%s%s%d%d%d",stud[i].name,stud[i].id,&stud[i].chinese,&stud[i].math,&stud[i].english)!
=EOF)
{
stud[i].sum=stud[i].english+stud[i].chinese+stud[i].math;
i++;
}//从文件3.txt中读入数据进结构体数组stud中
fclose(fp);
low=0;
high=i-1;
QSort(low,high);//快速排序
fp=fopen("3.txt","w");//将排序后的数据写入3.txt中
for(intj=0;j
{
fprintf(fp,"%-8s%-8s%-8d%-8d%-8d%-8d\n",stud[j].name,stud[j].id,stud[j].chinese,stud[j].math,stud[j].english,stud[j].sum);
}
fclose(fp);
}
(4)第四项功能,输入一个学生姓名后,能查找到此学生的信息并输出结果。
调用函数findoutstudent()来实现。
函数也提供了两种查找方法,通过调用函数derectfindoutstudent()实现从文件从3.txt中逐个读入数据,再进行查找判断,如果找到所需要的数据,则查找结束,否则继续查找直至文件结束。
autofindoutstudent()在进行第三步的过程中,已经把3.txt中的学生数据读入了结构体数组当中,调用函数autofindoutstudent()直接从结构体中进行查找。
voidderectfindoutstudent()//输入一个学生姓名,查找到此学生的信息并输出结果
{
charNAME[30];
intflag=0;
FILE*fp;
fp=fopen("3.txt","r");
cin>>NAME;
while(fscanf(fp,"%s%s%d%d%d%d",stud[1].name,stud[1].id,&stud[1].chinese,&stud[1].math,&stud[1].english,&stud[1].sum)!
=EOF)
{
if(strcmp(stud[1].name,NAME)==0)
{
flag=1;
cout<<"-------姓名-------学号-------语文-------数学-------英语-------总分--------"<cout<<""<cout<break;
}
}
if(flag==0)
cout<<"无此学生相关信息"<fclose(fp);
}
voidautofindoutstudent()//从结构体数组中查找
{
intn,flag=0,k;
charName[30];
n=i-1;
cin>>Name;
for(k=1;k<=n;k++)
{
if(strcmp(stud[k].name,Name)==0)
{
flag=1;
cout<<"-------姓名-------学号-------语文-------数学-------英语-------总分--------"<cout<<""<cout<break;
}
}
if(flag==0)
cout<<"无此学生相关信息"<}
voidfindoutstudent()//提供两种查找方法
{
charc;
cout<<"请选择查找方法"<cout<<"1.从文件3中直接查找"<cout<<"2.在运行第三步的基础上查找"<cin>>c;
cout<<"请输入学生姓名:
";
if(sign1==0&&c=='2')
{
cout<<"请执行操作3后再执行此项操作!
"<return;
}
switch(c)
{
case'1':
derectfindoutstudent();//从文件3中直接查找
break;
case'2':
autofindoutstudent();//从结构体数据中直接查找
break;
}
}
(5)第五项功能,通过调用函数exit()退出。
系统函数调用关系示意图:
2.4调试分析
(1)intmain()
{system("color8A");
intchoice;
在主程序中使用system("color8A"),可以改变运行出的背景颜色与字体颜色,其中数字“8”为改变背景颜色变量,可在0-9之间变换;“A”位字体颜色变量,可在A-F之间变换。
(2)voidderectfindoutstudent()//输入一个学生姓名,查找到此学生的信息并输出结果
{
charNAME[30];
intflag=0;
FILE*fp;
fp=fopen("31.txt","r");
cin>>NAME;
while(fscanf(fp,"%s%s%d%d%d%d",stud[1].name,stud[1].id,&stud[1].chinese,&stud[1].math,&stud[1].english,&stud[1].sum)!
=EOF)
{
if(strcmp(stud[1].name,NAME)==0)
{
flag=1;
cout<<"-------姓名-------学号-------语文-------数学-------英语-------总分--------"<cout<<""<cout<break;
}
}
if(flag==0)
cout<<"无此学生相关信息"<fclose(fp);
}
调试中发现因31.txt不存在产生错误,应将31.txt改为3.txt。
2.5测试结果
未录入数据:
录入数据查询(李华明):
3.设计成果展示
3.1用户手册
1.运行环境:
WindowsXp/Windows7等。
2.执行文件:
学生成绩管理系统.exe。
3.用户界面:
用户界面简单易懂,流程介绍清晰,按照流程操作即可完成管理系统的建立。
4.简要说明:
本系统是一个学生成绩管理系统,实现了文件的合并,补考学生的提取,学生信息的排序,信息的查找的功能。
其中学生的信息包含有姓名、学号、中文、数学、英语和部分。
本系统菜单如下:
1)实现对两个文件数据进行合并,生成新文件3.txt
2)抽取出三科成绩中有补考的学生并保存在一个新文件4.txt
3)对合并后的文件3.txt中的数据按总分降序排序
4)输入一个学生姓名后,能查找到此学生的信息并输出结果
5)退出系统
系统在进行相关的选项操作的时候,有相关的递进关系,其中在执行第3项操作的时候,需先执行第一项操作对文件进行合并生成第三项操作所需要的3.txt文件。
在执行第二项操作的时候应同样应先执行第一项操作。
在执行第四项操作中的autofindoutstudent()函数的时候,应先执行第三项操作。
3.2程序运行部分截图:
4.总结心得与体会
通过本次学生成绩管理系统的制作,我更深刻理解了结构体数组,快速排序和选择排序的使用,使我将课上学到的知识能够通过实践来融会贯通,获益匪浅。
通过本次课程设计,我进一步熟悉了数据结构课程设计的基本设计思想,加深了对于数据结构的认识。
本系统为学生成绩管理系统,能够用于基本的学生成绩管理。
具体功能如下:
1)实现对两个文件数据进行合并,生成新文件3.txt
2)抽取出三科成绩中有补考的学生并保存在一个新文件4.txt
3)对合并后的文件3.txt中的数据按总分降序排序
4)输入一个学生姓名后,能查找到此学生的信息并输出结果
5)退出系统
本系统为最基础的查询成绩管理系统,画面简单,操作也简单,只需在txt文件中录入需要的信息就可以在系统中使用查询、排序的功能。
程序仍有很大的改进空间,需要我继续努力去完善改进,使其变得更加完美,功能更加完善。
附录(完整程序源代码):
#include
usingnamespacestd;
#defineSIZE100
//存放学生数据的结构体
typedefstruct
{
charname[8];
charid[2];
intchinese;
intmath;
intenglish;
intsum;
}Student;
Studentstud[SIZE];
inti;
intsign=0,sign1=0,sign2=0,sign3=0;
voidUnitedfile()//合并1.txt和2.txt为3.txt
{
FILE*fp,*p;
Studentstudd;
fp=fopen("1.txt","r");//以读的方式打开1.txt
p=fopen("3.txt","w");//以写的方式打开3.txt
while(fscanf(fp,"%s%s%d%d%d",studd.name,studd.id,&studd.chinese,&studd.math,&studd.english)!
=EOF)
{
fprintf(p,"%-6s%-6s%-6d%-6d%-6d\n",studd.name,studd.id,studd.chinese,studd.math,studd.english);
}//读取1.txt的数据进入结构体中,写入3.txt,继续读取直结束
fclose(fp);//关闭文件1.txt
fp=fopen("2.txt","r");//以写的方式打开2.txt
while(fscanf(fp,"%s%s%d%d%d",studd.name,studd.id,&studd.chinese,&studd.math,&studd.english)!
=EOF)
{
fprintf(p,"%-6s%-6s%-6d%-6d%-6d\n",studd.name,studd.id,studd.chinese,studd.math,studd.english);
}
fclose(fp);
fclose(p);
}
voidfindout()//抽取出三科成绩中有补考的学生并保存在一个新文件4.txt
{
FILE*fp,*p;
Studentstudd;
fp=fopen("3.txt","r");
p=fopen("4.txt","w");
while(fscanf(fp,"%s%s%d%d%d",stud