11计科5402杨春平11计科5401陈铖11计科5404朱大鹏3doc.docx
- 文档编号:27958615
- 上传时间:2023-07-06
- 格式:DOCX
- 页数:29
- 大小:218.23KB
11计科5402杨春平11计科5401陈铖11计科5404朱大鹏3doc.docx
《11计科5402杨春平11计科5401陈铖11计科5404朱大鹏3doc.docx》由会员分享,可在线阅读,更多相关《11计科5402杨春平11计科5401陈铖11计科5404朱大鹏3doc.docx(29页珍藏版)》请在冰豆网上搜索。
11计科5402杨春平11计科5401陈铖11计科5404朱大鹏3doc
重庆大学实验报告
实验题目:
城市之间最短路径管理软件
学院:
计算机学院
专业班级:
计算机科学与技术专业6班
年级:
2011级
姓名:
杨春平
学号:
20115402
完成时间:
2013年6月19日
指导教师:
石锐
重庆大学教务处制
实验项目指导教师评定成绩表
学号:
20115402姓名:
杨春平班级:
11计算机科学与技术6班
项目
分值
参考标准
评分
学习态度
10
积极与老师、助教讨论(10分)
学习马虎,纪律涣散(5分)
缺勤(0分)
软件/系统质量
60
功能考虑完善,界面友好,Bug极少,针对异常情况有处理(55-60分)
功能考虑完善,界面良好,有一定Bug(49-54分)
功能较完善,Bug较多(43-48分)
完成程序基本功能(36-42分)
部分实现,无法运行(1-35分)
抄袭、被抄袭(0分)
实验演示答辩
10
重点突出、有特色、专业知识掌握好、能流畅回答老师提问(9-10分)
有一定特色、能较好地回答老师提问(7-8分)
能讲解项目的关键实现,能回答基本问题(0-6分)
实验报告撰写质量
20
文档规范,文字、图表表达清楚(18-20分)
文档较规范,文字、图表表达较清楚(11-17分)
文档不规范,内容空泛、结构混乱(0-10分)
指导教师评定成绩:
指导教师签名:
年月日
重庆大学本科学生实验项目任务书
实验题目
城市之间最短路径管理软件
学院
计算机学院
专业
计算机科学与技术
年级
2011级
任务描述:
以项目组形式,实现项目所要求的功能。
项目组每组2~4人,其中项目组长1人,负责项目整体进度和协调项目组成员之间的工作,要求项目组成员分工明确,各自的工作量均衡,并在实践报告中注明每个人的分工和工作量。
综合运用C++编程技术和Dijkstra算法和Floyd算法,用VS2010或QT设计实现一个简单的城市之间最短路径管理软件,该软件能够模拟实现简单的路径维护、求解单源最短路径、求解所有节点间最短路径等功能。
最后提交完整的设计报告和软件程序拷贝。
设计要求:
1.编写软件帮助旅行者了解从一个城市到另一个城市之间的最短路径。
2.程序接受用户输入城市列表(包含城市名称信息)和连接用户城市的路径列表(包含距离信息),在软件运行过程中这些信息均可修改。
要求城市数量不少于10,路径数量在30左右。
3.用户可以根据需要指定一个源点,软件需计算出该源点到其他剩余节点之间的最短距离和详细路径。
4.用户可以直接查看所有城市之间的最短距离。
参考资料:
☐DataStructuresandAlgorithmAnalysis(C++Version)CliffordA.Shaffer
☐DataStructureandAlgorithmAnalysisinC++(ThirdEdition),MarkAllenWeiss,PearsonEducation,2006.
☐DataStructures,Algorithms,andApplicationsinC++,SartajSahni,McGraw-Hill,1998.
☐《数据结构(C语言版)》,严蔚敏,吴伟民编著,清华大学出版社,2007年第1版
任务下达日期2013年4月10日
完成日期2013年6月19日
说明:
学院、专业、年级均填全称,如:
计算机学院、计算机科学与技术、2011。
实验报告正文
1、需求分析
本系统是为了帮助旅行者了解从一个城市到另一个城市之间的最短路径。
程序接受用户输入城市列表(包含城市名称信息)和连接用户城市的路径列表(包含距离信息),在软件运行过程中这些信息均可修改。
用户可以根据需要指定一个源点,软件需计算出该源点到其他剩余节点之间的最短距离和详细路径。
用户可以直接查看所有城市之间的最短距离。
此系统是基于图的一个简单应用,需要用到图的一些著名算法,如Dijskatra算法,Floyd算法。
2、系统设计
窗体类
下面介绍一下本系统的模块图:
3、关键代码描述
(1)首先是城市节点类,其中就只包含了城市名信息:
关键代码如下:
classnode
{
private:
stringname;
public:
node(void)
{
name="";
}
voidsetname(stringName)
{
name=Name;
}
stringgetname()
{
returnname;
}
};
(2)接下来就是图类的相关代码:
classGraphm
{
private:
intnumV,numE;
int**matrix;
int**D;
int*mark;
node*vtrex;
public:
Graphm()
{
}
Graphm(intnumvert)
{
inti,j;
numV=numvert;
numE=0;
D=(int**)newint*[numV];
for(i=0;i D[i]=newint[numV]; for(inti=0;i for(intj=0;j D[i][j]=0; vtrex=newnode[numV]; for(intk=0;k vtrex[k].setname(""); mark=newint[numV]; for(i=0;i mark[i]=0; matrix=(int**)newint*[numV]; for(i=0;i matrix[i]=newint[numV]; for(i=0;i for(j=0;j matrix[i][j]=0; } ~Graphm() { delete[]mark; for(inti=0;i delete[]matrix[i]; delete[]matrix; } intn(){ returnnumV; } inte(){ returnnumE; } intfirst(intv) { inti; for(i=0;i if(matrix[v][i]! =0) returni; returni; } intnext(intv1,intv2){ inti; for(i=v2+1;i if(matrix[v1][i]! =0)returni; returni; } intsetvtrex(strings) { intflag=0; for(inti=0;i { if(vtrex[i].getname()==s) { flag=1; returni; } } if(flag==0) { for(intj=0;j { if(vtrex[j].getname()=="") { vtrex[j].setname(s); returnj; } } } } stringgetV(intv) { returnvtrex[v].getname(); } voidsetedge(intv1,intv2,intwgt) { if(matrix[v1][v2]==0) { numE++; matrix[v1][v2]=wgt; matrix[v2][v1]=wgt; } else { matrix[v1][v2]=wgt; matrix[v2][v1]=wgt; } } voiddeledge(intv1,intv2){ if(matrix[v1][v2]! =0) { numE--; matrix[v1][v2]=0; } } intweight(intv1,intv2){ returnmatrix[v1][v2]; } intgetmark(intv){ returnmark[v]; } voidsetmark(intv,intval){ mark[v]=val; } stringgetvtrex(intv) { returnvtrex[v].getname(); } intgetD(intv1,intv2) { returnD[v1][v2]; } voidDijskatra(int*dist,intv0,int*path) { inti,j,k; for(i=0;i { if(dist[i]==10000) path[i]=-1; else path[i]=v0; } for(i=0;i if(matrix[v0][i]>0&&i! =v0) { dist[i]=matrix[v0][i]; path[i]=v0;} else { dist[i]=10000;path[i]=-1; } setmark(i,0); path[v0]=v0; dist[v0]=0; } setmark(v0,1); for(i=1;i intmin=10000; intu; for(j=0;j if(getmark(j)==0&&dist[j] { min=dist[j]; u=j; } } setmark(u,1); for(k=0;k if(getmark(k)==0&&matrix[u][k]>0&&min+matrix[u][k] { dist[k]=min+matrix[u][k]; path[k]=u; } } } } voidFloyd(){ for(inti=0;i for(intj=0;j { D[i][j]=matrix[i][j]; if(D[i][j]==0&&i! =j) D[i][j]=10000; } for(intk=0;k for(inti=0;i for(intj=0;j { if(D[i][j]>(D[i][k]+D[k][j])) D[i][j]=D[i][k]+D[k][j]; } } (3)接下来就是关于窗体的相关代码描述: 1、这是窗体初始化的代码: Form1(void) { stringcity1,city2,city3; intjuli,v1,v2,n=0; G=gcnewGraphm(30); charline[512]; ifstreamfin1("data.txt",ios: : in); while(! fin1.eof()) { fin1.getline(line,512,'\n'); n++; } fin1.close(); ifstreamfin("data.txt"); while(! fin.eof()) { for(inti=0;i { fin>>city1>>city2>>juli; v1=G->setvtrex(city1); v2=G->setvtrex(city2); G->setedge(v1,v2,juli); } } fin.close(); InitializeComponent(); } 2、首先是button4的代码,主要功能就是显示所有城市信息: intd,c; for(inti=0;i { if(G->getV(i)=="") { d=i; break; } } stringss2; for(inti=0;i { if(G->getV(i)! ="") { ss2+=G->getV(i)+"\n"; } } stringss1; while(d) { c=d%10; d=d/10; ss1=char(c+48)+ss1; } String^s=gcnewString(ss1.c_str()); textBox4->Text=s; deletes; String^s1=gcnewString(ss2.c_str()); richTextBox1->Text=s1; deletes1; } 3、然后是button1,作用是添加、修改城市信息: intw,flag1=0,flag2=0; intv1,v2; constchar*ch=(constchar*)(Marshal: : StringToHGlobalAnsi(textBox3->Text)).ToPointer(); strings=ch; w=atoi(ch); Marshal: : FreeHGlobal(IntPtr((void*)ch)); stringcity1; constchar*ch1=(constchar*)(Marshal: : StringToHGlobalAnsi(textBox1->Text)).ToPointer(); city1=ch1; Marshal: : FreeHGlobal(IntPtr((void*)ch1)); stringcity2; constchar*ch2=(constchar*)(Marshal: : StringToHGlobalAnsi(textBox2->Text)).ToPointer(); city2=ch2; Marshal: : FreeHGlobal(IntPtr((void*)ch2)); for(inti=0;i<30;i++) { if(G->getV(i)==city1) flag1=1; if(G->getV(i)==city2) flag2=1; } if(flag1==0) { String^S=gcnewString(city1.c_str()); comboBox1->Items->Add(S); comboBox2->Items->Add(S); comboBox3->Items->Add(S); deleteS; } if(flag2==0) { String^S=gcnewString(city2.c_str()); comboBox1->Items->Add(S); comboBox2->Items->Add(S); comboBox3->Items->Add(S); deleteS; } v1=G->setvtrex(city1); v2=G->setvtrex(city2); if(v1==v2||w<0) { stringsw="输º? 入¨? 错䨪误¨®! ê? 请? 重? 新? 输º? 入¨? "; String^s=gcnewString(sw.c_str()); richTextBox1->Text=s; deletes; } else { G->setedge(v1,v2,w); ofstreamfout("data.txt"); for(inti=0;i<30;i++) for(intj=i+1;j<30&&j>i;j++) { if(G->weight(i,j)! =0) fout< } stringsw1="恭¡ì喜2! ê? 添¬¨ª加¨®/修T改? 成¨¦功|! ê? "; String^s=gcnewString(sw1.c_str()); richTextBox1->Text=s; deletes; fout.close(); } textBox1->Text=L""; textBox2->Text=L""; textBox3->Text=L""; 4、然后是button2,其作用是查看最短距离和路径: intv1,v2; intjuli,c; intn,count; strings1; intk,m,j=1; int*E=newint[G->n()]; int*prev=newint[G->n()]; int*temp=newint[G->n()]; stringcity1; constchar*ch1=(constchar*)(Marshal: : StringToHGlobalAnsi(comboBox1->Text)).ToPointer(); city1=ch1; Marshal: : FreeHGlobal(IntPtr((void*)ch1)); stringcity2; constchar*ch2=(constchar*)(Marshal: : StringToHGlobalAnsi(comboBox2->Text)).ToPointer(); city2=ch2; Marshal: : FreeHGlobal(IntPtr((void*)ch2)); if(city1==""||city2=="") { stringsw1="未¡ä成¨¦功|选? 择? 城? 市ºD,ê? 请? 重? 新? 选? 择? : êo"; String^s2=gcnewString(sw1.c_str()); richTextBox1->Text=s2; deletes2; } else { for(inti=0;i { if(G->getvtrex(i)==city1) { v1=i; break; } } for(inti=0;i { if(G->getvtrex(i)==city2) { v2=i; break; } } G->Floyd(); juli=G->getD(v1,v2); stringss1=""; stringsw=""; if(juli==0) ss1="0"; else while(juli) { c=juli%10; juli=juli/10; ss1=char(c+48)+ss1; } for(inti=0;i { if(G->getvtrex(i)! ="") count++; } for(k=1;k { if(k==v1) E[k]=0; else E[k]=10000; } G->Dijskatra(E,v1,prev); if(v2! =v1) { temp[0]=v2; for(k=1;k { temp[k]=-1; } n=v2; for(m=1;m { if(prev[n]! =-1&&n! =v1) { temp[j]=prev[n]; n=prev[n]; j++; } else break; } s1+=G->getvtrex(v1); for(m=j-1;m>=0;m--) { if(temp[m]! =-1&&temp[m]! =v1) s1+="->"+G->getvtrex(temp[m]); } } s1="最Á? 短¨¬路¡¤径? : êo"+s1; sw="最Á? 短¨¬距¨¤离¤? : êo"+city1+"->"+city2+""+ss1+"公? 里¤? "+"\n\n\n"+s1; String^s=gcnewString(sw.c_str()); richTextBox1->Text=s; del
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 11 5402 杨春平 5401 陈铖 5404 朱大鹏 doc