C语言实训—电子地图导航系统源代码.docx_第1页
C语言实训—电子地图导航系统源代码.docx_第2页
C语言实训—电子地图导航系统源代码.docx_第3页
C语言实训—电子地图导航系统源代码.docx_第4页
C语言实训—电子地图导航系统源代码.docx_第5页
已阅读5页,还剩13页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

/*Filename:tagMap_tDo.cpp *Created:2012/6/24 * *Author:. 吴昊 王洋 张伟 王伟 */#include#include#include#include/*函数声明部分*/void ma_interf();int ReadFile();void ReadData(FILE *p);void WriteResult (int b , int j);void Search();/*宏定义*/#define MCGETCHAR(data) (*(char *)(data)#define MCGETSHORT(data) (unsigned short)( (unsigned short)(*(char *)(data)8 )|( (unsigned short)(*(char *)(data)+1)&0x00ff )#define MCGETLONG(data) ( ( (unsigned long)MCGETSHORT(data)16 )|( (unsigned long)MCGETSHORT(char *)(data)+2)&0x0000ffff ) )#define MCGET3BN(data) ( ( (unsigned long)MCGETCHAR(data)16 )|( (unsigned long)MCGETSHORT(char *)(data)+1)&0x0000ffff ) )#define Length 655350 int nsizecount = 2 ;/*定义结构体类型及变量*/struct RoadRecordshort ussize;long ullinkId;short usroadnamesize;int usdispclass;int usbrunch;int usroadnameflag;char roadname20;struct tagMap_tchar sign_one2;char linkid14;char flag7;char brunch9;char dispclass13;char Roadname30;char sign_two2;*s , *ss;int mark_1=0,mark_2=0; /标记程序是否运行读取文件和排序操作void SortData(tagMap_t s);void Update (tagMap_t s); struct dataOut long linkId;int dispclass;int brunch;int roadnameflag;struct RoadRecord roadLength;struct dataOut dataLength; /*存储道路信息的数组*/ /*Functionname:ReadFile *Function Description:读取二进制文件,并将其解析在文本文档里 *Date:2012/6/20 * */int ReadFile() int m;char aclinkId4 ;/*从二进制文件中读取道路编号*/ char acroadnamesize2 ; /*从二进制文件中读取道路名称数据长度*/ char acNodeInfo4;unsigned short ustotalsize; unsigned long ullinkId; unsigned short usroadnamesize;char actotalsize2 ; /*从二进制文件中读取道路信息的总体数据长度 */FILE *pfp = fopen( e:电子地图管理系统.dat , rb+); FILE *pf2 = fopen( e:解析文件.txt , w+); if(pfp = NULL)printf(can not open the 电子地图管理系统.dat file or there is no the file!n);return 0;if(pf2 = NULL)printf(can not open the 解析文件.txt file or there is no the filen);return 0;printf(nntttt文件读取中.n);while(fread(actotalsize , sizeof(actotalsize) , 1 , pfp) = 1) fread( aclinkId , sizeof(aclinkId) , 1 , pfp ) ;/*读取占用4字节的linkId字符*/ fread( acroadnamesize , sizeof(acroadnamesize) , 1 , pfp ) ;/*读取占用2字节的roadnamesize字符串*/ fread( acNodeInfo , sizeof(acNodeInfo) , 1 , pfp ) ; ustotalsize = MCGETSHORT(actotalsize) ;/*调用宏函数 , 将字符串信息转化为数值类型*/ullinkId = MCGETLONG(aclinkId) ;usroadnamesize = MCGETSHORT(acroadnamesize) ;/*赋值 :将数值信息传到结构体中*/ roadnsizecount.ussize = ustotalsize ;roadnsizecount.ullinkId = ullinkId ;roadnsizecount.usroadnamesize= usroadnamesize ;m=(int)acNodeInfo3&255;roadnsizecount.usdispclass=m&15;roadnsizecount.usbrunch=(m&112)/16;roadnsizecount.usroadnameflag=(m&128)/128;datansizecount.dispclass= roadnsizecount.usdispclass;datansizecount.brunch=roadnsizecount.usbrunch;datansizecount.roadnameflag=roadnsizecount.usroadnameflag;datansizecount.linkId= ullinkId;fread(roadnsizecount.roadname , sizeof(char) , ustotalsize - 12 , pfp ) ;/*从文件中读取道路名称*/fprintf(pf2 , #t);fprintf(pf2 , LinkID=);fprintf(pf2 , %dt , datansizecount.linkId);fprintf(pf2 , flag=);fprintf(pf2 , %dt , datansizecount.roadnameflag);fprintf(pf2 , brunch=);fprintf(pf2 , %dt , datansizecount.brunch);fprintf(pf2 , dispclass=);fprintf(pf2 , %dt , datansizecount.dispclass);fprintf(pf2 , Roadname=);fprintf(pf2 , %st , roadnsizecount.roadname+4);fprintf(pf2 , #);fprintf(pf2 , n);nsizecount+;fclose(pfp); fclose(pf2); printf(ntttt 文件读取成功n);return 0; /*Functionname:Search *Function Description:检索信息部分,可按不同的类型进行检索 *Date:2012/6/20 * */void Search()int select , i=0 , j=0 , *b , c=0 , f; /select 标记选择需要运行的分支 i 循环控制 j标记检索到信息的条数 /b 数组指针 用来存放检索到的信息的下标 c 用来存放数组b的下标 f 标记数组b的值char sss20;printf(nnt请输入检索方式:nntt1:指定linkID 检索nntt2:指定交叉link列表示class番号 检索nntt3:指定查找岔路数 检索nntt4:指定道路名称 检索nntt0:返回nntt请选择:);scanf(%d , &select);system(cls);printf(nn*-当检索到信息条数超过5条时 , 会把检索到的信息存放在searchresult文件中-*nn);printf(n*-当检索到信息条数未超过5条时 , 会把检索到的信息直接显示在屏幕上-*nnn);if(select = 1)char ss_114=LinkID=;printf(t请输入link的ID:);scanf(%s , sss);system(cls);strcat(ss_1 , sss);/连接字符串 for(i=0; i(nsizecount-2); i+)if(strcmp(ss_1 , ssi.linkid) = 0) /比较字符串是否一致printf(nn %s %s %s %s %s %s %snnn , si.sign_one , ssi.linkid , ssi.flag , ssi.brunch , ssi.dispclass , ssi.Roadname , si.sign_two);j+;if(j = 0)printf(nntttt没有匹配结果nnttt 请重新选择检索方式n);Search();else if(select = 2)char ss_114=dispclass=;printf(t请输入交叉link列表示class番号:);scanf(%s , sss);system(cls);strcat(ss_1 , sss);/连接字符串for(i=0; i(nsizecount-2); i+)if(strcmp(ss_1 , ssi.dispclass) = 0)/比较字符串是否一致j+;b=(int *)malloc(sizeof(int)*j);/动态申请数组b的存储空间for(i=0; i5)WriteResult(b , j);else if (j=5)/判断检索到得条数是否超过5条printf(nn);for(i=0; ij; i+)f=bi;printf( %s %s %s %s %s %s %sn , sf.sign_one , ssf.linkid , ssf.flag , ssf.brunch , ssf.dispclass , ssf.Roadname , sf.sign_two);printf(nn);free(b);else if(select = 3)char ss_114=brunch=;printf(t请输入岔路数:);scanf(%s , sss);system(cls);strcat(ss_1 , sss);/连接字符串for(i=0; i(nsizecount-2); i+)if(strcmp(ss_1 , ssi.brunch) = 0)/比较字符串是否一致j+;b=(int *)malloc(sizeof(int)*j);/动态申请数组b的存储空间for(i=0; i5)WriteResult(b , j);else if (j=5)/判断检索到得条数是否超过5条printf(nn);for(i=0; ij; i+)f=bi;printf( %s %s %s %s %s %s %sn , sf.sign_one , ssf.linkid , ssf.flag , ssf.brunch , ssf.dispclass , ssf.Roadname , sf.sign_two);printf(nn);free(b);else if(select = 4)char ss_114=Roadname=;printf(t请输入道路名称:);scanf(%s , sss);system(cls);strcat(ss_1 , sss);/连接字符串for(i=0; i(nsizecount-2); i+)if(strcmp(ss_1 , ssi.Roadname) = 0)/比较字符串是否一致j+;b=(int *)malloc(sizeof(int)*j);/动态申请数组b的存储空间for(i=0; i5)/判断检索到得条数是否超过5条WriteResult(b , j);else if (j=5)printf(nn);for(i=0; ij; i+)f=bi;printf( %s %s %s %s %s %s %sn , sf.sign_one , ssf.linkid , ssf.flag , ssf.brunch , ssf.dispclass , ssf.Roadname , sf.sign_two);printf(nn);free(b);else if(select = 0)system(cls);ma_interf();else/ 输入不在0到4之间给出提示信息 重新返回检索函数system(cls);printf(nntt输入信息错误,请重新选择检索方式nn);Search();ma_interf();/ 执行结束 返回主界面/*Functionname: WriteResult *Function Description:检索信息,当超过5条时,就将信息写入一个文档中 *Date:2012/6/21 * */void WriteResult (int b , int j)FILE *qq;if(qq=fopen(e:searchresult.txt , w) = NULL) /判断文件是否创建成功printf(创建文件失败n);exit(0);int i=0 , f;/ i 为循环控制变量 f 记录传入数组在不同的i下 bi 的值printf(nnttt检索到的信息超过-5-条nnntt检索到的信息写入searchresult文件中n);for(i=0; ij; i+)f=bi;fprintf(qq , #t);fprintf(qq , %st , ssf.linkid);/ 检索到的道路信息写入文件中fprintf(qq , %st , ssf.flag);/ 检索到的道路信息写入文件中fprintf(qq , %st , ssf.brunch);/ 检索到的道路信息写入文件中fprintf(qq , %st , ssf.dispclass);/ 检索到的道路信息写入文件中fprintf(qq , %st , ssf.Roadname);/ 检索到的道路信息写入文件中fprintf(qq , #);fprintf(qq , n);fclose(qq);/关闭指针qqprintf(nntt检索到的信息写入searchresult文件中成功nnn);void ma_interf()int select;/select 控制在主界面是选择需要执行的函数FILE *p;/创建解析文件的文件指针printf(/*-Welcome-*/n);printf(/*ttttttttt */n);printf(/*ttt电子地图信息统计系统tttt */n);printf(/*ttttttttt */n);printf(/*tttttt王伟 . 吴昊 张伟 王洋 */n);printf(/*ttttttt2012年6月18日t */n);printf(/*/nn);printf(请选择服务的种类:n);printf(t1:读取文件(e:电子地图管理系统GTBL.dat)nt2:排序并输出结果nt3:检索nt4:更新nt0:退出nt请选择:);scanf(%d , &select);system(cls);switch(select)case 1 :ReadFile();s=(struct tagMap_t *)malloc(sizeof(struct tagMap_t)*(nsizecount-2);/动态申请结构体s的内存空间ss=(struct tagMap_t *)malloc(sizeof(struct tagMap_t)*(nsizecount-2);/动态申请结构体ss的内存空间p=fopen(e:解析文件.txt , r);mark_1+;/标记是否执行读取文件ReadData(p);break;case 2 :if(mark_1!=1)printf(nnt请在进行排序前先选择-1-进行读取文件,否则无数据进行排序nn);ma_interf();else if(mark_1=1)mark_2+;/标记是否执行排序操作SortData(s);break;case 3 :if(mark_1=0|mark_2=0)/判断是否执行 读取文件 和排序道路信息printf(nntt请在进行-检索-前先选择-1-2-进行读取文件和排序操作nn);printf(tt 否则无数据进行检索或检索到的数据未排序nn);ma_interf();elseSearch();break;case 4 :if(mark_1=0|mark_2=0)/判断是否执行 读取文件 和排序道路信息printf(nntt请在进行-更新-前先选择-1-2-进行读取文件和排序操作nn);printf(tt 否则无数据进行更新或更新到得数据未排序nn);ma_interf();elseUpdate(s);break;case 0 :if(mark_1!=0)/判断是否打开申请s 和ss 的空间free(s);/释放s内存free(ss);/释放ss内存exit(0);break;default:system(cls); printf(nnnttt输入信息出错,请重新选择服务种类:nnnn);ma_interf();/执行结束 返回主界面/*Functionname:Judge *Function Description:判断解析出来的文件是否存在 *Date:2012/6/20 * */int Judge()FILE *pp;if(pp=fopen(e:电子地图管理系统.dat , rb) = NULL) /打开文件 并返回pp文件指针 判断文件是否存在system(cls);printf(nnttttthe file not exist!nntttt 请重新选择服务:nn);printf(nt请将需要解析的-电子地图管理系统.dat-放入-e:根目录下-中nn);return 0;elsereturn 1;/*Functionname:ReadData *Function Description:将文件信息读取到内存中 *Date:2012/6/21 * */ void ReadData(FILE *p)if(Judge() = 1)/判断文件Judge 函数的返回值int i=0;/i 为循环控制变量printf(nttt文件信息-写入内存中n);for(i=0;i(nsizecount-2);i+)fscanf(p , %s , si.sign_one);/道路信息放入内存中fscanf(p , %s , si.linkid);/道路信息放入内存中fscanf(p , %s , si.flag);/道路信息放入内存中fscanf(p , %s , si.brunch);/道路信息放入内存中fscanf(p , %s , si.dispclass);/道路信息放入内存中fscanf(p , %s , si.Roadname);/道路信息放入内存中fscanf(p , %s , si.sign_two);/道路信息放入内存中if(s1.sign_one!=)/判断文件信息是否写入成功printf(nttt 文件信息-写入内存成功nn);ma_interf();/返回主界面elsema_interf();/返回主界面/*Functionname: SortData *Function Description:对读取出来的文件信息进行排序并将排序结果显示在屏幕上 *Date:2012/6/21 * */void SortData(tagMap_t s)int i=0 , k=0 , j=0 , m=0 , n=7; /i k 为循环控制变量 n 记录linkid的长度 m 标记成功排序的个数 char temp50;printf(nnttt排序中请等待!nntt排序完成后将自动按LinkID编号由小到大显示所有道路信息nn);for(n=8; n13; n+)for(i=0; i(nsizecount-2); i+)if(int)strlen(si.linkid) = n)/ 判断linkid的长度是否为nk=i;/记录 Linkid长度为n时 数组s 的下标ij=i;/记录 Linkid长度为n时 数组s 的下标ifor(k=k+1; k0)/比较linkid的长度同为n时它们的大小i=k;/记录下当前检索到最小linkid的s数组的下标strcpy(ssm.linkid , si.linkid);/此时最小linkid 把数组s的信息存放到ss数组中strcpy(ssm.flag , si.flag);/此时最小linkid 把数组s的信息存放到ss数组中strcpy(ssm.brunch , si.brunch);/此时最小linkid 把数组s的信息存放到ss数组中strcpy(ssm.dispclass , si.dispclass);/此时最小linkid 把数组s的信息存放到ss数组中strcpy(ssm.Roadname , si.Roadname);/此时最小linkid 把数组s的信息存放到ss数组中strcpy(temp , sj.linkid);/交换si和sj中linkid的信息strcpy(sj.linkid , si.linkid);strcpy(si.linkid , temp);strcpy(temp , sj.flag);/交换si和sj中flag的信息strcpy(sj.flag , si.flag);strcpy(si.flag , temp);strcpy(temp , sj.brunch);/交换si和sj中brunch的信息strcpy(sj.brunch , si.brunch);strcpy(si.brunch , temp);strcpy(temp , sj.dispclass);/交换si和sj中dispclass的信息strcpy(sj.dispclass , si.dispclass);strcpy(si.dispclass , temp);strcpy(temp , sj.Roadname);/交换si和sj中Roadname的信息strcpy(sj.Roadname , si.Roadname);strcpy(si.Roadname , temp);m+;/记录已排序成功道路信息的个数i=j;if(m%830 = 0) /排序进度提示符 . 的输出控制 830 时刚好输出 1 行 . 且进度刚好100% printf(.);if(m%100=0)/ 控制百分数输出if(float)m/(nsizecount-2)*100=10)printf(%.1f%bbbbb , (float)m/(nsizecount-2)*100);system(cls);for(i=0;im;i+)printf( %s %s %s %s %s n , ssi.linkid , ssi.flag , ssi.brunch , ssi.dispclass , ssi.Roadname);print

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论