教学计划编制问题.docx
《教学计划编制问题.docx》由会员分享,可在线阅读,更多相关《教学计划编制问题.docx(23页珍藏版)》请在冰豆网上搜索。
教学计划编制问题
教学计划编制问题
一课题描述
大学每个专业都要制定教学计划。
假设任何专业都有固定的学习年限,每学年含两个学期的时间长短和学分上限值均相等。
每个专业开设的课程都是确定的,而且课程在开设时间的安排上必须满足先修关系。
每门课有哪些先修课程也是确定的(但可以有多门先修课程,
也可以没有先修课程)。
每门课恰好占一学期。
试在这些前提下设计一个教学计划编制程序。
、本次课程设计的任务
针对一些本科课程,根据课程之间的依赖关系,制定课程安排计划,并满足各学期课程数日大致相同。
按照用户输入的课程数,学期数,课程间的先后关系数目以及课程间两两间的先后关系,程序执行后会给出每学期应学的课程。
、基本要求
()输入参数:
学期总数,一学期的学分上限,每门课的课程号,学分和直接先修课的课程号。
()输出参数:
输出提示信息,由用户在键盘上输入运行程序中规定的命令来指定下列两种编排策略之一:
一是使学生在各学期中的学习负担尽量均匀;
二是使课程尽可能地集中在前几个学期中。
()若根据给定的条件问题无解,则报告适当的信息,否则将教学计划输出到用户指定的文件中
二课程设计目的
、加深对有向图概念的了解;
、深入了解网进行拓扑排序过程;
、巩固相关的理论知识;
三课程设计预备知识
、网的概念和结构;
、有向图的创建;
、栈的输入输出算法;
、语言的相关知识;
、数据结构与算法的相关知识。
四设计思路
编制教学计划,当然涉及到的课程都要给学完。
所以我们可以将所以的课程编制成一张图,然后遍历图。
由于课程有前续后继的关系,所以用网是最合适。
对网进行拓扑排序即可以得出结果。
对网进行拓扑排序有两种情况:
广度优先和深度优先。
在进行深度优先周游时,我们要考虑到一种情况。
例如:
高等数学和语言编程是并列的两门学科,他们之间没有前续后继的关系,可以同时进行学习。
高等数学是数值分析和电子电路的基础课程,电子电路又是模拟电子电路的基础课程。
语言编程是数据结构的基础课程,数据结构是算法设计与分析的基础课程。
如果按照深度优先周游的话就有可能将上面几门课程排成:
语言程序设计,数据结构,算法设计与分析,高等数学,电子电路,模拟电子电路。
这样的教学计划很明显不符合实际教学的需要。
因此我们应该进行广度优先周游,将高等数学和语言程序设计先学,再学其他后继课程。
五软件主要模块结构图
六程序流程图
七源程序代码
<>
<>
<>()等
<>等
<>(^或)
<>()
<>()
<>()()()
<>()
<>
函数结果状态代码
;是函数的类型,其值是函数结果状态代码,如等
;是布尔类型,其值是或
*顶点字符串的最大长度*
;
;
;
;
[];*字符串类型*
*图的邻接表存储表示*
{};*{有向图,有向网,无向图,无向网}*
{
;*该弧所指向的顶点的位置*
*;*指向下一条弧的指针*
*;*网的权值指针)*
};*表结点*
{
;*顶点信息*
*;*第一个表结点的地址,指向第一条依附该顶点的弧的指针*
}[];*头结点*
{
;
;*图的当前顶点数和弧数*
;*图的种类标志*
};
*图的邻接表存储的基本操作*
()
{*初始条件:
图存在和中顶点有相同特征*
*操作结果:
若中存在顶点,则返回该顶点在图中位置;否则返回*
;
(<)
(([]))
;
;
}
(*)
{*采用邻接表存储结构,构造没有相关信息的图(用一个函数构造种图)*
;
;
*;
("请输入教学计划的课程数:
");
(""(*));
("请输入拓扑排序所形成的课程先修关系的边数:
");
(""(*));
("请输入个课程的代表值(<个字符):
\",(*));
(<(*))*构造顶点向量*
{("",(*)[]);
(*)[];
}
("请输入个课程的学分值(<个字符):
\",(*));
(<(*))*构造顶点向量*
{("",(*)[]);
}
("请顺序输入每条弧(边)的弧尾和弧头(以空格作为间隔):
\");
(<(*))*构造表结点链表*
{("");
(*);*弧尾*
(*);*弧头*
(*)(());
>;
>;*图*
>(*)[];*插在表头*
(*)[];
}
;
}
()
{*输出图的邻接矩阵*
;
*;
()
{:
("有向图\");
}
("个顶点:
\");
(<)
(""[]);
("\条弧(边):
\");
(<)
{
[];
()
{("→"[][>]);
>;
}
("\");
}
}
([])
{*求顶点的入度,算法调用*
;
*;
(<)
[];*赋初值*
(<)
{
[];
()
{[>];
>;
}
}
}
;*栈类型*
*栈的顺序存储表示*
*存储空间初始分配量*
*存储空间分配增量*
{
*;*在栈构造之前和销毁之后,的值为*
*;*栈顶指针*
;*当前已分配的存储空间,以元素为单位*
};*顺序栈*
*顺序栈的基本操作*
(*)
{*构造一个空栈*
(*)(*)(*());
(!
(*))
();*存储分配失败*
(*)(*);
(*);
;
}
(*)清空栈的操作
{
>>;
}
()
{*若栈为空栈,则返回,否则返回*
()
;
;
}
(**)
{*若栈不空,则删除的栈顶元素,用返回其值,并返回;否则返回*
((*)(*))
;
**(*);
;
}
(*)
{*插入元素为新的栈顶元素*
((*)(*)>(*))*栈满,追加存储空间*
{
(*)(*)((*),((*))*
());
(!
(*))
();*存储分配失败*
(*)(*)(*);
(*);
}
*((*));
;
}
[];
[];
()
{*有向图采用邻接表存储结构。
若无回路,则输出的顶点的一个拓扑序列并返回,*
*否则返回。
*
[];
;
;
;
;
*;
();*对各顶点求入度[]*
();*初始化栈*
(<)*建零入度顶点栈*
([])
{();
<<*[]<<;
}
*入度为者进栈*
;*对输出顶点计数*
(())
{*栈不空*
();
[]*[];
[]*[];
("课程→学分"[][]);
*输出号顶点并计数*
;
([]>)
{*对号顶点的每个邻接点的入度减*
>;
(!
([]))*若入度减为,则入栈*
{();
<<*[]<<;
}
}
}
(<)
{("此有向图有回路\");
;
}
{("为一个拓扑序列。
\");
;
}
输出内容
();*对各顶点求入度[]*
();
<<"课程计划如下"<<;
;学期数
;
(<)
{
[];
;
;
;
学期学分计算
;
(<)*建零入度顶点栈*
{([])
{
();
}
}
(())
{
;
();
([]);
;
(>)
{
;
}
[];
([]>)
{*对号顶点的每个邻接点的入度减*
>;
[];
*(!
([]))若入度减为,则入栈
{
();
}*
}
[];
;
}
<<"第"<<<<"个"<<"学期的课程为:
"<<;
(<)
{
<<"课程"<<[[]]<<;
}
;
}
;
}
()
{;
("教学计划编制问题的数据模型为拓扑排序网结构。
\");
("以下为教学计划编制问题的求解过程:
\");
("请输入学期总数:
");
("");
("请输入学期的学分上限:
");
("");
();
();
();
}
八程序测试
、输入参考及预期值分析
()输入的形式和输入值的范围:
输入间用空格隔开。
要求用户输入的课程数小于,学期数小于或是等于,学分上限设定一个分值,课程名的长度小于等于个字符。
()程序所能达到的功能:
按照用户的输入,给出每学期应学的课程。
()若测试数据:
输入:
学期数:
5,课程数:
,课程间的先后关系数:
,课程的代表值:
。
课程间两两间的先后关系:
, , , ,
输出:
第学期应学的课程:
第学期应学的课程:
第学期应学的课程:
第学期应学的课程:
第学期应学的课程:
、选则简单测试用例看是否满足预期结果:
()输入先修关系无回路时的运行结果:
()输入先修关系有回路时的运行结果:
模拟实际课程编制分析
()假设某一专业的课程如下:
(只罗列出具有前续后继关系的课程,像马列等课程由于和其他课程没有关联,所以在课程排序好后考虑每个学期的课程量时随机加入,为表述方便,为每一门课程设一序号,代表该课程)
,高等数学,程序设计
,概率论和数理统计,编译原理
,线形代数,现代通信技术
,语言程序设计,计算机网络
,电路理论,软件工程
,模拟电子技术,算法设计与分析
,数字逻辑,人工智能
,面向对象编程技术,编程技术
,数据结构,电子商务
,汇编语言,分布式数据库
,计算机组成原理,网络数据库编程
,微机原理与接口技术,计算机图形学
,操作系统,图象处理
,数据库概论,嵌入式系统
,数值分析,多媒体技术
,计算机控制基础
()课程之间先后关系的网:
注:
课程之间的先后关系可能可能不完全正确,我们以测试算法问题为主。
()将上面的网用邻接表表示如下:
入度
顶点
边表
∧
∧
∧
∧
∧
∧
∧
∧
∧
∧
∧
∧
∧
∧
∧
∧
∧
∧
∧
∧
∧
∧
∧
∧
∧
∧
∧
∧
∧
∧
∧
()输出结果:
九心得体会
、关于理论准备
上学期学过语言和语言两门课程,这学期又在两门课的基础上学习了数据结构与操作系统,但一直没有得到实践的机会,对语言掌握不熟练。
这学期康松林老师指导我们做软件课程设计,我选择了课程编制问题,开始感觉较难没有思路,在多方查找资料与咨询之后,我们按照老师的要求将程序分为三个模块,去图书馆网上查找资料,开始慢慢寻找思路。
后来花两天时间和同学讨论思路,便有了大体框架,解决了框架问题,便着手写基本程序。
然后对要求整体分析结合操作系统的相关知识,通过想要实现的结果来实现功能。
在进试验室前我做了大量的工作,包括向老师请求帮助解释题目要求,对所学知识进行复习,查阅资料,深入理解算法,广泛征求同学意见等等。
在准备过程中我发现当遇到实际问题时,只要认真思考,用所学的知识,再一步步探索,是完全可以解决遇到的一般问题的。
、关于实践过程
在大一和大二我们学的计算机语言都是一些理论知识,就是有几个实习我们也大都注重观察的方面,比较注重理论性,而较少注重我们对算法分析的锻炼。
而这一次的实习既需要我们去想,又需要我们去做,好多东西看起来十分简单,一想都懂,但没有亲自去做它,你就不会懂理论与实践是有很大区别的,看一个东西简单,但它在实际操作中就是有许多要注意的地方,有些东西也与你的想象不一样,我们这次的实验就是要我们跨过这道实际和理论之间的鸿沟。
通过这次实践,我更加熟练的掌握了计算机语言;也了解了各种作业调度算法以及线程的基本知识;还学会了怎样做一个课程设计,并了解到我们的设计是实践的基础,实践中的大型软件工程等等是我们课程设计的升级。
做课程设计,一定要有个好的规划,不能盲目进行,否则很浪费时间,最后有可能功能都是先不了。
我们的程序就是改了又改,以致写了好几天才正式成形。
无论做什么事都要态度端正,态度决定一切,只要功夫深,铁杵磨成针。
这次实践我们热情都很高涨,很投入,但是最终收获也是最大的。
做工作还需要思考着做事,这样就事半功倍,更重要的是,做事的心态,也可以得到磨练,可以改变很多不良的习惯。
由于时间仓促,很多想法很多创意都没能实现,但是在今后的学习中我会加强理论与实践的结合,通过不断的摸索来弥补自己在课程设计方面的不足,以后再有这样的机会,一定要做得更好!
这次实践不只是对专业知识的加强,还锻炼了自己的思维能力,查资料筛选能力,将知识与实践相结合的能力,这些都是在书本上找不到的知识,都是在实践中切身感到的弥足珍贵的知识,这些我将终身受益,以后这种锻炼机会不多了,我会好好总结好好珍惜,将这次实践经验运用到将来的工作中,做一个有用之材。
计算机专业是一个工程专业。
所谓工程专业,就是从实践中来到实践中去的专业。
数据结构,是更快更好地完成工程任务的手段之一。
所谓编程,就是用特定语言表达算法的过程。
输入程序,就是把算法用计算机理解的方式告诉计算机。
算法才是灵魂,语言只是表达媒介。
算法是为了解决实际问题的。
是应用中有了需求才有人想出算法来解决这些问题如果是真实的案例,最终都要被抽象成为某些数据结构,然后用某些算法进行处理。
通过此次课程设计,我认识到了算法的重要性,也学到了算法的很多知识,包括它在实际应用中的作用,而且在复习数据结构时,我发现原来很多不懂得程序都搞懂了,比如说递归调用算法,以及书的遍历算法,因此,实践是很重要的。
在日后的学习中,我会更加重视知识的积累,学好算法,以更好的掌握一门计算机语言。
十 [参考文献]
、《计算机操作系统教程核心与设计原理》(清华大学出版社)
、《数据结构教程》(清华大学出版社)《数据结构上机实验与习题》(机械工业大学出版社)
、《计算机软件技术基础》(清华大学出版社第三版)