结构体(Struct)
- Typedef关键字
- 结构体类型数据的定义及其成员的使用
学习目标:
了解结构体概念并可以熟练使用结构体
适用场景:
如:学生信息的填写,超市物品的补充等具有可定标签的信息。
Typedef关键字
typedef 为 C 语言的关键字,作用是为一种数据类型(基本类型或自定义数据类型)定义一个新名字,不能
创建新类型。可以理解为其数据类型的别名。
- 与#define 不同,typedef 仅限于数据类型,而不是能是表达式或具体的值
- #define 发生在预处理,typedef 发生在编译阶段
结构体的定义与使用
语法格式:结构体 结构体名称{ 结构体成员列表 };
插入数据
如:当学校需要填写学生的信息(编号,名字,电话,年龄,性别,成绩,地址),当使用结构体的时候,则可以这样表示
编号 | 姓名 | 电话 | 年龄 | 性别 | 成绩 | 地址 |
1001 | 小张 | 12671289132 | 男 | 18 | 100 | 湖北省广水市 |
#include <stdio.h>
struct student{
int id; //编号
char name[11]; //名称
char phone[24]; //电话
int age; //年龄
int score; //性别
char address[51]; //地址
};
现在我们要插入一条数据到结构体当中:
int main(){
struct stu ss={1001,"小张","12671289132",'M',18,100,"湖北省随州市随县"};
printf("编号:%d\n",ss.id);
printf("姓名:%s\n",ss.name);
printf("电话:%s\n",ss.phone);
printf("性别:%s\n",ss.sex=='M'?"男":"女");
printf("年龄:%d\n",ss.age);
printf("成绩:%d\n",ss.score);
printf("地址:%s\n",ss.address);
return 0;
}
结果如图:
第一个问题:那么当我们需要填写多名学生的信息的时候,该如何表示了?
这时候就需要利用到数组了,只需要将其结构体定义为一个数组,我们就可以实现多条数据的插入了。
如表:
编号 | 姓名 | 电话 | 年龄 | 性别 | 成绩 | 地址 |
1001 | “小明” | “18672211234” | ‘M’ | 20 | 99 | "湖北省广水市 |
1002 | “小光” | “18672211234” | ‘F’ | 20 | 99 | "湖北省广水市 |
1003 | “小张” | “18672211234” | ‘M’ | 20 | 99 | "湖北省广水市 |
#include <stdio.h>
//为结构体取别名
typedef struct stu student;
struct stu
{
int id;
char name[21];
char phone[24];
char sex;
int age;
int score;
char address[51];
};
int main(){
//定义结构体数组 数组名 [元素个数]
student ss[3]={
{1001,"小明","18672211234",'M',20,99,"湖北省广水市" },
{1002,"小光","18672211234",'F',20,99,"湖北省广水市" },
{1003,"小张","18672211234",'M',20,99,"湖北省广水市" },
};
//通过结构体数组[下标].成员 找到相应的内容,数组的下标从0开始
for(int i=0;i<3;i++){
printf("编号:%d\n",ss[i].id);
printf("姓名:%s\n",ss[i].name);
printf("电话:%s\n",ss[i].phone);
printf("性别:%s\n",ss[i].sex=='M'?"男":"女");
printf("年龄:%d\n",ss[i].age);
printf("成绩:%d\n",ss[i].score);
printf("地址:%s\n",ss[i].address);
printf("\n");
}
return 0;
}
测试结果如图:
第二个问题:哪如果当需要去修改里面的学生信息时,哪该如何表示了?
或许有同学问了,直接去修改其数据。这种方法也是可行了,但如果当我们的数据过于庞大的话,还是不推荐去修改其数据的,这并不符合其编程思想。这时候则需要去导入一个包<string.h>
,利用该包下的strcpy方法
编号 | 姓名 | 电话 | 年龄 | 性别 | 成绩 | 地址 |
1001 | “小明” | “18672211234” | ‘M’ | 20 | 99 | "湖北省广水市 |
1002 | “ | “18672211234” | ‘F’ | 20 | 99 | "湖北省广水市 |
1003 | “小张” | “18672211234” | ‘M’ | 20 | 99 | "湖北省广水市 |
格式: strcpy(结构体变量.成员,更改的数据)
例如需要将表中的小光
的名字改成小李
。
则是 strcpy(ss[1].name,"小李");
结果如图 :
第三个问题:当我们去使用键盘打印其学生信息时,该如何去做!
第一步:使用scanf
,并将其放入for
循环中。
则表示为:
for(int i=0;i<学生人数,i++){
scanf("需要打印的信息");
}
完整代码如下:
#include <stdio.h>
typedef struct stu
{
int id;
char name[21];
char phone[24];
int age;
char sex;
int score;
}student;
int main()
{
int i;
student ss[3];
//定义其学生数
//通过键盘获取学生信息
for(i=0;i<3;i++){
scanf("%d%s%s%d,%c%d",&ss[i].id,ss[i].name,&ss[i].phone,&ss[i].age,&ss[i].sex,&ss[i].score);
//之所以不在name前面加取地址符是因为数组名本身就是一个首地址
}
//根据结构体成绩排序 \t是转义字符
for(i=0;i<3;i++){
printf("编号:%d\t",ss[i].id);
printf("姓名:%s\t",ss[i].name);
printf("电话:%s\t",ss[i].phone);
printf("性别:%s\t",ss[i].sex=='M'?"男":"女");
printf("年龄:%d\t",ss[i].age);
printf("成绩:%d\t",ss[i].score);
printf("\n");
}
return 0;
}
结果如图所示:
第四个问题:当我们掌握了如何使用结构体,并在结构体中加入学生数据,这时候我们就可以通过冒泡排序,将我们的数据按照成绩大小进行排序。代码如下:
#include <stdio.h>
typedef struct stu
{
int id;
char name[21];
char phone[24];
int age;
char sex;
int score;
}student;
void BubbleSort(student *ss,int len)
{
int i,j;
student temp; //结构体属于结构类型中的一种
for(i=0;i<len-1;i++){
for(j=0;j<len-i-1;j++){
//根据成绩排序 两个相邻结构体比较其成员
if(ss[j].score<ss[j+1].score){
//交换结构体中的变量
temp =ss[j];
ss[j] = ss[j+1];
ss[j+1] = temp;
}
}
}
}
int main()
{
int i;
student ss[3];
//通过键盘获取学生信息
for(i=0;i<3;i++){
scanf("%d%s%s%d,%c%d",&ss[i].id,ss[i].name,&ss[i].phone,&ss[i].age,&ss[i].sex,&ss[i].score);
//之所以不在name前面加取地址符是因为数组名本身就是一个首地址
}
BubbleSort(ss,3);
for(i=0;i<3;i++){
printf("编号:%d\t",ss[i].id);
printf("姓名:%s\t",ss[i].name);
printf("性别:%s\t",ss[i].sex=='M'?"男":"女");
printf("年龄:%d\t",ss[i].age);
printf("成绩:%d\t",ss[i].score);
printf("\n");
}
return 0;
}
结果如图所示: