数据库课程设计.docx

上传人:b****6 文档编号:7326209 上传时间:2023-01-23 格式:DOCX 页数:15 大小:329.85KB
下载 相关 举报
数据库课程设计.docx_第1页
第1页 / 共15页
数据库课程设计.docx_第2页
第2页 / 共15页
数据库课程设计.docx_第3页
第3页 / 共15页
数据库课程设计.docx_第4页
第4页 / 共15页
数据库课程设计.docx_第5页
第5页 / 共15页
点击查看更多>>
下载资源
资源描述

数据库课程设计.docx

《数据库课程设计.docx》由会员分享,可在线阅读,更多相关《数据库课程设计.docx(15页珍藏版)》请在冰豆网上搜索。

数据库课程设计.docx

数据库课程设计

目录

一、目的与要求1

1、设计目的1

2、基本要求1

3、创新要求2

4、写出设计说明书2

二、任务分析2

1、要求2

2、输入2

三、设计方法和基本原理2

1、问题描述(功能要求)2

2、问题的解决方案2

四、分析设计3

1、概要设计3

2、各模块之间的调用关系4

五、详细设计4

1、马踏遍棋盘流程4

2、部分代码与截图5

六、调试分析8

1、调试结果8

2、调试9

3、分析与心得9

七、使用说明10

八、小结与源程序代码清单10

1、小结10

2、源程序清单10

九、参考文献15

一、目的与要求

1、设计目的

(1)熟练使用C语言编写程序,强化模块设计理念;

(2)设计一个国际象棋马踏棋盘的演示程序。

(3)理解栈的特性“后进先出”和队列的特性“先进先出”。

(4)初步掌握软件开发过程的问题分析、系统设计、程序编码、测试等基本方法和技能;

2、基本要求

将马随机放在国际象标的8*8棋盘Board[8][8]某个方格中,马按走棋规则进行移动。

要求每个方格只进入一次,走遍棋盘上全部64个方格。

编制非递归程序,求出马的行走路线,并按求出的行走路线,将数字1、2、……、64依次真入一个8*8的方阵,输出之。

3、创新要求

在基本要求达到后,可进行创新设计,如根据查找结果进行修改的功能。

4、写出设计说明书

二、任务分析

1、要求

在国际象棋8×8棋盘上面,按照国际象棋规则中马的行进规则,实现从任意初始位置,每个方格只进入一次,走遍棋盘上全部64个方格。

编制程序,求出马的行走路线,并按求出的行走路线,将数字1,2,…,64依次填入一个8×8的方阵,并输出它的行走路线。

2、输入

任意一个起始位置;输出:

无重复踏遍棋盘的结果,以数字1-64表示行走路线。

三、设计方法和基本原理

1、问题描述(功能要求)

在国际象棋8×8棋盘上面,按照国际象棋规则中马的行进规则,实现从任意初始位置,每个方格只进入一次,走遍棋盘上全部64个方格。

编制程序,求出马的行走路线,并按求出的行走路线,将数字1,2,…,64依次填入一个8×8的方阵,并输出它的行走路线(棋盘如图所示)。

 

0

1

2

3

4

5

6

7

0

 

 

8

 

1

 

 

 

1

 

7

 

 

 

2

 

 

2

 

 

 

H

 

 

 

 

3

 

6

 

 

 

3

 

 

4

 

 

5

 

4

 

 

 

5

 

 

 

 

 

 

 

 

6

 

 

 

 

 

 

 

 

7

 

 

 

 

 

 

 

 

2、问题的解决方案

采用顺序栈或者链栈实现。

下图显示了马位于方格(2,3)时,8个可能的移动位置。

一般来说,当马位于位置(i,j)时,可以走到下列8个位置之一

0

1

2

3

4

5

6

7

0

8

1

1

7

2

2

H

3

7

3

4

5

4

5

6

7

(i-2,j+1)、(i-1,j+2)、(i+1,j+2)、(i+2,j+1)

(i+2,j-1)、(i+1,j-2)、(i-1,j-2)、(i-2,j-1)

