教学计划编制问题 数据结构课程设计报告 湖南工程学院.docx
《教学计划编制问题 数据结构课程设计报告 湖南工程学院.docx》由会员分享,可在线阅读,更多相关《教学计划编制问题 数据结构课程设计报告 湖南工程学院.docx(36页珍藏版)》请在冰点文库上搜索。
![教学计划编制问题 数据结构课程设计报告 湖南工程学院.docx](https://file1.bingdoc.com/fileroot1/2023-7/13/bda7096c-7391-4b82-a172-2575ce6d4a9f/bda7096c-7391-4b82-a172-2575ce6d4a9f1.gif)
教学计划编制问题数据结构课程设计报告湖南工程学院
课程设计报告
课程名称数据结构课程设计
课题名称教学计划编制问题
专业网络工程
班级0901
学号**********XX
姓名
指导教师刘长松陈华光李杰君
2011年7月15日
湖南工程学院
课程设计任务书
课程名称数据结构课程设计
课题教学计划编制问题
专业班级网络工程0901
学生姓名XX
学号**********XX
指导老师刘长松陈华光李杰君
审批
任务书下达日期:
2011年6月26日
任务完成日期:
2011年7月15日
一、设计内容与设计要求
1.设计内容:
1)问题描述
大学的每个专业都要制订教学计划。
假设任何专业都有固定的学习年限,每学年含两学期,每学期的时间长度和学分上限均相等。
每个专业开设的课程都是确定的,而且课程在开设时间的安排必须满足先修关系。
每门课程有哪些先修课程是确定的,可以有任意多门,也可以没有。
每门课恰好占一个学期。
试在这样的前提下设计一个教学计划编制程序。
2)基本要求
a.输入参数包括:
学期总数,一学期的学分上限,每门课的课程号(固定占3位的字母数字串)、学分和直接先修课的课程号。
b.允许用户指定下列两种编排策略之一:
一是使学生在各学期中的学习负担尽量均匀;二是使课程尽可能地集中在前几个学期中。
c.若根据给定的条件问题无解,则报告适当的信息;否则,将教学计划输出到用户指定的文件中。
计划的表格格式自行设计。
3)测试数据
学期总数:
6;
学分上限:
10;
该专业共开设课数:
12
课程号:
从C01到C12;
学分顺序:
2,3,4,3,2,3,4,4,7,5,2,3。
先修关系如下图:
4)实现提示
可设学期总数不超过12,课程总数不超过100。
如果输入的先修课程号不在该专业开设的课程序列中,则作为错误处理。
应建立内部课程号与课程号之间的对应关系。
2.设计要求:
课程设计报告规范
1)需求分析
a.程序的功能。
b.输入输出的要求。
2)概要设计
a.程序由哪些模块组成以及模块之间的层次结构、各模块的调用关系;每个模块的功能。
b.课题涉及的数据结构和数据库结构;即要存储什么数据,这些数据是什么样的结构,它们之间有什么关系等。
3)详细设计
a.采用C语言定义相关的数据类型。
b.写出各模块的类C码算法。
c.画出各函数的调用关系图、主要函数的流程图。
4)调试分析以及设计体会
a.测试数据:
准备典型的测试数据和测试方案,包括正确的输入及输出结果和含有错误的输入及输出结果。
b.程序调试中遇到的问题以及解决问题的方法。
c.课程设计过程经验教训、心得体会。
5)使用说明
用户使用手册:
说明如何使用你编写的程序,详细列出每一步的操作步骤。
6)书写格式
见附带说明。
7)附录
a.参考书目
b.源程序清单(带注释)
考核方式
指导老师负责验收程序的运行结果,并结合学生的工作态度、实际动手能力、创新精神和设计报告等进行综合考评,并按优秀、良好、中等、及格和不及格五个等级给出每位同学的课程设计成绩。
具体考核标准包含以下几个部分:
①平时出勤(占10%)
②系统需求分析、功能设计、数据结构设计及程序总体结构合理与否(占10%)
③程序能否完整、准确地运行,个人能否独立、熟练地调试程序(占40%)
④设计报告(占30%)
注意:
不得抄袭他人的报告(或给他人抄袭),一旦发现,成绩为零分。
⑤独立完成情况(占10%)。
课程验收要求
①运行所设计的系统。
②回答有关问题。
③提交课程设计报告。
④提交电子文档(源程序、设计报告文档)。
⑤依内容的创新程度,完善程序情况及对程序讲解情况打分。
二、进度安排
第19周
星期一
星期二
星期三
星期四
星期五
上午
8:
00~12:
00
√
下午
13:
30~17:
30
√
√
√
晚上
18:
00~20:
00
√
第20周
星期一
星期二
星期三
星期四
星期五
上午
8:
00~12:
00
√
下午
13:
30~17:
30
晚上
18:
00~20:
00
附:
课程设计报告装订顺序:
封面、任务书、目录、正文、评分、附件(A4大小的图纸及程序清单)。
正文的格式:
一级标题用3号黑体,二级标题用四号宋体加粗,正文用小四号宋体;行距为22。
正文的内容:
一、课题的主要功能;二、课题的功能模块的划分(要求画出模块图);三、主要功能的实现(至少要有一个主要模块的流程图);四、程序调试;五、总结;六、附件(所有程序的原代码,要求对程序写出必要的注释)。
正文总字数要求在5000字以上(不含程序原代码)。
1、需求分析
1.1程序的功能:
编制教学计划。
大学的每个专业都要制订教学计划。
假设任何专业都有固定的学习年限,每学年含两学期,每学期的时间长度和学分上限均相等。
每个专业开设的课程都是确定的,而且课程在开设时间的安排必须满足先修关系。
每门课程有哪些先修课程是确定的,可以有任意多门,也可以没有。
每门课恰好占一个学期。
1.2输入输出的要求:
a.输入参数包括:
学期总数,一学期的学分上限,每门课的课程号(固定占3位的字母数字串)、学分和直接先修课的课程号。
b.允许用户指定下列两种编排策略之一:
一是使学生在各学期中的学习负担尽量均匀;二是使课程尽可能地集中在前几个学期中。
c.若根据给定的条件问题无解,则报告适当的信息;否则,将教学计划输出到用户指定的文件中。
计划的表格格式自行设计。
2、概要设计
2.1程序模块功能图
图2.1-1功能模块图
2.2数据结构
inttermtime=0;//学期总数
intlimitgrade=0;//学分上线
charstr[100][4];//课程号
intscore[100]={0};//课程学分
inttotalcourse=0;//课程总数
structnode//课程节点
{
intvariable;//标志属不属于同一个学期所修
intprevious;//前修课程
intnext;//后学课程
structnode*courselink[100];//后修课程的指针
}*coursenode[100]={NULL};//课程数目节点
3、详细设计
3.1采用C语言定义相关的数据类型
FILE*fp//保存到文件
inttermtime=0;//学期总数
intlimitgrade=0;//学分上线
charstr[100][4];//课程号
intscore[100]={0};//课程学分
inttotalcourse=0;//课程总数
structnode//课程节点
{
intvariable;//标志属不属于同一个学期所修
intprevious;//前修课程
intnext;//后学课程
structnode*courselink[100];//后修课程的指针
}*coursenode[100]={NULL};//课程数目节点
3.2各模块的类C码算法
A.初始化课程节点
voidinitialNode()//初始化课程节点
{
inti;
intj;
printf("\n正在初始化。
。
。
。
。
。
。
\n");
for(i=0;i<100;i++)
{
后修课程的指针置零;
同学期学习的课程置零;
前修课程置零;
后修课程置零;
for(j=0;j<100;j++)
coursenode[i]->courselink[j]=NULL;
}
printf("\n初始化完毕。
。
。
。
。
。
。
\n");
}
B.建立课程顺序
voidcreateNode()//建立课程顺序
{
inti;
inttemp;
intflag;
for(i=0;i{
printf("\n请输入%d的深入课程数目:
",i+1);
scanf("%d",&(coursenode[i]->next));
printf("\n请输入%d的深入课程课程代号分别是什么(用空格分开):
",i+1);
for(temp=0;tempnext;temp++)
{
scanf("%d",&flag);
coursenode[i]->courselink[temp]=coursenode[flag-1];
coursenode[flag-1]->previous++;
}
}
printf("\n课程代号\t前修课程数\t深入课程数\n");
for(temp=0;temp{
printf("%d\t\t%d\t\t%d\n",temp+1,coursenode[temp]->previous,coursenode[temp]->next);
}
}
C.排课程
voidsortNode()//排课程
{
inti,j,flag=0,session=1;
FILE*fp;
if((fp=fopen("d:
\\course.txt","a"))==NULL)//如果文件已经存在,可以追加学生信息
{
if((fp=fopen("d:
\\course.txt","w"))==NULL)//文件不存在时,创建新文件,输入学生信息
{
printf("文件打开失败!
\n");
return;
}
}
printf("\n-----------------------------\n");
printf("课程代号\t课程号\t课程学分\n");
fprintf(fp,"课程代号\t课程号\t课程学分\n");
while
(1)
{
flag=1;
for(i=0;iif(课程数目节点为空)
if(同学期学习课程为空)
if(前修课程为0)
{
printf("%d\t\t%s\t%d\n",i+1,str[i],score[i]);
fprintf(fp,"%d\t%s\t%d\n",i+1,str[i],score[i]);
for(j=0;jnext;j++)
{
前修课程数目节点减一;
coursenode[i]->courselink[j]->variable=1;
coursenode[i]->courselink[j]=NULL;
}
coursenode[i]->next=0;
释放数目结点;
flag=0;
}
if(flag!
=0)break;
else
{
if(session<=termtime)
{printf("第%d学期课程结束\n------------------------------------\n",session);
fprintf(fp,"第%d学期课程结束\n------------------------------------\n",session);
session++;}
else
{
printf("学习时间不够\n");
exit(0);
}if(session<=termtime);
}
for(i=0;iif(课程节目数不为O)
coursenode[i]->variable=0;
}
fclose(fp);//关闭文件指针
}
D,输入基本信息
voidinputBasicInformation()//输入基本信息
{
inti;
printf("请输入学期总数:
");
scanf("%d",&termtime);
if(termtime>=12)
{
printf("\n对不起,学期总数不能超过12\n");
exit(0);
}
printf("\n请输入学分上限:
");
scanf("%d",&limitgrade);
printf("\n请输入课程总数:
");
scanf("%d",&totalcourse);
for(i=0;iprintf("请输入第%d门课程号(三个字符,回车结束):
",i+1);
scanf("%s",&str[i]);
str[i][3]='\0';
printf("请输入第%d门课程学分(回车结束):
",i+1);
scanf("%d",&score[i]);
if(学分高于上限)
{
printf("\n对不起,课程学分不能超过学分上限\n");
exit(0);
}
}
printf("\n您所输入的数据如下,请核实:
\n");
printf("课程代号\t课程号\t课程学分\n");
for(i=0;i{
printf("%d\t\t%s\t%d\n",i+1,str[i],score[i]);
}
}
E.清空信息
voidcls()
{
inti=0;
学期数置零;
学分上限置零;
for(i=0;i<100;i++)
{
str[i][0]='\0';
score[100]=0;
}
总课程数置零;
printf("\n原来数据已经清空\n");
}
F.菜单
voidmenu()
{
printf("*************************教学计划编制************************\n");
printf("\n1输入课程安排基本信息");
printf("\n2建立课程顺序");
printf("\n3排列课程顺序");
printf("\n4原来数据清空");
printf("\n5退出");
}
G.主函数
voidmain()
{
intn;
initialNode();
while
(1)
{
menu();
printf("\n请输入您要选择的操作序号,按回车键确认:
");
scanf("%d",&n);
switch(n)
{
case1:
inputBasicInformation();;break;
case2:
createNode();;break;
case3:
sortNode();;break;
case4:
cls();break;
case5:
exit(0);
default:
printf("输入错误,请输入列表中存在的序号!
\n");
}
}
}
3.3各函数的调用关系图、主要函数的流程图
图2.3-1流程图
4、调试分析以及设计体会
4.1测试数据:
学期总数:
6;
学分上限:
10;
该专业共开设课数:
12
课程号:
从C01到C12;
学分顺序:
2,3,4,3,2,3,4,4,7,5,2,3。
先修关系如下图:
图4.1-1测试数据先修关系图
正确输入测试数据后,如果系统符合要求,正确排序,则如图4.1-2所示。
图4.1-2正确的测试结果
4.2程序调试中遇到的问题以及解决问题的方法:
我们在实验过程中遇到的最大难题是课程排序算法的编写。
刚开始的时候没有任何的思路,网上也只有拓扑排序的算法,对于课程设计要求的排序算法没有任何头绪。
经过请教老师和同学以及翻阅了一些相关书籍,并在网上的搜索有了排序算法的大体思路。
经过几天的修改,终于写出了符合要求的排序算法。
4.3课程设计过程经验教训、心得体会:
每一次读懂别人的代码都是一种提高。
每一次减少一个Error都是一种进步。
每当一个模块编译完成都是一种成就。
这次数据结构的课程设计着实是一件难事,平常很少动手编程序,课堂上也没太多关注把思路转化为代码。
以至于最后要实现图的输入输出时,明明知道可以用邻接表或者拓扑排序,但就是不知道写代码。
经过一个星期的课程设计,过程曲折可谓一语难尽。
整天都是对着电脑,不然就是翻阅资料。
在此期间我失落过,也曾一度热情高涨。
点点滴滴令我回味无长。
这次课程设计使我体会到只有做到细心耐心,恒心才能做好事情。
通过本次课程设计,对图的概念有了一个新的认识,在学习离散数学的时候,总觉得图是很抽象的东西,但是在学习了《数据结构教程》这门课程之后,我慢慢地体会到了其中的奥妙,图能够在计算机中存在,首先要捕捉他有哪些具体化、数字化的信息,比如说权值、顶点个数等,这也就说明了想要把生活中的信息转化到计算机中必须用数字来完整的构成一个信息库,而图的存在,又涉及到了顶点之间的联系。
图分为有向图和无向图,而无向图又是有向图在权值双向相等下的一种特例,如何能在计算机中表示一个双向权值不同的图,这是一件很巧妙的事情。
在计算机中实现一个很简单的想法就需要涉及到很多专业知识,为了完成设计,在前期工作中,基本都是以学习C语言为主,所以浪费了很多时间,比如说在程序中,删除顶点和增加顶点的模块中都有和建图模块相互重复的函数,但是由于技术的原因,只能做一些很累赘的函数,可见在调用知识点,我没有掌握好。
不过,有了这次课程设计的经验和教训,我能够很清楚的对自己定一个合适的水平,而且在这次课程设计中我学会了运用两个新的函数sprintf()和包涵在#include 头文件中的输入函数。
这次的课程设计使我懂得了理论与实际相结合是很非常重要的,只有理论知识是远远不够的,只有把所学的理论知识与实践相结合起来,从理论中得出结论,才能真正为社会服务,从而提高自己的实际动手能力和独立思考的能力。
在整个设计过程中,构思是很花费时间的。
调试时经常会遇到这样那样的错误,有的是因为粗心造成的语法错误。
当然,很多也时用错了方法,总是实现不了。
同时在设计的过程中发现了自己的不足之处,对以前所学过的知识理解得不够深刻,掌握得不够牢固。
根据我在课程设计中遇到得问题,我将在以后的学习过程中注意以下几点。
首先需要认真上好专业实验课,多在实践中锻炼自己。
其次写程序的过程中要考虑周到,严密。
再次,在做设计的时候要有信心,有耐心,切勿浮躁。
然后,认真的学习课本知识,掌握课本中的知识点,并在此基础上学会灵活运用。
最后,在课余时间里多写程序,熟练掌握在调试程序的过程中所遇到的常见错误,以便能节省调试程序的时间。
每个实验通常都要花费很久的时间才能理清一个程序的思路,而且要不断的调试程序才能把程序调试正确,同时还要做到界面的输出也是需要美化的。
这次课程设计终于顺利完成了,在设计中遇到了很多专业知识问题,最后在老师的辛勤指导下,也完成了课程设计。
通过这次的课程设计,让我更加了解到数据结构的重要性。
以及它对我们专业的发展发挥的作用。
对我们而言,知识上的收获很重要,但精神上的丰收更加可喜。
让我知道了学无止境的道理。
我们每一个人永远不能满足于现有的成就,人生就像在爬山,一座山峰的后面还有更高的山峰在等着你。
挫折是一份财富,经历是一份拥有。
这次课程设计必将成为我人生旅途上一个非常美好的回忆!
同时在做课程设计时要能够从多方面去考虑,去研究,用多种算法去实现要求。
此次课程设计,学到了很多课内学不到的东西,比如独立思考解决问题,出现差错的随机应变,这些都让我受益非浅,今后的制作应该能够更轻松,自己也都能够解决并高质量的完成项目。
我觉得作为一名网络工程专业的学生,数据结构的课程设计是很有意义的.更重要的是如何把自己平时所学的东西应用到实际中.虽然自己对于这门课懂的并不多,很多基础的东西都还没有很好的掌握,觉得很难,也没有很有效的办法通过自身去理解,但是靠着这一个多礼拜的"学习",在同学的帮助和讲解下,渐渐对这门课逐渐产生了些许的兴趣,自己开始主动学习并逐步从基础慢慢开始弄懂它。
我认为这个收获应该说是相当大的。
觉得课程设计反映的是一个从理论到实际应用的过程,但是更远一点可以联系到以后毕业之后从学校转到踏上社会的一个过程。
同学间的讨论、互助,以及自身的动脑和努力,都是以后工作中需要的。
5、使用说明
使用VC++,打开schedule.c文件,接着编译,无错误,然后重建也没有错误,最后执行该文件。
显示如图5-1:
图5-1程序编译正确
要求输入学期总数、一个学期的学分上限、需要编排课程总数、课程名、课程号、该课程的学分,按照出现的每一步来输入该课程设计所提供的相关数据。
如图5-2所示。
图5-2输入课程安排基本信息
要求依次输入各课程的深入(后续)课程代号,按照出现的每一步来输入该课程设计所提供的相关数据。
如图5-3所示。
图5-3建立课程顺序
各项信息输入完毕后,在主选菜单中选择3,系统将自动排出课程。
如图5-4所示。
图5-4排列课程数据
同时,系统会将教学编制计划自动保存到d:
\course.txt下,如图5-5、5-6所示。
图5-5保存目录
图5-6course文件内容
如果信息输入错误,或者需要更换新的信息,可以在主选菜单中选择清空信息选项,系统将自动删除原有数据。
如图5-7所示。
图5-7数据清空
在主选菜单中选择5退出后,系统将自动关闭。
6.参考书目
A.《数据结构教程》李春葆等编著清华大学出版社
B.《数据结构教程上机实验指导》李春葆等编著清华大学出版社
7、附录
7.1.源程序清单(带注释)
#include"stdio.h"
#include"malloc.h"
#include"iostream.h"
#include"stdlib.h"
inttermtime=0;//学期总数
intlimitgrade=0;//学分上线
charstr[100][4];//课程号
intscore[100]={0};//课程学分
inttotalcourse=0;//课程总数
structnode//课程节点
{
intvariable;//标志属不属于同一个学期所修
intprevious;//前修课程
intnext;//