C语言,结构体排序!

ruying1389279 2015-01-22 12:02:38
#include "stdafx.h"
#include "stdlib.h"
#include "stdio.h"

struct num
{
int id;
int math;
int eng;
int sum;
};

int main(void)
{
int i,j,temp;
struct num stu[5];
printf("请录入信息!\n");
printf("学号 数学 英语\n");
for (i = 0; i < 5; i++)
{
scanf("%d %d %d",&stu[i].id,&stu[i].math,&stu[i].eng);
stu[i].sum = stu[i].eng + stu[i].math;
}
printf("按总分降序排列!");
for (i = 0; i < 5; i++)
{
temp = stu[i].sum;
for (j = i+1; j < 5; j++)
{
if (temp < stu[i].sum)
{
stu[i].sum = stu[j].sum;
stu[j].sum = temp;
temp = stu[i].sum;
}
}
}
printf("总分\n");
for (i = 0; i < 5; i++)
{
printf("%d \n",stu[i].sum);
}
system("pause");
return 0;
}


怎么才能让结构体中的其他成员的顺序,跟着总分的顺序而变呢?
...全文
556 9 打赏 收藏 转发到动态 举报
写回复
用AI写文章
9 条回复
切换为时间正序
请发表友善的回复…
发表回复
赵4老师 2015-01-22
  • 打赏
  • 举报
回复
仅供参考
//学号 姓名 电话 成绩
//01 XXX 182XXXXXXXX 88
#include <stdio.h>
#include <string.h>
#define MAXS 10000
struct ST {
    int XH;
    char XM[11];
    char DH[13];
    int CJ;
} st[MAXS],t;
int n,i,j;
char ln[80];
FILE *f;
int main() {
    f=fopen("in.txt","r");
    if (NULL==f) {
        printf("Can not open file in.txt!\n");
        return 1;
    }
    i=0;
    while (1) {
        if (NULL==fgets(ln,80,f)) break;
        if (4!=sscanf(ln,"%d%10s%12s%d",&st[i].XH,st[i].XM,st[i].DH,&st[i].CJ)) {
            st[i].XH=0;
            strcpy(st[i].XM,"Unknown");
            strcpy(st[i].DH,"Unknown");
            st[i].CJ=0;
            printf("line %d format error:%s!\n",i+1,ln);
        }
        i++;
        if (i>=MAXS) {
            printf(">%d lines Ignored.\n",MAXS);
            break;
        }
    }
    fclose(f);
    n=i;
    for (i=0;i<n-1;i++) {
        for (j=i+1;j<n;j++) {
            if (st[i].CJ<st[j].CJ) {t=st[i];st[i]=st[j];st[j]=t}
        }
    }
    for (i=0;i<n;i++) {
        printf("%5d%10s%12s%4d\n",st[i].XH,st[i].XM,st[i].DH,st[i].CJ);
    }
    return 0;
}
ruying1389279 2015-01-22
  • 打赏
  • 举报
回复
引用 7 楼 ruying1389279 的回复:
[quote=引用 3 楼 mymtom 的回复:] 排序的基本操作就是比较和交换呀

#include <stdio.h>
#include <stdlib.h>


struct num
{
    int id;
    int math;
    int eng;
    int sum;
};
 
int main(void)
{
    int i,j;
    struct num stu[5];
    struct num temp;

    printf("请录入信息!\n");
    printf("学号 数学 英语\n");
    for (i = 0; i < 5; i++)
    {
        scanf("%d %d %d",&stu[i].id,&stu[i].math,&stu[i].eng);
        stu[i].sum = stu[i].eng + stu[i].math;
    }
    printf("按总分降序排列!");
    for (i = 0; i < 5; i++)
    {
        for (j = i+1; j < 5; j++)
        {
            if (stu[j].sum > stu[i].sum)
            {
                temp = stu[i];
                stu[i] = stu[j];
                stu[j] = temp;
            }
        }
    }
    printf("总分\n");
    for (i = 0; i < 5; i++)
    {
        printf("%d %d %d %d \n", stu[i].id, stu[i].math, stu[i].eng, stu[i].sum);
    }

    getchar();

    return 0;
}
vc++2010 这样写不对[/quote] 看到了,漏掉了一行代码
ruying1389279 2015-01-22
  • 打赏
  • 举报
