城市地理信息系统.docx
- 文档编号:7355022
- 上传时间:2023-01-23
- 格式:DOCX
- 页数:16
- 大小:130.64KB
城市地理信息系统.docx
《城市地理信息系统.docx》由会员分享,可在线阅读,更多相关《城市地理信息系统.docx(16页珍藏版)》请在冰豆网上搜索。
城市地理信息系统
城市地理信息系统
一、需求分析
城市地理信息系统
程序设计问题描述:
将若干城市的信息存入一个带头结点的单链表,结点中的城市信息包括城市名、城市的位置坐标。
要求:
(1)给定一个城市名,返回其位置坐标;
(2)给定一个位置坐标P和一个距离D,返回所有与P的距离小于等于D的城市。
二、设计概要
1、抽象数据类型
本程序运用了关于带头结点的单链表这种数据结构。
ADTLinkList{
数据对象V:
是具有相同特性的数据元素的集合,称为顶点集。
数据操作R:
R={VR}
VR={
}
基本操作:
Open();
初始条件:
存在一个txt格式文件,里面写有城市信息;
操作结果:
文件信息输出到链表。
Appenditem();
初始条件:
存在一个链表的头结点;
操作结果:
添加条目。
Finditem1();
初始条件:
存在城市信息条目;
操作结果:
查找信息1.按城市名,返回该城市的坐标x,y。
Finditem2();
初始条件:
存在城市信息条目;
操作结果:
查找信息1,输入一位置坐标p和一个距离d,返回所有与p的距离小于等于d的城市。
Removeitem();
初始条件:
存在城市信息条目;
操作结果:
删除条目。
Saveandfree();
初始条件:
存在城市信息条目;
操作结果:
保存链表信息到文件并释放内存空间。
}ADTLinkList;
2、其抽象数据类型定义如下:
structCity
{
charcityname[20];
intx,y;
structCity*next;
};
3、基本操作:
typedefstructCitycity;
externintshowmenu();//菜单
externvoidAppenditem();//添加条目
externvoidprint();//输出条目
externvoidFinditem1();//查找条目(按城市名)
externvoidFinditem2();//查找条目(位置p的坐标)
externvoidRemoveitem();//删除信息
externvoidSaveandfree();//保存到文件
externvoidOpen();//打开文件
4、主程序的流程以及各程序模块之间的调用关系
5、算法的描述
本程序运用了顺序表中的链表的知识,构造了一个带头结点的单链表。
(如下图所示)
三.详细设计
1.主程序伪代码
voidmain()
{
界面初始化;
输入操作命令;
While(“命令”!
=“退出”)
{
接受命令(用户输入要实现功能);
进入各个处理命令函数;
}
}
2.主要函数流程图
添加城市条目函数流程图—a按城市名查询函数流程图—b
四、调试分析:
⑴调试过程中遇到的问题以及问题的解决方案:
在调试的过程中碰到了一下问题:
a.引用形参应用不当;
b.每次在执行程序时,都要从新输入城市的相关信息,包括城市名及其坐标,操作麻烦。
解决方案:
a.对引用形参了解的不是很透彻,导致错误,所以将指向头结点的指针定义为全局变量;
b.建立一个txt格式的文件,用于存储城市的相关信息,避免每次执行程序时要从新输入的麻烦。
⑵算法的时空分析(包括基本操作和其他算法的时间复杂度和空间复杂度的分析)和改进设想:
五、经验和体会:
通过本次课程设计,我学到了一种程序设计方法,就是结构化程序设计方法,在程序设计过程中,我尝试按如下方法进行结构化程序设计:
(1)自顶向下;
(2)逐步细化;(3)模块化设计(4)结构化编码。
这种设计方法的过程是将问题求解由抽象逐步具体化的过程,而且,用这种方法便于验证算法的正确性。
本次课程设计所使用的是较为复杂的抽象数据类型——图,而且在弧的基础上增加了许多信息,如添加了时间,费用等等,这无疑给编程加大了难度,同时也是相当的具有挑战性。
在编程的过程中,我用到了全局变量,我将全局变量放在工程的头文件里面,编译的时候报错,说是多重定义。
最终选择了宏定义判断语句进行编译和运行,结果顺利通过。
同时,在文件操作方面我也曾遇到问题,就是在程序对文件进行读取的时候报错,无法读取文件,最后查询有关C的工具书,原来是文件路径问题,借助工具书最终解决了文件操作方面的问题。
总之,这次课程设计是对这一个学期以来对数据结构学习成果的一个验证,同时也是理论与实践很好的结合,既对学过的数据结构进行了巩固,也对我的编程能力奠定了坚实的基础。
在此,我要十分感谢张敏老师的教导,谢谢老师给我题出了很好建议和意见,使我更加完善我的系统,也使我学到了很多关于编程的东西,以后一定要好好的学习更加系统的学习,谢谢老师!
六、测试结果:
七、附录
/*************************************************
Filename:
comomn.h//文件名
Author:
liguanghe
Version:
1.0
Date:
2010.12.10//作者、版本及完成日期
Description:
链表相关实验函数的相关头文件//用于详细说明此程序文件完成的主要功能
*************************************************/
#include
#include
#include
#include
#include
#include
#include
#include
#include
#if!
defined(head_h_inc)
#definehead_h_inc
structCity
{
charcityname[20];
intx,y;
structCity*next;
};
typedefstructCitycity;
externintshowmenu();//菜单
externvoidAppenditem();//添加条目
externvoidprint();//输出条目
externvoidFinditem1();//查找条目(按城市名)
externvoidFinditem2();//查找条目(位置p的坐标)
externvoidRemoveitem();//删除信息
externvoidSaveandfree();//保存到文件
externvoidOpen();//打开文件
#endif
#include"common.h"
#include"head.h"
externCity*head=NULL;
//主函数
voidmain()
{
Open();//打开文件
while
(1)
{
switch(showmenu())//显示菜单
{
case1:
Appenditem();//添加条目
break;
case2:
print();//输出条目
break;
case3:
Finditem1();//查找条目1.按城市名
break;
case4:
Finditem2();//查找条目1.按位置p的坐标
break;
case5:
Removeitem();//删除信息
print();//输出删除后的结果
break;
case0:
Saveandfree();//保存并释放内存
exit(0);//退出
break;
}
}
}
//文件信息输出到链表
voidOpen()
{
FILE*fp;
City*p1=NULL,*p2=NULL,*temp=NULL;
if((fp=fopen("books.txt","rb+"))==NULL)
{
printf("\n****************这是一个新的城市地理信息系统******************\n");
return;
}
head=(City*)malloc(sizeof(City));
head->next=NULL;
temp=p2=head;
while(!
feof(fp))//循环读取
{
p1=(City*)malloc(sizeof(City));
temp=p2;
p2->next=p1;
p2=p1;
fread(p1,sizeof(City),1,fp);
}
temp->next=NULL;
fclose(fp);//关闭文件
}
//菜单
intshowmenu()
{
intsn;
printf("\n*********************城市地理信息系统*****************\n");
printf("\t*1.添加城市条目*\n");
printf("\t*2.输出城市*\n");
printf("\t*3.按城市名查询*\n");
printf("\t*4.按位置坐标查询*\n");
printf("\t*5.删除城市条目*\n");
printf("\t*0.保存并退出!
*\n");
printf("******************************************************\n");
printf("请输入选择(0~5):
");
for(;;)
{
scanf("%d",&sn);
if(sn<0||sn>5)
printf("输入选择有错,请重新选择(0~5):
\n");
else
break;
}
returnsn;
}
//添加条目
voidAppenditem()
{
City*p1=NULL,*p2=NULL;
p1=(City*)malloc(sizeof(City));//申请结点
printf("输入城市名:
\n");//添加信息
scanf("%s",p1->cityname);
printf("输入该城市坐标x:
\n");
scanf("%d",&p1->x);
printf("输入该城市坐标y:
\n");
scanf("%d",&p1->y);
p1->next=NULL;//保存到链表
if(head==NULL)
{
head=(City*)malloc(sizeof(City));//申请空间
head->next=p1;
}
else
{
for(p2=head;p2->next!
=NULL;p2=p2->next);//找到结点尾
p2->next=p1;
}
printf("此信息已添加!
");
}
//输出城市信息
voidprint()
{
City*p=NULL;
if(head==NULL)
{
printf("此记录中无记录,请输入记录后在使用本功能!
\n");
return;
}
printf("**************城市地理信息系统*********************\n");//输出信息
printf("城市名\t城市坐标\n");
for(p=head->next;p!
=NULL;p=p->next)
printf("%s\t%d\t%d\n",p->cityname,p->x,p->y);
}
//查找信息1.按城市名,返回该城市的坐标x,y
voidFinditem1()
{
City*p;
charfindcityname[20];
printf("请输入要查找的城市名:
\n");
scanf("%s",findcityname);
printf("**************城市地理信息系统*********************\n");
printf("城市名\t城市坐标\n");
for(p=head->next;p!
=NULL;p=p->next)
{
if(strcmp(p->cityname,findcityname)==0)
printf("%s\t%d\t%d\n",p->cityname,p->x,p->y);
}
}
//查找信息2.输入一位置p的坐标m,n,和一距离D,返回所有与p的距离小于等于D的城市
voidFinditem2()
{
City*p;
intm,n,d;
doublelen;
printf("请输入要查找的位置的坐标x:
\n");
scanf("%d",&m);
printf("请输入要查找的位置的坐标y:
\n");
scanf("%d",&n);
printf("请输入距离D:
\n");
scanf("%d",&d);
printf("**************城市地理信息系统*********************\n");
printf("城市名\t城市坐标\n");
for(p=head->next;p!
=NULL;p=p->next)
{
len=sqrt((p->x-m)*(p->x-m)+(p->y-n)*(p->y-n));
if(len<=d)
printf("%s\t%d\t%d\n",p->cityname,p->x,p->y);
}
}
//删除信息
voidRemoveitem()
{
charfindcityname[20];//先查找后删除
City*p=head->next,*pr=head->next;
printf("请输入要删除的城市名:
\n");
scanf("%s",findcityname);
if(head->next==NULL)
{
printf("无此节点!
\n");
return;
}
while((strcmp(p->cityname,findcityname)!
=0)&&p->next!
=NULL)
{
pr=p;
p=p->next;
}
if(strcmp(findcityname,p->cityname)==0)//输出删除信息
{
printf("%s\t%d\t%d\n",p->cityname,p->x,p->y);
if(p==head->next)
head->next=p->next;
else
pr->next=p->next;
free(p);
}
printf("此信息已删除!
");
}
//保存链表信息到文件并释放内存空间
voidSaveandfree()
{
City*p=NULL;
FILE*fp;
char*Book="books.txt";
if(head==NULL)
{
printf("\n记录为空!
\n");
return;
}
else
p=head->next;
if((fp=fopen(Book,"w+"))==NULL)
{
printf("\n打不开文件!
\n");
return;
}
while(p!
=NULL)//保存信息
{
fwrite(p,sizeof(City),1,fp);
p=p->next;
}
printf("保存完毕!
");
fclose(fp);
//*****释放链表空间*****
for(;head->next!
=NULL;)
{
p=head->next;
head->next=head->next->next;
free(p);
}
free(head);
}
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 城市 地理信息系统
![提示](https://static.bdocx.com/images/bang_tan.gif)