C语言实训电子地图导航系统源代码.docx
- 文档编号:9040426
- 上传时间:2023-02-02
- 格式:DOCX
- 页数:27
- 大小:22.38KB
C语言实训电子地图导航系统源代码.docx
《C语言实训电子地图导航系统源代码.docx》由会员分享,可在线阅读,更多相关《C语言实训电子地图导航系统源代码.docx(27页珍藏版)》请在冰豆网上搜索。
C语言实训电子地图导航系统源代码
/**************************************************************************************
*Filename:
tagMap_tDo.cpp*
*Created:
2012/6/24*
*Author:
..吴昊王洋张伟王伟*
**************************************************************************************/
#include
#include
#include
#include
/*函数声明部分*/
voidma_interf();
intReadFile();
voidReadData(FILE*p);
voidWriteResult(intb[],intj);
voidSearch();
/*宏定义*/
#defineMCGETCHAR(data)(*((char*)(data)))
#defineMCGETSHORT(data)((unsignedshort)((((unsignedshort)(*((char*)(data))))<<8)|(((unsignedshort)(*((char*)(data)+1)))&0x00ff)))
#defineMCGETLONG(data)((((unsignedlong)MCGETSHORT((data)))<<16)|(((unsignedlong)MCGETSHORT((char*)(data)+2))&0x0000ffff))
#defineMCGET3BN(data)((((unsignedlong)MCGETCHAR((data)))<<16)|(((unsignedlong)MCGETSHORT((char*)(data)+1))&0x0000ffff))
#defineLength655350
intnsizecount=2;
/*定义结构体类型及变量*/
structRoadRecord
{
shortussize;
longullinkId;
shortusroadnamesize;
intusdispclass;
intusbrunch;
intusroadnameflag;
charroadname[20];
};
structtagMap_t
{
charsign_one[2];
charlinkid[14];
charflag[7];
charbrunch[9];
chardispclass[13];
charRoadname[30];
charsign_two[2];
}*s,*ss;
intmark_1=0,mark_2=0;//标记程序是否运行读取文件和排序操作
voidSortData(tagMap_ts[]);
voidUpdate(tagMap_ts[]);
structdataOut
{longlinkId;
intdispclass;
intbrunch;
introadnameflag;
};
structRoadRecordroad[Length];
structdataOutdata[Length];/*存储道路信息的数组*/
/**************************************************************************************
*Functionname:
ReadFile*
*FunctionDescription:
读取二进制文件,并将其解析在文本文档里*
*Date:
2012/6/20*
**************************************************************************************/
intReadFile()
{
intm;
characlinkId[4];/*从二进制文件中读取道路编号*/
characroadnamesize[2];/*从二进制文件中读取道路名称数据长度*/
characNodeInfo[4];
unsignedshortustotalsize;
unsignedlongullinkId;
unsignedshortusroadnamesize;
charactotalsize[2];/*从二进制文件中读取道路信息的总体数据长度*/
FILE*pfp=fopen("e:
\\电子地图管理系统.dat","rb+");
FILE*pf2=fopen("e:
\\解析文件.txt","w+");
if(pfp==NULL)
{
printf("cannotopenthe电子地图管理系统.datfileorthereisnothefile!
\n");
return0;
}
if(pf2==NULL)
{
printf("cannotopenthe解析文件.txtfileorthereisnothefile\n");
return0;
}
printf("\n\n\t\t\t\t文件读取中.....\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);
/*赋值:
将数值信息传到结构体中*/
road[nsizecount].ussize=ustotalsize;
road[nsizecount].ullinkId=ullinkId;
road[nsizecount].usroadnamesize=usroadnamesize;
m=(int)acNodeInfo[3]&255;
road[nsizecount].usdispclass=m&15;
road[nsizecount].usbrunch=(m&112)/16;
road[nsizecount].usroadnameflag=(m&128)/128;
data[nsizecount].dispclass=road[nsizecount].usdispclass;
data[nsizecount].brunch=road[nsizecount].usbrunch;
data[nsizecount].roadnameflag=road[nsizecount].usroadnameflag;
data[nsizecount].linkId=ullinkId;
fread(road[nsizecount].roadname,sizeof(char),ustotalsize-12,pfp);/*从文件中读取道路名称*/
fprintf(pf2,"#\t");
fprintf(pf2,"LinkID=");
fprintf(pf2,"%d\t",data[nsizecount].linkId);
fprintf(pf2,"flag=");
fprintf(pf2,"%d\t",data[nsizecount].roadnameflag);
fprintf(pf2,"brunch=");
fprintf(pf2,"%d\t",data[nsizecount].brunch);
fprintf(pf2,"dispclass=");
fprintf(pf2,"%d\t",data[nsizecount].dispclass);
fprintf(pf2,"Roadname=1=");
fprintf(pf2,"%s\t",road[nsizecount].roadname+4);
fprintf(pf2,"#");
fprintf(pf2,"\n");
nsizecount++;
}
fclose(pfp);
fclose(pf2);
printf("\n\t\t\t\t文件读取成功\n");
return0;
}
/**************************************************************************************
*Functionname:
Search*
*FunctionDescription:
检索信息部分,可按不同的类型进行检索*
*Date:
2012/6/20
*
**************************************************************************************/
voidSearch()
{
intselect,i=0,j=0,*b,c=0,f;//select标记选择需要运行的分支i循环控制j标记检索到信息的条数
//b数组指针用来存放检索到的信息的下标c用来存放数组b的下标f标记数组b的值
charsss[20];
printf("\n\n\t请输入检索方式:
\n\n\t\t1:
指定linkID检索\n\n\t\t2:
指定交叉link列表示class番号检索\n\n\t\t3:
指定查找岔路数检索\n\n\t\t4:
指定道路名称检索\n\n\t\t0:
返回\n\n\t\t请选择:
");
scanf("%d",&select);
system("cls");
printf("\n\n*****--当检索到信息条数超过5条时,会把检索到的信息存放在searchresult文件中--*****\n\n");
printf("\n********--当检索到信息条数未超过5条时,会把检索到的信息直接显示在屏幕上--********\n\n\n");
if(select==1)
{
charss_1[14]="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,ss[i].linkid)==0)//比较字符串是否一致
{
printf("\n\n%s%s%s%s%s%s%s\n\n\n",s[i].sign_one,ss[i].linkid,ss[i].flag,ss[i].brunch,\
ss[i].dispclass,ss[i].Roadname,s[i].sign_two);
j++;
}
}
if(j==0)
{
printf("\n\n\t\t\t\t没有匹配结果\n\n\t\t\t请重新选择检索方式\n");
Search();
}
}
elseif(select==2)
{
charss_1[14]="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,ss[i].dispclass)==0)//比较字符串是否一致
{
j++;
}
}
b=(int*)malloc(sizeof(int)*j);//动态申请数组b的存储空间
for(i=0;i<(nsizecount-2);i++)
{
if(strcmp(ss_1,ss[i].dispclass)==0)//比较字符串是否一致
{
b[c]=i;
c++;
}
}
if(j==0)
{
printf("\n\n\t\t\t\t没有匹配结果\n\n\t\t\t请重新选择检索方式\n");
Search();
}
elseif(j>5)
{
WriteResult(b,j);
}
elseif(j<=5)//判断检索到得条数是否超过5条
{
printf("\n\n");
for(i=0;i { f=b[i]; printf("%s%s%s%s%s%s%s\n",s[f].sign_one,ss[f].linkid,ss[f].flag,ss[f].brunch,\ ss[f].dispclass,ss[f].Roadname,s[f].sign_two); } printf("\n\n"); } free(b); } elseif(select==3) { charss_1[14]="brunch="; printf("\t请输入岔路数: "); scanf("%s",sss); system("cls"); strcat(ss_1,sss);//连接字符串 for(i=0;i<(nsizecount-2);i++) { if(strcmp(ss_1,ss[i].brunch)==0)//比较字符串是否一致 { j++; } } b=(int*)malloc(sizeof(int)*j);//动态申请数组b的存储空间 for(i=0;i<(nsizecount-2);i++) { if(strcmp(ss_1,ss[i].brunch)==0)//比较字符串是否一致 { b[c]=i; c++; } } if(j==0) { printf("\n\n\t\t\t\t没有匹配结果\n\n\t\t\t请重新选择检索方式\n"); Search(); } elseif(j>5) { WriteResult(b,j); } elseif(j<=5)//判断检索到得条数是否超过5条 { printf("\n\n"); for(i=0;i { f=b[i]; printf("%s%s%s%s%s%s%s\n",s[f].sign_one,ss[f].linkid,ss[f].flag,ss[f].brunch,\ ss[f].dispclass,ss[f].Roadname,s[f].sign_two); } printf("\n\n"); } free(b); } elseif(select==4) { charss_1[14]="Roadname=1="; printf("\t请输入道路名称: "); scanf("%s",sss); system("cls"); strcat(ss_1,sss);//连接字符串 for(i=0;i<(nsizecount-2);i++) { if(strcmp(ss_1,ss[i].Roadname)==0)//比较字符串是否一致 { j++; } } b=(int*)malloc(sizeof(int)*j);//动态申请数组b的存储空间 for(i=0;i<(nsizecount-2);i++) { if(strcmp(ss_1,ss[i].Roadname)==0)//比较字符串是否一致 { b[c]=i; c++; } } if(j==0) { printf("\n\n\t\t\t\t没有匹配结果\n\n\t\t\t请重新选择检索方式\n"); Search(); } elseif(j>5)//判断检索到得条数是否超过5条 { WriteResult(b,j); } elseif(j<=5) { printf("\n\n"); for(i=0;i { f=b[i]; printf("%s%s%s%s%s%s%s\n",s[f].sign_one,ss[f].linkid,ss[f].flag,ss[f].brunch,\ ss[f].dispclass,ss[f].Roadname,s[f].sign_two); } printf("\n\n"); } free(b); } elseif(select==0) { system("cls"); ma_interf(); } else//输入不在0到4之间给出提示信息重新返回检索函数 { system("cls"); printf("\n\n\t\t输入信息错误,请重新选择检索方式\n\n"); Search(); } ma_interf();//执行结束返回主界面 } /****************************************************************************** ******** *Functionname: WriteResult* *FunctionDescription: 检索信息,当超过5条时,就将信息写入一个文档中* *Date: 2012/6/21* **************************************************************************************/ voidWriteResult(intb[],intj) { FILE*qq; if((qq=fopen("e: \\searchresult.txt","w"))==NULL)//判断文件是否创建成功 { printf("创建文件失败\n"); exit(0); } inti=0,f;//i为循环控制变量f记录传入数组在不同的i下b[i]的值 printf("\n\n\t\t\t检索到的信息超过--5--条\n\n\n\t\t检索到的信息写入searchresult文件中……\n"); for(i=0;i { f=b[i]; fprintf(qq,"#\t"); fprintf(qq,"%s\t",ss[f].linkid);//检索到的道路信息写入文件中 fprintf(qq,"%s\t",ss[f].flag);//检索到的道路信息写入文件中
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 语言 电子地图 导航系统 源代码