为什么最后李四的数据出现两次,王五的数据不出现

typedef struct Student
{
unsigned long int id;
char name[21];
float score;
}STUDENT;
#define N 5
int main(void)
STUDENT st[]={ {2022001,"张三",55.5f},
{2022002,"李四",78.5f},
{2022003,"王五",88.8f}
{2022004,"小明",96.5f},
{2022005,"李华",69.5f}},st1;
for (int i=0;i<5;i++)

for (int j=0;j<5-i;j++)
if(st[j].score<st[j+1].score)
stl=st[j];
st[j]=st[j+1];
st[j+1]=st1;
}
printf("学号:%lu,姓名:%s,成绩:%1f\n”,st[i].id,st[i].name, st[i].score);
return 0;
}

  1. 首先不太清楚你上面的这个程序是怎么运行的哈,大眼看过来好几处语法错误。错误太多就不一一列举了。
  2. 在程序中你用到的一些符号没有区分全教半角,可以在仔细一点。比如最后一个printf中的第二个引号。
  3. 从你后面的逻辑来看你应该采用的是一个冒泡排序的方法,那么问题就是for循环在后面不跟随花括弧“{}”的情况只认为后面遇到的第一个分号“;”为有效的执行体。
  4. 至于你说描述的现象的原因,其实就是因为在排序的算法中加入的输出,此时的结果并非为最终结果,中间涉及到数据的交换,正好在应该输出王五的那个地方数据被交换,输出成了李四(大概意思,不太准确)。
  5. 所以,根据你的大致意思,我帮你修改了一下可以作为参考。

#include <stdio.h>

#define N 5

typedef struct Student
{
    unsigned long int id;
    char name[21];
    float score;
} STUDENT;

int main(void)
{
    STUDENT st[] = {
        {2022001, "张三", 55.5f},
        {2022002, "李四", 78.5f},
        {2022003, "王五", 88.8f},
        {2022004, "小明", 96.5f},
        {2022005, "李华", 69.5f},
    },   st1;

    for (int i = 0; i < 5; i++)
    {
        for (int j = 0; j < 5 - 1 - i; j++)
        {
            if (st[j].score < st[j + 1].score)
            {
                st1 = st[j];
                st[j] = st[j + 1];
                st[j + 1] = st1;
            }
        }
    }
    for (i = 0; i < 5; i++)
    {
        printf("学号:%lu,姓名:%s,成绩:%1f\n", st[i].id, st[i].name, st[i].score);
    }
    return 0;
}

如果解决你的问题,还请采纳!