HM069 只读打印防误改

HM069 只读打印防误改

HM069 只读打印防误改

来源: 第 69 集 结构体-结构体中const使用场景

难度: 入门

时间限制: 1s

空间限制: 64MB

题目描述

学生结构体含姓名、年龄、分数三个成员。用花括号可以在创建变量的同时完成初始化,例如 {name, age, score}

若把整个结构体按值传入打印函数,形参会得到一份完整拷贝:姓名、年龄、分数(若还有身高、体重等字段,也要一并拷走)。一个人还好;一所学校成千上万名学生每人调用一次打印,就会复制出成千上万份副本,内存开销很大。

改成指针接收地址后,不再复制整份档案,只传入一份地址,因此更省空间。指针访问成员必须改用箭头 ->,不能再用点号。

地址传递有隐患:打印函数本应只做读,若误写成 p->age = 150,主函数里的实参也会被改掉。在形参前加 const,写成 const Student *p,就可以把参数限定为只读:读姓名、年龄、分数都可以,一旦写入,编译器会报「必须是可修改的左值」这类错误,从而防止误操作。

读入 \(n\) 名学生。先输出:值传递打印 \(n\) 人时会拷贝多少个字段、改用指针时传入多少份地址。再处理询问:只读打印必须走 const 指针;改年龄必须走**非** const 指针。只读打印之后,档案不得被改写。

输入格式

第一行一个整数 \(n\)(\(1 \le n \le 100\))。

接下来 \(n\) 行,每行一个不含空白的姓名和两个整数年龄、分数(\(1 \le |name| \le 20\),\(1 \le age \le 200\),\(0 \le score \le 100\)),按下标 \(0\) 到 \(n-1\) 存放。

下一行一个整数 \(q\)(\(1 \le q \le 200\))。

接下来 \(q\) 行:

  • 1\ i:用 const 指针只读打印下标 \(i\)(\(0 \le i < n\))。
  • 2\ i\ x:用非 const 指针把下标 \(i\) 的年龄改成 \(x\)(\(1 \le x \le 200\))。

输出格式

第一行两个整数:值传递打印这 \(n\) 人会拷贝的字段总数(每人 \(3\) 个字段),以及指针传递会传入的地址份数(每人 \(1\) 份),中间一个空格。

之后对每个操作:

  • 操作 1:输出一行 name age score
  • 操作 2:输出一行 UPDATED name age score(改完后的当前值)。

行末换行。

样例

输入 #1

1
张三 15 70
3
1 0
2 0 150
1 0

输出 #1

3 1
张三 15 70
UPDATED 张三 150 70
张三 150 70

输入 #2

2
甲 16 80
乙 17 90
2
1 1
2 0 18

输出 #2

6 2
乙 17 90
UPDATED 甲 18 80

说明

样例 1 只有 \(1\) 人,值传递要拷 \(3\) 个字段,指针只传 \(1\) 份地址。第一次打印年龄仍是 \(15\),说明只读函数没有改写;随后非 const 指针把年龄改成 \(150\),主函数里的档案跟着变。样例 2 有 \(2\) 人,字段拷贝数是 \(6\),地址份数是 \(2\)。打印必须用箭头访问 const 指针。

信息

ID
1068
难度
(无)
分类
(无)
标签
(无)
递交数
0
已通过
0
通过率
?
上传者