软件综合课程设计_第1页
软件综合课程设计_第2页
软件综合课程设计_第3页
软件综合课程设计_第4页
软件综合课程设计_第5页
已阅读5页,还剩20页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

沈阳航空航天大学课程设计报告课程设计名称:软件综合课程设计

课程设计题目:连通图的着色问题院(系):计算机学院专业:计算机科学与技术班级:学号:姓名:指导教师:说明:结论(优秀、良好、中等、及格、不及格)作为相关教环节考核必要依据;格式不符合要学术诚信声明本人声明:所呈交的报告(含电子版及数据文件)是我个人在导师指导下独立进行设计工作及取得的研究结果。尽我所知,除了文中特别加以标注或致谢中所罗列的内容以外,报告中不包含其他人己经发表或撰写过的研究结果,也不包含其它教育机构使用过的材料。与我一同工作的同学对本研究所做的任何贡献均己在报告中做了明确的说明并表示了谢意。报告资料及实验数据若有不实之处,本人愿意接受本教学环节“不及格”和“重修或重做”的评分结论并承担相关一切后果。本人签名:日期:2017年月日

课程设计任务书课程设计名称软件综合课程设计专业计算机科学与技术学生姓名班级学号题目名称连通图着色问题起止日期2016 年12月19日起至2017 年 1月13日止课设内容和要求:输入一个连通无向图到适当的存储结构中,图的结点数由键盘输入,给图上的每一个结点标记一种颜色,在保证任何相邻结点颜色不同的前提下,求解出该无向连通图所需要的最少颜色数,并给出每个结点的具体颜色,输出连通图着色动态演示过程。设计要求:系统米用可视化编程实现;利用所学知识,设计相应的数据结构;开发工具选择面向对象的C++等;4•界面友好,操作方便;5.按照课程设计规范书写课程设计报告参考资料:面向对象的程序设计方法语言及数据结构和离散数学相关资料教研室审核意见: 教研室主任签字:指导教师(签名) 年 月 日学生(签名) 2016年12 月18日

