2 qq 28635077 qq_28635077 于 2015.06.29 16:29 提问

求帮忙看看错在哪里,把输进去的数据从大到小排序

#include
#include

typedef struct student
{
char name[20];
int score;
}STU;

void sort(STU *aStu, int n)
{
int i,j;
int temp;
for(j=0;j {
for(i=0;i {
if(aStu[i].score>aStu[i+1].score)
{
temp=aStu[i].score;
aStu[i].score=aStu[i+1].score;
aStu[i+1].score=temp;
}
}
}
printf("学生成绩从大到小排序为:");
for(i=0;i<n;i++)
{
printf("%s,%d\n",aStu[i].name,aStu[i].score);
}
}

int main(void)
{
int i;
int num;
STU *aStu={0};
printf("请输入学生的人数:");
scanf("%d",&num);
printf("请输入学生的姓名及成绩:");
for(i=0;i<num;i++)
{
scanf("%s,%d",aStu[i].name,&aStu[i].score);
}
sort(aStu, num);

system("pause");
return 0;

}

4个回答

bdmh
bdmh   Ds   Rxr 2015.06.29 16:33

第二个for循环应该是根据 j 的位置去做循环,就比如

 for(j=0;j<=9;j++) 
{ for (i=0;i<10-j;i++) 

网上冒泡排序很多代码的,仔细看看

ivanx_cc
ivanx_cc   2015.06.29 16:57

1 你的主函数没有给你的 aStu 分配内存,这样会导致段错误。
2 你的排序方法应该是想用冒泡排序, 但是你的逻辑上有问题,而且就算你的排序正确了, 你的name与的成绩也是无法对应上的。
排序的简单修改方法为
for(j = 0; j < n; j++) {
for(i = j; i < n-1; i++) {
if(aStu[j].score < aStu[i+1].score) {
temp=aStu[j].score;
aStu[j].score=aStu[i+1].score;
aStu[i+1].score=temp;
}
}
}

至于你的name与成绩 如何对应到一起, 可以在思考一下。

ivanx_cc
ivanx_cc   2015.06.29 16:57

1 你的主函数没有给你的 aStu 分配内存,这样会导致段错误。
2 你的排序方法应该是想用冒泡排序, 但是你的逻辑上有问题,而且就算你的排序正确了, 你的name与的成绩也是无法对应上的。
排序的简单修改方法为
for(j = 0; j < n; j++) {
for(i = j; i < n-1; i++) {
if(aStu[j].score < aStu[i+1].score) {
temp=aStu[j].score;
aStu[j].score=aStu[i+1].score;
aStu[i+1].score=temp;
}
}
}

至于你的name与成绩 如何对应到一起, 可以在思考一下。

wm9028
wm9028   2015.06.29 17:34

可以好好看看冒泡排序算法

Csdn user default icon
上传中...
上传图片
插入图片