关于#c语言#的问题:程序运行到输入起点回车就结束了,qiu怎样解决#include <stdio.h>

关于#c语言#的问题:程序运行到输入起点回车就结束了,qiu怎样解决#include <stdio.h>
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#define INFINITY 10000
#define M 20
typedef struct{
    char V[M][10];//顶点数组,用来存储辖区的值即辖区的名称
    int R[M][M];
    int vexnum;
}Graph;

int locatevex(Graph*g,char a[100]) 
{
    int i;
    for(i=0;i<g->vexnum;i++)
    {
        if(strcmp(a,g->V[i])==0)
        return i;
        
    }
    if(i==g->vexnum)
    return -1;
}

int creategraph(Graph *g)
{
    int i=0,j,k,p,m;
    char a[10],b[10];
    printf("******欢迎使用地铁站建设程序******\n");
    printf("******请按照提示依次输入信息******\n");
    printf("******请输入所有的辖区,以0作为结束标志******\n");
    scanf("%s",g->V[i]);
    while(strcmp("0",g->V[i])!=0)
    {
        i++;
        scanf("%s",g->V[i]);
    }
    g->vexnum=i;
    for(i=0;i<g->vexnum;i++)
    for(j=0;j<g->vexnum;j++)
    g->R[i][j]=INFINITY;
    printf("******请输入各辖区之间的路程,以00作为结束标志\n");
    scanf("%s%s%d",a,b,&m);
    while(strcmp("0",a)!=0 || strcmp("0",b)!=0 || m!=0)
    {
        k=locatevex(g,a);
        p=locatevex(g,b);
        if(k==-1)
        {
            printf("******对不起,输入错误,没有%s这个辖区******\n",a);
            return 0;
            
        }
        if(p==-1)
        {
            printf("******对不起,输入错误,没有%s这个辖区******\n",b);
            return 0;
        }
        g->R[k][p]=g->R[p][k]=m;
        scanf("%s%s%d",a,b,&m);
    }
    return 1;
}

struct tree{
    int weizhi;
    int lowcost;
};

int minimun(struct tree*a,Graph g)
{
    int i,k,m=0;
    for(i=0;i<g.vexnum;i++)
    {
        if(m==0&&a[i].lowcost!=0)
        {
            m=1;
            k=i;
        }
        if(m==1&&a[i].lowcost!=0)
        {
            if(a[i].lowcost<a[k].lowcost)
            k=i;
        }
    }
    return k;
}

