2401_84941450 2024-06-19 18:03 采纳率: 80%
浏览 1
已结题

输入名字和成绩排序哪错了

代码是


#include<stdio.h>
int x;
void paixu(char arr[][2]);
void paixu(char arr[][2])
{
    char *p;
    char *t;
    for(int m=1;m<x;m++)
    {
    for(int n=1;n<x;n++)
    {
        if(arr[n][1]>arr[n-1][1])
        {
            p=&arr[n-1][1];
            t=&arr[n-1][0];
            *p=arr[n][1];
            arr[n][1]=arr[n-1][1];
            arr[n-1][1]=*p;
            *t=arr[n][0];
            arr[n][0]=arr[n-1][0];
            arr[n-1][0]=*p;
        }
        
    }
}
}
int main()
{
    scanf("%d",&x);
    char a[x][2];
    for(int i=0;i<50;i++)
    {
        scanf("%c%d",&a[i][0],&a[i][1]);
    }
    paixu(a);
    for(int i=0;i<x;i++)
    {
        printf("%15c%5d",a[i][0],a[i][1]);
    }
}

  • 写回答

1条回答 默认 最新

  • 专家-赤兔[在线] 优质创作者: 编程框架技术领域 2024-06-19 18:03
    关注

    引自免费微信小程序:皆我百晓生

    从你提供的代码来看,存在多个问题导致成绩排序功能无法正确实现。下面将逐一指出并提供修改建议。

    1. 数组大小固定与动态读取冲突: 代码中使用了char a[x][2]定义数组,但在scanf循环中又假定数组大小为50(for(int i=0;i<50;i++))。这会导致数组越界,因为x可能不是50。应确保读取的元素数量与数组实际大小一致。

    2. 排序逻辑错误: 排序函数paixu中的交换操作有误。你尝试通过指针交换元素,但这只交换了单个字符而不是整个数组元素。此外,成绩和名字应该一起移动,而你的代码中并没有考虑到这一点。

    3. 数据类型不匹配scanf中使用%c%d格式读取数据,但数组定义为char a[x][2],这意味着每个数组元素是一个字符。对于成绩部分,你需要一个整数类型,而非字符类型。

    4. 数组初始化和使用问题: 数组a在读取前未被适当初始化,可能导致随机值读入。同时,main函数中for循环读取数据时,循环次数应该基于x,而非固定为50。

    下面是修正后的代码示例:

    #include <stdio.h>
    
    // 定义一个结构体用于存储姓名和成绩,这里假设姓名只有一个字符
    typedef struct {
        char name[2]; // 假设姓名由一个字符组成,实际应用中可能需要更长的名字
        int score;    // 成绩,使用整型
    } Student;
    
    void paixu(Student arr[], int size) {
        for (int m = 0; m < size - 1; m++) {
            for (int n = 0; n < size - 1 - m; n++) { // 避免不必要的比较
                if (arr[n].score > arr[n + 1].score) {
                    Student temp = arr[n];
                    arr[n] = arr[n + 1];
                    arr[n + 1] = temp; // 正确的交换方式
                }
            }
        }
    }
    
    int main() {
        int x;
        scanf("%d", &x);
        Student a[x];
    
        for (int i = 0; i < x; i++) {
            scanf(" %c %d", &a[i].name, &a[i].score); // 注意空格用于跳过可能存在的换行符
        }
    
        paixu(a, x);
    
        for (int i = 0; i < x; i++) {
            printf("%c %d\n", a[i].name, a[i].score); // 输出格式调整,增加换行符
        }
    
        return 0;
    }
    

    这段代码修复了上述提到的所有问题,并使用了一个结构体来更好地组织姓名和成绩数据,确保它们作为整体进行排序。注意,在实际应用中,你可能需要处理更复杂的数据类型,例如完整的字符串姓名,这将要求对结构体和输入/输出方法进行相应调整。

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

报告相同问题?

问题事件

  • 系统已结题 8月27日
  • 已采纳回答 8月19日
  • 创建了问题 6月19日