就是我在执行ticket()函数时readtxt()这个函数时从文本里读取出来的数字跟我文本里存的不一样
自己写的,可能有些地方不太对
#include"stdio.h"
#include"stdlib.h"
#include"string.h"
#define max 50
int Bian[max][max][2];//第一层存放相连站点的距离,第二层存放到各点的最短距离//
struct subway
{
char no[max];//编号//
char ostation[max];//线路起始站//
char estation[max];//线路终点站//
}sub[max];
int n,z=1;
void readtxt();//读取文本//
int money(int a);//计算票价//
int jisuan(int i,int h,int c);//辅助计算最短距离//
void shortest();//计算最短距离//
void save();//保存文件//
void add();//增加站点//
void Delete();//删除站点//
void Print();//存储信息的浏览//
void Search();//对单一站点信息查询//
void ticket();//计算票价//
void menu();//主菜单//
int main()
{
while(z)
menu();
system("pause");
return 0;
}
void readtxt()//读取文本//
{
int i=0,j,k=0;
FILE *fp;
if((fp=fopen("subway.txt","r"))==NULL)
{
printf("subway.txt读取失败");
system("pause");
exit(0);
}
FILE *B;
if((B=fopen("Bow.txt","r"))==NULL)
{
printf("Bow.txt读取失败");
system("pause");
exit(0);
}
while(fscanf(fp,"%s %s %s",sub[i].no,sub[i].ostation,sub[i].estation)==3)//站点的读取//
{
i++;
}
fclose(fp);
n=i;
for(i=0;i<2*n;i++)//边的读取//
{
for(j=0;j<n;j++)
{
fscanf(B,"%d",&Bian[i][j][0]);
}
for(j=n-1;j<2*n;j++)
{
fscanf(B,"%d",&Bian[i][j][1]);//最短距离的读取//
}
}
fclose(B);
printf("边:\n");
for(i=0;i<n;i++)//最短距离的读取//
{
for(j=0;j<n;j++)
{
printf("%d ",Bian[i][j][0]);
}
printf("\n");
}
printf("最短:\n");
for(i=0;i<n;i++)//最短距离的读取//
{
for(j=0;j<n;j++)
{
printf("%d ",Bian[i][j][1]);
}
printf("\n");
}
}
void save()//保存文件//
{
int i,j;
FILE *fp;
FILE *B;
fp=fopen("subway.txt","w");
B=fopen("Bow.txt","w");
for(i=0;i<n;i++)
{
fprintf(fp,"%s %s %s",sub[i].no,sub[i].ostation,sub[i].estation);//站点的保存//
fputc('\n',fp);
}
fclose(fp);
for(i=0;i<n;i++)
{
for(j=0;j<n;j++)
{
fprintf(B,"%d",Bian[i][j][0]);//边的保存//
}
fputc('\n',B);
}
for(i=0;i<n;i++)
{
for(j=0;j<n;j++)
{
fprintf(B,"%d",Bian[i][j][1]);//最短距离的保存//
}
fputc('\n',B);
}
fclose(B);
printf("边:\n");
for(i=0;i<n;i++)
{
for(j=0;j<n;j++)
{
printf("%d ",Bian[i][j][0]);
}
printf("\n");
}
system("pause");
}
int money(int a)//计算票价//
{
int i;
if(a=0)
i=0;
else if(a<=4)
i=2;
else if(a>4&&a<=12)
i=2+(a-4)/4;
else if(a>12&&a<=24)
i=4+(a-12)/6;
else
i=6+(a-24)/8;
return i;
}
int road[max][max];//记录是否走过//
#define kon 999
int jisuan(int i,int h,int c)//计算最短距离//
{
int j,k=0,l;
int a=kon,b,d,e;
for(j=0;j<n;j++)
{
if(road[h][j]!=1)
{
k++;
}
}
if(k==0)
{
return 0;
}
e=kon;
for(j=0;j<n;j++)
{
if(h=j)
{
Bian[h][j][1]=0;
road[h][j]=1;
}
else if(road[h][j]!=1)
{
if(a>=Bian[h][j][0])
{
a=Bian[h][j][0];
if(a<=Bian[h][j][1])
{
if(h!=i)
{
l=c+a;
}
else
{
l=a;
}
if(l<k)
{
e=l;
}
if(l<=Bian[i][j][1])
{
Bian[i][j][1]=l;
Bian[j][i][1]=Bian[i][j][1];
}
}
}
}
}
int help[50];
int g=0;
for(j=0;j<n;j++)
{
if(road[h][j]!=1)
{
help[g]=j;
g++;
}
}
int o,p;
o=Bian[h][help[0]][0];
p=help[0];
for(j=0;j<g;j++)
{
if(o<Bian[h][help[j]][0])
{
o=Bian[h][help[j]][0];
p=help[j];
}
}
b=p;
if(i=h)
{
d=e;
}
else if(i!=h)
{
d+=e;
}
road[i][b]=1;
road[b][i]=road[i][b];
k=0;
for(j=0;j<n;j++)
{
if(road[i][j]!=1)
{
k+=1;
}
}
if(k!=0)
{
jisuan(i,b,d);//b记录离i最短的站点,d记录i到b的距离//
}
else
{
return 0;
}
}
void shortest()//计算起始站和终点站的最短距离//
{
int i,j,k=0;
int e,r;
for(e=0;e<n;e++)
{
for(r=0;r<n;r++)
{
road[e][r]=0;
}
}
int c;
for(i=0;i<n;i++)
{
c=0;
jisuan(i,i,c);
}
printf("最短:\n");
for(i=0;i<n;i++)//最短距离的读取//
{
for(j=0;j<n;j++)
{
printf("%d ",Bian[i][j][1]);
}
printf("\n");
}
save();
}
void add()//新增地铁站点//
{
int i=0,k=0,j,l,h,flag,g,p=0;//新增地铁数量 <l> ;相连站点数量 <h>//
int a[10];//相连地铁编号//
int b[10];//相连距离//
FILE *fp;
FILE *B;
if((fp=fopen("subway.txt","a+"))==NULL)
{
printf("subway.txt读取失败");
system("pause");
exit(0);
}
if((B=fopen("Bow.txt","a+"))==NULL)
{
printf("Bow.txt读取失败");
system("pause");
exit(0);
}
while(fscanf(fp,"%s %s %s",sub[i].no,sub[i].ostation,sub[i].estation)==3)//站点的读取//
{
i++;
}
fclose(fp);
n=i;
if(n==0)
{
p=1;
}
printf("%d\n",i);
for(g=0;g<n;g++)//边的读取//
{
for(j=0;j<n;j++)
{
fscanf(B,"%d",&Bian[g][j][0]);
}
fscanf(B,"\n");
}
for(i=0;i<n;i++)//最短距离的读取//
{
for(j=0;j<n;j++)
{
fscanf(B,"%d",&Bian[i][j][1]);
}
fscanf(B,"\n");
}
fclose(B);
//分割//
printf("请输入待增加的地铁站点数量:\n");
scanf("%d",&l);
do
{
flag=1;
while(flag)
{
flag=0;
printf("请输入第%d个地铁站点的编号:\n",i+1);
scanf("%s",sub[i].no);
for(j=0;j<i;j++)
{
if(strcmp(sub[i].no,sub[j].no)==0)
{
printf("已有该地铁编号,请重新登入。\n");
flag=1;
system("pause");
break;
}
}
printf("请输入第%d个地铁站点的起始站:\n",i+1);
scanf("%s",sub[i].ostation);
printf("请输入第%d个地铁站点的终点站:\n",i+1);
scanf("%s",sub[i].estation);
printf("与该地铁站点相连的地铁站点数量:\n");
scanf("%d",&h);
for(j=0;j<h;j++)
{
printf("请输入与第%d号地铁站点相连的地铁编号:\n",i+1);
scanf("%d",&a[j]);
}
for(j=0;j<h;j++)
{
printf("请输入与第%d号地铁编号相连站点的距离:(一次一个)\n",i+1);
scanf("%d",&Bian[i][a[j]-1][0]);
Bian[a[j]-1][i][0]=Bian[i][a[j]-1][0];
}
if(flag==0)
{
i++;
}
}
}
while(i<n+l);
n+=l;
//分割//
for(j=0;j<n;j++)
{
for(g=0;g<n;g++)
{
if(Bian[j][g][0]==0&&j!=g)
{
Bian[j][g][1]=kon;
}
else
{
Bian[j][g][1]=Bian[j][g][0];
}
}
}
if(p==0)
{
shortest();
}
else
save();//保存//
printf("录入完毕!\n\n");
return ;
}
void Delete()
{
int i=0,k=0,j,g;
char a[10];//相连地铁编号//
int b[10];//相连距离//
FILE *fp;
FILE *B;
if((fp=fopen("subway.txt","r"))==NULL)
{
printf("subway.txt读取失败");
system("pause");
exit(0);
}
if((B=fopen("Bow.txt","r"))==NULL)
{
printf("Bow.txt读取失败");
system("pause");
exit(0);
}
while(fscanf(fp,"%s %s %s",sub[i].no,sub[i].ostation,sub[i].estation)==3)//站点的读取//
{
i++;
}
fclose(fp);
n=i;
for(g=0;g<n;g++)//边的读取//
{
for(j=0;j<n;j++)
{
fscanf(B,"%d",&Bian[g][j][0]);
}
fscanf(B,"\n");
}
for(i=0;i<n;i++)//最短距离的读取//
{
for(j=0;j<n;j++)
{
fscanf(B,"%d",&Bian[i][j][1]);
}
fscanf(B,"\n");
}
fclose(B);
//分割//
int t,flag=0;
char s1[30];
printf("请输入要删除的地铁编号:\n");
scanf("%s",s1);
for(t=0;t<n;t++)
{
if(strcmp(sub[t].no,s1)==0)
{
flag=1;
for(j=t;j<n-1;j++)
{
sub[j]=sub[j+1];
}
}
if(flag==1)
{
for(j=t;j<n-1;j++)
{
for(g=0;g<n;g++)
{
Bian[j][g][0]=Bian[j+1][g][0];
Bian[g][j][0]=Bian[g][j+1][0];
}
}
}
}
for(j=0;j<n;j++)
{
for(g=0;g<n;g++)
{
if(Bian[j][g][0]=NULL)
{
Bian[j][g][1]=kon;
}
else
{
Bian[j][g][1]=Bian[j][g][0];
}
}
}
if(flag==0)
{
printf("该编号不存在!\n");
}
if(flag==1)
{
printf("站点删除成功!\n");
n--;
}
shortest();
save();
}
void Search()//查找
{
FILE *fp;//要读取的文件指针
int i=0;//数组移动
if((fp=fopen("subway.txt","r"))==NULL)
{
printf("subway.txt读取失败");
system("pause");
exit(0);
}
printf("hi\n");
system("pause");
while(fscanf(fp,"%s %s %s",sub[i].no,sub[i].ostation,sub[i].estation)==3)
{
i++;
}
n=i;
int j,item,flag=0;
char s1[10];
printf("----------------------------------------------------------\n");
printf("------------------◎ 1.按编号查询 ◎--------------------\n");
printf("------------------◎ 2.按起始站查询 ◎--------------------\n");
printf("------------------◎ 3.按终点站查询 ◎--------------------\n");
printf("------------------◎ 4.退出本菜单 ◎--------------------\n");
printf("----------------------------------------------------------\n");
while(1)
{
printf("请选择子菜单编号:");
scanf("%d",&item);
flag=0;
switch(item)
{
case 1:
printf("请输入要查询的地铁站点编号:");//通过地铁线路查找
scanf("%s",s1);
for(j=0;j<n;j++)
if(strcmp(sub[j].no,s1)==0)
{
flag=1;
printf("地铁编号 起始站 终点站\n");
printf("---------------------------\n");
printf(" %s %s %s \n",sub[j].no,sub[j].ostation,sub[j].estation);
}
if(flag==0)
printf("查询错误,无该信息!\n"); break;
case 2:
printf("请输入查询的地铁起始站:");//通过地铁起始站查找
scanf("%s",s1);
for(j=0;j<n;j++)
if(strcmp(sub[j].ostation,s1)==0)
{
flag=1;
printf("地铁编号 起始站 终点站\n");
printf("---------------------------\n");
printf(" %s %s %s \n",sub[j].no,sub[j].ostation,sub[j].estation);
}
if(flag==0)
printf("查询错误,无该信息!\n"); break;
case 3:
printf("请输入查询的地铁终点站:");//通过地铁终点站查找
scanf("%s",s1);
for(j=0;j<n;j++)
if(strcmp(sub[j].estation,s1)==0)
{
flag=1;
printf("地铁编号 起始站 终点站\n");
printf("---------------------------\n");
printf(" %s %s %s \n",sub[j].no,sub[j].ostation,sub[j].estation);
}
if(flag==0)
printf("查询错误,无该信息\n"); break;
case 4: return;
default:printf("请在1-4之间选择\n");//提示用户在有效范围中选择
}
}
}
void Print()//存储信息的浏览//
{
int i;
printf("欢迎查询地铁线路!所有信息为:\n");
printf("地铁编号 起始站 终点站\n");
printf("---------------------------\n");
readtxt();//调用函数
for(i=0;i<n;i++)
{
printf(" %s %s %s \n",sub[i].no,sub[i].ostation,sub[i].estation);
}
system("pause");
}
void ticket()
{
int i,j,l;
readtxt();
system("pause");
printf("请输入起点站编号:\n");
scanf("%d",&i);
printf("请输入终点站编号:\n");
scanf("%d",&j);
l=Bian[i-1][j-1][1];
printf("从第%d号地铁站到第%d号地铁站的地铁票需要%d元。\n\n",i,j,money(l));
}
void menu()//主菜单//
{
int num;
system("color 75");//更改界面颜色为灰色背景浅紫色字体
printf("******************************广州地铁线网票价查询系统**************************\n");
printf("***********************友情提示:浏览和更新前请先刷新系统***********************\n");
printf(" ********************************** \n");
printf(" * 0 刷新地铁信息 * \n");
printf(" * 1 地铁信息的增加 * \n");
printf(" * 2 地铁信息的浏览 * \n");
printf(" * 3 地铁信息的查询 * \n");
printf(" * 4 地铁票价的查询 * \n");
printf(" * 5 地铁信息的删除 * \n");
printf(" * 6 退出 * \n");
printf(" ********************************** \n");
printf("请输入选择序号:\n");
scanf("%d",&num);
switch(num)
{
case 0:readtxt(); break;
case 1:add(); break;
case 2:Print(); break;
case 3:Search(); break;
case 4:ticket(); break;
case 5:Delete(); break;
case 6:z=0; printf("Bye!\n"); break;
default:printf("请在0-6之间选择\n");
}
}
图一是readtxt()读取出来的数,图二是文本里的数