m0_61385251 2021-09-20 15:24 采纳率: 100%
浏览 62
已结题

C语言文本读取内容错误

就是我在执行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()读取出来的数,图二是文本里的数

img

img

  • 写回答

1条回答 默认 最新

  • CSDN专家-link 2021-09-20 15:41
    关注

    for(j=n-1;j<2*n;j++)
    第二个循环应该从n开始,而不是n-1。现在和for(j=0;j<n;j++)重复了j=n-1

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论

报告相同问题?

问题事件

  • 系统已结题 9月28日
  • 已采纳回答 9月20日
  • 创建了问题 9月20日

悬赏问题

  • ¥15 stata安慰剂检验作图但是真实值不出现在图上
  • ¥15 c程序不知道为什么得不到结果
  • ¥40 复杂的限制性的商函数处理
  • ¥15 程序不包含适用于入口点的静态Main方法
  • ¥15 素材场景中光线烘焙后灯光失效
  • ¥15 请教一下各位,为什么我这个没有实现模拟点击
  • ¥15 执行 virtuoso 命令后,界面没有,cadence 启动不起来
  • ¥50 comfyui下连接animatediff节点生成视频质量非常差的原因
  • ¥20 有关区间dp的问题求解
  • ¥15 多电路系统共用电源的串扰问题