跳舞搭配问题课程设计报告.docx
《跳舞搭配问题课程设计报告.docx》由会员分享,可在线阅读,更多相关《跳舞搭配问题课程设计报告.docx(23页珍藏版)》请在冰豆网上搜索。
跳舞搭配问题课程设计报告
(一)PROTEL部分
1.任务说明:
(1)熟练掌握PROTEL软件的使用;
(2)按要求绘制电路原理图和PCB版图(能够用自动布线和手动布线相结合);
(3)能够按要求建立元件库和封装库。
2.原理图绘制说明:
(1)练习学会使用PROTEL99SE软件。
从中我们要学会使用PROTEL99SE软件来绘制任一原理图以及任一PCB原理图。
首先是安装这个软件,在基本掌握这个软件的使用说明时,开始绘制原理图。
打开PROTEL99SE,新建一个PROTEL工程,在Document中分别新建一个原理图,如图:
图1新建原理图
(2)画原理图库,封装,和封装库。
根据任务书上的电路原理图,去库里找相对应的元件对应摆好。
由于我这个电路原理图比较特殊,有单片机数码管器件,在库存里不能找到,需要自己人工绘制且绘制起来比较麻烦,当将这些元器件画出来并在原理图中摆好后,将它们再依次连接起来,并用PageUp和PageDown键依次为放大、缩小键,可以调节电路图的清晰度,便于检查。
检查无误后便可以保存原理图,则原理图绘制完毕。
自己画40个脚的单片机首先要要去图1中那样建立一个自己的元件库,首先点击SchematicLibrary,保存到指定的文件夹,然后先画一个正方形,再加上需要的管脚数,点击管脚,修改属性,然后加上元件名称,保存,自己的元件库就建立了起来。
图2自己画的40个脚单片机
画好原理图后,需要对原理图进行封装,封装的方法是,点击各个元器件,在Footorint栏中填写上援建的封装号,如元件数码管是一个14个管脚的器件,查的他的封装号是DIP14,即在Footorint栏中填写上DIP14,这样一个元件就封装完毕,把所有的元件封装完毕。
图3电路中的元件进行封装
3、检查原理图的正确性和生成网络表
原理图封装完毕后,需要检查原理图,我们的具体做法是,在PROTEL99界面中点击Tools下的ERC,然后点击确定,看是否自己画的原理图是不是合格的,有没有错误。
图4检查原理图
在确定自己画的原理图没有错误后,需要生成网络表,生成网络标的办法是在Design键中找到CreateNetlist,点击,就生成了自己所画的正确的原理图的网络表。
图5生成的部分网络表
4、印制PCB版图绘制说明:
在绘制PCB原理图之前,新建一个PCBDocment,新建PCBDocment,的操作如下图:
图6新建一个PCBDocment,
点击菜单栏中的文件菜单,新建一个PCBDocment,导入网络表,便会自动生成PCB原理图,用粉色线将原理图圈至框内,制成印制板边框图,给板布局,使板子既经济又美观。
然后点击“自动布线”,给板全部布线。
但是由于部分原因我们在导入网络表之后,有的元器件导线,这个时候我们就要从新回到第一步,看自己话的原理图是否完全正确,一般原理图出现的问题是我们画导线时,导线与元器件的接口没有接好,后导致我们生成的PCB图中的元器件没有导线相连,在仔细检查我们的原理图后,我们重新生成检查后的原理图的网络表,然后我们在重复建立PCB图的步骤,,如果我们在确定自己的原理图正确,但是生成的PCB途中为部分元器件还是没有导线,这个时候就需要我们自己手动布线,手动布线的方法是:
点击缺少线的元器件的管脚,弹出一个对话框,对话框弹出后点击Advanced选项,里面有Net选项,对照自己的原理图,看该元器件的管脚是与那个另外其他的元器件相连,在Net中找到该元器件,确定后,导线就相连。
导线连接完毕后就是手动布局,首先确定PCB板的大小,我们一定要选择一个合适的大小,太大浪费板,太小,元件布局不开,自己手动把各个元器件拉到指定的位置,元器件可以旋转等,最后在KeepoutLayer键中选择全部局,最后便生成最完美的印制版图。
图7生成的PCB图
4.对所绘制电路进行简要分析:
该电路由单片机、数码管器件、电阻、电容、蜂鸣器、无极性电容等基本元件组成,电路构造比较复杂,但是原理比较通俗易懂。
制版图中,同色线没有相交叉,并且元件引脚均已连接正确,说明电路图连接准确,可以生成制板。
5.总结:
通过PROTEL99SE软件的课设,我掌握了PROTEL99SE软件的应用方法,加深了我对电路及电子信息工程专业的了解,也对PCB板的制作有了较深的印象,为以后在电子行业的发展,奠定了一定的基础。
通过这次课设也我深刻地体会到身为一名专业设计人员自身应该具备的严谨、细心、负责的工作态度和作风,为我将来在专业方面的发展打下坚实的基础,但是在做的过程中我也遇到了许多困难,软件运用不熟悉,原理不太理解等,我及时的向同学和老师请教和答疑,去图书馆查找资料,上网搜索资料,最终克服了重重困难,完成了自己的课程设计,在此过程中收获很多,在今后的学习过程中我会更加努力,丰富充实自己的知识,完成自己学习任务,为以后的工作等打下一个坚实的基础。
6.参考文献
1、韩晓东,李勇江.Protel99SE电路设计实用教程.[M]北京:
中国铁道出版社,2007.
2、邵建昂.Protel99教学实践探讨.实验室研究与探索,2007,26
(2):
100-105.
3、文艳等编著.Protel99SE电子电路设计.[M]北京:
机械工业出版社,2006.8
4、老虎工作室.Protel99SE多层次电路板设计与制作.[M]北京:
人民邮电出版社,2007年.2--18页。
5、莫力.《Protel99SE电路设计》北京:
国防工业出版社,2005.01
6、刘天旺主编.Protel99SE电路设计应用教程.[M]北京:
电子工业出版社,2007.8
附录I电路原理图
附录II印制板图
(二)软件设计部分
一、任务说明:
1.设计内容:
一班有m个女生,有n个男生(m不等于n),现要开一个舞会.男女生分别编号坐在舞池的两边的椅子上.每曲开始时,依次从男生和女生中各出一人配对跳舞,本曲没成功配对者坐着等待下一曲找舞伴.
请设计一系统模拟动态地显示出上述过程,要求如下:
1)输出每曲配对情况
2)计算出任何一个男生(编号为X)和任意女生(编号为Y),在第K曲配对跳舞的情况.至少求出K的两个值.
2.需求:
本课题要对数目不等的男生女生跳舞进行搭配,设计需要解决每一首曲子
男生女生的搭配情况,要采用循环队列的模式来解决,男生和女生各在两个循环
的队列中,每首曲子开始,便在两个队首各取一人成功配对跳舞,并进入队尾,
等待下一次配对。
,通过对两个循环队列的输出、入列操作,就可以简单实现要求,动态的模拟出舞池两边那女生的搭配情况.
例如:
(4男5女情况)
第一首:
男1和女1
第二首:
男2和女2
第三首:
男3和女3
第四首:
男4和女4
第五首:
男1和女5
--------------------------
-------------------------
-----------------------------
二、设计过程
1、文字说明:
要模拟动态地显示出现题目中所要求的循环,我们要先建立两个循环队列SqQueueboys和SqQueuegirls。
1)将男生、女生两组人分别存入这两个队列。
以实现他们的循环配对输出。
2)利用循环队列的特性,将男女生分别进行入队列和出队列操作,实现搭配输出。
3)循环队列的长度分别设为男女生的个数。
4)在计算机终端输出的结果是:
(1)输入数据
(2)输出每曲配对情况
(3)输出第K曲配对情况
(4)退出
2、程序流程图:
为实现上述功能和目的,要用到循环队列的相关知识,同时,要定义一定的抽的数据类型,主函数调用各个函数模块
1.各模块函数介绍:
1)classcirularQueue
作用:
定义一个一个循环队列
2)~cirularQueue()
作用:
定义析构函数,使对象在撤销时释放
3)boolIsFull()
作用:
判断队列是否已满
4)boolIsEmpty()
作用:
判断队列是否为空,用于出队列前使用
5)voidpush(Tinfo)
作用:
入队。
每对舞伴跳完舞之后,做入队处理,到达队尾,等待下次跳舞。
6)voidPop(T&info)
作用:
出队。
每取曲子响起时男生队列和女生队列作出队处理,两人跳舞。
7)voidGetHead(T&info)
作用:
取队首元素,对出队的男女进行识别。
8)voidInitqueue(cirularQueue&,int);
作用:
初始化队列
9)voiddisplay(int,int);
作用:
根据男生和女生的人数和曲目的数目,来判断每曲歌的男女配对情况
10)voidcharge(int,int);
作用:
判断指定组合能否配对成功
2.本程序包含三个模块:
1)主程序模块:
voidmain()
{
初始化;
do{
接受命令;
处理命令;
}while(“命令”=”退出”)
}
2)、集合单元模块——实现集合的各个函数模块
3)、结点结构单元模块——定义集合的结点结构
3、主框图和各子框图模块设计
1)主函数调用关系图
要模拟动态地显示出现题目中所要求的循环,我们要先建立两个循环队列SqQueueboys和SqQueuegirls。
将男生、女生两组人分别存入这两个队列。
以实现他们的循环配对输出。
利用循环队列的特性,将男女生分别进行入队列和出队列操作,实现搭配输出。
图1主函数调用关系
为了提高效率和其他原因,引入了初始化列表,因为初始化列表比把组合成员放在构造函数中初始化,省略了调用组合成员对象的赋值构造函数,
2)每曲配对函数调用关系图voiddisplay(int,int)
否
是
图2每曲配对函数调用关系图
4队满判断boolIsFull()
图3队满判断图
5对空判断原则boolIsEmpty()
图4队满判断空判断图
6入队流程voidpush(Tinfo)
图5入队满流程图
7出队流程voidPop(T&info)
图6出入队满流程图
8.取队首元素代码voidGetHead(T&info)
三、调试过程及实验结果
1、调试过程
一开始的调试中,做循环的时候无法是出来的人员回到原来的队列中,后来询问老师后,老师帮助改正,队员能回到了自己的队列,但再次调适自己的程序的时候发现,我输入男生的人数和女生人数时,程序总出现了输入错误,自己寻找了很长时间没有找到,找到同学帮忙,最后发现是在编写程序的时候自己把男生和女生的人数都提前确定了,,所以到后来自己输入男生和女生的人数时总是错误的,修改完成后最后程序运行时还是有些错误和警告,老是提示非法操作。
在不断改善程序后,程序得以顺利运行。
2、实验结果
最后的运行结果完成了软件设计任务中的功能如下:
1.完成了输出每曲配对情况的功能
2.完成了计算出任何一个男生(编号为X)和任意女生(编号为Y),在第K曲配对跳舞的情况.至少求出K的两个值.的功能。
(1)程序最初的运行结果(如图所示)
图7程序最初运行图
(2)各曲配对情况(如图所示)
图8各曲配对情况图
(3)根据男女编号查找对应的曲数(能配对)
图9根据男女编号查找对应的曲数图(能配对)
(4)根据男女编号查找对应的曲数(不能配对)
图10根据男女编号查找对应的曲数图(不能配对)
四、结论
这次课程设计及运用了C++,程序开始定义了classcirularQueue,其中有头指针,尾指针等。
随之定义了析构函数,释放对象,然后进行了队列的基本操作,有队列的申明,判断队空及队满,出队,入队,其核心是display()函数和charge()函数,其中display()用于对各位同学编号和每队的输出情况,charge()用于计算已编号的同学在第几曲中进行配对。
循环队列是一种环状的队列并且对头元素指向队尾元素,运用循环队列的基本操作顺利的解决学生舞曲搭配问题,主要利用用循环队列的环状结构,循环地执行出列入列操作并在出队列时进行配对并输出配对情况,而整个过程不需要不需要移动元素使程序在空间复杂度上降到最小,采用指针的移动大大加快了程序的执行效率。
并且对输入进行了改进,以防止用户随意输入时出现的各种意想不到的错误。
通过本次课设复习了C语言的知识,对C++的运用惊醒了进一步的掌握,同时我对软件的编程有了很深的了解,运用方面有了长足的进步,但是在做的过程中我也遇到了许多困难,我及时的向同学和老师请教和答疑,去图书馆查找资料,上网搜索资料,最终克服了重重困难,完成了自己的课程设计,再次过程中收获很多,在今后的学习过程中我会更加努力,丰富充实自己的知识,完成自己学习任务,为以后的工作等打下一个坚实的基础。
五、参考文献
1.谭浩强,《C程序设计》,北京,清华大学出版社,2005
2.刘彦明.《计算机软件技术基础教程》.西安,西安电子科技大学出版社,2001.2
3.王士元,《C高级实用程序设计》,北京,清华大学出版社,1996
4.朱振元.《数据结构(C++语言描述)》北京:
清华大学出版社,2007
5.郑红军,《C语言程序设计基础实验与综合练习》,武汉,武汉大学出版社,2011.1
6.姜仲秋,《C语言程序设计》,南京,南京大学出版社,1998.1
附录I
程序清单
#include
template
classcirularQueue//定义一个一个循环队列
{private:
intMaxSize;
intfront;//头指针
intrear;//尾指针
T*data;
public:
cirularQueue(intMaxLength)
{MaxSize=MaxLength;
front=rear=0;
data=newT[MaxLength];
}
~cirularQueue()//定义析构函数,使对象在撤销时释放
{front=rear=0;
delete[]data;
}
voidInitqueue()//队列的申明
{for(inti=0;ipush(i);
}
boolIsFull()//判断队列是否已满
{if((rear+1)%MaxSize==front)
returntrue;
elsereturnfalse;
}
boolIsEmpty()//判断队列是否为空
{if(front==rear)
returntrue;
elsereturnfalse;
}
voidpush(Tinfo)//入队
{if(IsFull())
{cout<<"错误!
队列已满!
"<exit(-1);
}
else
{data[rear]=info;
rear=(rear+1)%MaxSize;
}
}
voidPop(T&info)//出队
{if(IsEmpty())
{cout<<"错误!
队列为空!
"<exit(-1);
}
else
{info=data[front];
front=(front+1)%MaxSize;
}
}
voidGetHead(T&info)//取队首元素
{if(IsEmpty())
{cout<<"错误!
队列为空!
"<exit(-1);
}
else
{info=data[front];
}
}
};
intmain()
{cout<<"请分别输入男生和女生的人数:
";
cin>>m>>n;
display(m,n);
inta=0,b=0;
charquit='y';
while(quit!
='n')
{cout<<"请输入男生和女生的编号:
";
cin>>a>>b;
while((a>m)||(b>n))
{cout<<"输入的编号过大,请重新输入:
";
cin>>a>>b;
}
charge(a,b);
cout<<"是否继续(是请输入'y',否则请输入'n'):
";
cin>>quit;
}
return0;
}
voidInitqueue(cirularQueue&Q,intm)//初始化队列
{for(inti=1;i<=m;i++)
Q.push(i);
}
voiddisplay(intm,intn)
{cirularQueueman(m+1);
cirularQueuewoman(n+1);
Initqueue(man,m);
Initqueue(woman,n);
cout<<"请输入曲目数:
";
cin>>songnum;
cout<<"每曲的配对情况为:
"<for(intk=1;k<=songnum;k++)
{intx=0,y=0;//男生和女生的编号
man.Pop(x);//男生按顺序出队跳舞
woman.Pop(y);//女生按顺序出队跳舞
cout<<"第"<\t"<"<man.push(x);//跳完舞后男生再次进入队列等在下一次跳舞
woman.push(y);//跳完舞后男生再次进入队列等在下一次跳舞
}
}
voidcharge(inta,intb)
{intcount=0;//定义舞曲计数以记录他们能在第几曲时在一起跳舞
cirularQueueman1(m+1);
cirularQueuewoman1(n+1);
Initqueue(man1,m);
Initqueue(woman1,n);
while(count<=songnum)
{intx,y;
count++;
man1.Pop(x);
woman1.Pop(y);
man1.push(x);
woman1.push(y);
if((x==a)&&(y==b))
{cout<<"第"<\t"<"<break;
}
}
//如果他们在这个舞会上不能在一起跳舞,则输出
if(count==songnum+1)
cout<<"他们在这个舞会上不可能在一起跳舞"<}