#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;
}
简单选择排序出错,SSort结果总是不对;但是把排序算法单独拿出来测试结果正确
- 写回答
- 好问题 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线路