回复
引用 3 楼 mymtom 的回复:
排序的基本操作就是比较和交换呀

#include <stdio.h>
#include <stdlib.h>


struct num
{
int id;
int math;
int eng;
int sum;
};

int main(void)
{
int i,j;
struct num stu[5];
struct num temp;

printf("请录入信息!\n");
printf("学号 数学 英语\n");
for (i = 0; i < 5; i++)
{
scanf("%d %d %d",&stu[i].id,&stu[i].math,&stu[i].eng);
stu[i].sum = stu[i].eng + stu[i].math;
}
printf("按总分降序排列!");
for (i = 0; i < 5; i++)
{
for (j = i+1; j < 5; j++)
{
if (stu[j].sum > stu[i].sum)
{
temp = stu[i];
stu[i] = stu[j];
stu[j] = temp;
}
}
}
printf("总分\n");
for (i = 0; i < 5; i++)
{
printf("%d %d %d %d \n", stu[i].id, stu[i].math, stu[i].eng, stu[i].sum);
}

getchar();

return 0;
}


vc++2010 这样写不对
ruying1389279 2015-01-22
  • 打赏
  • 举报
回复
谢谢大家,昨晚刚看了结构体这一张,就是不懂到底怎么交换整个结构体。现在明白了,非常感谢大家!
自信男孩 2015-01-22
  • 打赏
  • 举报
回复
排序不能只让num交换,而是让整个结构体的内容都跟着交换就可以了。
百曉生 2015-01-22
  • 打赏
  • 举报
回复
参考一下——http://blog.csdn.net/u012421456/article/details/40015333
mymtom 2015-01-22
  • 打赏
  • 举报
回复
排序的基本操作就是比较和交换呀

#include <stdio.h>
#include <stdlib.h>


struct num
{
    int id;
    int math;
    int eng;
    int sum;
};
 
int main(void)
{
    int i,j;
    struct num stu[5];
    struct num temp;

    printf("请录入信息!\n");
    printf("学号 数学 英语\n");
    for (i = 0; i < 5; i++)
    {
        scanf("%d %d %d",&stu[i].id,&stu[i].math,&stu[i].eng);
        stu[i].sum = stu[i].eng + stu[i].math;
    }
    printf("按总分降序排列!");
    for (i = 0; i < 5; i++)
    {
        for (j = i+1; j < 5; j++)
        {
            if (stu[j].sum > stu[i].sum)
            {
                temp = stu[i];
                stu[i] = stu[j];
                stu[j] = temp;
            }
        }
    }
    printf("总分\n");
    for (i = 0; i < 5; i++)
    {
        printf("%d %d %d %d \n", stu[i].id, stu[i].math, stu[i].eng, stu[i].sum);
    }

    getchar();

    return 0;
}
lm_whales 2015-01-22
  • 打赏
  • 举报
回复
另外,你的排序本身,可能也是错误的
lm_whales 2015-01-22
  • 打赏
  • 举报
回复
有很多种方法 1种是不改变原始数据,只是另建一个指针数组,或者索引数组 这种多余大的数据排序比较好,因为大的数据,交换量很大 另外一种是改变数据的顺序的,通常的排序算法 比较的时候,比较总分就可以了, 交换的时候,交换整个结构 C,C++现在可以结构整体赋值,所以结构赋值语法很简练的 例如 struct num { int id; int math; int eng; int sum; }; C: void swap_num(struct num * a,struct num * b){ struct num n=*a; *a=*b; *b=n; } C++ 可以直接用标准库的swap 也可以自己定义一个; void swap_num(num &a,num&b) { num n=a; a=b; b=n; } 你的交换算法有问题,所以不能进行真正的排序

69,381

社区成员

发帖
与我相关
我的任务
社区描述
C语言相关问题讨论
社区管理员
  • C语言
  • 花神庙码农
  • 架构师李肯
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