但是,如果(i,j)靠近棋盘的边缘,上述有些位置可能超出棋盘范围,成为不允许的位置。

8个可能位置可以用两个一维数组Htry1[0..7]和Htry2[0..7]来表示:

01234567

Htry1-2-11221-1-2

01234567

Htry21221-1-2-2-1

位于(i,j)的马可以走到的新位置是在棋盘范围内的(i+Htry[h],j+Htry2[h]),其中h=0,1,2,…,7。

每次在多个可走位置中选择其中一个进行试探,其余未曾试探过的可走位置必须用适当结构妥善管理,以备试探失败时的“回溯”(悔棋)使用。

 

四、分析设计

1、概要设计

(1)、顺序栈的抽象数据类型定义:

ADTStack{

数据对象:

D={ai|ai∈(0,1,…,9),i=0,1,2,…,n,n≥0}

数据关系:

R={|ai-1,ai∈D,i=1,2,…,n}

}ADTStack

(2)本程序包含三个模块:

1、主程序模块:

voidmain(){

定义变量;

接受命令;

处理命令;

退出;

}

2、起始坐标函数模块——马儿在棋盘上的起始位置;

3、探寻路径函数模块——马儿每个方向进行尝试,直到试完整个棋盘;

4、输出路径函数模块——输出马儿行走的路径;

2、各模块之间的调用关系

五、详细设计

1、马踏遍棋盘流程

2、部分代码与截图

(1)、主程序模块

voidmain()

