结构体
很简单,就是结构,我们学过哪些结构?数组、指针数组等等能把一堆数据有结构、条例的组合在一起并且修改调用的,这块也是一个重要思维或者说分支,不亚于模块化(函数、文件)逻辑(逻辑条件),因此有些学校的编程课叫数据结构,就是因为它和c语言密不可分(尤其是c是内存操作的语言),数据结构甚至还有专门的书,只不过不止面向编程,更为广义(深学下去就是数据工程相关了,也有相关计算机三级四级的考试),就像《控制论》和自动化专业,前者牵扯哲学领域更为广泛,后者就是前者的一方面应用。
言归正传,c语言预制的数据结构比较少,数组是其中一个,其实是因为c语言允许用户自己设置相关结构(之前的链表已经用过了,链表也是一个自定义的数据结构)
这里我们来系统性学习一下结构体
首先是基本格式
struct date
{
int year;
int month;
int day;
};
这个就是说一个结构体(我们自己定义的变量格式如同int、char)里面包含三个int类型变量,相当于一个集合
使用方法如下
定义这个结构体变量(如同int a)
struct date s1,s2,s3;
比较麻烦,还得敲个struct stu再加上变量,于是有了高级写法(用typedef函数)
typedef struct {
int year;
int month;
int day;
} Date; //分号前大括号后是这个结构体变量的名字
这时候定义变量就可以这样
Date s1,s2,s3;
和链表那一块用的语法就一样了
结构体可以嵌套
这里再定义一个结构体,包含上面那个
typedef struct {
int year;
int month;
int day;
} Date;
typedef struct {
int num;
char name[20];
char sex;
Date birth;
float score;
} Student;
结构体内部存储内容的输入输出
输入可以直接赋值(和数组一样)
还是上面那个Student结构体,注意顺序要对应
Student s1 = {10010,"zhangsan",'m',{2000,5,4},84.5};
//注意里面大括号,代表嵌套的date结构体
从用户那里获取
scanf("%d",&s2.num);
scanf("%s",s2.name); //注意没有&
scanf(" %c",&s2.sex);
// 注意这里有一个空格,用来跳过前面的换行符(上一行加个getchar()也行)
scanf("%d %d %d",&s2.birth.year,&s2.birth.month,&s2.birth.day);
scanf("%f",&s2.score);
fgets写法(名字录入那里),这一块用fgets反而有些复杂了,运用scanf录入字符串也行,就是用scanf录入字符串不需要取地址符号&,因为数组就是个地址
scanf("%d", &s2.num);
fgets(s2.name, sizeof(s2.name), stdin);
s2.name[strcspn(s2.name, "\n")] = 0; // 移除换行符
scanf(" %c", &s2.sex); // 注意这里有一个空格,用来跳过前面的换行符
scanf("%d %d %d", &s2.birth.year, &s2.birth.month, &s2.birth.day);
scanf("%f", &s2.score);
输出更好写
printf("学号:%d\n",s2.num);
printf("姓名:%s\n",s2.name);
printf("性别:%c\n",s2.sex);
printf("出生日期:%d年%d月%d日\n",s2.birth.year,s2.birth.month,s2.birth.day);
printf("成绩:%.1f",s2.score);
这里主要讲解的重点就是那个点,加个点再加上要存的对应结构体中的变量名字计算机就知道你要存入的是结构体的哪个变量,如果嵌套那就多个点加名字
有点调用、点名的意思,比如30个人用结构体集合成一个变量叫一班,如果张三还嵌套一个身份的结构体里面有个年龄的变量,如果想要对一班张三年龄操作就需要这么写
一班.张三.年龄
结构体可以整体赋值操作
这里我想让刚才输入的结构体s2的内容弄到s3里面,就可以这么写
s3 = s2;
例题
根据提示,在右侧编辑器 Begin-End 区间补充代码,从后台获取学生s2的信息,交换学生s1和s2的信息,按照测试说明的输出格式依次输出s1和学生s2的信息。
运用我们上面的知识就可以写出来了
#include <stdio.h>
#include <string.h>
typedef struct {
int year;
int month;
int day;
} Date;
typedef struct {
int num;
char name[20];
char sex;
Date birth;
float score;
} Student;
int main()
{
Student s1 = {10010, "zhangsan", 'm', {2000, 5, 4}, 84.5}, s2, s3;
// 使用 fgets 获取名字,注意 fgets 会读取换行符,需要手动移除
scanf("%d", &s2.num);
fgets(s2.name, sizeof(s2.name), stdin);
s2.name[strcspn(s2.name, "\n")] = 0; // 移除换行符
scanf(" %c", &s2.sex); // 注意这里有一个空格,用来跳过前面的换行符
scanf("%d %d %d", &s2.birth.year, &s2.birth.month, &s2.birth.day);
scanf("%f", &s2.score);
// 交换两个结构体变量s1和s2,三个箱子理论
s3 = s1;
s1 = s2;
s2 = s3;
printf("学号:%d\n", s1.num);
printf("姓名:%s\n", s1.name);
printf("性别:%c\n", s1.sex);
printf("出生日期:%d年%d月%d日\n", s1.birth.year, s1.birth.month, s1.birth.day);
printf("成绩:%.1f\n", s1.score);
printf("学号:%d\n", s2.num);
printf("姓名:%s\n", s2.name);
printf("性别:%c\n", s2.sex);
printf("出生日期:%d年%d月%d日\n", s2.birth.year, s2.birth.month, s2.birth.day);
printf("成绩:%.1f", s2.score);
return 0;
}
这就是一个学生的数据卡,据我所知,这一块内容在以后的学习里有一个编程书都会让我们干的事要用——制作一个通讯录,典中典
总结
1、注意定义的技巧
2、注意输入输出怎么操作(也就是那个 . )
3、注意 . 是英文输入法
4、结构体可以整体操作
以上均是本人理解,如有错误欢迎各位大佬评论区指出~
标签:int,s2,s1,C语言,birth,printf,scanf,结构 From: https://blog.csdn.net/dyudbegdu/article/details/144948849