You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

C语言中结构体内部marks数组排序失效问题求助

问题分析与解决

核心问题

你想要对每个学生的marks[]数组内部的三门成绩进行升序排序,但当前代码的sort函数存在两个致命错误,导致排序无效:

  1. 未初始化的变量m:在比较if (s[i].marks[m] > s[j].marks[m])时,m没有被赋值,访问的是随机内存位置的数组元素,逻辑完全错误。
  2. 错误的排序逻辑:当前代码是在交换整个学生结构体,而不是对单个学生的marks数组内部元素进行排序。

另外,你的需求明确要求按百分比排序学生,这和“对每个学生的成绩数组排序”是两个不同的需求,下面会同时处理这两个要求。

修正后的代码

#include <stdio.h>
#include <stdlib.h>
 
struct student{
    char name[10];
    int rollno;
    int marks[3];  // 三门科目成绩数组
    int totalMarks;
    float percent;
};

void calculate(struct student s[10], int n) {
    int i, m;
    for (i = 0; i < n; i++) {
         s[i].totalMarks = 0;
         s[i].percent = 0.0;
         for (m = 0; m < 3; m++) {  
              s[i].totalMarks += s[i].marks[m];
         }
         s[i].percent = s[i].totalMarks / 3.0;
    }
}

void display(struct student s[10], int n) {
    int i, m;
    for (i = 0; i < n; i++) {
        printf("Student's Name: %s\n", s[i].name);
        printf("Student's Rollno: %d\n", s[i].rollno);
        for (m = 0; m < 3; m++) {
            printf("Subject %d Marks: %d\n", m+1, s[i].marks[m]);
        }
        printf("Total Marks: %d\n", s[i].totalMarks);
        printf("Total Percent: %.2f\n", s[i].percent);
        printf("\n");
    }  
}

// 对单个学生的marks数组进行升序排序
void sort_marks_per_student(struct student *s) {
    int i, j, temp;
    // 冒泡排序实现数组内部升序
    for (i = 0; i < 2; i++) {
        for (j = 0; j < 2 - i; j++) {
            if (s->marks[j] > s->marks[j+1]) {
                temp = s->marks[j];
                s->marks[j] = s->marks[j+1];
                s->marks[j+1] = temp;
            }
        }
    }
}

// 按百分比对学生进行升序排序(符合需求要求)
void sort_students_by_percent(struct student s[10], int n) {
    int i, j;
    struct student temp;
    for (i = 0; i < n - 1; i++) {
        for (j = 0; j < n - i - 1; j++) {
            if (s[j].percent > s[j+1].percent) {
                temp = s[j];
                s[j] = s[j+1];
                s[j+1] = temp;
            }
        }
    }
}

// 整合排序逻辑:先给每个学生排序成绩,再按百分比排序学生
void sort(struct student s[10], int n) {
    int i;
    // 遍历每个学生,对其成绩数组内部排序
    for (i = 0; i < n; i++) {
        sort_marks_per_student(&s[i]);
    }
    // 按百分比对学生整体排序
    sort_students_by_percent(s, n);
    
    // 输出排序后的结果
    printf("\n排序后的学生信息(成绩内部升序+按百分比升序):\n");
    for (i = 0; i < n; i++) {
        printf("Student's Name: %s\n", s[i].name);
        printf("Student's Rollno: %d\n", s[i].rollno);
        for (int m = 0; m < 3; m++) {
            printf("%d ", s[i].marks[m]);
        }
        printf("\nTotal Marks: %d\n", s[i].totalMarks);
        printf("Total Percent: %.2f\n", s[i].percent);
        printf("\n");
    } 
}

// 实现题目给定的accept函数
void accept(struct student s[10], int n) {
    int i, m;
    for (i = 0; i < n; i++) {
        printf("\nEnter student's name: ");
        scanf("%s", s[i].name);
        printf("Enter student's rollno: ");
        scanf("%d", &s[i].rollno);
        for (m = 0; m < 3; m++) {
            printf("Enter Subject %d marks: ", m + 1);
            scanf("%d", &s[i].marks[m]);
        }
        printf("\n");
    }
}

int main() {
    struct student s[10]; 
    int n;
    printf("Enter the number of students: ");
    scanf("%d", &n);

    // 使用给定的accept函数接收输入
    accept(s, n);

    calculate(s, n);  

    printf("\n学生原始信息:\n");
    display(s, n);

    printf("\n开始排序...\n");
    sort(s, n);
    printf("\n");
}

关键修正说明

  • 拆分排序逻辑:新增sort_marks_per_student函数专门处理单个学生的成绩数组排序,sort_students_by_percent处理学生按百分比排序,职责更清晰。
  • 修复变量问题:所有循环变量均提前初始化,避免访问随机内存。
  • 符合函数原型:实现了题目要求的accept函数,替换了main函数中的输入逻辑,代码结构更规范。

内容的提问来源于stack exchange,提问作者ayushkadbe

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.25 23:48:21