课程设计总结:这次的课程设计让我学到了很多东西,也复习了许多知识,在专业知识方面:复习了离散数学中关于图的着色算法,这次课设采用的是鲍威尔算法;由于刚开始是用C++写的,所以顺带复习了一下C++编程,前期基本功能都已经实现了。由于课设要求界面,恰好这个学期学了JAVA,所以后期把代码转换成JAVA。在其他方面:更加娴熟的利用网络进行答疑解惑,参考和吸取自己有用的东西。比如说刚开始不会做界面,回去复习和研究了老师上课课件的例子,试着编写,不懂就百度,总能找到答案。还有就是,刚开始不会用键盘输入数据,不会画圆,不会连线,不会改变字体颜色等,这些都是从网上百度学会的。最后,在功能步步实现的时候,心中涌现的是种喜悦,也许这就是程序员的乐趣所在吧。下个学期还有毕设,通过这个课设让我更加熟练的使用Eclipse,为下个学期的毕设做准备。指导教师评语:指导教师(签字): 年月日课程设计成绩目录TOC\o"1-5"\h\z题目的内容与要求 5\o"CurrentDocument"1.1题目的内容 5\o"CurrentDocument"1.2题目的要求 5\o"CurrentDocument"题目理解与程序解读 5\o"CurrentDocument"总体设计 7\o"CurrentDocument"程序框架设计 7\o"CurrentDocument"程序数据结构设计 7\o"CurrentDocument"详细设计 9\o"CurrentDocument"主程序流程图 9\o"CurrentDocument"子函数流程图 10\o"CurrentDocument"构造函数Graph(intvexnum,intatcnum) 10\o"CurrentDocument"邻接表函数int_Xlist() 10度数排序子函数int_Dushu() 12\o"CurrentDocument"结点着色子函数Brust_color() 13画板画图子函数Paint() 14\o"CurrentDocument"调试分析 15\o"CurrentDocument"运行说明 15\o"CurrentDocument"4.1测试用例1 15\o"CurrentDocument"4.2测试用例2 16\o"CurrentDocument"参考文献 18\o"CurrentDocument"源程序(清单) 191题目的内容与要求1.1题目的内容输入一个无向图到适当的存储结构中,给图上的每一个结点标记一种颜色,在保证任何相邻结点颜色不同的同时,求解出该图所需要的最少颜色数,并给出每个结点的具体颜色。1.2题目的要求系统采用可视化编程实现;利用所学知识,设计相应的数据结构;开发工具选择面向对象的C++等;4.界面友好,操作方便;5.按照课程设计规范书写课程设计报告1.3题目理解与程序解读本次课设与离散数学当中图的部分有密切的联系,连通图的着色问题,涉及到图的连通性和图的着色问题。当图的结点之间存在通路,则此图是连通的,在此基础之上对他进行着色。重要之处在于每个进店标记一种颜色,但要求的是相邻的结点要着上不同的颜色,要求所使用的颜色数最少即是所要求的。解决此题的算法是韦尔奇.鲍威尔的着色理论,算法如下:(1) 将图的结点按照度数的递减顺序进行排列,(这种排列可能不是唯一的,因为有些点有相同的度数)。(2) 用第一种颜色对第一个结点进行着色,并且按排列次序,对于前面着色点不相邻的每一个结点着上同样的颜色。(3) 用第二种颜色对尚未着色的点重复第二个步骤,用第三种颜色继续这种做法,直到所有的点全部着上色为止。所以源程序就是对韦尔奇鲍威尔算法演示。首先输入结点个数和边的个数,结点结构体内包含结点编号,度数,结点的颜色和状态。边的结构体当中包含结点结构体变量,用来指示边起始节点和终止结点,同时还包含边的编号。对输入的图用关联矩阵来表示,对着色的颜色用整型的数字来表示,所以我们规定数字1—5分别表示为绿色,蓝色,黄色,红色和黑色。初始化颜色为绿色,即是为数字1.总体设计2.1程序框架设计这个课程设计用java编写的,用一个图类,成员方法包括图的邻接矩阵建立,度数排序,结点着色函数和画板画图函数具体设计如下流程图2.1图2.1程序框架流程图2.2程序数据结构设计定义一个图类,成员变量包括:结点数vexnum,边数actnum;用二维数组当作邻接矩阵xlist[][];保存各点度数的数组Dushu[];标记各点是否着色的变量flag[];m1[]是用来保存各点度数递减的下标;color[]用来保存第i点应该着第color[i]种色;widthl和height1为界面的大小。具体代码如下:publicstaticintvexnum; ///////点和边publicstaticintatcnum;publicstaticintxlist[][]=newint[50][50];///////邻接表publicstaticintDushu[]=newint[50]; //度数public intflag[]=newint[50];////////////着色标记,publicstaticintm1[]=newint[50];///////////////度数递减的下标排序publicstaticintcolor[]=newint[50];public intwidth1=1000,height1=1000;图类的成员方法包括:图类的构造函数,主要是初始化要输入的图的结点数和边数。publicGraph(intvexnum1,intatcnuml)//初始化邻接矩阵,通过输入某条边的两个点来初始化邻接矩阵。publicint[][]int_xlist()各结点度数排序,读出个点度数,把度数递减排序,在对应把度数所对应的结点号输出。public int[]int_Dushu()结点着色函数,从度数最大的点和不与该点相连的点开始同一种着色。publicint[]Brust_Color()画板画出输入的图并着色。publicvoidpaint(Graphicsg)

