八皇后问题课程设计报告Word下载.docx
《八皇后问题课程设计报告Word下载.docx》由会员分享,可在线阅读,更多相关《八皇后问题课程设计报告Word下载.docx(22页珍藏版)》请在冰豆网上搜索。
二、基本要求及说明
(1)电路原理图图纸尺寸按照给定的任务作相应的设置;
(2)电路原理图见PROTEL训练任务部分;
(3)按指定电路图在PROTEL99中绘制原理图和印制板图;
(4)按照给定要求创建原理图器件和该器件的相应的封装。
根据给定的资料创建芯片7805及其封装形式。
按软件设计要求实现相应的功能(见软件设计任务部分)
三、按照要求撰写总结报告
成绩评定表
评语、建议或需要说明的问题:
指导教师签字:
日期:
成绩
PROTEL训练任务
软件设计任务
在8*8的棋盘上放8个(皇后)棋子的所有合理布局,布局的合理规则是:
在棋盘上的任何一行,一列及任意一条对角线上,都不能出现两个棋子。
算法的基本思想:
利用试探和回溯的搜索技术求解。
若第k列棋子放在第I行上,不和棋盘上已有的棋子发生冲突,则继续为第k+1列的棋子寻求合适的位置。
若I从1到8都不合适,则退而修改第k-1列棋子位置。
直到k=8表示构成一个合理布局。
试用非递归方法模拟上述过程。
PROTEL部分
一、任务说明:
二、原理图绘制说明:
电路原理图的设计与绘制的流程,包括设置电路图纸、放置元器件、调整元器件的布局、放置导线和添加注释等步骤。
1、新建一个设计数据库文件和原理图文件,并打开原理图设计编辑器。
新建原理图文件步骤:
(1)打开文件->
新建文件(如果当前已经有一个设计打开,则改为打开文件->
新建设计)。
(2)单击设计导航中的Document项,并执行文件->
新建命令打开NewDocument对话框。
(3)双击NewDocument对话框Document选项卡中的SchematicDocument图标,此时Protel将新建一个后缀名为.Sch的原理图文件。
(如图1所示)
图1新建原理图文件
(4)在设计导航中单击新建的原理图文件打开原理图设计编辑器。
(如图2所示)
图2原理图设计编辑器
2、设置图纸环境
点击设计->
选项,打开文档选项对话框。
根据要求设置为A4图纸。
(如图3所示)
图3页面属性设置
3、放置元件及原理图布线
(1)点击原理图管理器“浏览窗口”标签切换到原理图管理器。
(2)点击“浏览”下的下拉式l列表框,并从列表框中选择“库”项。
(3)在元件库中选择电路所需的元件,单击“放置”按钮,单击鼠标左键放置元器件,鼠标右键取消放置元器件的状态。
(4)双击元器件,改变其参数。
(5)单击画导线工具,将光标移到管脚处,单击鼠标左键进行连线。
(6)连接好整个电路图。
三、印制版图绘制说明
在绘制电路板之前,要对电路板有一个总体的规划,,具体包括电路板的物理尺寸、元器件的封装,以及各元器件的摆放位置等。
印制板图的绘制主要分为以下几个步骤:
1、生成网络表文件:
(1)单击要生成网络报表的原理图。
(2)选择“设计”菜单下的“创建网络表”弹出网络表对话框,设置网络表的各项参数。
(3)设置完网络创建对话框后单击OK按钮,此时将生成网络报表文件。
2、制作PCB元件
单击左侧的管理浏览器中的DOCUMENT图标,并新建一个默认名为PCBLIB1.LIB的文件。
3、PCB的设计
(1)定义元器件的封装
原理图绘制完成后,正确加入网络表,系统会自动地为大多数元器件提供封装。
(2)元器件布线规则的设置
这里主要设置PCB板的禁线区的大小,只能在禁线区内绘制PCB版图。
(3)生成并加载网络表
只有将网络表装入PCB系统后,才能进行电路板的自动布线。
在设计好的PCB板上生成网络表和加载网络表,必须保证生成的网络表没有任何错误,其所有的元器件都能够加载在PCB板中。
(PCB文件的建立如图8所示)
图8新建PCB文件
(4)元器件手工布局
由于一般元器件自动布局都不很规则,甚至有的相互重叠,因此必须手动调整元器件的布局。
(5)自动布线
设置好布线规则之后,可以利用系统提供的自动布线功能进行自动布线。
(6)手工布线
自动布线结束后,有可能因为元器件的布局使自动布线无法完全解决问题或产生布线冲突,此时就需要进行手工布线加以调整。
四、总结
通过这一周的Protel课程设计,我认识了Protel软件,并且学会了如何使用这个软件,通过自己不断的练习画图,我已经能熟练掌握用Protel软件对所绘制电路进行简要分析,同时也了解了该软件的部分原理。
刚开始的时候,用Protel软件设计电路对于初学者的我们来说是一个较为复杂的过程,掌握这个软件确实有一定的难度,从最开始的找元器部件就非常的困难,连线和删除等都还不熟练,封装的时候各部件的名称识别也比较困难,因此在刚开始做时就特别的浪费时间,但随着画的图越来越多,对各方面的功能也就掌握的比较熟练了。
但在生成网络表时,却出现了很多的错误,由于我们对电路原理掌握的不多,因此找起错误来就特别的麻烦。
这时候,我们就寻求了老师的帮助,解决了困难,顺利的完成了我的第一周课设任务。
我们是学习电子的,经常会接触电路板,应用这个软件,我们在电脑上进行全程设计,从原理图到PCB板,并且在电脑上可以进行检查,然后在实际中就可以作出电路板,十分方便,不会浪费资源。
然后,也加强了我们的学习能力,写报告的时候,我也遇到了一些问题,也要老师没讲的,或者讲过,我们没有注意听,通过问老师,同学,并且自己看书,在电脑上不停的进行实践操作,使我更好的学习了Protel99SE。
也加强了我们的动手操作能力。
附录I电路原理图
附录II印制板图
五、参考文献
1.作者:
杜刚书名:
《电路设计与制版——Protel应用教程》出版社:
清华大学出版社出版年2006
2.作者:
张伟书名:
《Protel99SE基础教程》出版社:
人民邮电出版社出版年2006年
3.作者:
池之恒书名:
《ProtelDXP电路原理图与电路板设计教程》出版社:
海洋出版社出版年:
2004年
4.作者:
郭燕春 书名:
《Protel 2004电路原理图及PCB设计》 出版社:
机械工业出版社
5.作者:
崔玮 书名:
《Protel99SE电路原理图与电路板设计教程》 出版社:
海洋出版社
软件设计部分
一、题目分析
本次我的课程设计的题目是八皇后问题。
要求是在8*8的棋盘上放8个(皇后)棋子的所有合理布局,布局的合理规则是:
若第k列棋子放在第I行上,不和棋盘上已有的棋子发生冲突,则继续为第k+1列的棋子寻求合适的位置。
直到k=8表示构成一个合理布局
八皇后问题是一个古老而著名的问题,该问题是十九世纪著名的数学家高斯1850年提出的,并作了部分解答。
高斯在棋盘上放下了八个互不攻击的皇后,他还认为可能有76种不同的放法,这就是有名的“八皇后”问题。
在国际象棋中,皇后是最有权利的一个棋子;
只要别的棋子在它的同一行或同一列或同一斜线(正斜线或反斜线)上时,它就能把对方棋子吃掉。
所以高斯提出了一个问题:
在8*8的格的国际象棋上摆放八个皇后,使其不能相互攻击,即任意两个皇后都不能处于同一列、同一行、或同一条斜线上面,问共有多少种解法。
现在我们已经知道八皇后问题有92个解答。
八皇后问题是一个比较有趣,也比较难求解的问题,我结合了数据结构的内容分析,运用了数组知识,数组的下标i表示棋盘上的第i列,a[i]的值表示皇后在第i列所放的位置。
程序中首先假定a[1]=1,表示第一个皇后放在棋盘的第一列的第一行的位置上,然后试探第二列中皇后可能的位置,找到合适的位置后,再处理后续的各列,这样通过各列的反复试探,可以最终找出皇后的全部摆放方法。
为了实现这些功能,我编写了place()函数、print()函数和nqueen()函数。
首先调用place()函数来判断摆放每个皇后是否合理,再调用nqueen()函数来检查此皇后棋子是否和棋盘上已有的棋子发生冲突,如果不冲突,则继续寻找下一个皇后的合适位置,如果冲突,则退而修改上一个皇后的位置。
二、设计过程(程序流程图)
本程序是在主函数main的基础上运行的,由主函数main调用子函数placeprintnqueen来实现其全部功能。
该程序采用回溯法。
最后将结果输出并保存。
1.主函数
图1主函数流程图
2.place()子函数的设计:
intplace(intk)//判断k位置摆放皇后是否合理
{
inti=1;
while(i<
k)
{
if(Q[i]==Q[k]||(abs(Q[i]-Q[k])==abs(i-k)))return0;
//两个棋子如果在同一斜行或者同一列,则不成立
i++;
}
return1;
}
此子函数是用来判断皇后棋子摆放的位置是否合理。
首先定义列数为变量i,并赋值为1。
若皇后棋子所在的列数i小于可以取得的列的最大值k,则此列存在,返回true,接着用一个表达式说明两个棋子如果在同一斜行或者同一列,则不成立,返回false,place函数流程图如下所示:
图2place()函数流程图
3.print()子函数的设计:
voidprint()//打印结果
for(inti=1;
i<
N+1;
i++)
printf("
%d"
Q[i]);
\n"
);
此子函数是用来打印出每一个符合题目要求的棋子所在的行数。
首先定义变量皇后棋子所在的列数,再判断此变量是否小于最大值N+1,若此命题为真,则输出皇后所在的行数,若为假,则返回。
print()函数流程图如下所示:
图3print()函数流程图
4.nqueen()子函数的设计:
voidnqueen(intk)//
intcount=0;
//解决方案数
while(k>
=1)
{
Q[k]++;
while(Q[k]<
=N&
&
!
place(k))//从第一个位置开始试探摆第k个皇后
if(Q[k]<
=N)//第k个皇后安全时在棋盘内
if(k==N)//已经是第最后一个皇后则得到一个解决方案
count++;
count);
print();
elsek++;
//继续处理下一个皇后
elseQ[k--]=0;
//第k个皇后安全时不在棋盘内,则回溯
此子函数是用来查找皇后棋子具体的位置。
开始时定义自变量和列数k,判断列数是否大于等于1,如果为真,则继续进行行数加1,如果为假,则返回。
当棋子所在的行数小于行数的最大值并且在place函数中返回0时,则在此子函数中为真,则继续进行行数加1,如果为假,则回到初始时的判断。
nqueen()函数流程图如下所示:
图4nqueen()函数流程图
三、调试过程及实验结果
调试分析:
进行八皇后的排序后,有92种排法,我把92种结果运行出来
实验结果:
四、结论
通过一周的软件课程设计,我对计算机软件技术基础有了更深入的理解,我的课设题目是八皇后问题,为了做好课设,我不断的上网查阅资料和向老师的帮助,这对我解决问题有了很大的帮助,通过此次课设,我学会了什么叫做回溯法和试探法,还有递归与非递归的区别。
当然,在程序运行过程中,我不可避免地遇到了很多问题,比如函数不能调用,功能无法实现,编译错误等等,经过老师、同学的帮助,程序终于可以正常运行了。
我觉得出现错误并不可怕,重要的是我们要敢于发现错误。
通过这次课设,我了解到了在编程过程中我们一定要有足够的耐心与细心。
1.王士元,《C高级实用程序设计》,清华大学出版社,1996
2.梁翎,《C语言程序设计实用技巧与程序实例》,上海科普出版社,2000
3.谭浩强,《C程序设计》,清华大学出版社,2005
4.潘锦平,《软件系统开发技术》,西安电子科技大学出版社,2000
5.徐宝文,李志,《C程序设计语言》,机械工业出版社,2004
六、程序清单
#include<
stdio.h>
stdlib.h>
math.h>
#defineN8//皇后个数
intQ[N+1]={0};
//定义棋盘
=k)
if(Q[i]==Q[k]||(abs(Q[i]-Q[k])==abs(i-k)))returnfalse;
returntrue;
voidprint()//打印结果
voidnqueen(intk)//
place(k))//从第一个位置开始试摆第k个皇后
if(Q[k]<
=N)//第k个皇后安全时在棋盘内
if(k==N)//已经是第最后一个皇后则得到一个解决方案
intmain()
nqueen
(1);
return0;