🎁 当前为 免费试看 内容 · 开通VIP 解锁 GESP 通关手册全部 1–8 级知识点 + 题库 + 详细解析
🌐 主站
📖 已学 0

📌 结构体

所属等级:GESP 4级 | 难度:★★★ | 关键词:struct、成员、结构体数组、按字段排序

📝 考纲要求

  • 理解结构体的概念,能把多个相关字段打包成一个整体;
  • 掌握 struct 的定义、声明与成员访问(. 运算符);
  • 掌握结构体数组的定义与遍历;
  • 能按某个字段对结构体数组进行排序(配合冒泡/选择排序)。

📖 通俗讲解

💡 一句话理解 结构体就像一个自定义档案袋,把属于同一事物的多个信息(如姓名、年龄、分数)装在一起,方便一起搬运和处理。

用 struct 名字 { 类型 成员1; 类型 成员2; }; 定义。声明变量后,用 变量.成员 访问,例如 stu.score。结构体数组 Student a[105]; 则每个元素都是一个档案袋,访问写成 a[i].score。

🖼️ 图解

 struct Student {          // 自定义档案袋
     int id;               // 学号
     string name;          // 姓名
 };
 一个 Student 变量的内存布局:
 ┌──────────┬──────────────┐
 │   id     │    name      │    ← 两个字段打包
 │   1001   │   "Tom"      │
 └──────────┴──────────────┘
 访问成员:stu.id = 1001;  stu.name = "Tom";  (用点 .)
C++
#include <iostream>
#include <string>
using namespace std;
struct Student {          // 定义一个学生结构体
    string name;          // 姓名
    int score;            // 分数
};
int main() {
    Student stu;          // 声明一个学生变量
    cin >> stu.name >> stu.score;  // 通过 . 访问成员
    cout << stu.name << " " << stu.score << endl;
    return 0;
}
输入 / 输出Tom 95 Tom 95

🔵 核心必背重点

✅ 必背
  • 访问成员用点 .:普通变量 stu.score,数组元素 a[i].score;
  • 结构体定义末尾必须有分号 };;
  • 结构体数组排序:比较时只看排序依据的字段,交换时整个结构体一起换;
  • 结构体里可以放 string、数组等任意类型成员。
🔑
记忆口诀:“打包信息用 struct,末尾分号别漏掉;点号访问取成员,排序只看关键字段整体搬。”

🔴 考试拉分难点

⚠️ 难点
  • 整体交换:排序交换两个学生时要交换整个结构体(含姓名、分数),不能只换分数;
  • 按多字段排序:先比主字段,相等再比次要字段(用嵌套 if);
  • 结构体里放字符数组 vs string:用 string 可直接赋值和比较,更简单。

🟡 高频易错陷阱

🚫 扣分坑点
  • 定义结构体忘写结尾分号 };;
  • 用 stu->score(箭头)访问普通变量,应为点 .(箭头用于指针);
  • 排序时只交换分数没交换姓名,数据对不上;
  • 结构体数组下标越界,例如 a[n]。

🧪 例题演练

例题 1(基础题):结构体数组输入与输出

题目:输入 n(≤100)个学生的姓名和分数,输出第 1 个学生的信息。

C++
#include <iostream>
#include <string>
using namespace std;
struct Student {
    string name;
    int score;
};
int main() {
    int n;
    Student a[105];           // 结构体数组
    cin >> n;
    for (int i = 0; i < n; i++) {
        cin >> a[i].name >> a[i].score;  // 逐个读入
    }
    cout << a[0].name << " " << a[0].score << endl;
    return 0;
}
输入 / 输出3 Tom 95 Lucy 88 Bob 90 Tom 95

例题 2(模拟真题):按分数从高到低排序

题目:输入 n 个学生的姓名和分数,按分数降序输出(分数相同按输入顺序)。

C++
#include <iostream>
#include <string>
using namespace std;
struct Student {
    string name;
    int score;
};
int main() {
    int n;
    Student a[105], t;        // t 为交换用的临时结构体
    cin >> n;
    for (int i = 0; i < n; i++) cin >> a[i].name >> a[i].score;
    for (int i = 0; i < n - 1; i++) {          // 冒泡排序
        for (int j = 0; j < n - 1 - i; j++) {
            if (a[j].score < a[j + 1].score) { // 分数小的往后沉
                t = a[j]; a[j] = a[j + 1]; a[j + 1] = t;  // 整体交换
            }
        }
    }
    for (int i = 0; i < n; i++)
        cout << a[i].name << " " << a[i].score << endl;
    return 0;
}
输入 / 输出3 Tom 95 Lucy 88 Bob 90 Tom 95 Bob 90 Lucy 88
🚫 错误示范 if (a[j].score < a[j+1].score) { int tmp=a[j].score; a[j].score=a[j+1].score; a[j+1].score=tmp; } —— 只换了分数没换姓名,姓名和分数错位。

🛡️ 避坑总结

  1. 结构体定义 struct X { ... }; 末尾分号不能省;
  2. 访问成员用点 .,数组元素用 a[i].成员;
  3. 排序时比较看关键字段,交换要整条结构体一起换;
  4. 多字段排序先主后次,用嵌套判断;
  5. 优先用 string 存姓名,避免字符数组越界。

💡 提示:按 ← → 方向键可在上一 / 下一知识点间快速翻页

GESP 4级 · 学习进度 0/0

📑 本页目录