课程设计.docx
- 文档编号:28485313
- 上传时间:2023-07-14
- 格式:DOCX
- 页数:31
- 大小:24.98KB
课程设计.docx
《课程设计.docx》由会员分享,可在线阅读,更多相关《课程设计.docx(31页珍藏版)》请在冰豆网上搜索。
课程设计
前言:
在全球以及行业信息化浪潮的冲击下,教育信息化是近年来教育领域最热的一个词,随着网络技术的不断发展和进步,教育领域也一样在发生着改变,从最初的计算机辅助教学到现在的网络化教学、多媒体教学和数字化校园,教育信息化与最初提出的内涵已经有了很大变化。
作为教育信息化最重要的一个基础平台就是校园网的建设。
国家从1994年正式启动中国教育科研计算机网(CERNET)以来,已与国内几百所学校相连,为广大师生及科研人员提供了一个全新的网络环境。
1998年10月,中国教育科研网二期工程正式启动,工程到2000年二期工程完成,除达到连接1000所大学的目标外,对有条件的中小学也提供接入上网服务。
如今,各大院校都完成了校园网络的建设,同时,很多中小学都建设了自己的校园网。
从而如何可以用最低的成本为学校布置网线,实现网络通信也就成为了我们所关注的问题。
需求分析:
1校园内建筑物信息存储于数据文件中(格式自定,至少15个建筑物),包括建筑物编号、名称、简介等信息;
②能根据“建筑物编号/名称”查询任意建筑物的相关信息;
2施工成本最低且任意两建筑物可以相互通信。
现有主要模块如下:
类1:
Schoolyard(校园类型)
此类应含有包含各个建筑物的容器和包含学校内建筑物之间直接路径的容器,并含有一些必要的辅助变量。
其构造方法为用两个文件F1,F2去生成具体的校园对象,其中F1中存放要生成对象的建筑物的信息,F2存放要生成对象的建筑物边的信息。
其中具有一个方法getNetPath()生成此校园对应的最小布置网线路径,并保存到辅助数组help中。
类2:
BiSearcher(二叉查找类)
此类的构造方法:
根据一个校园,构造出此校园的二叉查找树,并对外提供search方法,可以根据建筑物的ID或者名称查询到建筑物的信息并返回。
类3:
SchoolSearchSystem
此类主要是根据一个校园生成其对应的图形化查询系统,并根据求得的最小布置网线路径,在对应校园地图中画出对应的最小网线布置路线。
其中含有校园对应的查询者,属于二叉查询者,以后如果想改用其他的方式查找,可以直接NEW出其他方式的查询者,只要该类继承BulidingSearcher接口,这样增加了程序的灵活性。
主类:
根据F1,F2生成我的校园,并相应生成我的校园查询系统,启动。
其他类均为辅助类,在这里不再详细介绍。
概要设计:
1.Schoolyard
MAX:
常量,做为无穷
buildings:
Building类型的数组,存放各个建筑物
num:
存放建筑物数目
BDRelations:
用来存放建筑物之间的直接路径长度
Min:
辅助量
help:
辅助数组
sum:
存最佳布置网线的路径总长度
Schoolyard(Filef1,Filef2):
根据f1文件,每行读入一个建筑物信息,用逗号分离,建立其相应的建筑物对象存入buildings数组中。
初始化BDRelations,把其中的权值全部赋值为MAX
根据f2文件,每行读入建筑物之间一条路径的信息,每条路径的颜色自动初始化为黑色,构造相应的Line存入BDRelations中。
构造校园的过程中,就调用其getNetpath方法,求出此校园的最佳布置网线路径,并将其相应路径的颜色改为红色。
publicvoidgetNetPath()//求布线路径,即最小生成树
算法思想:
建立一个辅助数组help=newNW[num];
内部类:
privateclassNW
{
intnum;//到达Vatrix的直接距离
intvatrix;//所到达的顶点
BooleanisCertain=false;//有没有被确定
}
从第一个顶点出发,其余每个顶点的相应变量值初始化为到达第一个顶点的相应信息。
如:
num为此顶点到达第一个顶点的直接路径长度,vatrix为第一个顶点的下标值,isCertain=false.
用循环依次找到最小生成树所对应的20条边
循环体:
用searchMin()方法找出其中num最小的,将其路径长度加到SUM中,并将其对应路径的颜色改为红色,将对应顶点的isCertain改为True,并对应更新其余顶点,看其余顶点到它的距离是否比原来的NUM小,若小则将NUM和vatrix修改成对应的值。
2:
BiSearcher
继承BulidingSearcher接口,实现其对应的抽象方法
abstractBuildingsearch(intid);
abstractBuildingsearch(Stringtext);
具有相应变量:
Schoolyards;BiSearchNoderoot;
构造方法:
BiSearcher(Schoolyards)
根据一个校园初始化其Schoolyards,并根据s中的ID信息构造相应的二叉查找树root。
(用根节点唯一标志一颗树)。
publicvoidcreatBiTree():
根据建筑物的总个数不断的向树中加入节点,调用publicvoidinsert(BiSearchNoden,BiSearchNoderoot)若root.id==-1说明树为空,则将其中的对应变量改为节点所对应的变量。
否则,如果n.id root.lchild=n;elseinsert(n,root.lchild); 同理若n.id>root.id且root.rchild==null,则root.rchild=n; 否则insert(n,root.rchild);若相等则不插入。 search方法: 若是根据ID找,则用二叉查找树,调用publicBuildingsch(intid,BiSearchNoderoot) 若id==root.id则,找到返回,若id 若是根据名称找,直接在buildings数组中顺序查找。 3.SchoolSearchSystem 主要是图形化界面的生成,构建一个窗口,上面是查询系统,下面是校园地图,每个建筑物用一个矩形表示,建筑物之间具有的直接路径用直线表示,其中属于最佳布置网线路径的用红色标志。 这里就不再详细说明。 主类: 根据F1,F2生成我的校园,并相应生成我的校园查询系统,启动。 详细设计: (主要算法的实现代码) 1.Schoolyard publicvoidgetNetPath()//求布线路径,即最小生成树 { sum=0; help=newNW[num]; for(inti=0;i { help[i]=newNW(); } help[0].isCertain=true;//从0号点出发 for(inti=1;i { help[i].num=BDRelations[0][i].length;//开始时,每个算出每个顶点距0号顶点的距离 help[i].vatrix=0; } for(inti=0;i { intindex2; index2=searchMin(); sum+=help[index2].num; BDRelations[index2][help[index2].vatrix].myColor=1;//把所确定的边改为红色 BDRelations[help[index2].vatrix][index2].myColor=1; help[index2].isCertain=true;//把这个顶点确定下来 for(intj=1;j { if(help[j].isCertain==false&&help[j].num>BDRelations[j][index2].length)//每确定一个点,要对应更新其他点 { help[j].num=BDRelations[j][index2].length; help[j].vatrix=index2; } } } } privateintsearchMin() { intindex=-1; for(inti=1;i { min=MAX; if(help[i].isCertain==false&&help[i].num { min=help[i].num; index=i; } } returnindex; } privateclassNW { intnum;//到达Vatrix的直接距离 intvatrix;//所到达的顶点 BooleanisCertain=false;//有没有被确定 } 2.BiSearcher publicvoidcreatBiTree()//创建自己的查找树 { for(inti=0;i { insert(newBiSearchNode(s.buildings[i]),root); } } publicvoidinsert(BiSearchNoden,BiSearchNoderoot) { if(root.id==-1)//root为空,则插入到根节点 { root.id=n.id; root.data=n.data; root.lchild=n.lchild; root.rchild=n.rchild; } else{//否则查找插入位置 if(n.id { if(root.lchild==null)//比根小,又根的左子树为空,则插入 root.lchild=n; elseinsert(n,root.lchild);//左子树不为空则在左子树中寻找插入位置 }if(n.id>root.id) { if(root.rchild==null)//比根大,又根的右子树为空,则插入 root.rchild=n; elseinsert(n,root.rchild);//左子树不为空则在右子树中寻找插入位置 }else{ //说明已经有该节点,不进行插入 } } } publicBuildingsearch(intid){//用二叉查找树进行查找 returnsch(id,root); } publicBuildingsch(intid,BiSearchNoderoot) { if(root==null||root.id==-1)returnnull; else{ if(id==root.id) returnroot.data; elseif(id returnsch(id,root.lchild); else returnsch(id,root.rchild); } } 调试分析: 问题1: Exceptioninthread"main"java.lang.NumberFormatException: Forinputstring: "0,女生1栋,宿舍楼" 这个通常是由于 cpage=Integer.parseInt(getp); 转换引起的~ 调试中发现,ss=s.split(",");没有正常按,分割 将文件中,用中文输入法打入的,转换为英文形式打入的,后问题解决 Exceptioninthread"main"java.lang.NullPointerException atBiSearcher.creatBiTree(BiSearcher.java: 45) atBiSearcher. 13) atSchoolSearchSystem. 9) atTestSchoolSystem.main(TestSchoolSystem.java: 16) publicvoidcreatBiTree()//创建自己的查找树 { for(inti=0;i { insert(newBiSearchNode(s.buildings[i]),root); } } 调试后,发现错误出在S.num上 改正: 在SchoolSearchSystem类中,本来定义语句为 Schoolyards; BulidingSearcherfinder=newBiSearcher(s); 这会出现,s为NULL时就去构造。 更改到构造方法中: SchoolSearchSystem(Schoolyards) { this.s=s; finder=newBiSearcher(s); } 程序可以运行,但是输入ID,无法找到建筑物 问题出现在mySchoolSystem.finder.search()中 分析问题所在: 可能查找树没有创建成功 是插入方法的问题 publicvoidinsert(BiSearchNoden,BiSearchNoderoot) { if(root.id==-1)//root为空,则插入到根节点 root=n; 这样写只是形参的ROOT指向了n,类成员ROOT并没有改变 改为 if(root.id==-1)//root为空,则插入到根节点 { root.id=n.id; root.data=n.data; root.lchild=n.lchild; root.rchild=n.rchild; } 在函数内部为形参赋值要小心! 用ID查找实验成功,但是用名字查找,提示无法找到建筑物。 原代码: publicBuildingsearch(Stringname){//根据姓名查找的话,就在Buildings中依次查找,速度比较慢 for(inti=0;i { if(s.buildings[i].name==name) returns.buildings[i]; } returnnull; } 改为 publicBuildingsearch(Stringname){//根据姓名查找的话,就在Buildings中依次查找,速度比较慢 for(inti=0;i { if(s.buildings[i].name.equals(name)) returns.buildings[i]; } returnnull; } 比较字符串相等时,用equals,不要用==! equals是比较内容相不相等。 以上第一步,用二叉查找树实现系统查询的功能以完成,下面将把问题转移到求最小生成树上来。 现在为了图形化程序,打算在建筑物类型中加入它的X,Y坐标属性。 在窗口中,想根据建筑物的位置坐标,画出每个建筑物,并写上其名字。 P2定义成myPanel型,重写其Paint方法,实现绘图 结果发现图形画不到Panel上,但是调试时查出实际上是进入了Paint方法,只是没有画上。 后来发现是窗口太小了,画到了下面。 下面的不是很好调整,我想另外启动一个窗口,专门画图。 后来发现两个窗口有很不方便的地方,决定重新购置一个窗口,上部分放组件,下面放地图,并且生成边这个类,有两个顶点和颜色属性,用一个ArrayList存放,并且把是最小生成树上的边用红色,其它边用黑色,画图时,对应画出每条边。 大致方法是: 生成校园查询系统时,将校园的建筑物之间的边存入一个容器,在窗口中,依次取出每条边,并绘制。 修改: 现在不用另外用一个ArrayList,在BDRelations里放入每条边的信息,重起一个边的类,数据成员有intlenth,intcolor; 一部分边画成了红色,但还有一部分没有画,考虑一下,觉得问题可能出现在修改边时应该同时修改两条! 后来验证是正确的。 到这里,程序基本完成了,下面进行优化,之前边的距离是进行估算的,但是现在建筑物的坐标已经确定了,所以可以准确确定两个建筑物之间的距离,所以对文件数据进行更改。 最后,在图上再写上一段说明,用drawString,但发现没有写出来。 后来发现是被上面的组件遮挡住了,调整一下位置,又发现字体太小,调整字体大小。 全部完成: 此软件能够画出校园的大致地图,并且能够标志出布置网线的最佳路径,能够根据建筑物的ID或名称查询建筑物的相关信息。 课设总结: 附录: publicclassBiSearchNode{ intid; Buildingdata; BiSearchNodelchild,rchild; BiSearchNode()//构造一个空节点 { data=null; id=-1; } BiSearchNode(Buildingb) { data=b; id=b.id; } } publicclassBuilding{ intid; Stringname,massage; intx,y; Building() { id=x=y=-1; } Building(intid,Stringname) { this.id=id; this.name=name; } Building(intid,Stringname,Stringmassage,intx,inty) { this.id=id; this.name=name; this.massage=massage; this.x=x; this.y=y; } } publicclassLine{ intlength; intmyColor=0;//0表示黑,1表示红,初始值为黑 Line(intlength) { this.length=length; } } publicinterfaceBulidingSearcher{ abstractBuildingsearch(intid); abstractBuildingsearch(Stringtext); } importjava.io.*; publicclassSchoolyard{ finalintMAX=1000;//做为无穷 Building[]buildings=newBuilding[30];//最多不超过30个建筑物,先申请30个大小的空间 intnum=0;//存放建筑物数目 Line[][]BDRelations;//用来存放建筑物之间的直接路径长度 intmin; NW[]help;//设置一个辅助数组 intsum;//存最佳布置网线的路径总长度 publicstaticBufferedReaderin; Schoolyard(Filef1,Filef2)//用两个文件构造学校,一个是建筑物的信息,一个是建筑物之间直接路径的信息 { Strings; String[]ss; try{ in=newBufferedReader(newFileReader(f1));//先对第一个文件(存放建筑物的)进行处理 while((s=in.readLine())! =null) { ss=s.split(","); buildings[num++]=newBuilding(Integer.parseInt(ss[0]),ss[1],ss[2],Integer.parseInt(ss[3]),Integer.parseInt(ss[4])); } in.close(); }catch(FileNotFoundExceptione){ System.out.println("无法找到存放建筑物的文件."); }catch(IOExceptione){ e.printStackTrace(); } //buildings构造完成后,构造BDRelations BDRelations=newLine[num][num]; for(inti=0;i for(intj=0;j BDRelations[i][j]=newLine(MAX); try{ in=newBufferedReader(newFileReader(f2)); while((s=in.readLine())! =null) { ss=s.split(","); BDRelations[Integer.parseInt(ss[0])][Integer.parseInt(ss[1])]=newLine(Integer.parseInt(ss[2])); BDRelations[Integer.parseInt(ss[1])][Integer.parseInt(ss[0])]=newLine(Integer.parseInt(ss[2])); } }catch(FileNotFoundExceptione){ System.out.println("无法找到存放建筑物关系的文件."); }catch(IOExceptione){ e.printStackTrace(); } getNetPath(); } publicvoidgetNetPath()//求布线路径,即最小生成树 { sum=0; help=newNW[num]; for(inti=0;i { help[i]=newNW();
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 课程设计