void MiniSpanTree_PRIM(Graph g,char a[100])
{
    struct tree closedge[M];
    int i,j,k,money=0;
    k=locatevex(&g,a);
    for(i=0;i<g.vexnum;i++)
    {
        if(i!=k)
        {
            closedge[i].lowcost=g.R[k][j];
            closedge[i].weizhi=k;    
        }
    } 
    
    closedge[k].lowcost=0;
    printf("******根据您的输入建立邻接表为:******");
    for(i=0;i<g.vexnum;i++)
    {
        for(j=0;j<g.vexnum;j++)
        {
            printf("l%dl",g.R[i][j]);
        }
        printf("\n\n");
     } 
     printf("******应建设地铁去辖区及之间权值为:******\n");
     for(i=1;i<g.vexnum;i++)
     {
         k=minimun(closedge,g);
         money=money+closedge[k].lowcost;
         printf("%d:%s  %s %d\n",i,g.V[closedge[k].weizhi],g.V[k],closedge[k].lowcost);
         closedge[k].lowcost=0;
         for(j=0;j<g.vexnum;j++)
         {
             if(g.R[k][j]<closedge[j].lowcost)
             {
                 closedge[j].weizhi=k;
                 closedge[j].lowcost=g.R[k][j];
             }
         }
     }
    printf("******据统计地铁的总建设路程为;%d******\n",money);
     
}
int main()
{
    int i;
    Graph g;
    char a[100];
    i=creategraph(&g);
    if(i)
    {
        printf("******请输入起始地点为:******\n");
        scanf(" %s",a);
        //getchar();
        MiniSpanTree_PRIM(g,a);
        
    }
    printf("******感谢您的使用,谢谢!******\n\n");
}
  • 你可以看下这个问题的回答https://ask.csdn.net/questions/366587
  • 你也可以参考下这篇文章:#include<stdio.h>怎么理解,stdio.h是什么头文件,是不是每个C语言程序都要加?
  • 除此之外, 这篇博客: C语言实现三个数从大到小顺序输出中的 #include<stdio.h> 部分也许能够解决你的问题, 你可以仔细阅读以下内容或跳转源博客中阅读:
  • int main()
    {
    int a = 0;
    int b = 0;
    int c = 0;
    int ciao = 0;//ciao 是笔者随意取的一个中间变量
    scanf(“%d %d %d”, &a, &b, &c);
    if (a < b || a ==b)
    {
    ciao = a;
    a = b;
    b = ciao;
    }
    if (a < c || a == c)
    {
    ciao = a;
    a = c;
    c = ciao;
    }
    if (b < c || b == c)
    {
    ciao = b;
    b = c;
    c = ciao;
    printf(“%d %d %d”, a, b, c);
    }
    else
    {
    printf(“%d %d %d”, a, b, c);
    }
    return 0;`

  • 以下回答由chatgpt基于相关博客总结生成:

    这个问题的出现是因为输入操作不被缓冲,需要使用getchar()来实现输入的缓冲。

    具体解决方案如下:

    1. 在需要输入的地方加入getchar()操作,如下所示:
    #include <stdio.h>
    
    int main()
    {
        printf("请输入您的姓名:");
        getchar(); // 添加getchar()操作
        return 0;
    }
    
    1. 如果需要在多个地方实现输入缓冲,可以将输入缓冲这段代码作为一个函数来进行封装:
    #include <stdio.h>
    
    void clear_input_buffer() // 封装输入缓冲的函数
    {
        char ch;
        while ((ch = getchar()) != '\n' && ch != EOF) {} // 不断读取输入缓冲
    }
    
    int main()
    {
        printf("请依次输入您的姓名、性别和年龄:");
        clear_input_buffer(); // 调用输入缓冲函数
        return 0;
    }
    

    以上两种方法都可以解决输入缓冲的问题。如果还有其他问题或者需要详细的代码示例,请在评论区留言。

这么写代码会累死审查的, 为了以后能省同事, 注意一下命名规则.


void MiniSpanTree_PRIM(Graph g, char a[100])
{
    struct tree closedge[M];
    int i;
    int j = 0; // 问题, 不置零导致的问题
    int k;
    int money = 0;
    k = locatevex(&g, a);
    for (i = 0; i < g.vexnum; i++)
    {
        if (i != k)
        {
            closedge[i].lowcost = g.R[k][j]; // 问题
            closedge[i].weizhi = k;
        }
    }
    closedge[k].lowcost = 0;
    printf("******根据您的输入建立邻接表为:******");
    for (i = 0; i < g.vexnum; i++)
    {
        for (j = 0; j < g.vexnum; j++)
        {
            printf("l%dl", g.R[i][j]);
        }
        printf("\n\n");
    }
    printf("******应建设地铁去辖区及之间权值为:******\n");
    for (i = 1; i < g.vexnum; i++)
    {
        k = minimun(closedge, g);
        money = money + closedge[k].lowcost;
        printf("%d:%s  %s %d\n", i, g.V[closedge[k].weizhi], g.V[k],
               closedge[k].lowcost);
        closedge[k].lowcost = 0;
        for (j = 0; j < g.vexnum; j++)
        {
            if (g.R[k][j] < closedge[j].lowcost)
            {
                closedge[j].weizhi = k;
                closedge[j].lowcost = g.R[k][j];
            }
        }
    }
    printf("******据统计地铁的总建设路程为;%d******\n", money);
}