结构体与联合体
结构体与联合体
结构体的定义与使用;联合体的定义与使用。
概念
结构体 struct 把多个字段打包成一种复合类型,用 . 访问成员(指针用 ->)。联合体 union 各成员共享同一块内存,同一时刻通常只应把其中一个成员当有效值使用。与 cspj.cpp.pointer 的区别:结构体讲数据布局与成员访问,指针讲地址与解引用。与 cspj.ds.linked-list 等数据结构叶子不同:这里考语言层面的 struct/union 语法,不是链表算法。初赛单选会给 union 改 float 成员、或 struct 数组排序,完善程序可能在比较相邻结构体元素处设空位。
CSP-J 常考
cspj-r1-2023第 3 题:单选题,给union Data正确写入float value的语句(.value与->干扰项)。cspj-r1-2021第 40 题:完善程序空位,在结构体数组去重/比较逻辑处选条件表达式。
struct Student {
string name;
int score;
};
union Data {
int num;
float value;
};
Student a{"Li", 90};
Data d;
d.value = 3.14f;
cout << a.name << " " << d.value << endl;
易错点
union写入value后再读num得到的是同一内存的 reinterpret,语义上不应混读,单选题考「正确赋值方式」而非后续读 int。- 结构体成员访问:
obj.field与ptr->field,选项里value.data、data->value类笔误要逐项排除。 - 完善程序若用结构体数组
A[i]与A[i-1]比较,空位要同时考虑下标i==0的边界。
完善程序共 3 分1 道小题
整组作答后提交批改,成绩计入掌握度 · 已答 0/1
( 2 ) (矩形计数) 平面上有 n 个关键点,求有多少个四条边都和 x 轴或者 y 轴平行的矩形,满足四个顶点都是关键点。给出的关键点可能有重复,但完全重合的矩形只计一 次。
试补全枚举算法。
程序
1
#include <iostream>23using namespace std;45struct point {6 int x, y, id;7};89bool equals(point a, point b) {10 return a.x == b.x && a.y == b.y;11}1213bool cmp(point a, point b) {14 return ①;15}1617void sort(point A[], int n) {18 for (int i = 0; i < n; i++)19 for (int j = 1; j < n; j++)20 if (cmp(A[j], A[j - 1])) {21 point t = A[j];22 A[j] = A[j - 1];23 A[j - 1] = t;24 }25}2627int unique(point A[], int n) {28 int t = 0;29 for (int i = 0; i < n; i++)30 if (②)31 A[t++] = A[i];32 return t;33}3435bool binary_search(point A[], int n, int x, int y) {36 point p;37 p.x = x;38 p.y = y;39 p.id = n;40 int a = 0, b = n - 1;41 while (a < b) {42 int mid = ③;43 if (④)44 a = mid + 1;45 else46 b = mid;47 }48 return equals(A[a], p);49}5051const int MAXN = 1000;52point A[MAXN];5354int main() {55 int n;56 cin >> n;57 for (int i = 0; i < n; i++) {58 cin >> A[i].x >> A[i].y;59 A[i].id = i;60 }61 sort(A, n);62 n = unique(A, n);63 int ans = 0;64 for (int i = 0; i < n; i++)65 for (int j = 0; j < n; j++)66 if (⑤ && binary_search(A, n, A[i].x, A[j].y) &&67 binary_search(A, n, A[j].x, A[i].y)) {68 ans++;69 }70 cout << ans << endl;71 return 0;72}- 40(②)单选空位 ②3 分
②处应填 ( )
阅读下述代码,请问修改 data 的 value 成员以存储 3.14,正确的方式是
union Data{
int num;
float value;
char symbol;
};
union Data data;