数据结构设计实习报告28Word文件下载.docx
- 文档编号:21139846
- 上传时间:2023-01-27
- 格式:DOCX
- 页数:17
- 大小:21.07KB
数据结构设计实习报告28Word文件下载.docx
《数据结构设计实习报告28Word文件下载.docx》由会员分享,可在线阅读,更多相关《数据结构设计实习报告28Word文件下载.docx(17页珍藏版)》请在冰豆网上搜索。
structcode{};
//代码
structId{};
//ID
Id*creat(){}//文件读取创建结构
Voidprint(参数){}//输出指定的分类数据
Voidoperation(Id*head)//分类操作
{
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
..............
类型
X,Y
代码:
structcoordinate
doublex;
doubley;
coordinate*next;
};
structcode
intcode1;
intcode2;
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;
structId
intId1;
intId2;
Id*next;
code*next1;
然后是主程序的设计代码如下:
voidmain()
{
Id*head;
cout<
<
"
数据结构课程设计"
endl;
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;
next1=NULL;
head=p;
fp=fopen("
"
r"
);
while(!
feof(fp))
fscanf(fp,"
%d,%d"
&
p->
Id1,&
Id2);
//读取目标Id
if(p->
Id1==-999999&
Id2==-999999)//整个文件结束
break;
q=newcode;
next1=q;
fscanf(fp,"
code1,&
code2);
//读取代码
s=newcoordinate;
q->
next=s;
while
(1)
{
fscanf(fp,"
%lf,%lf"
s->
x,&
y);
if(s->
x!
=-666666.0&
y!
=-666666.0)//目标结束
{
s->
next=newcoordinate;
s=s->
next;
}
else
break;
}
if(!
p->
next=newId;
p=p->
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:
请选择线的类别\n"
printf("
1.图廓点\t2.铁路\t3.汽渡虚线\t4.主要道路\t5.本类全部\t6.退出\n"
scanf("
b);
switch(b)
case1:
print(head,1,0);
break;
//代码=10000
case2:
print(head,1,1);
//代码=10001
case3:
print(head,1,3);
//代码=10003
case4:
print(head,1,4);
//代码=10004
case5:
print(head,1,5);
//代码=10000100011000310004
case6:
//推出
}break;
case2:
请选择面的类别\n"
1.码头\t2.铁路中转站\t3.河流、湖泊\t4.居民地\t5.本类全部\t6.退出\n"
scanf("
c);
switch(c)
{
print(head,2,1);
//代码=20001
print(head,2,2);
//代码=20002
print(head,2,3);
//代码=20003
case4:
print(head,2,4);
//代码=20004
case5:
print(head,2,5);
//代码=20001200022000320004
case6:
}break;
case3:
printf("
printf("
1.控制点\t2.退出\n"
d);
switch(d)
case1:
print(head,3,5);
//代码=30000
恭喜!
分类完成!
\n"
return;
case4:
print(head,4,5);
////代码=1000010001100031000042000120002200032000430000
case5:
我设计了一个voidprint(Id*head,intcase1,intcase2)函数,其中参数case1为代码首位数字参数case2为代码末位数字通过这两个条件来控制输出
首先,p=head,然后进行判断
鉴于我的数据结构,只需让*p->
next1=*q然后q->
code1,对code1进行求余,求整来进行分类判断了
voidprint(Id*head,intcase1,intcase2)
Id*p;
p=head;
while(p->
next!
=NULL)
{
q=p->
next1;
if((q->
code1/10000==case1&
code1%10000==case2)||(q->
case2==5)||(case1==4&
case2==5))//输出判断
{
printf("
%d,%d\n"
p->
Id1,p->
q->
code1,q->
s=q->
while(s->
=-666666.0)
{
printf("
%lf,%lf\n"
s->
x,s->
}
}
}
至此程序设计编写完成,进行调试过程
程序调试分析
运行程序,调试过程中,个人遇到以下问题:
1.数据文件必须和程序文件放在同一目录底下,才能读取和运行
2.运行后,发现了选定一种类型后,输出坐标后,程序就结束了
不能进行反复选择,查看其他类型
要查看的话,要重新运行程序
解决办法:
在整个输出部分外加上一个while循环语句,用来限定,直到选择菜单上的退出,才退出程序
否则,就继续选择输出
解决上述问题后程序就能成功运行
达到预期实习要求
最终截图如下:
最后,我发现本程序一些其他的问题
第一,存储结构不完善,如果在海量数据的情况下,这种结构会浪费大量的时间,因为分类输出的数据都要遍历全部数据数据
解决这个问题,可以把类型层和坐标层分开,而且分好类后就把这一类存放在一起,用指针标记,输出时只找到此类的指针就输出全部此类的数据了
程序还可以加上输出图形,实现图形上的放大缩小等功能
遗憾的是,上面的问题由于时间关系,没能在本次实习中实现,本人正在研究中,会尽快完善此程序
实习总结
通过这次实习,我学到了如何对数据分析和处理
如何针对不同的数据进行分析后,确定出简单,有效的存储结构,从而使程序高效执行
尤其是在程序功能划分和架构的设计方面得到了锻炼,并且通过这次实习,我对C语言掌握的更加熟练,对链表认识深刻,极大的提高我的编程思想
从中也学到了编写程序的一些基本的流程和方法
为以后的学习打下了坚实的基础
另外,这次实习过后,使我对《数据结构》课程有了更深刻的认识和理解
它是编程的精髓,有好的数据结构,才有好的算法,有好的算法,才有好的程序
最后,我要对指导我实习的王强老师表示真诚的感谢,非常感谢王老师的指导,让我受益非浅
附:
完整程序代码
#include"
stdafx.h"
iostream.h"
#defineNULL0
Id*creat(void)
voidmain()
cout<
head=creat();
//创建
operation(head);
//操作
1、敏而好学,不耻下问——孔子
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 数据 结构设计 实习 报告 28