详细设计3.1主程序流程图图3..1主函数主函数里分别执行了构造函数,邻接表的建立函数,度数排序函数,着色函数,和画板画图函数。首先根据提示输入结点数和边数,然后在输入边的关系,分别以各个边的起点,终点的方式输入,回车控制框内计算出输入图的邻接矩阵,各个结点的度数排序以及各个点的着色情况。具体流程如上流程图3.13.2子函数流程图3.2.1构造函数Graph(intvexnum,intatcnum)此部分为图的信息的初始化,接收输入图的结点数和边数以及框架模式,画板的大小,背景颜色。为后面的工作做准备。具体流程如下流程图3.2图3.2构造函数3・2・2邻接表函数int_Xlist()此部分是建立邻接矩阵。首先初始化邻接矩阵xlist[][]=O,然后通过从输入框输入的边的关系存于临时数组,其中vex_vex[i][0]是起点,vex_vex[i][l]是终点。然后,在把邻接矩阵中第i行的各个元素xlist[vex_vex[i][0]][vex_vex[i][1]]设置为1。最后在控制台输出邻接矩阵。具体流程如下流程图3.3图3.3邻接表函数3.3.3度数排序子函数int_Dushu()此部分是将各个结点的度数按递减的顺序进行排列。首先用2个循环吧各个结点的度数统计出来,然后存于Dushu[i]数组中对应的i就是i点的度数。把Dushu[]数组赋值给temp[],在对temp[]使用冒泡排序,得到度数递减序列。再把各个结点和度数想对应,就能得到度数递减的结点号保存在数组m1[]中,最后并输出这个序列以及该点对应的度数。具体流程如下流程图3.4。开始NKvexnumj<yeKnuniNKvexnum结束i<vexnum-3+[j]==1且开始NKvexnumj<yeKnuniNKvexnum结束i<vexnum-3+[j]==1且iflag[j]!=0aatenp[i]==Dus^u[j]输出度数排序te[np[il=Dushu[ili++:给酬冒泡排序3存于七曰1口[]中j]++;图3.4度数排序函数3.3.4结点着色子函数Brust_color()此部分是本程序中最重要的部分,即为结点进行着色。首先初始化一些变量如统计颜色数q=1,变量k=0。结点i应该着第color[i]种颜色。由于m1[]保存的是度数递减的结点号排序,给i=m[k]赋值,首先判断i结点是否着色即判断flag==O。不等则说明未着色。然后标记第q种颜色,即color[i]=q,同时标记第flag[i]=O说明已经着色。在读邻接矩阵,判断与点i不相连的结点j着色第q种颜色,即color[j]=q,同时标记第flag[j]=O说明已经着色。如此循环直到最后一个点说明全部点已着色。具体流程如下图3.5

3・3・5画板画图子函数Paint()该部分为最后在画板是画出所输入的图的函数。首先通过循环生成总共vexnum个二维坐标,为后面画圆和连线做准备。由着色函数得出i结点应该着第color[i]种颜色,用一个循环遍历所有结点,并分别用对应第color[i]种颜色进行画圆,再读邻接矩阵,再把与点i不相连的结点j用相同颜色画笔画出圆,同时标记第flag[j]=0说明已经着色。最后连接结点i和结点j图3・6画板画图函数调试分析4.1运行说明1本程序的运行环境为Eclipse;2进入演示程序后即显示提示信息:输入结点数:m;输入边数:n;输入第0条边:起点:终点:输入第1条边:起点:终点:输入第n-1条边:输入完毕后即显示出邻接矩阵,以及度数排列顺序,给点的着色以及有几种颜色。4.1测试用例1输入下图所对应的信息:4个结点,4条边,第0条边起点:0终点1;第1条边起点:0终点2;第2条边起点:0终点3;第3条边起点:1终点2;然后就会在控制框计算出该图所对应的邻接表,各点度数,和各点度数降序排序,

以及各个顶点应该着色情况,结果如下图4.1和4.2:与此同时弹出画板,画板画出该图以及各点的着色情况。咲鈕主0111101®1100100®第W外涪点射宜牴:3第百丄亍暗点豹宜牴;2第vZ牛瞎点旳宜牴;2^v34-fd.£MSs£=1忑点0应谍着第1存氐生忑点丄白该普第2护克生忑点?应该普第2护克圭质.占2它该潜第刁护壺色謝希妾?严进生图4.1图4.2程序结果为至少要3颜色,同样在图4.2中也可以看出着色结果图4.24.2测试用例2输入一个完全图图所对应的信息:5个结点,10条边,第0条边起点:0,终点1。第1条边起点:0,终点2。第2条边起点:0,终点3。第3条边起点:0,终点4。第4条边起点:1,终点2。第5条边起点:1,终点3。第6条边起点:1,终点4。第7条边起点:2,终点3。第8条边起点:2,终点4。第9条边起点:3,终点4。

然后就会在控制框计算出该图所对应的邻接表,各点度数,和各点度数降序排序以及各个顶点应该着色情况,结果如下图4.3和图4.4:与此同时弹出画板,画板画出该图以及各点的着色情况。弊1111011110111110011111第仙■譜点拊1弊1111011110111110011111厲.占B.应该率第丄护衣生忑点1JM滾着栄2严克色忑点2/2该率栄?护克色忑.占空应谍率栄堤护枣生忑点4.应该着第5护枣生謝需丟5严克色图4.3 图4.4程序结果为要用5颜色,同样在图4.4中也可以看出着色结果参考文献严蔚敏,吴伟民.《数据结构》(C语言版)[M].北京:清华大学出版,2007年朱站立,张选平.《数据结构》[M].西安:西安交通大学出版社,2007年左孝凌,刘永才.《离散数学》[M].上海科学技术文献出版社,1982年源程序(清单)importjava.util.Scanner;importjava.applet.Applet;importjava.awt.BasicStroke;importjava.awt.Color;importjava.awt.FlowLayout;importjava.awt.Font;importjava.awt.Frame;importjava.awt.Graphics;importjava.awt.Graphics2D;importjava.awt.Stroke;importjava.awt.event.ComponentEvent;//importjava.awt.event.ComponentListener;importjava.awt.event.ItemEvent;//importjava.awt.event.ItemListener;importjava.awt.event.WindowEvent;importjava.awt.event.WindowListener;importjava.util.Random;publicclassGraphextendsFrameimplementsWindowListener{publicstaticintvexnum; ///////点和边publicstaticintatcnum;publicstaticintxlist[][]=newint[50][50]; ///////邻接表publicstaticintDushu[]=newint[50];//度数public intflag[]=newint[50];〃/〃///Z//7着色标记,publicstaticintm1[]=newint[50];//〃/〃////////度数递减的下标排序publicstaticintcolor[]=newint[50];public intwidth1=800,height1=600;publicGraph(intvexnum1,intatcnum1){this.setTitle("Graph");this.setSize(width1,height1);this.setBackground(Color.white);this.setLayout(newFlowLayout());addWindowListener(this);vexnum=vexnum1;atcnum=atcnum1;}public int[][]int_xlist()//////需要返回一下邻接矩阵Scannerin=newScanner(System.in);inti=0,j=0;intk,l;intvex_vex[][]=newint[20][2];for(i=0;i<atcnum;i++){System.out.println("请输入第"+i+"条边的联系:”);System.out.println("请输入起点:”);vex_vex[i][0]=in.nextInt();System.out・println(”请输入终点:”);vex_vex[i][1]=in.nextInt();}for(i=0;i<50;i++)for(j=0;j<50;j++){xlist[i][j]=0;/ZZ/Z//Z//Z//Z/ZZ/Z//初始flag[i]=1;}for(i=0;i<atcnum;i++){我$1^6*」6*团[0]]26%」6*[口[1]]=1;〃〃〃〃〃//构造邻接矩阵廁$1^6%」6乂[口[1]]^6*」6%[口[0]]=1;〃///〃〃〃//构造邻接矩阵 ?}System.out.println("邻接矩阵”); ////〃//////输入数据for(i=0;i<vexnum;i++)System.out.println(xlist[i][0]+""+xlist[i][1]+" "+xlist[i][2]/*);*/+""+xlist[i]⑶);〃〃〃////输入数据System.out.println("\n");returnxlist;//〃////////输入数据}public int[]int_Dushu()/////需要返回度数排序、、{inti,j,k;inttemp[]=newint[50];for(i=0;i<vexnum;i++)for(j=0;j<vexnum;j++){if((xlist[i][j]==1)&&(i!=j))Dushu[j]++; 〃度数存于Dushu[]中}for(i=0;i<vexnum;i++)temp[i]=Dushu[i];/////////////////////////冒泡排序for(i=0;i<vexnum;i++)for(j=0;j<vexnum-1;j++){if(temp[j]<temp[j+1]){k=temp[j];temp[j]=temp[j+1];temp[j+1]=k;}}///////////////////////////////////////for(i=0;i<vexnum;i++)for(j=0;j<vexnum;j++){if((flag[j]!=0)&&(temp[i]==Dushu[j])){m1[i]=j;/////〃度数递减的节点的下标flag[j]=0;break;}}for(i=0;i<vexnum;i++){System.out.println("第v"+m1[i]+"个结点的度数:"+Dushu[m1[i]]);}returnml;/////度数递减的下标排序}///////////////////////////////////////publicint[]Brust_Color()〃〃/〃/〃/Z///7〃需要返回个点着色情况{inti=0,j=0,p=0,k=0,q=1;for(i=0;i<vexnum;i++){flag[i]=1;color[i]=0;}System・out・println("\n");〃〃/%//输入数据for(;p<vexnum;p++){if(flag[i]!=0){System・outprintln(”顶点"+i+"应该着第"+q+"种颜色”);flag[i]=0;color[i]=q;for(j=0;j<vexnum;j++){if((j!=i)&&(xlist[i][j]==0)&&(flag[j]!=0)){System・out・println("顶点"+j+"应该着第"+q+"种颜色”);flag[j]=0;color[j]=q;}}}else{k++;continue;}q++;k++;}intmax=color[0];for(i=1;i<vexnum;i++)if(max<=color[i])max=color[i];System.out.println("最少需要"+max+"种颜色");returncolor;}///////////////////////////////publicvoidpaint(Graphicsg){Strokestroke1=newBasicStroke(8・0f);/设置线宽为5.0Strokestroke2=newBasicStroke(2・0f);/设置线宽为3・0Colorcolor0=newColor(255,0,0);//紫色Colorcolor1=newColor(255,255,0);Colorcolor2=newColor(0,150,100);Colorcolor3=newColor(255,100,255);Colorcolor4=newColor(100,255,100);/II/用swith()区分各种颜色String[]string={"0","1","2","3","4","5","6","7","8","9"};inti=0,j=0;intx[]=newint[10];inty[]=newint[10];Graphics2Dg2d=(Graphics2D)g;Randomne=newRandom();for(i=0;i<10;i++){x[i]=ne.nextInt(500);IIIIIIIIIIIIII横坐标y[]=ne・nexant(500);IIIIIIIIIIIIIIIIII纵坐标}for(i=0;i<vexnum;i++)for(j=0;j<vexnum;j++)IIII"IIIIII画圆{if((xlist[i][j]==1)&&(i!=j)){g2d.setStroke(stroke1);IIg2d.setFont(getFont());g2d・setFont(newFont("宋体”,Font・BOLD,20));g2d.setColor(Color.black);g2d・drawString(string[i],x[i]+5,y[i]+20);switch(color[i]){case0:g2d・setColor(color0);break;case1:g2d・setColor(color1);break;case2:g2d・setColor(color2);break;case3:g2d・setColor(color3);break;case4:g2d・setColor(color4);break;}g2d・drawArc(x[i],y[i],30,30,0,360);g2d・setStroke(stroke2

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论