#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;
}
不清楚你写的函数是何含义,一句注释也没有.
但是经过调试,知道是数组越界导致报错!
// 满足一定的条件,此条while循环会一直执行,当1等于999时,i+1数组就越界了。
while (student[num1[i]].grade == student[num1[i + 1]].grade) {
++j;
++i;
// 为了防止越界,加上下面一句代码即可。
//if (i == n) break;
}