数据结构设计实习报告28.docx
- 文档编号:8003567
- 上传时间:2023-01-27
- 格式:DOCX
- 页数:17
- 大小:21.07KB
数据结构设计实习报告28.docx
《数据结构设计实习报告28.docx》由会员分享,可在线阅读,更多相关《数据结构设计实习报告28.docx(17页珍藏版)》请在冰豆网上搜索。
数据结构设计实习报告28
数据结构设计实习报告28
1、敏而好学,不耻下问——孔子
数据结构设计实习报告
专业:
地理信息系统
班级:
0503702
学号:
这个我不知道也
姓名:
倪倪
指导老师:
王强是他吗?
?
好像是我哟!
!
2007-7-11
数据结构设计实习报告
--测量数据读取及分类程序
7月2号--6号,数据结构老师安排我们进行了数据结构设计的实习
本次实习旨在让我们能熟练运用C语言编程实现对数据的操作,能熟练使用链表和栈两种结构
同时拥有对数据的基本分析和基本处理能力
掌握用C语言编程的基本方法和程序架构的基本设计,为我们培养良好的编程习惯和编程风格,同时为以后的GIS软件开发打好基础
实习程序设计要求
本次实习老师首先给定一个武汉测量实习的数据文件,文件名为"武汉实习数据.usr"
里面包括了武汉市的道路,房屋等设施的点的数据
老师要求我们编写一个程序,要实现读取此文件中的数据,并且按点、线、面分类,然后在点、线、面每一项下在再分不同类型的点,最后按选择不同类的点输出此类型下所有点的坐标
程序需求分析
根据老师的要求,我分析本程序首先涉及两大功能模块,第一个功能模块就是这个数据读取和存储,第二个功能模块就是数据的分类操作和输出,具体模块分析后我采用了三个函数来实现这两个模块的功能,具体如下:
1.数据文件的读取和存储//第一个模块Id*creat()
2.数据操作即数据分类//第二个模块voidoperation()
3.对分类数据的输出//第二个模块voidprint(参数)
对程序总体架构进行设计
具体设计如下:
structcoordinate{};//坐标
structcode{};//代码
structId{};//ID
Id*creat(){}//文件读取创建结构
Voidprint(参数){}//输出指定的分类数据
Voidoperation(Id*head)//分类操作
{
print(参数);//调用分类输出函数
print(参数);
...........
}
Main()
{Id*head;
head=creat();//获取结构的入口
operation();//分类操作
}
首先对第一个功能模块分析,数据文件的读取,先查看了数据文件,大体了解数据
文件中大体分四个部分,第一部分目标ID,也就是文件中多少个点,共655个
第二部分是目标分类代码
第三部分是各类型下的坐标
第四部分为结束标志
如下所示:
目标ID,0关键字,0
目标分类代码,0分类码,0
x1,y1x,y坐标串
x2,y2
......
xn,yn
-666666.0,-666666.0目标结束
......下一个目标
-999999,-999999整个文件结束
分析得出,要用链表来存储数据
具体的分为两个链表,一个用来存目标的ID;另一个用来存分类码和坐标数据
首先定义一个双指针域的链表,一个指针域用来连接它本身,另一个用来存目标分类码的地址,也就是第二个链表的头指针,从而使两个链表连起来
此结构的结构图和代码如下:
ID
ID
ID
..............
类型
类型
类型
..............
X,Y
X,Y
X,Y
代码:
structcoordinate
{
doublex;
doubley;
coordinate*next;
};
structcode
{
intcode1;
intcode2;
coordinate*next;
};
structId
{
intId1;
intId2;
Id*next;
code*next1;
};
下来对程序的第二部分,数据的分类
文件中规定了分类格式如下所示:
分类代码:
代码名称
30000控制点
10000图廓点
10001铁路
10003汽渡虚线
10004主要道路
20001码头
20002铁路中转站
20003河流、湖泊
20004居民地
3、代码说明:
分类代码第一个字符为1,表示线目标
为2,表示面目标
我采用对上面的代码同时求余和求整,这样就达到分双层的目的,用了IF语句
如下示:
if(q->dm1/10000==1&&q->dm1%10000==0)//就输出代码为10000的数据
第三部分,数据的输出
采用链表的一般顺序输出即可
至此,程序的主体结构已设计完成
下面进行详细设计和代码的编写
程序详细设计
首先编写代码定义如上两个链表
其中存放ID的链表有两个指针域,一个*next用来指向下一个ID节点,一个*next1用来指向另一个链表第一个节点,即连接两个链表
图参照上图,代码如下:
structcoordinate
{
doublex;
doubley;
coordinate*next;
};
structcode
{
intcode1;
intcode2;
coordinate*next;
};
structId
{
intId1;
intId2;
Id*next;
code*next1;
};
然后是主程序的设计代码如下:
voidmain()
{
Id*head;
cout<<"数据结构课程设计"< cout<<"0503702李佳倪design"< head=creat();//创建数据结构 operation(head);//所有的操作 } 下面在Id*creat(void)函数中定义各链表的指针,然后再申请空间并初始化,再定义文件型指针,用来打开文件,进行读取 最后返回头指针 head=creat();代码如下: Id*creat(void) { Id*p,*head; code*q; coordinate*s; FILE*fp; p=newId; p->next=NULL; p->next1=NULL; head=p; fp=fopen("武汉实习数据.usr","r"); while(! feof(fp)) { fscanf(fp,"%d,%d",&p->Id1,&p->Id2);//读取目标Id if(p->Id1==-999999&&p->Id2==-999999)//整个文件结束 break; q=newcode; p->next1=q; fscanf(fp,"%d,%d",&q->code1,&q->code2);//读取代码 s=newcoordinate; q->next=s; while (1) { fscanf(fp,"%lf,%lf",&s->x,&s->y); if(s->x! =-666666.0&&s->y! =-666666.0)//目标结束 { s->next=newcoordinate; s=s->next; s->next=NULL; } else break; } if(! feof(fp)) { p->next=newId; p=p->next; p->next=NULL; } } returnhead; } 先用了while循环,它的判断文件是否结束用到了FEOF函数,此函数在文件结束时返回非0值,对其求反就为假,当它没遇到文件结尾,就返回一个0值 对其再求反,就得到真,这样就能读到文件结束 读取时,先用指针指向第一个ID,用结束符-999999来判断是否到数据结尾,没到,用*next1来指向存放ID中的分类码的节点,即第二个链表的头指针*q,然后用*q来读取下面的坐标,直到遇到-666666.0,表示第一个ID下的数据读完,用*p->next来移动到下一个ID来继续读取,直到读完文件 至此,数据结构建立好了,下面进行分类和输出 我用了一个操作函数voidoperation(Id*head)实现所有的分类选择操作 在每个操作之后调用print(Id*head,intcase1,intcase2)传入参数分别进行输出结果 voidoperation(Id*head) { inta; fflush(stdin); while(a! =5) { printf("请选择\n"); printf("1.线\t2.面\t3.点\t4.本类全部\t5.退出\n"); intb,c,d; scanf("%d",&a); switch(a) { case1: printf("请选择线的类别\n"); printf("1.图廓点\t2.铁路\t3.汽渡虚线\t4.主要道路\t5.本类全部\t6.退出\n"); scanf("%d",&b); switch(b) { case1: print(head,1,0);break;//代码=10000 case2: print(head,1,1);break;//代码=10001 case3: print(head,1,3);break;//代码=10003 case4: print(head,1,4);break;//代码=10004 case5: print(head,1,5);break;//代码=10000100011000310004 case6: break;//推出 }break; case2: printf("请选择面的类别\n"); printf("1.码头\t2.铁路中转站\t3.河流、湖泊\t4.居民地\t5.本类全部\t6.退出\n"); scanf("%d",&c); switch(c) { case1: print(head,2,1);break;//代码=20001 case2: print(head,2,2);break;//代码=20002 case3: print(head,2,3);break;//代码=20003 case4: print(head,2,4);break;//代码=20004 case5: print(head,2,5);break;//代码=20001200022000320004 case6: break; }break; case3: printf("请选择\n"); printf("1.控制点\t2.退出\n"); scanf("%d",&d); switch(d) { case1: print(head,3,5);break;//代码=30000 case2: printf("恭喜! ! 分类完成! \n");return; }break; case4: print(head,4,5);break;////代码=1000010001100031000042000120002200032000430000 case5: break; } } } 我设计了一个voidprint(Id*head,intcase1,intcase2)函数,其中参数case1为代码首位数字参数case2为代码末位数字通过这两个条件来控制输出 首先,p=head,然后进行判断 鉴于我的数据结构,只需让*p->next1=*q然后q->code1,对code1进行求余,求整来进行分类判断了 代码如下: voidprint(Id*head,intcase1,intcase2) { Id*p; code*q; coordinate*s; p=head; while(p->next! =NULL) { q=p->next1; if((q->code1/10000==case1&&q->code1%10000==case2)||(q->code1/10000==case1&&case2==5)||(case1==4&&case2==5))//输出判断 { printf("%d,%d\n",p->Id1,p->Id2); q=p->next1; printf("%d,%d\n",q->code1,q->code2); s=q->next; while(s->x! =-666666.0&&s->y! =-666666.0) { printf("%lf,%lf\n",s->x,s->y); s=s->next; } } p=p->next; } } 至此程序设计编写完成,进行调试过程 程序调试分析 运行程序,调试过程中,个人遇到以下问题: 1.数据文件必须和程序文件放在同一目录底下,才能读取和运行 2.运行后,发现了选定一种类型后,输出坐标后,程序就结束了 不能进行反复选择,查看其他类型 要查看的话,要重新运行程序 解决办法: 在整个输出部分外加上一个while循环语句,用来限定,直到选择菜单上的退出,才退出程序 否则,就继续选择输出 解决上述问题后程序就能成功运行 达到预期实习要求 最终截图如下: 最后,我发现本程序一些其他的问题 第一,存储结构不完善,如果在海量数据的情况下,这种结构会浪费大量的时间,因为分类输出的数据都要遍历全部数据数据 解决这个问题,可以把类型层和坐标层分开,而且分好类后就把这一类存放在一起,用指针标记,输出时只找到此类的指针就输出全部此类的数据了 程序还可以加上输出图形,实现图形上的放大缩小等功能 遗憾的是,上面的问题由于时间关系,没能在本次实习中实现,本人正在研究中,会尽快完善此程序 实习总结 通过这次实习,我学到了如何对数据分析和处理 如何针对不同的数据进行分析后,确定出简单,有效的存储结构,从而使程序高效执行 尤其是在程序功能划分和架构的设计方面得到了锻炼,并且通过这次实习,我对C语言掌握的更加熟练,对链表认识深刻,极大的提高我的编程思想 从中也学到了编写程序的一些基本的流程和方法 为以后的学习打下了坚实的基础 另外,这次实习过后,使我对《数据结构》课程有了更深刻的认识和理解 它是编程的精髓,有好的数据结构,才有好的算法,有好的算法,才有好的程序 最后,我要对指导我实习的王强老师表示真诚的感谢,非常感谢王老师的指导,让我受益非浅 附: 完整程序代码 #include"stdafx.h" #include"iostream.h" #defineNULL0 structcoordinate { doublex; doubley; coordinate*next; }; structcode { intcode1; intcode2; coordinate*next; }; structId { intId1; intId2; Id*next; code*next1; }; Id*creat(void) { Id*p,*head; code*q; coordinate*s; FILE*fp; p=newId; p->next=NULL; p->next1=NULL; head=p; fp=fopen("武汉实习数据.usr","r"); while(! feof(fp)) { fscanf(fp,"%d,%d",&p->Id1,&p->Id2);//读取目标Id if(p->Id1==-999999&&p->Id2==-999999)//整个文件结束 break; q=newcode; p->next1=q; fscanf(fp,"%d,%d",&q->code1,&q->code2);//读取代码 s=newcoordinate; q->next=s; while (1) { fscanf(fp,"%lf,%lf",&s->x,&s->y); if(s->x! =-666666.0&&s->y! =-666666.0)//目标结束 { s->next=newcoordinate; s=s->next; s->next=NULL; } else break; } if(! feof(fp)) { p->next=newId; p=p->next; p->next=NULL; } } returnhead; } voidprint(Id*head,intcase1,intcase2) { Id*p; code*q; coordinate*s; p=head; while(p->next! =NULL) { q=p->next1; if((q->code1/10000==case1&&q->code1%10000==case2)||(q->code1/10000==case1&&case2==5)||(case1==4&&case2==5))//输出判断 { printf("%d,%d\n",p->Id1,p->Id2); q=p->next1; printf("%d,%d\n",q->code1,q->code2); s=q->next; while(s->x! =-666666.0&&s->y! =-666666.0) { printf("%lf,%lf\n",s->x,s->y); s=s->next; } } p=p->next; } } voidoperation(Id*head) { inta; fflush(stdin); while(a! =5) { printf("请选择\n"); printf("1.线\t2.面\t3.点\t4.本类全部\t5.退出\n"); intb,c,d; scanf("%d",&a); switch(a) { case1: printf("请选择线的类别\n"); printf("1.图廓点\t2.铁路\t3.汽渡虚线\t4.主要道路\t5.本类全部\t6.退出\n"); scanf("%d",&b); switch(b) { case1: print(head,1,0);break;//代码=10000 case2: print(head,1,1);break;//代码=10001 case3: print(head,1,3);break;//代码=10003 case4: print(head,1,4);break;//代码=10004 case5: print(head,1,5);break;//代码=10000100011000310004 case6: break;//推出 }break; case2: printf("请选择面的类别\n"); printf("1.码头\t2.铁路中转站\t3.河流、湖泊\t4.居民地\t5.本类全部\t6.退出\n"); scanf("%d",&c); switch(c) { case1: print(head,2,1);break;//代码=20001 case2: print(head,2,2);break;//代码=20002 case3: print(head,2,3);break;//代码=20003 case4: print(head,2,4);break;//代码=20004 case5: print(head,2,5);break;//代码=20001200022000320004 case6: break; }break; case3: printf("请选择\n"); printf("1.控制点\t2.退出\n"); scanf("%d",&d); switch(d) { case1: print(head,3,5);break;//代码=30000 case2: printf("恭喜! ! 分类完成! \n");return; }break; case4: print(head,4,5);break;////代码=1000010001100031000042000120002200032000430000 case5: break; } } } voidmain() { Id*head; cout<<"数据结构课程设计"< cout<<"0503702李佳倪design"< head=creat();//创建 operation(head);//操作 } 1、敏而好学,不耻下问——孔子
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 数据 结构设计 实习 报告 28