电子地图信息

来源:互联网 发布:php中空对象的if 判断 编辑:程序博客网 时间:2024/04/29 12:18

****************************************************************************界面 ElectricMap.cpp **************************************************************************

#include<stdio.h>

#include<memory.h>
#include<windows.h>
#include<time.h>
#include"Analysis.h"
#include"Search.h"
#include"Sort.h"
#include"Update.h"


Road *road=(Road*)malloc(MAX*sizeof(Road));


int main()
{
/*                文件读取                */
/*                文件排序                */
/*  文件检索                */
/*  文件更新                */
/*                主程序                  */


system("color 30");
printf("/****************************Welcome!*************************/\n");
printf("/***                 电子地图信息管理系统                  ***/\n");
printf("\n");
printf("/***       ^_^ ^_^ ^_^ 组长 -- 江天情 ^_^ ^_^ ^_^          ***/\n");
printf("/***       ^_^ ^_^ ^_^ 组员 -- 段新宇 ^_^ ^_^ ^_^          ***/\n");
printf("/***       ^_^ ^_^ ^_^ 组员 -- 范雪峰 ^_^ ^_^ ^_^          ***/\n");
printf("/***       ^_^ ^_^ ^_^ 组员 -- 金志强 ^_^ ^_^ ^_^          ***/\n");
printf("/***       ^_^ ^_^ ^_^ 组员 -- 范一然 ^_^ ^_^ ^_^          ***/\n");
printf("\n");
printf("/****************************Welcome!*************************/\n");
while(1)
{
char a[2];
static int cout=1;
printf("\n请选择服务的种类:\n");
printf(" 1.文件读取.\n");
printf(" 2.文件排序.\n");
printf(" 3.文件检索.\n");
printf(" 4.文件更新.\n");
printf(" 0.退出.\n");
printf("请选择:");
scanf("%1s",a);
if(cout>1)
{
goto loop;
}
else
{
if(a[0]=='0')
{
return 0;
}
if(a[0]=='1')
{
cout+=1;
loop: switch(a[0])
{
case '1':
{
printf("文件读取中.....\n");
Analysis(road);//文件读取
printf("文件已转存到analysis.txt中!\n");

}break;
case '2':
{
Sort(road);//文件排序


}break;
case '3':
{
Search(road);//文件检索

}break;
case '4':
{
printf("文件更新中.....\n");
Update(road);//文件更新
printf("更新完成!\n");
}break;
case '0':
{
return 0;
}break;
default:
{
printf("您输入的为非法选项!请重新选择:\n");

}break;
}
}
else
{
printf("文件没有加载!请重新选择:\n");
}
}
fflush(stdin);
}

***********************************************************************Analysis.h*******************************************************************************

#define MAX 63538
typedef unsigned short uint16;
typedef unsigned int  uint32;
#define BigtoLittle16(A) ((((uint16)(A) & 0xff00) >> 8) | (((uint16)(A) & 0x00ff) << 8))
#define BigtoLittle32(A) ((((uint32)(A) & 0xff000000) >>24) | (((uint32)(A) & 0x00ff0000) >> 8) | (((uint32)(A) & 0x0000ff00) << 8) | (((uint32)(A) & 0x000000ff) << 24))


typedef struct {
uint16 RecordSize;//道路信息大小
uint32 LinkID;//道路标号
uint16 RoadSize;//道路名称大小
uint16 RoadFlag;//道路标志位
uint32 RoadNode;//道路岔路数
uint16 LinkClass;//道路番号
uint32 info; //道路信息起始点情报
char RoadName[30];//道路名称
}Road;


void Analysis(Road *road)
{
int i=0,zero=0;
uint32 temp=0;
memset(road,0,MAX*sizeof(Road));
FILE *fp,*fp1;
fp1=fopen("analysis.txt","w");
if((fp=fopen("GTBL.DAT","rb"))==NULL)
printf("源文件不存在!\n");
while(i<MAX)
{
fread(&road[i].RecordSize,2,1,fp);//读取道路信息大小
fread(&road[i].LinkID,4,1,fp);//读取道路标号
fread(&road[i].RoadSize,2,1,fp);//读取道路名称大小
fread(&road[i].info,4,1,fp);//读取始点Node的情报
if((BigtoLittle16(road[i].RecordSize)-12)!=0)//用道路信息大小减去12剩下的就是道路名称的二进制码
{
fread(&(road[i].RoadName),BigtoLittle16(road[i].RecordSize)-12,1,fp);//读取道路名称
}
fprintf(fp1,"序号: %5d",i+1);
fprintf(fp1," 道路信息大小: %5d",BigtoLittle16(road[i].RecordSize));//道路信息大小
fprintf(fp1," 道路ID: %5d",BigtoLittle32(road[i].LinkID));//道路标号
fprintf(fp1," 道路番号: %5d",BigtoLittle16(road[i].info)&15);//道路番号
fprintf(fp1," 道路标志位: %5d",BigtoLittle16(road[i].info)>>7);//道路标志位
fprintf(fp1," 道路岔路数: %5d",(BigtoLittle16(road[i].info)>>4)&7);//道路岔路数
if((road[i].RecordSize-12)==0)
{
fprintf(fp1," 道路名称大小: %5d",zero);
fprintf(fp1," 道路名称: 该道路无名称! \n");
}
else
{
fprintf(fp1," 道路名称大小:  %5d",BigtoLittle16(road[i].RoadSize));
fprintf(fp1," 道路名称:  %5s\n",&road[i].RoadName);
}
i++;
}
fclose(fp);
fclose(fp1);
fp=NULL;
fp1=NULL;
}

****************************************************************Search.h***************************************************

int Search( Road *proad)
{
int n,i,flag=0,count=0;
int ret,m=0;
char filename[20];
FILE *fp;
Road *roadagain;
roadagain=(Road*)malloc(sizeof(Road)*MAX);
while(1)
{
printf("请选择检索方式:\n");
printf(" 1:指定LinkID检索\n");
printf(" 2:指定岔路数检索\n");
printf(" 3:指定道路名称检索\n");
printf(" 4:指定交叉Link列表示Class番号检索\n");
printf(" 0:返回\n");
printf("请选择:");
scanf("%d",&n);
if((n!=1)&&(n!=2)&&(n!=3)&&(n!=4)&&(n!=0))
{
printf("输入有误! 请重新选择\n");
printf("\n");
}
if(n==1)
{
unsigned int LinkID;
printf("请输入要查找的LinkID:");
scanf("%d",&LinkID);
for(i=0;i<MAX;i++)
{
if(BigtoLittle32(proad[i].LinkID)==LinkID)
{
printf("检索成功!\n");
flag=1;
printf("道路ID:%d   道路标志位:%d   道路岔路数:%d   道路番号:%d   道路名称:%s\n",BigtoLittle32(proad[i].LinkID),BigtoLittle32(proad[i].info)>>7,(BigtoLittle32(proad[i].info)>>4)&7,BigtoLittle32(proad[i].info)&15,proad[i].RoadName);
break;
}
if(BigtoLittle32(proad[i].LinkID)!=LinkID)
{
flag=0;
}
}
if(flag==0)
{
printf("没有找到你所要检索的信息!\n");
}

}
if(n==2)
{
flag=0;
unsigned int RoadNode;
printf("请输入要查找的岔路数:");
scanf("%d",&RoadNode);
for(i=0;i<MAX;i++)
{
if(((BigtoLittle32(proad[i].info)>>4)&7)==RoadNode)
{
flag=1;
count++;
roadagain[count-1].RecordSize=BigtoLittle16(proad[i].RecordSize);
roadagain[count-1].LinkID=BigtoLittle32(proad[i].LinkID);
roadagain[count-1].RoadFlag=BigtoLittle32(proad[i].info)>>7;
roadagain[count-1].RoadNode=(BigtoLittle32(proad[i].info)>>4)&7;
roadagain[count-1].LinkClass=BigtoLittle32(proad[i].info)&15;
strcpy(roadagain[count-1].RoadName,proad[i].RoadName);
}
}
if(flag==1)
{
printf("检索成功!\n");
if(count<=5)
{
for(i=0;i<count;i++)
{
printf("道路ID:%d   道路标志位:%d   道路岔路数:%d   道路番号:%d   道路名称:%s   \n",roadagain[i].LinkID,roadagain[i].RoadFlag,roadagain[i].RoadNode,roadagain[i].LinkClass,roadagain[i].RoadName);
}
count=0;
}
if(count>5)
{
printf("检中数目大于5(共%d条),将其转存到一个文本文件。\n",count);
printf("请输入该文本文件的名称<用加.txt后缀>:");
scanf("%s",filename);
printf("检索的信息已经成功输出到文本文件中,敬请查看。\n");
fp=fopen(filename,"w");
for(i=0;i<count;i++)
{
fprintf(fp,"size:%3d  LinkID:%6d  Flag:%2d  turnoff:%2d  番号:%2d  name:%s\n",roadagain[i].RecordSize,roadagain[i].LinkID,roadagain[i].RoadFlag,roadagain[i].RoadNode,roadagain[i].LinkClass,roadagain[i].RoadName);

}
fclose(fp);
fp=NULL;
count=0;
}
}
else
printf("没有找到你要检索的信息!\n");


}
if(n==3)
{
flag=0;
char RoadName[20];
printf("请输入要查找的道路名称:");
scanf("%s",RoadName);

for(i=0;i<MAX;i++)
{
ret=strcmp(RoadName,proad[i].RoadName);
if(ret==0)
{
flag=1;
m=1;
}
else
flag=0;

if(flag==1)
{
count++;
roadagain[count-1].RecordSize=BigtoLittle16(proad[i].RecordSize);
roadagain[count-1].LinkID=BigtoLittle32(proad[i].LinkID);
roadagain[count-1].RoadFlag=BigtoLittle32(proad[i].info)>>7;
roadagain[count-1].RoadNode=(BigtoLittle32(proad[i].info)>>4)&7;
roadagain[count-1].LinkClass=BigtoLittle32(proad[i].info)&15;
strcpy(roadagain[count-1].RoadName,proad[i].RoadName);
}
}
if(m==1)
{
printf("检索成功! \n");
if(count<=5)
{
for(i=0;i<count;i++)
{
printf("LinkID:%d   有无Flag:%d   岔路数:%d   交叉Link列表示Class番号:%d   道路名称:%s   \n",roadagain[i].LinkID,roadagain[i].RoadFlag,roadagain[i].RoadNode,roadagain[i].LinkClass,roadagain[i].RoadName);

}
count=0;
}
else if(count>5)
{
printf("检中数目大于5(共%d条),将其转存到一个文本文件.\n",count);
printf("请输入该文本文件的名称<用加.txt后缀>:");
scanf("%s",filename);
printf("检索的信息已经成功输出到文本文件中,敬请查看!\n");
fp=fopen(filename,"w");
for(i=0;i<count;i++)
{
fprintf(fp,"size:%3d  LinkID:%6d  Flag:%2d  turnoff:%2d  番号:%2d  name:%s\n",roadagain[i].RecordSize,roadagain[i].LinkID,roadagain[i].RoadFlag,roadagain[i].RoadNode,roadagain[i].LinkClass,roadagain[i].RoadName);

}
fclose(fp);
fp=NULL;
count=0;
}
}
else
printf("没有找到你要检索的信息! \n");




}
if(n==4)
{
flag=0;
uint16 LinkClass;
printf("请输入要查找的番号:");
scanf("%d",&LinkClass);
for(i=0;i<MAX;i++)
{
if((BigtoLittle32(proad[i].info)&15)==LinkClass)
{
flag=1;
count++;
roadagain[count-1].RecordSize=BigtoLittle16(proad[i].RecordSize);
roadagain[count-1].LinkID=BigtoLittle32(proad[i].LinkID);
roadagain[count-1].RoadFlag=BigtoLittle32(proad[i].info)>>7;
roadagain[count-1].RoadNode=(BigtoLittle32(proad[i].info)>>4)&7;
roadagain[count-1].LinkClass=BigtoLittle32(proad[i].info)&15;
strcpy(roadagain[count-1].RoadName,proad[i].RoadName);

}
}
if(flag==1)
{
printf("检索成功!\n");
if(count<=5)
{
for(i=0;i<count;i++)
{
printf("LinkID:%d   有无Flag:%d   岔路数:%d   交叉Link列表示Class番号:%d   道路名称:%s   \n",roadagain[i].LinkID,roadagain[i].RoadFlag,roadagain[i].RoadNode,roadagain[i].LinkClass,roadagain[i].RoadName);

}
count=0;
}
if(count>5)
{
printf("检中数目大于5(共%d条),将其转存到一个文本文件。\n",count);
printf("请输入该文本文件的名称<用加.txt后缀>:");
scanf("%s",filename);
printf("检索的信息已经成功输出到文本文件中,敬请查看。\n");
fp=fopen(filename,"w");
for(i=0;i<count;i++)
{
fprintf(fp,"size:%3d  LinkID:%6d  Flag:%2d  turnoff:%2d  番号:%2d  name:%s\n",roadagain[i].RecordSize,roadagain[i].LinkID,roadagain[i].RoadFlag,roadagain[i].RoadNode,roadagain[i].LinkClass,roadagain[i].RoadName);

}
fclose(fp);
fp=NULL;
count=0;
}
}
else
printf("没有找到你要检索的信息!\n");


}
if(n==0)
{
return 0;
}
fflush(stdin);
}
}

********************************************************Sort.h*********************************************************



void BubbleSort(Road *a, int n)  /*  冒泡  */
{
int i,j;
Road x;
for(i=1;i<n;i++)
{
for(j=0;j<n-i;j++)
{
if(BigtoLittle32(a[j].LinkID)>BigtoLittle32(a[j+1].LinkID))
{
x=a[j];
a[j]=a[j+1];
a[j+1]=x;
}
}
}
}


void InsertSort(Road *a,int n)  /*  插入  */
{
int i,j;
Road temp;
for(i=1;i<n;++i)
{
temp=a[i];
j=i-1;
while(j>=0&&temp.LinkID<BigtoLittle32(a[j].LinkID))
{
a[j+1]=a[j];
j--;
}
a[j+1]=temp;
}
}


void QuickSort(Road *a,int s,int t)  /*  快排  */
{

int i=s,j=t;
Road temp;
if(i<j)
{
temp=a[s];
while(i!=j)
{
while(i<j&&BigtoLittle32(a[j].LinkID)>BigtoLittle32(temp.LinkID))
{
j--;
}
if(i<j)


{
a[i]=a[j];
i++;
}
while(i<j&&BigtoLittle32(a[i].LinkID)<BigtoLittle32(temp.LinkID))
{
i++;
}
if(i<j)
{
a[j]=a[i];j--;
}
}
a[i]=temp;
QuickSort(a,s,i-1);
QuickSort(a,i+1,t);
}
 
}


int Sort(Road *a)
{
int i;
char b[2];
while(1)
{
printf("\n请选择排序方式:\n");
printf(" 1.冒泡法排序.\n");
printf(" 2.插入法排序.\n");
printf(" 3.快速排序.\n");
printf(" 0.返回主界面.\n");
printf("请选择: ");
scanf("%1s",b);
switch(b[0])
{
case '0':
{
return 0;
}break;
case '1':
{
double T1,T2;
T1=clock();
BubbleSort(a,MAX);
T2=clock();
printf("排序完成.时间为:%.5f秒!\n",(T2-T1)/1000);
}break;
case '2':
{
double T1,T2;
T1=clock();
InsertSort(a,MAX);
T2=clock();
printf("排序完成.时间为:%.5f秒!\n",(T2-T1)/1000);
}break;
case '3':
{
static int count=1;
double T1,T2;
if(count>1)
{
printf("排序已完成!时间为:%.5f秒!\n",(T2-T1)/1000);
}
else
{
T1=clock();
int s=0;
int t=MAX-1;
QuickSort(a,0,MAX-1);
T2=clock();
printf("排序完成.时间为:%.5f秒!\n",(T2-T1)/1000);
count++;
}
}break;
default:
{
printf("您输入的为非法选项!请重新选择:\n");
}break;


}
FILE *fp;
fp=fopen("sort.txt","w");
for(i=0;i<MAX;i++)
{
fprintf(fp,"序号: %5d 道路信息大小: %8d 道路ID: %8d 道路名称大小: %8d 道路标志位: %8d 道路岔路数: %8d 道路番号: %8d 道路名称: %s\n",i+1,BigtoLittle16(a[i].RecordSize),BigtoLittle32(a[i].LinkID), BigtoLittle16(a[i].RoadSize), (BigtoLittle16(a[i].info)>>7),(BigtoLittle16(a[i].info)>>4)&7,BigtoLittle16(a[i].info)>>15,a[i].RoadName);
}
fflush(stdin);
fclose(fp);
fp=NULL;
}
return 0;                                        
}

***********************************************************Update.h**********************************************************

void Update(Road *b)
{
FILE *fp2;
fp2=fopen("update.dat","w");
int i=0;
while(i<MAX)
{
fwrite(&b[i].RecordSize,2,1,fp2);
fwrite(&b[i].LinkID,4,1,fp2);
fwrite(&b[i].RoadSize,2,1,fp2);
fwrite(&b[i].info,4,1,fp2);
fwrite(&b[i].RoadName,BigtoLittle16(b[i].RecordSize)-12,1,fp2);
i++;
}
fclose(fp2);
fp2=NULL;
}
这个代码的功能是将一个.dat文件中的数据读取出来,并解析,解析完成后有排序、查找和更新等功能。这个是由五个人共同完成,是我第一次写的小项目,我做的是排序,但是在完成后别的模块也有尝试做了一遍,个人觉得只有解析那里是比较难想的,整体上还是比较简单。

第一次发,有什么问题请见谅。