欢迎光临
我们一直在努力

新手学 C 别死啃语法!第九期:结构体入门,打包不同类型数据,手写简易学生信息管理系统

一、开篇回顾 & 本期目标

不知不觉我们已经走到本系列最后一期啦。

前面八期,我们依次掌握了:开发环境、变量、运算符、判断、循环、数组、字符串、函数、指针。能存数字、存文字、能写独立功能、能拆分模块化代码。

但现实生活里,一组信息往往是混搭的:比如一名学生,既有数字学号、小数分数,又有文字姓名。普通数组只能存同一种数据,单纯拼一堆变量又杂乱难维护。

C 语言专门用 结构体 struct 解决这个问题:把不同类型的数据打包成一个整体,用来描述「一条完整记录」。

本期作为入门系列收尾,目标:

  • 搞懂结构体是什么、怎么定义、怎么使用;
  • 掌握结构体变量、结构体数组两大核心用法;
  • 学会结构体做函数参数,延续模块化编程思想;
  • 综合所有知识点,手写 带菜单的学生信息管理系统(录入、查看、退出);
  • 梳理结构体专属易错点,帮大家彻底避坑。
  • 前置要求:熟练数组、字符串、循环、自定义函数。

    二、大白话讲透:什么是结构体

    举个生活例子,很好理解:

    每个人都有个人档案:姓名、年龄、身高、手机号。

    • 姓名:文字(字符串)
    • 年龄:整数
    • 身高:小数

    这一组信息类型各不相同,但又属于同一个人。在代码里,我们就可以用结构体,把这一堆数据打包在一起,当成一个全新的 “自定义数据类型” 来使用。

    简单总结:

    • int 只能存整数,char 只能存字符;
    • 结构体可以自由组合多种类型数据,用来描述一个完整事物。

    三、结构体基础语法

    1. 定义结构体类型

    格式固定,先定义模板,再创建变量。

    struct 结构体名
    {
    成员列表; // 里面可以写 int / char / float / 字符数组
    };

    ⚠️ 重点:大括号后面必须加分号,这是新手最容易漏掉的地方。

    我们以「学生」为例,定义一个标准结构体:

    // 定义学生结构体模板
    struct Student
    {
    char name[20]; // 姓名(字符串)
    int id; // 学号(整数)
    float score; // 分数(小数)
    };

    2. 定义结构体变量

    有了模板,就像有了图纸,可以创建实体变量:

    // 方式1:单独定义变量(最常用)
    struct Student stu1;
    struct Student stu2;

    3. 访问结构体成员

    想要操作内部的姓名、学号、分数,用 英文小数点 .格式:结构体变量名.成员名

    4. 最简演示案例

    #include <stdio.h>
    #include <string.h>

    // 1. 定义结构体模板
    struct Student
    {
    char name[20];
    int id;
    float score;
    };

    int main(void)
    {
    // 2. 创建结构体变量
    struct Student stu;

    // 3. 给成员赋值
    stu.id = 202601;
    stu.score = 89.5f;
    strcpy(stu.name, "ZhangSan"); // 字符串必须用 strcpy

    // 4. 读取输出
    printf("===== 单条学生信息 =====\\n");
    printf("学号:%d\\n", stu.id);
    printf("姓名:%s\\n", stu.name);
    printf("分数:%.2f\\n", stu.score);

    return 0;
    }

    运行结果:

    ===== 单条学生信息 =====
    学号:202601
    姓名:ZhangSan
    分数:89.50

    补充:结构体快速初始化

    定义变量时直接赋值,一行写完:

    struct Student stu = {"LiSi", 202602, 92.0f};

    四、核心进阶:结构体数组

    单个结构体只能存一条信息,如果要管理全班几十个学生,就要用 结构体数组。

    理解:普通数组存放普通变量,结构体数组里每一个元素,都是一整条学生信息。

    基础示例

    #include <stdio.h>
    #include <string.h>

    struct Student
    {
    char name[20];
    int id;
    float score;
    };

    int main(void)
    {
    // 结构体数组:存放3名学生
    struct Student stuArr[3] = {
    {"ZhangSan", 202601, 88.0f},
    {"LiSi", 202602, 95.5f},
    {"WangWu", 202603, 76.0f}
    };

    int i;
    // 循环遍历输出
    for(i = 0; i < 3; i++)
    {
    printf("学号:%d 姓名:%s 分数:%.2f\\n",
    stuArr[i].id, stuArr[i].name, stuArr[i].score);
    }

    return 0;
    }

    运行效果:

    学号:202601 姓名:ZhangSan 分数:88.00
    学号:202602 姓名:LiSi 分数:95.50
    学号:202603 姓名:WangWu 分数:76.00

    五、知识点整合:结构体做函数参数

    延续我们一直坚持的模块化思想,把录入、查看功能单独封装成函数,结构体数组可以直接作为参数传递。

    这也是后期做项目的标准写法。

    六、本期终极实战:菜单版学生信息管理系统(系列收官项目)

    整合:结构体 + 结构体数组 + 循环 + 分支判断 + 字符串 + 函数完整功能:

  • 菜单选择:1 录入学生信息 2 查看全部信息 0 退出系统
  • 支持循环使用,反复操作;
  • 模块化拆分代码,结构清晰。
  • 完整可直接运行代码

    #include <stdio.h>
    #include <string.h>

    // 1. 定义学生结构体
    struct Student
    {
    char name[20];
    int id;
    float score;
    };

    // 最大学生人数
    const int MAX_STU = 5;
    // 全局结构体数组(存放所有学生信息)
    struct Student stuArr[MAX_STU];

    // 函数声明
    void inputInfo();
    void showInfo();

    int main(void)
    {
    int choice;
    printf("===== 学生信息管理系统(入门收官项目)=====\\n");

    // 主菜单循环
    while(1)
    {
    printf("\\n请选择功能:\\n");
    printf("1. 录入学生信息\\n");
    printf("2. 查看全部信息\\n");
    printf("0. 退出系统\\n");
    printf("请输入选择:");
    scanf("%d", &choice);

    if(choice == 1)
    {
    inputInfo();
    }
    else if(choice == 2)
    {
    showInfo();
    }
    else if(choice == 0)
    {
    printf("系统已退出,感谢使用!\\n");
    break;
    }
    else
    {
    printf("输入无效,请选择 0~2!\\n");
    }
    }

    return 0;
    }

    // 录入所有学生信息
    void inputInfo()
    {
    int i;
    printf("\\n—– 开始录入信息 —–\\n");
    for(i = 0; i < MAX_STU; i++)
    {
    printf("第%d位学生:\\n", i + 1);
    printf("姓名:");
    scanf("%s", stuArr[i].name);
    printf("学号:");
    scanf("%d", &stuArr[i].id);
    printf("分数:");
    scanf("%f", &stuArr[i].score);
    }
    printf("信息录入完成!\\n");
    }

    // 展示所有学生信息
    void showInfo()
    {
    int i;
    printf("\\n—– 全部学生列表 —–\\n");
    for(i = 0; i < MAX_STU; i++)
    {
    printf("学号:%d 姓名:%s 分数:%.2f\\n",
    stuArr[i].id, stuArr[i].name, stuArr[i].score);
    }
    }

    运行演示

    ===== 学生信息管理系统(入门收官项目)=====

    请选择功能:
    1. 录入学生信息
    2. 查看全部信息
    0. 退出系统
    请输入选择:1

    —– 开始录入信息 —–
    第1位学生:
    姓名:XiaoMing
    学号:202601
    分数:90
    第2位学生:
    姓名:XiaoHong
    学号:202602
    分数:85.5
    ……

    请选择功能:
    1. 录入学生信息
    2. 查看全部信息
    0. 退出系统
    请输入选择:2

    —– 全部学生列表 —–
    学号:202601 姓名:XiaoMing 分数:90.00
    学号:202602 姓名:XiaoHong 分数:85.50

    请选择功能:
    ……
    请输入选择:0
    系统已退出,感谢使用!

    七、本期新手高频踩坑合集(必收藏)

    1. 结构体定义末尾漏写分号

    struct Student
    {
    char name[20];
    int id;
    }; // 这里 ; 绝对不能丢

    2. 结构体字符串成员直接赋值

    ❌ 错误:stu.name = "abc";✅ 正确:必须使用 strcpy(stu.name, "abc");

    3. 混淆 & 取地址符

    • 普通数字成员:scanf("%d", &stu.id); 必须加 &
    • 字符数组成员:scanf("%s", stu.name); 不加 &

    4. 成员访问符号写错

    只能用英文小数点 .,不要用逗号、顿号、括号。

    5. 结构体数组下标越界

    和普通数组规则一致,下标从 0 开始,不要超出预设长度。

    八、拓展小练习(自主提升)

    在收官项目基础上自行改造,巩固全套知识点:

  • 增加功能:查找指定学号的学生信息;
  • 增加功能:统计全班平均分、最高分;
  • 限制菜单输入,增加容错判断。
  • 九、全篇总结 + 系列完整收官

    1. 本期知识点总结

  • 理解结构体作用:组合多种不同类型数据,描述完整事物;
  • 掌握结构体定义、变量创建、成员访问、初始化;
  • 学会结构体数组,实现多条记录批量管理;
  • 结合函数、循环、判断、字符串,完成综合管理系统。
  • 2. 全系列 9 期整体回顾

    到这里,《新手学 C 别死啃语法》实战入门系列 正式完结!我们从零开始,一步步走完 C 语言入门全部核心内容:

  • 第 01 期:环境搭建 + 基础输入输出
  • 第 02 期:变量、运算符 + 简易计算器
  • 第 3 期:if 判断 + 多功能计算器
  • 第 4 期:循环语句 + 猜数字游戏
  • 第 5 期:一维数组 + 成绩统计
  • 第 6 期:函数 + 代码模块化
  • 第 7 期:指针基础
  • 第 8 期:字符数组、字符串 + 登录器
  • 第 9 期:结构体 + 综合学生信息管理系统
  • 全程没有死啃厚书本、没有堆砌枯燥理论,以实战代码驱动学习,从一行简单代码,一步步做到完整小型项目。

    能跟着坚持到最后,说明你已经稳稳拿下 C 语言入门!

    十、后续学习路线建议(按需进阶)

    入门结束后,可以根据自己的方向继续深耕:

  • 通用进阶路线动态内存 malloc/free、文件读写、指针进阶、多级指针、位运算;
  • 嵌入式 / 单片机 / 硬件开发路线结合 C 语言学习寄存器操作、中断、定时器、通信协议,这也是 C 语言最主流的就业方向(本人就业方向就属于嵌入式);
  • 练手项目路线基于现有知识做:通讯录、图书管理、万年历、小游戏等综合项目。
  • 十一、寄语

    编程是一门越动手、越熟练的技能。入门只是起点,多敲代码、多改功能、多排查问题,水平才会稳步提升。

    感谢大家一路陪伴学习,本系列到此圆满结束。后续进阶内容、实战项目、问题答疑,我们继续交流!

    赞(0)
    未经允许不得转载:171主机测评 » 新手学 C 别死啃语法!第九期:结构体入门,打包不同类型数据,手写简易学生信息管理系统
    分享到: 更多 (0)

    评论 抢沙发

    • 昵称 (必填)
    • 邮箱 (必填)
    • 网址