数据结构课程设计C语言.docx
- 文档编号:20830850
- 上传时间:2023-04-25
- 格式:DOCX
- 页数:32
- 大小:101.12KB
数据结构课程设计C语言.docx
《数据结构课程设计C语言.docx》由会员分享,可在线阅读,更多相关《数据结构课程设计C语言.docx(32页珍藏版)》请在冰豆网上搜索。
数据结构课程设计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个文件:
中的内容:
SnoSnameSsexSageSdept
中的内容:
CnoCnameCcredit
1英语4
2数学2
3信息系统4
4操作系统3
5数据结构4
6数据处理2
7C/C++4
中的内容:
SnoCnoGrade
3、开发环境
VisualC++不仅仅是是一个C++编译器,而是一个基于Windows操作系统的可视化集成开发环境IDE,这种环境开发出来的软件稳定性好、可移植性强,可以编制各种各样的Windows应用程序。
三、详细设计
1、系统流程图
2、界面设计
主界面:
在此界面用户可以选择要操作的选项,回车之后即可进入相关的页面进行操作(例如:
选择1,即可显示本学期考核的7门科目信息)
在本界面里用户可以输入学生相关的信息数据,按照提示进行操作即可,例如
所有操作均有提示语,比较人性化的管理,易懂,简单。
3、大概设计模块
(1)先编入系统所需的库函数,从而使程序可运行。
#include<>
#include<>
#include<>
#include<>0”no,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;i
for(p2=p1->next,j=i+1;j
{
if(p1->Snum
{
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,分别指向文件与文件。
此时会有提示语"请确认是否将数据存储进文件:
1.是2.否:
",选择‘1’,将信息存入。
*****以上就是本程序的详细设计及基本思想*****
4、所遇到的问题和分析解决
1、存在的不足
本学生成绩管理系统由九大模块组成,每个模块相互联系又相互独立。
这个学生成绩管理系统存在着很多不足之处,由于自己本身编程能力的问题,这个系统可以实现的功能非常有限。
只能实现学生管理系统最基本的功能,可以进行简单的输入、输出学生资料,查询和修改学生信息,能直接从文件中读入数据,能对系统所作的修改、操作进行保存等。
而且在每个模块也有不足的地方,比如在输入学生资料时,对有些信息项没有严格的规定,可以输入任何的字符。
这有待以后努力,更详尽的实现模块的功能。
2、do-while语句的位置问题
在修改学生记录此模块中,若循环语句的位置不对那么这个循环就会自动跳出,或变为乱码,不能实现原有的功能。
所以要想清楚到底是在哪安放,按照逻辑思路找到相应的语句正确添加就行了。
3、细节方面
其实在有些细节方面还是要特别注意啊,比如分号的添加,<<与>>的方向问题,函数的返回值等问题,虽然容易改掉,但是很容易养成不好的习惯,而且还会浪费时间,所以在一开始写的时候就要很仔细,这样才能保证程序编的精细,同时若出现很多这样的错误的话,在编写程序的时候也会心里烦的,所以在编程的时候要认真仔细。
4、文件的写入与读出
刚开始时对文件的操作不是很明白,一直不能很好的操作文件,直到最后快要验收的时候,仍旧出现了严重的问题,就是对已经存在的文件读取问题,通过"读取文件并输出学生信息",将数据从文件中读取,但是不能够正常的读出,最后把读文件的操作语句进行仔细检查后,发现语句的顺序有点问题,把fscanf()语句进行再修改后就能够正常的读取文件了。
5、内存的分配问题
对于初学者的话对内存的分配和释放问题是比较抽象的和模糊的问题,在排序是之前就出现了交换数据困难的问题,以及内存分配空间繁琐释放空间不及时的问题,造成空间的浪费,使得程序运行时效率较低,因此最后采用了顺序存储记录的方式,这就能改变前面所出现的问题。
6、较小的问题方面
其余的就没什么比较大的问题了,基本上只要细心一点的话就可以正确调试了。
5、系统特色及关键技术
其实在本程序的设计过程当中,没有很吸引人的关键技术,因为本人的C语言或C++语言都不是学的很好,所以当初设计的时候就只是想把功能都实现就好了,尽可能的把所要求的功能都编进程序,这样就觉得很满足了。
所以都是设计的比较简单易懂的语言,这样自己能够更明白一些,所以就没有时间去细细地去设计自己的程序。
本程序要说有什么值得说的,那就只有人性化这点了,在设计成学的时候,因为自己怕弄混了,所以添加了很详尽的提示,这样在编程的过程中或调试的时候都能够比较快的运行。
还有就是尽可能的应用了do-while语句和switch-case语句,这两个语句在之前不是很常用,所以在这个程序中试炼了一下,虽然在编写的过程中总是出错,但还是成功的用好了,也是程序有条理一些。
我也知道这些东西别人可能比我弄得还要好,但是我在我所学的知识中成功的应用了这些,我觉得就是好事,就是进步。
唯一的亮点可能就是进入系统是的密码设计了,就这一点小小的设计就花了我好几个小时去调试,因为总能在后面程序的加入及运行时发现一些新的小问题。
6、结论及心得体会
一周多的课程设计,终于成功的验收了,虽然有些疲惫,但还是有很多的收获的,像计算机组成原理的课设一样,我又一次巩固了所学到的知识,之前的学习只是停留在理论基础上,现在自己动手操作试验后,才是真正的理解及体会。
C也学了近一年,有很多知识都是似懂非懂,通过平时上机操作,自己也了解了一些,但让我有了更深的理解和更好的认识,则是在这次的课设上,之前的困惑也通过这次的课设解决了一些,虽然还是不能够全面的理解,但是有进步就很高兴。
在课程设计之前,因为有了综合实验的经验与教训,明白了写代码这一步是非常重要的,因为当你把代码输进去之后,并编译让其运行,发现通过不了,再来检查出问题,是很费费力的事情,因此分析和规划代码是很重要的,最重要的是要把逻辑结构写好,这样就不会出现大问题,写代码就要先找出核心的内容,用多种方法来实现核心部分,这样可以尽可能的避免发现逻辑或编译不支持的错误。
通过本次论文设计,我初步学会了论文设计的基本方法,学会了怎样去借鉴别人的方法和经验,知道了如何整合资料和处理这些资料的能力,这位以后做毕设的论文打下了基础,使我感觉比较好的是有一种成功的喜悦,虽然在编译的时候会经常因为一些小的错误而心烦意乱,但是也不失为一件好事,失败的越多积累的经验越丰富,对人的考验也比较多,那么在最后编译成功时的喜悦就越浓烈,也是自己的能力有了进一步的提高。
由于知识和经验的不足,这个程序编写的不是很尽如人意,但是融合了自己的心血,就觉得是最好的,所以在以后还是需要较多的努力的,还是会在以后的学习过程中不断地提高和改进的。
7、附录(源代码)
#include<>
#include<>
#include<>
#include<>
staticintcount=0;
staticintscnum=0;
#defineN10
#defineSIZE1000
structstudent
{
longSnum;
charSname[20];
charSsex[10];
intSage;
charSdept[10];
structstudent*next;
};
structCourse
{
intCno;
charCname[20];
intCredit;
};
structCourseCo[7]={{1,"英语",4},{2,"数学",2},{3,"信息系统",4},{4,"操作系统",3},{5,"数据结构",4},{6,"数据处理",2},{7,"c/c++",4}};
structStuCourse
{
longSno;
intSCno;
doubleGrade;
};
voidmenu()
{
printf("\n学生成绩统计与分析系统\n\n");
printf("\n菜单\n\n");
printf("\n1.显示本学期考核的7门科目信息以供学生选课\n");
printf("\n2.输入学生基本信息并显示\n");
printf("\n3.输入学生的选课信息\n");
printf("\n4.查找某学生的信息及选修科目的信息\n");
printf("\n5.修改某学生的信息\n");
printf("\n6.增加一个学生的记录\n");
printf("\n7.删除某个学生的记录\n");
printf("\n8.按学号降序排序,依次输出\n");
printf("\n9.将学生的信息存储入文件\n");
printf("\n0.退出已录入%d名学生的记录\n\n",count);
}
no,Co[i].Cname,Co[i].Credit);
}
fclose(fp);
}
StuCourseSCno=b;break;
}
else
{printf("无法找到!
请确认是否已输入该学生的信息。
\n");}
}
printf("输入选修的科目编号(1-7):
\n");
scanf("%d",&c);
while
(1)
{
if(c>=1&&c<=7)
{SC[i].SCno=c;break;}
else
{printf("请重新选择选修科目!
\n输入你选修的科目的编号(1-7):
\n");scanf("%d",&c);}
}
printf("输入该选修科目的成绩:
\n");
scanf("%lf",&SC[i].Grade);
}
printf("选修科目信息如下:
\n");
printf("SnoCnoGrade\n");
for(i=0;i { printf("%-10ld%7d%\n",SC[i].Sno,SC[i].SCno,SC[i].Grade); } } StuCourseSC号查找2.姓名查找(输入1或2): \n"); scanf("%d",&a); while (1) { if(a==1) { printf("请输入该学生的学号: \n"); scanf("%ld",&x); if(p->Snum==NULL) {printf("系统中没有任何学生信息,请先选择存储! \n");break;} while(x! =p->Snum&&p->next! =NULL) { p=p->next; } if(x==p->Snum) { printf("学号姓名性别年龄所属院系\n"); printf("%ld%10s%8s%8d%10s\n",p->Snum,p->Sname,p->Ssex,p->Sage,p->Sdept); } else printf("无法找到! 请确认是否已输入该学生的信息。 \n"); break; } elseif(a==2) { printf("请输入该学生的姓名: \n"); scanf("%s",c); if(p->Snum==NULL) {printf("系统中没有任何学生信息,请先选择存储! \n");menu();} while((strcmp(c,p->Sname)! =0)&&p->next! =NULL)
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 数据结构 课程设计 语言