数据结构课程设计任务书.docx
《数据结构课程设计任务书.docx》由会员分享,可在线阅读,更多相关《数据结构课程设计任务书.docx(17页珍藏版)》请在冰豆网上搜索。
数据结构课程设计任务书
课程设计(论文)任务书
软件学院学 院 软件+电气专 业2010—1 班
一、课程设计(论文)题目 数据结构课程设计--车厢调度问题
二、课程设计(论文)工作自2011年12月26日起至2011年12月30日止
三、课程设计(论文)地点:
创新大楼机房
四、课程设计(论文)内容要求:
1.本课程设计的目的
⑴训练学生灵活应用所学数据结构知识,独立完成问题分析,结合数据结构理论知识,
编写程序求解指定问题;
⑵初步掌握软件开发过程的问题分析、系统设计、程序编码、测试等基本方法和技能;
⑶提高综合运用所学的理论知识和方法独立分析和解决问题的能力,巩固、深化学生
的理论知识,提升编程水平。
2.课程设计的任务及要求
1)基本要求:
⑴要求从分析题目的需求入手,按设计抽象数据类型、构思算法、通过设计实现抽象
数据类型、编写上机程序和上机调试等若干步骤完成题目,最终写出完整的报告;
⑵在程序设计阶段应尽量利用已有的标准函数,加大代码的重用率;
⑶程序设计语言推荐使用C/C++,程序书写规范,源程序需加必要的注释;
⑷每位同学需提交可独立运行的程序和规范的课程设计报告。
2)课程设计论文编写要求
⑴理论设计部分以课程设计论文的形式提交,格式必须按照课程设计论文标准格式进
行书写和装订;
⑵课程设计报告(论文)包括中文目录、设计任务、需求分析、概要设计、详细设计、
编码实现、调试分析、课设总结、谢辞、参考文献、附录等;
⑶设计部分应包含系统功能模块图,调试分析应包括运行截图等。
3)课程设计评分标准:
⑴学习态度:
10分;
⑵系统设计:
20分;
⑶编程调试:
20分;
⑷回答问题:
20分;
⑸论文撰写:
30分。
4)参考文献:
⑴严蔚敏,吴伟民.数据结构(C语言版)[M].清华大学出版社.2010.3
⑵严蔚敏,吴伟民.数据结构题集(C语言版)[M].清华大学出版社.1999.2
⑶何钦铭,冯燕等.数据结构课程设计[M].浙江大学出版社.2007.8
5)课程设计进度安排
⑴准备阶段(4学时):
选择设计题目、了解设计目的要求、查阅相关资料;
⑵程序模块设计分析阶段(4学时):
程序概要设计、详细设计;
⑶代码编写调试阶段(8学时):
程序模块代码编写、调试、测试;
⑷撰写论文阶段(4学时):
总结课程设计任务和设计内容,撰写课程设计论文。
学生签名:
2011年12月26日
6)课程设计题目具体要求:
根据自己所选择的题目填写内容
课程设计(论文)评审意见
(1)学习态度(10分):
优( )、良( )、中( )、一般( )、差( );
(2)系统设计(20分):
优()、良( )、中( )、一般( )、差( );
(3)编程调试(20分):
优( )、良( )、中( )、一般( )、差( );
(4)回答问题(20分):
优( )、良( )、中( )、一般( )、差( );
(5)论文撰写(30分):
优( )、良( )、中( )、一般( )、差( );
(6)格式规范性及考勤是否降等级:
是( )、否( )
评阅人:
王英华 职称:
讲师
2012年1月4日
一、需求分析3
1、问题描述3
2、基本要求:
3
3、问题分析3
二、概要设计3
1.定义栈的抽象数据类型定义:
3
2.定义一个一维数组来保存所有的输出序列4
3、定义全局变量4
三、详细设计5
(1)菜单显示voidmessage()5
(2)调度过程voidAttemper(intpos,intpath[],intcur)5
1、序列输出voidPrint()5
2、变化过程voidDisplayOnly(intk,intOutput,intInput)5
3、显示操作序列的状态的变化过程voidDisplayOnly(intk,intOutput,intInput)6
四、调试分析8
1.分析描述8
2.调试思路8
五、用户手册8
1.程序运行环境8
2.进入操作页面8
六、测试结果9
1.输入车厢数9
七、体会心得10
八、源代码11
一、需求分析
1、问题描述:
假设停在铁路调度站(如教科书中图3.1(b)所示)入口处的车厢系列的编号依次为1,2,3,…n。
设计一个程序,求出所有可能由此输出的长度为n的车厢系列。
2、基本要求:
⑴设计一个程序,求出由一个编号依次为1,2,、、、,n的车厢序列可能产生的所有出栈系列。
⑵利用双向栈存储结构实现调度站和输出序列这两个栈的空间共享。
⑶对于每个输出序列演示出所有操作序列的变化过程。
3、问题分析
若实现车厢调度的基本要求,所以需要建立一个栈来实现。
栈的特性是先进后出,而根据栈的特性,进栈与出栈都有两种可能:
一个数进栈后,要么立刻出栈,要么进行下一个数的进栈;同样一个数出栈后,要么继续出栈(栈不空),要么继续下一个数的进栈。
输入一个车厢长度,从而得到由此输出长度为n的车厢序列,并定义一个二维数组来保存所有的输出序列。
二、概要设计
1.定义栈的抽象数据类型定义:
基本操作:
InitStack(&S)
操作结果:
构造一个空栈S。
StackEmpty(&S)
初始条件:
栈S已经存在
操作结果:
判断栈S是否为空栈
StackFull(&S)
初始条件:
栈S已经存在
操作结果:
判断栈S是否已满
Push(&S,x)
初始条件:
栈S已经存在
操作结果:
在栈S的栈顶插入栈顶元素x
Pop(&S,&x)
初始条件:
栈S已经存在
操作结果:
删除栈顶元素,并赋给x
2.定义一个一维数组来保存所有的输出序列
structpathss{
intpaths[30]intnumber;
}AllPath;
3、定义全局变量
intn;
intpath[30];
三、详细设计
(1)菜单显示voidmessage()
主要功能就是显示主菜单:
请输入车厢数(2—30):
(2)调度过程voidAttemper(intpos,intpath[],intcur)
入栈时,输入一个数i,判断是否小于n(全局变量),如果小于n,则一个数进栈后,要么立刻出栈,要么进行下一个数的进栈;
同样,出栈时,首先判断栈是否为空,如果不为空,则一个数出栈后,要么继续出栈(栈不空),要么继续下一个数的进栈。
每个数根据以上的两种出栈入、栈选择,将产生所有可能的车厢序列,然后在运用一个二维数组,把每种序列保存在二维数组里。
1、序列输出voidPrint()
根据栈的特性输出所有可能长度为n的车厢序列。
2、变化过程voidDisplayOnly(intk,intOutput,intInput)
实现对于每个输出序列印出操作序列或状态变化过程。
运行程序时,输入一个序列号,然后按一下回车键,就会显示与序列号相对应的车厢序列,然后每按一次回车,就有一次变化,直到演化完毕为止。
3、显示操作序列的状态的变化过程voidDisplayOnly(intk,intOutput,intInput)
在运行程序时显示操作序列的状态的变化
四、调试分析
1.分析描述
此车厢调度的基本要求比较简单,只要掌握好栈的基本特性和基本操作,一般都能顺利完成。
2.调试思路
此系统需要运用递归算法,所以还必须对整个系统有个清晰的认识和思路,这样才能更好的掌握运行的详细过程与结果。
每个步骤都有两种可能,那怎样解决操作问题呢?
我决定先以入栈为主,先入先入,操作完毕后恢复至分步时的状态,再进行出栈的操作,这样两种可能就都完成了。
数据存储是用了一个数组,便于存储。
五、用户手册
1.程序运行环境
为DOS操作系统,执行文件为车厢调度.exe
2.进入操作页面
可以根据页面上的提示继续操作(如下图)。
六、测试结果
1.输入车厢数
假设车厢长度n=4
(以上便是程序运行过程中的一些截图)
7、体会心得
在经过三天的课设之后感觉到做东西要细心,一步一步来,不能急躁,不然什么都弄不好。
在课设的过程当中当看到程序运行成功感觉努力没有白费。
希望在以后的学习当中能够做的更好。
在编排方面要先有个大概编排然后在进行修改。
这样会舍得编排更加完善。
不会有什么错误。
希望以后会更好。
八、源代码
#include
#include
#defineSTACK_INI_SIZE30
#defineSTACKINEMENT10
#defineNULL0
typedefstruct
{
int*base;
int*top;
intstacksize;
intlength;
}stack;
main()
{
voidinitlist(stack*s);
voidoperation(stack*s);
stacks;
initlist(&s);
operation(&s);
}
voidinitlist(stack*s)
{
s->base=s->top=(int*)malloc(STACK_INI_SIZE*sizeof(int));
if(!
s->base)
{
printf("开辟失败");
exit
(1);
}
s->length=0;
s->stacksize=STACK_INI_SIZE;
}
voidpush(stack*s,inti)
{
if(s->length==s->stacksize)
{
s->base=(int*)realloc(s->base,(STACK_INI_SIZE+STACKINEMENT)*sizeof(int));
s->length=STACK_INI_SIZE;
s->stacksize+=STACKINEMENT;
}
*(s->top)=i;
s->length++;
s->top++;
}
voidpop(stack*s)
{
if(s->top==s->base)
{
printf("栈空无法删除错误");
exit
(1);
}
s->top--;
printf("%d",*(s->top));
*(s->top)=NULL;
s->length--;
}
voidoperation(stack*s)
{
inta[60],i,j,k,m,n,l,z,y,flag1=1,flag2=1;
charch;
printf("请输入车厢数(2-30)\n");
while(flag1)/*此循环是输入一个正确的车厢数假如在此输入的是4*/
{
scanf("%d",&i);
if(2>i&&i>30)
printf("输入错误请重新输入\n");
else
flag1=0;
}
flag1=1;
for(j=0;j
{
a[j++]=1;
a[j]=0;
}
while(flag1)/*总循环,输出所有满足条件的车厢调度*/
{
l=1,k=0;
for(j=0;j
{
if(a[j]==1)
push(s,l++);
elseif(a[j]==0)
pop(s);
}
printf("\n");
for(j=0;j
if(a[j]==1)
k++;
if(k==i)
flag1=0;
a[i*2-1]++;/*尾数自加1*/
while(flag2&&flag1)
{
z=1,m=0,n=0,y=1;
for(j=i*2-1;j>=0&&z;j--)/*假如自加之后是2的话,前一位自加1,本位为0*/
if(a[j]!
=2)
z=0;
else
{
a[j]=0;
a[j-1]++;
}
for(j=0;j
{
if(a[j]==1)
m++;
elseif(a[j]==0)
n++;
else
printf("错误\n");
if(n>m)
y=0;/*判断输出的时候栈是否为空,比如11000110*/
}
if(m==i&&n==i&&a[0]==1&&a[i*2-1]==0&&y==1)
flag2=0;
else
a[i*2-1]++;
}
flag2=1;
}
}