结构体的应用 和 结构体排序(qsort)

结构体

提前说明:本文需要搭配这篇介绍qsort的文章食用,本文为其的拓展。

只会简单介绍结构体的应用。

会提供模板,且只会教大家一种使用方法。大家可以自学其他的结构体使用方法。

为什么要使用结构体?

试想如下问题:现在大班有200名同学,现有他们的姓名,学号,成绩,性别,小班号。如何存储?

当然可以开5个数组分别来存储。但这样子的弊端很明显。那么有没有办法把这些变量拼在一起,形成一个新的变量student,student中含有姓名,学号,成绩,性别,小班号?

有的,结构体。

定义结构体

struct student{
	int id,score,sex,class;
    char name[20];
    //可以在这定义int,double,指针,数组...
};

struct student xiaoming;	//定义了一个结构体xiaoming
struct student stu[200];	//定义了一个结构体数组

访问结构体

使用成员运算符(.)来访问结构体成员。

例:

int a;
a = xiaoming.id;				//将“xiaoming”这个结构体中成员id的值赋给a
printf("%s",xiaoming.name);		//输出结构体“xiaoming”中的字符串name

例题:

给定xiaoming和20个同学的信息。请输出输出所有学号比小明大的同学的信息

scanf("%s%d%d%d%d",xiaoming.name, &xiaoming.id, &xiaoming.score, &xiaoming.sex, &xiaoming.class);
for(int i=0;i<20;i++){
	scanf("%s%d%d%d%d",stu[i].name, &stu[i].id, &stu[i].score, &stu[i].sex, &stu[i].class);
    //注意,在输入字符串的时候没有加"&"
}
for(int i=0;i<20;i++){
	if(stu[i].id>xiaoming.id)
    printf("%s %d %d %d %d",stu[i].name, stu[i].id, stu[i].score, stu[i].sex, stu[i].class);
    //注意,在输入字符串的时候没有加"&"
}

结构体+qsort

直接使用问题来讲。

问题一:

请对n名同学的学号排序。先输入信息,输出排序后的结果。

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

struct student{//定义结构体
	int id,score,sex,class;
    char name[20];
};

int cmp(const void *a,const void *b)
{
    struct student *aa=(struct student *)a;
    struct student *bb=(struct student *)b;
    if( (*aa).id > (*bb).id )   return 1;
    return -1;
}

int main()
{
	int n;
    struct student stu[1000];

    scanf("%d",&n);
    for(int i=0;i<n;i++){//输入
        scanf("%s%d%d%d%d",stu[i].name, &stu[i].id, &stu[i].score, &stu[i].sex, &stu[i].class);
    }

    qsort(stu,n,sizeof(stu[0]),cmp);//排序

    for(int i=0;i<n;i++){//输出
        printf("%-10s %-5d %-5d %-5d %-5d\n",stu[i].name, stu[i].id, stu[i].score, stu[i].sex, stu[i].class);
    }
}
问题二:

请对n名同学排序,第一关键字为分数,第二关键字为班号,第三关键字为学号,都是降序。先输入信息,输出排序后的结果。

//这里只给cmp函数
int cmp(const void *a,const void *b)
{
    struct student *aa=(struct student *)a;
    struct student *bb=(struct student *)b;
    if( (*aa).score < (*bb).score )   return 1;
    if( (*aa).score > (*bb).score )   return -1;
    //能执行到下一行说明成绩一样
    if( (*aa).class < (*bb).class )   return 1;
    if( (*aa).class > (*bb).class )   return -1;
    //能执行到下一行说明成绩、班级一样
    if( (*aa).id  <  (*bb).id )   return 1;
    return -1;
}
  • 2
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值