哪里错了,咋改咧??

输入n个朋友的信息,包括姓名、生日、电话号码,本题要求编写程序,按照年龄从大到小的顺序依次输出通讯录。题目保证所有人的生日均不相同。

哪里错了,PTA显示运行超时

#include<stdio.h>
struct frd {
    char name[10];
    int num[8];
    char phone[17];
};
int main()
    {
        int flag,j,k,i,N;
        struct frd t;
        scanf("%d",&N);
    struct frd pengyou[N];
    for (i=0;i<N;i++)
    {
        scanf("%s%d%s",&pengyou[i].name,&pengyou[i].num,&pengyou[i].phone);
    }
    for (i=0;i<N;i++)
    {    k=i;
        flag=0;
        for (j=0;i<N;j++)
        {if (pengyou[j].num<pengyou[k].num)
        {k=j;flag=1;}}
     if (flag==1)
     {
         t=pengyou[i];
         pengyou[i]=pengyou[k];
         pengyou[k]=t;
     }}
     for(i=0;i<N;i++)
     {
         printf("%s%d%s",pengyou[i].name,pengyou[i].num,pengyou[i].phone);}
         return 0;
     
         
    
    }


我知道了,你用的选择排序,时间复杂度为O(n*n)

【以下回答由 GPT 生成】

首先,我们需要检查代码中的错误和潜在问题。在代码中,有几个问题需要解决:

  1. 结构体中的num成员应该是一个整数数组,而不是一个单独的整数。我们需要将num声明为int num[8]
  2. 在输入朋友的信息时,我们应该使用%d格式来读取整数数组成员,而不是%d。同样,%s应该用于读取字符串成员。
  3. 第二个内层循环的for循环中的循环条件错误。应该是j<N,而不是i<N
  4. 在第二个内层循环中,我们需要更新flag的值,以便在找到更小的年龄时进行交换。
  5. 在输出通讯录时,我们需要使用换行符来分隔不同的朋友信息。

改进后的代码如下:

#include<stdio.h>
struct frd {
    char name[10];
    int num[8];
    char phone[17];
};
int main()
{
    int flag, j, k, i, N;
    struct frd t;
    scanf("%d", &N);
    struct frd pengyou[N];
    for (i=0; i<N; i++)
    {
        scanf("%s", pengyou[i].name);
        for (j=0; j<8; j++)
        {
            scanf("%d", &pengyou[i].num[j]);
        }
        scanf("%s", pengyou[i].phone);
    }
    for (i=0; i<N; i++)
    {    
        k=i;
        flag=0;
        for (j=i+1; j<N; j++)
        {
            if (pengyou[j].num[0] > pengyou[k].num[0])
            {
                k=j;
                flag=1;
            }
        }
        if (flag==1)
        {
            t=pengyou[i];
            pengyou[i]=pengyou[k];
            pengyou[k]=t;
        }
    }
    for(i=0; i<N; i++)
    {
        printf("%s ", pengyou[i].name);
        for (j=0; j<8; j++)
        {
            printf("%d", pengyou[i].num[j]);
        }
        printf(" %s\n", pengyou[i].phone);
    }
    return 0;
}

请注意,这里仅根据代码本身提供的信息进行了改进。可能还有其他优化方案,但我们需要更多信息来针对性地优化。如果代码仍然存在性能问题,可能需要进一步分析算法和数据结构,并根据具体问题进行优化。



【相关推荐】



如果你已经解决了该问题, 非常希望你能够分享一下解决方案, 写成博客, 将相关链接放在评论区, 以帮助更多的人 ^-^

主要两处有问题,第一处是第4行电话号码定义 int num[8]; 是有误的,这里不需数组。第二处是第20行: for (j=0;i<N;j++) 里 i < N 是错误的,这里的循环因子是 j 。整体修改如下,改动处见注释,供参考:

#include <stdio.h>
#define N 50        // 修改
struct frd {
    char name[10];
    int  num;    //int num[8];  // 修改
    char phone[18]; //char phone[17]; 修改
};
int main()
{
    int flag, j, k, i, n;      // 修改
    struct frd t, pengyou[N];  // 修改
    scanf("%d", &n);
    
    for (i = 0; i < n; i++)
    {
        scanf("%s %d %s", &pengyou[i].name, &pengyou[i].num, &pengyou[i].phone);
    }
    for (i = 0; i < n; i++)
    {
        k = i;
        flag = 0;
        for (j = i + 1; j < n; j++)  //for (j = 0; i < n; j++)  修改
        {
            if (pengyou[j].num < pengyou[k].num)
            {
                k = j; flag = 1;
            }
        }
        if (flag == 1)
        {
            t = pengyou[i];
            pengyou[i] = pengyou[k];
            pengyou[k] = t;
        }
    }
    for (i = 0; i < n; i++)
    {
        printf("%s %d %s\n", pengyou[i].name, pengyou[i].num, pengyou[i].phone); 
        //printf("%s%d%s", pengyou[i].name, pengyou[i].num, pengyou[i].phone);
    }
    return 0;
}

你这个排序算法需要改一改。

看看是不是输入格式不对,你的程序本身不会超时,没有死循环,可能是输入卡了。