数据结构课程设计C语言.docx
《数据结构课程设计C语言.docx》由会员分享,可在线阅读,更多相关《数据结构课程设计C语言.docx(53页珍藏版)》请在冰豆网上搜索。
数据结构课程设计C语言
计算机科学与技术学院课程设计成绩单
课程名称:
数据结构课程设计
姓名
xxx
性别
x
学号
xxx
班级
xxx班
综合成绩
成绩等级
程序运行情况
(占总成绩20%)
□能正确运行□基本能正确运行□能运行但结果不完善
(20分)(15分)(10分)
程序功能的完善程度
(占总成绩10%)
□完善□基本完善□不完善
(10分)(8分)(5分)
程序结构的合理性
(占总成绩10%)
□合理□基本合理□不太合理
(10分)(8分)(5分)
对问题的答辩情况
(占总成绩40%)
□概念正确有创新□能正确回答所有问题□基本能正确回答
(40分)(35分)(30分)
□部分问题回答概念不清晰
(20分)
学生的工作态度与独立工作能力
(占总成绩10%)
□工作态度认真能独立完成任务□工作态度认真但独立性较差
(10分)(8分)
□工作态度基本认真但缺乏独立性
(5分)
设计报告的规范性
(占总成绩10%)
□符合规范□基本符合规范□规范性较差
(10分)(8分)(5分)
优秀:
90分~100分良好:
80分~89分中等:
70~79分及格:
60~69分不及格0分~59分
武汉科技大学计算机科学与技术学院制表
引言------------------------------------------------------------3
一、问题描述------------------------------------------------
二、需求分析------------------------------------------------
三、详细设计------------------------------------------------
四、所遇到的问题和分析解决---------------------------
五、系统特色及关键技术---------------------------------
六、结论及心得体会---------------------------------------
七、附录(源代码)---------------------------------------
引言
通过本课程设计,使自己更加系统地理解和掌握数据结构的基本概念;能自如地根据实际要求,设计相应的数据结构,并运用C或C++语言实现所设计的算法,编写较大型的程序,分析和解决实际应用问题,进一步加深、巩固所学专业课程的基本理论知识,理论联系实际,进一步培养自己综合分析问题和解决问题的能力。
掌握C语言或C++语言独立的编写、调试应用程序和进行其它相关设计的技能。
此项目主要是考察我们对结构体、数组、文件等具体操作,以及对C语言语法的掌握,所以做成此项目要求比较高的设计要求,对整体有很熟悉的概括,同时调试过程也是很重要的,对程序界面的要求也比较高,要设计的合理同时也要美观一点,能够人性化的描述清楚你的各个功能,一目了然,对其他用户使用本程序简单易懂,这才能成本程序或本系统是成功的。
对于学生成绩管理系统,此项目每年都有学生去做,但是能够在其他项目中脱颖而出,还要有自己的设计特色,用简单的语言详细描述系统的功能,这才是关键。
这个设计能够练习我们的理解和运用结构化程序设计的思想和方法,掌握开发一个小型实用系统的基本方法,学会调试一个比较长的程序的基本方法,同时掌握书写程序设计开发文档的能力。
一﹑问题描述
1、课程设计应完成的工作
(1)编写算法
(2)算法测试,并有具体的测试结果和结果分析
(3)撰写课程报告,内容包括:
①封面
②目录
③课程设计报告正文
④使用说明
⑤参考文献
2、总体设计工作(包含几大功能模块)
1.显示本学期考核的7门科目信息以供学生选课;
2.输入学生基本信息并显示;
3.输入学生的选课信息;
4.查找某学生的信息及选修科目的信息;
5.修改某学生的信息;
6.增加一个学生的记录;
7.删除某个学生的记录;
8.按学号降序排序,依次输出;
9.将学生的信息存储入文件。
二、需求分析
1、系统描述
该系统实现对若干个大学生的学习成绩进行管理。
至少包括以下信息:
结构体:
学生,选修科目,选修信息
学生:
学号,姓名,性别,年龄,所属院系
选修科目:
科目编号,科目名称,科目学分
选修信息:
选修该科目者学号,科目编号,科目成绩
2、功能要求
1.使用中文菜单,界面设计和用户输入输出要人性化些;
2.将学生信息保存在文本文档中,具体对学生信息进行插入删除查询操作时,将保存在文本文档中的学生信息提取出来,保存在自己定义的数据结构中,然后再对该数据结构进行操作,所有操作完成,或者在相应的命令后,再将学生信息保存到文本文档中;
3.具有数据输入功能,输入的数据能最终保存在文件中;
4.具有数据删除功能,能最终从文件中删除;
5.排序功能,根据自己设计的数据结构,设计排序算法;
6.具有多种查询(如按学号查询、按姓名查询、按成绩查询等)及输出功能;
7.学生信息的修改(比如修改学生姓名,修改学生某门课程的成绩)。
考查点:
●插入时注意学号的处理,可以不填吗,是否重复,其他数据是否可以乱填,如何控制;
●删除时一要防止误操作,二要考虑该生的选课信息,如何处理;
●修改时同样要考虑各数据项的性质;
●对选修表进行插入、删除、修改操作;
●查询要求可以实现多条件查询。
有3个文件:
Student.txt中的内容:
SnoSnameSsexSageSdept
20120001李勇男20CS
20120002刘晨女19CS
20120003王敏女18MA
20120005张立男19IS
Course.txt中的内容:
CnoCnameCcredit
1英语4
2数学2
3信息系统4
4操作系统3
5数据结构4
6数据处理2
7C/C++4
SC.txt中的内容:
SnoCnoGrade
20120001190
20120001280
20120001485
20120002186
20120003382
20120003588
20120005790
3、开发环境
VisualC++不仅仅是是一个C++编译器,而是一个基于Windows操作系统的可视化集成开发环境IDE,这种环境开发出来的软件稳定性好、可移植性强,可以编制各种各样的Windows应用程序。
三、详细设计
开始
1、系统流程图
主界面
输入学生信息
显示信息科目
修改学生信息
删除学生信息
增加学生信息
信息存入文件
退出本系统
输入选修信息
查找学生信息
结束
2、界面设计
主界面:
在此界面用户可以选择要操作的选项,回车之后即可进入相关的页面进行操作(例如:
选择1,即可显示本学期考核的7门科目信息)
在本界面里用户可以输入学生相关的信息数据,按照提示进行操作即可,例如
所有操作均有提示语,比较人性化的管理,易懂,简单。
3、大概设计模块
(1)先编入系统所需的库函数,从而使程序可运行。
#include
#include
#include
#include//文件和标准控制台的输入输出
(2)Main()函数的设计
在main()函数中主要运用do-while循环语句和switch()-case选择判断语句来调用相关
功能模块。
系统的运行是在一个永真的循环里进行的,只有在主界面并选择“退出”时,才会跳出永真循环,并退出程序。
(3)主界面的设计
在主界面中包括“①显示本学期考核的7门科目信息以供学生选科目②输入学生基本信息并显示③输入学生的选课信息④查找某学生的信息及选修科目的信息⑤修改某学生的信息⑥增加一个学生的记录⑦删除某学生的记录⑧按数据结构降序(冒泡)排序⑨将学
生的信息存储入文件⑩退出”等全部的功能,之所以设计这麽一个主界面,一是因为能使用户对程序操作的流程更加清晰简明,二是保证了用户同时只能对一个文件进行操作系统的要求,保证了系统不会打开文件紊乱或者出现致命的错误。
每个函数体如下:
Intmain();//主函数
voidsave();//选修课程文件存储
voidload();//选修课程文件输出
voidinput(structstudent**headp);//学生信息的输入
voidxuxiuinput(structstudent**headp,structStuCourseSC[]);//选修信息的输入
voidfind(structstudent**headp,structStuCourseSC[]);//查找学生的信息及选修信息
intmodify(structstudent**headp,structStuCourseSC[]);//修改学生信息及选修信息
voidinsert(structstudent**headp,structStuCourseSC[]);//增加一个学生的信息
voidshanchu(structstudent**headp,structStuCourseSC[]);//删除一个学生的信息
voidsort(structstudent**headp);//学生信息按学号大小排序
voidfilesave(structstudent**headp,structStuCourseSC[]);//学生信息及选修信息录入文件
voidfileload(structstudent**headp,structStuCourseSC[]);//文件信息输出
4、详细设计思想
(1)确定语言算法
由于之前都没有做过类似的设计,所以一时间不能够确定到底使用何种语言来设计本系统,所以在网上看了一些其他人设计的程序,链表的、数组的,C++的,各种各样的,也不知如何选择,但是仔细地看了其中的设计思想,最终还是用C和链表的来做,一是觉得本人对指针数组掌握的不是很熟练,那么在设计过程中容易产生不能理解的错误,耽误时间,二是想运用C,可以巩固一下所学的数据结构的知识,之前做实验的时候一直用C++来做,都没怎么用所学的知识,这时候想练练。
就这样确定了整体的结构算法。
(2)确定程序主要功能模块
这个就比较简单了,主要是根据系统设计的说明及要求来设计,从而设计了十大功能模块,有文件操作,有系统维护功能,排序和统计功能,有输入输出等基本功能,比较人性化,添加了较多的提示语。
这个程序的主要功能时输入学生的学号,姓名,学期和三科成绩来对其进行存储,在存储后可以对学生的成绩按学号及学期或姓名及学期来进行查询,同时输出此同学的平均分及总分,之后可以对某个同学的成绩进行各种操作,例如修改,删除等,同时还可以对学生们的成绩按照总分或单科成绩排序,在整个过程中所做的操作都会保存到"student.txt"文件中并显示。
(3)系统结构体的设计
学生
所属院系
年龄
学
号
性别
姓名
structstudent//结构体
{
longSnum;//学号
charSname[20];//姓名
charSsex[10];//性别
intSage;//年龄
charSdept[10];//所属院系
structstudent*next;//指针
};
科目
学分
名称
编号
structCourse//结构体
{
intCno;//选修科目编号
charCname[20];//信息科目名称
intCredit;//信息科目学分
};
选修
成绩
编号
学号
structStuCourse//结构体
{
longSno;//选修者学号
intSCno;//选修科目编号
doubleGrade;//选修科目成绩
};
(4)各功能模块的设计
******主函数模块
用函数intmain()来实现
主要是来显示主菜单,使用户选择操作。
首先定义一个指针数组(全局使用)StuCourseSC[SIZE](SIZE=1000),;在此处SIZE是指数组大小,之前有定义的,在这里应用了do-while和switch-case语句来进行选择,是个比较简单实现的模块。
最后若选择“0”则是退出永真循环。
******选修课程的文件输入(出)模块
用函数voidsave();与voidload();来实现
主要用来将已定义的结构体数组Course存储入文件Course.txt,以及将其中数据从文件Course.txt中输入。
voidsave()//录入文件
{
FILE*fp;
inti;
if((fp=fopen("Course.txt","w"))==NULL)
{
printf("无法打开此文件!
\n");
exit(0);
}
for(i=0;i<7;i++)
{
if(fwrite(&Co[i],sizeof(structCourse),1,fp)!
=1)
printf("无法打开文件Course.txt!
\n");
}
fclose(fp);
}
voidload()//导出文件
{
FILE*fp;
inti;
if((fp=fopen("Course.txt","r"))==NULL)
{
printf("无法打开文件Course.txt!
\n");
exit(0);
}
for(i=0;i<7;i++)
{
fread(&Co[i],sizeof(structCourse),1,fp);
printf("%4d%10s%8d\n",Co[i].Cno,Co[i].Cname,Co[i].Credit);
}
fclose(fp);
}
******输入学生记录模块
用函数voidinput(structstudent**headp);来实现
主要功能用来对学生的信息进行收集和输入。
首先会跳出主菜单,选择”2”,进入输入模块输入所需学生个数的学生信息,比如学号,姓名,性别,年龄及所属院系(以学号为0结束输入新的学生信息)等。
输完之后会自动跳出主菜单,根据主菜单来在此基础上进行操作。
期间会有一些提示语,按此操作即可。
根据if和for语句来判定期间是否有重复学号输入,在本操作中,允许有重复学生姓名出现。
在此模块中,同时也用到了一个控制变量a,它是用来判定的条件变量。
之后返回主菜单。
******输入选修信息模块
用函数voidxuxiuinput(structstudent**headp,structStuCourseSC[])来实现
主要功能用于选修信息的录入。
首先会跳出主菜单,选择“3“,进入输入模块输入所需选修科目的个数,接着输入选修该科目者的学号及科目编号及成绩。
根据for-while语句来控制,期间会有提示语。
在本操作中,不允许学号的重复,科目编号控制在1-7。
******查找学生及选修信息模块
用函数voidfind(structstudent**headp,structStuCourseSC[])实现
主要功能用于学生基本信息的查找以及选修信息的查找。
首先会跳出主菜单,选择”4’,接着选择查找的方式(1.学号查找2.姓名查找),输入学号(姓名),便会显示拥有该学号(姓名)学生的基本信息;对于选修信息也是同样。
该模块运用了for-while语句,对于学号,科目编号等进行控制,避免重复等情况出现。
******修改学生及选修信息模块
用函数intmodify(structstudent**headp,structStuCourseSC[])实现
主要功能是修改学生的基本信息以及选修科目的信息。
首先跳出主菜单,选择‘5’。
输入你想要修改的学生的学号,接着会弹出一个提示语"请输入你想修改的学生信息的标号:
1.学号2.姓名3.性别4.年龄5.所属院系6.选修科目信息:
",选择想要修改的选项,例如‘1’,接着输入新的学号,修改成功。
在本模块中运用了if-else语句及while语句来控制变量,只有正确输入才会弹出循环,正确显示。
******插入学生记录及选修信息模块
用函数voidinsert(structstudent**headp,structStuCourseSC[])实现
主要功能是插入一个新的学生记录,并将该学生的选修信息录入到StuCourse中。
首先弹出主菜单,选择‘6’,输入新增加的学生的学号,接着输入该学生的选修信息,然后再输入学生的姓名,年龄等信息。
在本模块中同样使用while语句以及if-else语句来控制学号等的输入。
******删除学生记录以及选修信息模块
用函数voidshanchu(structstudent**headp,structStuCourseSC[])来实现
主要功能是删除一个学生的记录并删除其中StuCourse中的记录。
首先有个选择的操作,之后会有判断语句,根据所输入的学号,来显示删除前的信息记录,添加for循环语句,循环把后一位的信息提前一位,整体数量减一,来进行全局变量的修改,之后再把修改过后的信息记录保存到文件中去。
在现实中会有由于某些原因而不在学校的同学的记录,这时候就要对其记录进行删除操作,这样可以使系统及时更新并得到优化。
******按数据结构学号(冒泡)降序排序模块
用函数voidsort(structstudent**headp)来实现
主要功能时是用来对学生的记录来按学号大小进行排序。
这样方便对学生有个大致的了解。
本排序使用冒泡排序。
它有两个优点:
一是“编程复杂度”很低,很容易写出代码;二是具有稳定性,这里的稳定性是指原序列中相同两元素的相对顺序仍然保持到排序后的序列。
冒泡排序时进过n-1趟子排序完成的,第i趟子排序从第1个数至第n+1个数,若第i个数比后一个数大(则升序,小则降序。
本程序一律采用降序)则交换两数。
本程序中冒泡排序代码如下:
for(p1=*headp,i=0;inext)
for(p2=p1->next,j=i+1;jnext)
{
if(p1->SnumSnum)
{
num=p2->Snum;
p2->Snum=p1->Snum;
p1->Snum=num;
strcpy(name,p2->Sname);
strcpy(p2->Sname,p1->Sname);
strcpy(p1->Sname,name);
strcpy(sex,p2->Ssex);
strcpy(p2->Ssex,p1->Ssex);
strcpy(p1->Ssex,sex);
age=p2->Sage;
p2->Sage=p1->Sage;
p1->Sage=age;
strcpy(dept,p2->Sdept);
strcpy(p2->Sdept,p1->Sdept);
strcpy(p1->Sdept,dept);
}
}
排序前:
排序后:
******将学生及选修信息存入文件并显示模块
用函数voidfilesave(structstudent**headp,structStuCourseSC[])及voidfileload(structstudent**headp,structStuCourseSC[])实现
主要功能是将之前输入的学生信息及选修科目信息存储入文件并从文件中导出显示。
首先本模块中有2个文件指针FILE*fp1,*fp2,分别指向Student.txt文件与StuCourse.txt文件。
此时会有提示语"请确认是否将数据存储进文件:
1.是2.否:
",选择‘1’,将信息存入。
*****以上就是本程序的详细设计及基本思想*****
4、所遇到的问题和分析解决
1、存在的不足
本学生成绩管理系统由九大模块组成,每个模块相互联系又相互独立。
这个学生成绩管理系统存在着很多不足之处,由于自己本身编程能力的问题,这个系统可以实现的功能非常有限。
只能实现学生管理系统最基本的功能,可以进行简单的输入、输出学生资料,查询和修改学生信息,能直接从文件中读入数据,能对系统所作的修改、操作进行保存等。
而且在每个模块也有不足的地方,比如在输入学生资料时,对有些信息项没有严格的规定,可以输入任何的字符。
这有待以后努力,更详尽的实现模块的功能。
2、do-while语句的位置问题
在修改学生记录此模块中,若循环语句的位置不对那么这个循环就会自动跳出,或变为乱码,不能实现原有的功能。
所以要想清楚到底是在哪安放,按照逻辑思路找到相应的语句正确添加就行了。
3、细节方面
其实在有些细节方面还是要特别注意啊,比如分号的添加,<<与>>的方向问题,函数的返回值等问题,虽然容易改掉,但是很容易养成不好的习惯,而且还会浪费时间,所以在一开始写的时候就要很仔细,这样才能保证程序编的精细,同时若出现很多这样的错误的话,在编写程序的时候也会心里烦的,所以在编程的时候要认真仔细。
4、文件的写入与读出
刚开始时对文件的操作不是很明白,一直不能很好的操作文件,直到最后快要验收的时候,仍旧出现了严重的问题,就是对已经存在的文件读取问题,通过"读取文件并输出学生信息",将数据从文件中读取,但是不能够正常的读出,最后把读文件的操作语句进行仔细检查后,发现语句的顺序有点问题,把fscanf()语句进行再修改后就能够正常的读取文件了。
5、内存的分配问题
对于初学者的话对内存的分配和释放问题是比较抽象的和模糊的问题,在排序是之前就出现了交换数据困难的问题,以及内存分配空间繁琐释放空间不及时的问题,造成空间的浪费,使得程序运行时效率较低,因此最后采用了顺序存储记录的方式,这就能改变前面所出现的问题。
6、较小的问题方面
其余的就没什么比较大的问题了,基本上只要细心一点的话就可以正确调试了。
5、系统特色及关键技术
其实在本程序的设计过程当中,没有很吸引人的关键技术,因为本人的C语言或C++语言都不是学的很好,所以当初设计的