cxSnowJohn 2021-04-10 10:06 采纳率: 50%
浏览 33

简单选择排序出错,SSort结果总是不对;但是把排序算法单独拿出来测试结果正确

#include <stdio.h>
typedef struct
{
    char name[101];
    int year;
    int grade;
}Stu[1000];
void SSort(Stu student, int num[], int n);
void StrSort(Stu student, int num[], int num1[], int n);
void Show(Stu student, int num[], int n);
void Egrade(Stu student, int num1[], int num2[], int n);
int main()
{
    Stu student;
    int i;
    int n;//学生人数
    int num[1000];//记录序号
    int num1[1000];//记录相同成绩的人数
    scanf("%d", &n);
    getchar();
    for(i = 0; i < n; ++i)
    {
        gets(student[i].name);//姓名
        scanf("%d", &student[i].year);//年龄
        getchar();//读取缓冲区中的回车
        scanf("%d", &student[i].grade);//成绩
        getchar();
    }
    SSort(student, num, n);//大小序号存储在num中
    //Show(student, num, n);
    Egrade(student, num, num1, n);//相同成绩的人数记录在num1中
    //Show(student, num, n);
    //printf("\n");
    StrSort(student, num, num1, n);//按字母排序
    Show(student, num, n);
}
void SSort(Stu student, int num[], int n)
{//对成绩进行简单选择排序,num保存学生按照成绩排序后的序号
    int i;
    int j, k;
    int t;
    for(i = 0; i < n; ++i)
    {
        num[i] = i;//初始化学生序号与输入一致
    }
    for(i = 0; i < n - 1; ++i)
    {//简单选择排序
        k = i;
        for(j = i + 1; j < n; ++j)
        {
            if(student[k].grade > student[j].grade)
            {
                k = j;
            }
        }
        if(k != i)
        {//交换num中所对应的学生序号
            t = num[k];
            num[k] = num[i];
            num[i] = t;
        }
    }
}
void StrSort(Stu student, int num[], int num1[], int n)
{//num1存储成绩相同的人数,num是按成绩排序的序号,n是总人数
    int j;//交换Num中的序号
    int i = 0;
    int x, y, z;//简单选择排序
    while(num1[i] != 0)
    {
        for(x = num1[i]; x < num1[i + 1]; ++x)
        {//简单选择排序
            z = x;
            for(y = x + 1; y < num1[i + 1]; ++y)
            {
                if(student[ num[z] ].name[0] > student[ num[y] ].name[0])
                {
                    z = y;
                }
            }
            if(z != x)
            {
                j = num[z];
                num[z] = num[x];
                num[x] = j;
            }
        }
        ++i;
    }
}
void Show(Stu student, int num[], int n)
{
    int i;
    int t;
    for(i = 0; i < n; ++i)
    {
        t = num[i];
        printf("%s %d %d\n", student[t].name, student[t].year, student[t].grade);
    }
}
void Egrade(Stu student, int num1[], int num2[], int n)
{//数组num2分别保存num1中成绩相等的人数
    int i = 0;
    int t = 0;
    int j;//记录相同成绩的人数
    while(i < n)
    {
        j = 1;
        while(student[ num1[i] ].grade == student[ num1[i + 1] ].grade)
        {//比较成绩是否相等
            ++j;
            ++i;
            if(i == n)
            {
                break;//防止数组越界
            }
        }
        num2[t + 1] = j;//保存
        ++i;
        ++t;
    }
    num2[0] = 0;
}

  • 写回答

1条回答 默认 最新

  • cpp_learners 2021-04-10 14:13
    关注

    不清楚你写的函数是何含义,一句注释也没有.

    但是经过调试,知道是数组越界导致报错!

    // 满足一定的条件,此条while循环会一直执行,当1等于999时,i+1数组就越界了。
    while (student[num1[i]].grade == student[num1[i + 1]].grade) {
    	++j;
    	++i;
    			
        // 为了防止越界,加上下面一句代码即可。
    	//if (i == n) break;
    }
    评论

报告相同问题?

悬赏问题

  • ¥20 基于MSP430f5529的MPU6050驱动,求出欧拉角
  • ¥20 Java-Oj-桌布的计算
  • ¥15 powerbuilder中的datawindow数据整合到新的DataWindow
  • ¥20 有人知道这种图怎么画吗?
  • ¥15 pyqt6如何引用qrc文件加载里面的的资源
  • ¥15 安卓JNI项目使用lua上的问题
  • ¥20 RL+GNN解决人员排班问题时梯度消失
  • ¥60 要数控稳压电源测试数据
  • ¥15 能帮我写下这个编程吗
  • ¥15 ikuai客户端l2tp协议链接报终止15信号和无法将p.p.p6转换为我的l2tp线路