结构体
提前说明:本文需要搭配这篇介绍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;
}