首页 > 其他分享 >C语言结构体

C语言结构体

时间:2025-01-05 19:33:46浏览次数:3  
标签:int s2 s1 C语言 birth printf scanf 结构

结构体

很简单,就是结构,我们学过哪些结构?数组、指针数组等等能把一堆数据有结构、条例的组合在一起并且修改调用的,这块也是一个重要思维或者说分支,不亚于模块化(函数、文件)逻辑(逻辑条件),因此有些学校的编程课叫数据结构,就是因为它和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

相关文章

  • C语言(自定义)函数
    函数概念函数可以分为函数库(预制菜)和自定义函数(自己做的菜)函数库之前的文章讲解过一部分数组的、字符串的、动态内存的,有兴趣可以我的学习专栏看一看,里面都有今天重点讲解的函数是自定义函数先来几道预制菜输入/输出函数(头文件为stdio.h):用于完成输入/输出功能;(最基本的)字......
  • C语言语法练习1(较简单)
    一、题目来源注意:题目来自牛客网链接:【新手上路】语法入门+算法入门题单_ACM竞赛_ACM/CSP/ICPC/CCPC/比赛经验/题解/资讯_牛客竞赛OJ_牛客网二、部分题目的解1、#include<stdio.h>intmain(){doublea,b,c;scanf("%lf%lf",&a,&b);c=(b/a)*100;pr......
  • 每日一题洛谷B3655 [语言月赛202208] 天天爱跑步C语言
    #include<stdio.h>intmain(){ intn; scanf("%d",&n); intv1,v3,v7,v30,v120,v365; scanf("%d%d%d%d%d%d",&v1,&v3,&v7,&v30,&v120,&v365); intt=0; intcount=0; intsum=0; for......
  • 【C语言】求主对角线上元素和,求次对角线上元素和
    intmain(){ inta[3][3]={1,3,6,7,9,11,14,15,17}; ints1=0,s2=0,i,j; for(i=0;i<3;i++) { for(j=2;j>=0;j--) { if(i==j)s1+=a[i][j]; } } for(i=0;i<3;i++) { for(j=2;j>=0;j--) { if(i+......
  • C语言中的强弱符号
    文章目录一、基本定义二、链接过程中的行为三、应用场景四、强弱符号示例1五、稍有难度示例2在C语言中,强弱符号是与链接过程相关的重要概念,C++中不存在强弱符号,以下是对它们的详细讲解:一、基本定义强符号强符号通常是指在编译单元(一般是一个源文件,即.c文件)中......
  • Python数据结构与算法分析 第3版PDF、EPUB免费下载
    适读人群:1.希望学习数据结构和算法的Python用户;2.计算机专业的学生和老师。只有洞彻数据结构与算法,才能真正精通Python!热门计算机科学教材,华盛顿大学、北京大学等多家高校采用,让你在代码编写的战场上所向披靡!电子版仅供预览,下载后24小时内务必删除,支持正版,喜欢的请购买正版......
  • [数据结构学习笔记4] 堆栈(Stack)
    堆栈,我们总是把新的数据加在堆栈的最顶端,移除的时候也是从最顶端开始移除。也叫LIFO(lastinfirstout)。代码实现(javascript)classStack{constructor(...items){this.items=items;}clear(){this.items.length=0;}clon......
  • 1.4学习关键字,define,指针 ,结构体
    %lf%lf,lf之间不能加,只能用空格;extern:声明外部符号;void无(一般用于返回类型);不需要返回值sizeof -计算大小,  typedef类型重命名;register---寄存器,建议,存放在寄存器中;int  变量,变量的名字不能为关键字;intage;名字必须是字母,数字,下划线组成,不能有特殊字符,同时不能......
  • python【数据结构】
     1.列表Python中列表是可变的,这是它区别于字符串和元组的最重要的特点;即,列表可以修改,而字符串和元组不能。以下是Python中列表的方法:方法描述list.append(x)把一个元素添加到列表的结尾,相当于a[len(a):]=[x]。list.extend(L)通过添加指定列表的所有元素来扩充列表,......
  • 【C语言编程】地址与指针:理解与应用
    在C语言编程中,理解地址和指针的概念至关重要。地址是内存中可以唯一标识内存单元的数字,而指针则是存储这些地址的变量。通过指针,程序员可以直接访问和操作内存,这是C语言强大功能的基础。地址的概念在C语言中,每个变量都存储在内存中的一个特定位置,这个位置就是变量的地址。例如,一......