C语言----结构体精讲

结构体(Struct)

  • Typedef关键字
  • 结构体类型数据的定义及其成员的使用
学习目标:
 了解结构体概念并可以熟练使用结构体 
适用场景:
 如:学生信息的填写,超市物品的补充等具有可定标签的信息。 

Typedef关键字

typedef 为 C 语言的关键字,作用是为一种数据类型(基本类型或自定义数据类型)定义一个新名字,不能创建新类型。可以理解为其数据类型的别名。

  • 与#define 不同,typedef 仅限于数据类型,而不是能是表达式或具体的值
  • #define 发生在预处理,typedef 发生在编译阶段

结构体的定义与使用

语法格式:结构体 结构体名称{ 结构体成员列表 };

插入数据

如:当学校需要填写学生的信息(编号,名字,电话,年龄,性别,成绩,地址),当使用结构体的时候,则可以这样表示

编号姓名电话年龄性别成绩地址
1001小张1267128913218100湖北省广水市
#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’2099"湖北省广水市
1002“小光”“18672211234”‘F’2099"湖北省广水市
1003“小张”“18672211234”‘M’2099"湖北省广水市
#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’2099"湖北省广水市
1002小光 == 小李”“18672211234”‘F’2099"湖北省广水市
1003“小张”“18672211234”‘M’2099"湖北省广水市

格式: 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; 
}

结果如图所示:
在这里插入图片描述

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值