{

inti,j;

intx,y;

for(i=0;i

for(j=0;j

board[i][j]=0;

for(;;)

{

printf("电子商务一班程正炉请您输入棋子起始坐标—X的范围为1到8andY的坐标也为1到8)\n");

printf("\n");

printf("\n");

printf("程正炉请您输入横坐标x=");

scanf("%d",&x);//输入起始位置的横坐标

printf("\n");

printf("程正炉请您输入纵坐标y=");

scanf("%d",&y);//输入起始位置的纵坐标

if(x>=1&&x<=8&&y>=1&&y<=8)break;

printf("请注意X的范围为1到8andY的坐标也为1到8,请检查是否输错,请您重新输入。

\n");

}

printf("\n");

printf("从这里这个位置开始%d:

\n\n",8*(x-1)+y);

InitLocation(x-1,y-1);//调用起始坐标函数

}

(2)、输出路径函数模块

voidDisplay()

{

inti,j;

for(i=0;i

{

for(j=0;j

printf("\t%d",board[i][j]);//输出马儿在棋盘上走过的路径

printf("\n\n");

}

printf("\n");

}

 

六、调试分析

1、调试结果

2、调试

1、调试中的问题

(1)调试问题:

本程序设计过程中采用多文件组件工程的方式进行。

在头文件中定义了全局变量,

解决方案:

将全局变量定义为staic型变量。

或者在声明中使用extern关键字

(2)调试问题:

虽然编译都能通过,但是运行时却出错,程序不能终止,只有通过人工方式结束程序,可能是在某些地方出现了无限死循环了,马儿回溯的时候,下一次又有可能走那个方向,这样就出现了死循环。

解决方案:

标记马儿选择的方向director。

在结点结构设计上加入director

(3)调试问题:

在调试过程中,对变量的监视发现栈顶元素中director无法更新,我原本的程序代码设计是cur.director=k

解决方案:

(Path.top-1)->from=k;//保存下一步所选最佳路径下标

(4)调试问题:

当走到边界时,有可走的路,但是程序却回溯了。

解决方案:

for(intk=1+direction;k<9,k<=mayway[0];k++)//向所得的方向进行探寻

3、分析与心得

一、分析

(1)、本次实验的主要目的是在于掌握和理解栈的特性和它的应用。

在编制该程序中遇到了很多问题。

首先,在开始刚编制程序的时候遇到的问题是,程序编译都通不过,主要在一些细节的问题上,还有在程序的返回值在刚开始时也没有正确返回。

经过编译慢慢调试,编译都能通过,没有错误和警告。

(2)、虽然编译都能通过,但是运行时却出错,程序不能终止,只有通过人工方式结束程序,可能是在某些地方出现了无限死循环了,然后在仔细检查代码,发现没有标记马儿尝试的方向director,这样的话,马儿回溯的时候,下一次又有可能走那个方向,这样就出现了死循环。

(3)、标记好马儿尝试的方向后,编译运行,但是运行结果却不符合程序所要求的结果,说明在算法上肯定有错误,检查发现,马儿走的坐标没有控制后,它的横纵坐标必须控制0到7之间,否则的话马儿就会踏出棋盘以外,这样输出的结果就不对。

还有就是棋盘走过的位置要标记一下,以便下次走不重复走,当回溯的时候的记得把标记给清掉,这个地方有时候也很容易混淆。

(4)、还有一点就是,该程序运算量大,算法复杂度高,所以运行的时候很慢,特别占内存,CPU的使用也很高,几乎都在70%到90%之间,配置低了可能还运行不了

二、心得体会

通过本次实验的编写,能够掌握栈的性质以及它的应用。

但是自己掌握的东西还很不够,所以很多东西都是在同学的帮助下才完成的。

在这次课程设计之后我明天了想自己很多的不足之处,知道了自己什么地方需要加强!

争取以后能完全靠自己做出程序。

七、使用说明

用户使用手册:

本系统有8个操作,用户只需将源程序清单输入可运行C++的编辑平台,例如vc++,c++Builder等等,然后进行编译,连接,最后出现工作平台。

进入工作平台后用户可根据自己需要按界面提示进行相关操作即可。

八、小结与源程序代码清单

1、小结

通过本次实验的编写,能够掌握栈的性质以及它的应用。

这个程序也让我头疼了几次,就是运行速度很慢,要等很久才能输出结果,这样的话很占内存资源,而且CPU的使用记录也很高,主要是它需要的运算太多,所以CPU使用记录也是很高的。

通过网上查询一些算法了解到了贪心法,并运用到本程序的设计中,大大提升了算法的效率。

在该程序的编制过程中留下了一些思考的问题,就是马儿从一个起点位置开始探寻,最后马儿探寻成功的路径会不会是不只一条路径,可能还有多条路径,由于时间和精力的限制没有去深究,但是这应该值的思考的。

在用顺序栈来实现该程序之前,也尝试过用链栈来做,但是发现如果用链栈来做的话,在存储调用的时候不是很方便,或许用链栈来做应该是对自己的一种挑战。

尽管没有用链栈做不过,用顺寻栈来做在编制该程序中也收获不小。

2、源程序清单

//

(1)、定义头文件和预定义

#include

#defineMAXSIZE100

#defineN8

//

(2)、数据类型定义

intboard[8][8];//定义棋盘

intHtry1[8]={1,-1,-2,2,2,1,-1,-2};

/*存储马各个出口位置相对当前位置行下标的增量数组*/

intHtry2[8]={2,-2,1,1,-1,-2,2,-1};

/*存储马各个出口位置相对当前位置列下标的增量数组*/

structStack{//定义栈类型

inti;//行坐标

intj;//列坐标

intdirector;//存储方向

}stack[MAXSIZE];//定义一个栈数组

inttop=-1;//栈指针

//(3)、函数声明

voidInitLocation(intxi,intyi);//马儿在棋盘上的起始位置坐标

intTryPath(inti,intj);//马儿每个方向进行尝试,直到试完整个棋盘

voidDisplay();//输出马儿行走的路径

//(4)、起始坐标函数模块

voidInitLocation(intxi,intyi)

{

intx,y;//定义棋盘的横纵坐标变量

top++;//栈指针指向第一个栈首

stack[top].i=xi;//将起始位置的横坐标进栈

stack[top].j=yi;//将起始位置的纵坐标进栈

stack[top].director=-1;//将起始位置的尝试方向赋初值

board[xi][yi]=top+1;//标记棋盘

x=stack[top].i;//将起始位置的横坐标赋给棋盘的横坐标

y=stack[top].j;//将起始位置的纵坐标赋给棋盘的纵坐标

if(TryPath(x,y))//调用马儿探寻函数,如果马儿探寻整个棋盘返回1否则返回0

Display();//输出马儿的行走路径

else

printf("无解");

}

//(5)、探寻路径函数模块

intTryPath(inti,intj)

{

intfind,director,number,min;//定义几个临时变量

inti1,j1,h,k,s;//定义几个临时变量

inta[8],b1[8],b2[8],d[8];//定义几个临时数组

while(top>-1)//栈不空时循环

{

for(h=0;h<8;h++)//用数组a[8]记录当前位置的下一个位置的可行路径的条数

{

number=0;

i=stack[top].i+Htry1[h];

j=stack[top].j+Htry2[h];

b1[h]=i;

b2[h]=j;

if(board[i][j]==0&&i>=0&&i<8&&j>=0&&j<8)//如果找到下一位置

{

for(k=0;k<8;k++)

{

i1=b1[h]+Htry1[k];

j1=b2[h]+Htry2[k];

if(board[i1][j1]==0&&i1>=0&&i1<8&&j1>=0&&j1<8)

//如果找到下一位置

number++;//记录条数

}

a[h]=number;//将条数存入数组a[8]中

}

}

for(h=0;h<8;h++)//根据可行路径条数小到大按下表排序放入数组d[8]中

{

min=9;

for(k=0;k<8;k++)

if(min>a[k])

{

min=a[k];

d[h]=k;//将下表存入数组d[8]中

s=k;

}

a[s]=9;

}

director=stack[top].director;

if(top>=63)//如果走完整个棋盘返回1

return

(1);

find=0;//表示没有找到下一个位置

for(h=director+1;h<8;h++)//向八个方向进行探寻

{

i=stack[top].i+Htry1[d[h]];

j=stack[top].j+Htry2[d[h]];

if(board[i][j]==0&&i>=0&&i<8&&j>=0&&j<8)//如果找到下一位置

{

find=1;//表示找到下一个位置

break;

}

}

if(find==1)//如果找到下一个位置进栈

{

stack[top].director=director;//存储栈结点的方向

top++;//栈指针前移进栈

stack[top].i=i;

stack[top].j=j;

stack[top].director=-1;//重新初始化下一栈结点的尝试方向

board[i][j]=top+1;//标记棋盘

}

else//否则退栈

{

board[stack[top].i][stack[top].j]=0;//清除棋盘的标记

top--;//栈指针前移退栈

}

}

return(0);

}

//(6)输出路径函数模块

voidDisplay()

{

inti,j;

for(i=0;i

{

for(j=0;j

printf("\t%d",board[i][j]);//输出马儿在棋盘上走过的路径

printf("\n\n");

}

printf("\n");

}

//(5)主程序模块

voidmain()

{

inti,j;

intx,y;

for(i=0;i

for(j=0;j

board[i][j]=0;

for(;;)

{

printf("请输入棋子起始坐标(1<=x<=8and1<=y<=8)\n");

printf("请输入行坐标x=");

scanf("%d",&x);//输入起始位置的横坐标

printf("请输入列坐标y=");

scanf("%d",&y);//输入起始位置的纵坐标

if(x>=1&&x<=8&&y>=1&&y<=8)break;

printf("Yourinputisworng!

!

!

\n");

}

printf("从这里这个位置开始%d:

\n\n",8*(x-1)+y);

InitLocation(x-1,y-1);//调用起始坐标函数

}

九、参考文献

[1] 闵联营,何克右.《C++程序设计教程》.武汉理工大学出版社; 

[2] 严蔚敏,吴伟民.《数据结构(C语言版)》.清华大学出版社;

[3] 张文祥, 肖四友.《C++实验与案例分析》. 科学出版社; 

[4] 谭浩强.《C++程序设计》. 清华大学出版社; 

[5] 朱战立.《数据结构(C++语言描述)》(第二版本).高等教育出版社。

[6]陆蓓.C语言程序设计(第二版)[M].北京:

科学出版社,2009

[7]严蔚敏.数据结构:

C语言版[M].北京:

清华大学出版社,2007.

 

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 高等教育 > 研究生入学考试

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1