题目信息

题目类型
提高级
题目年份
2023
题目题型
编程题
关 键 词
结构体(struct)

题目题干

第 3 题   

结构体(struct)3dV100150满分答卷(100150.com)-青少年编程等级考试及竞赛题库

【题目背景】3dV100150满分答卷(100150.com)-青少年编程等级考试及竞赛题库

在C++等高级语言中,除了int和float等基本类型外,通常还可以自定义结构体类型。在本题当中,你需要模拟一种类似C++的高级语言的结构体定义方式,并计算出相应的内存占用等信息。3dV100150满分答卷(100150.com)-青少年编程等级考试及竞赛题库

【题目描述】3dV100150满分答卷(100150.com)-青少年编程等级考试及竞赛题库

在这种语言中,基本类型共有4种:byte,short,int,long,分别占据1,2,4,8字节的空间。3dV100150满分答卷(100150.com)-青少年编程等级考试及竞赛题库

定义一个结构体类型时,需要给出类型名和成员,其中每个成员需要按顺序给出类.型和名称。类型可以为基本类型,也可以为先.定义过的结构体类型。注意,定义结构体类型时不会定义具体元素,即不占用内存。3dV100150满分答卷(100150.com)-青少年编程等级考试及竞赛题库

定义一个元素时,需要给出元素的类型和名称。元素将按照以下规则占据内存:3dV100150满分答卷(100150.com)-青少年编程等级考试及竞赛题库

• 元素内的所有成员将按照定义时给出的顺序在内存中排布,对于类型为结构体的成员同理。3dV100150满分答卷(100150.com)-青少年编程等级考试及竞赛题库

• 为了保证内存访问的效率,元素的地址占用需要满足对齐规则,即任何类型的大小和该类型元素在内存中的起始地址均应对齐到该类型对齐要求的整数倍。具体而言:3dV100150满分答卷(100150.com)-青少年编程等级考试及竞赛题库

–对于基本类型:对齐要求等于其占据空间大小,如int类型需要对齐到4字节,其余同理。3dV100150满分答卷(100150.com)-青少年编程等级考试及竞赛题库

–对于结构体类型:对齐要求等于其成员的对齐要求的最大值,如一个含有int和short的结构体类型需要对齐到4字节。3dV100150满分答卷(100150.com)-青少年编程等级考试及竞赛题库

以下是一个例子(以C++语言的格式书写):3dV100150满分答卷(100150.com)-青少年编程等级考试及竞赛题库

struct d {
    short a;
    int b;
    short c;
};
d e;

该代码定义了结构体类型d与元素e。元素e包含三个成员e.a,e.b,e.c,分别占据第0∼1,4∼7,8∼9字节的地址。由于类型d需要对齐到4字节,因此e占据了第0∼11字节的地址,大小为12字节。3dV100150满分答卷(100150.com)-青少年编程等级考试及竞赛题库

你需要处理n次操作,每次操作为以下四种之一:3dV100150满分答卷(100150.com)-青少年编程等级考试及竞赛题库

1.定义一个结构体类型。具体而言,给定正整数k与字符串s,t1,n1,...,tk,nk,其中k表示该类型的成员数量,s表示该类型的类型名,t1,t2,...,tk按顺序分别表示每个成员的类型,n1,n2,...,nk按顺序分别表示每个成员的名称。你需要输出该结构体类型的大小和对齐要求,用一个空格分隔。3dV100150满分答卷(100150.com)-青少年编程等级考试及竞赛题库

2.定义一个元素,具体而言,给定字符串t,n分别表示该元素的类型与名称。所有被定义的元素将按顺序,从内存地址为0开始依次排开,并需要满足地址对齐规则。你需要输出新定义的元素的起始地址。3dV100150满分答卷(100150.com)-青少年编程等级考试及竞赛题库

3.访问某个元素。具体而言,给定字符串s,表示所访问的元素。与C++等语言相同,采用.来访问结构体类型的成员。如a.b.c,表示a是一个已定义的元素,它是一个结构体类型,有一个名称为b的成员,它也是一个结构体类型,有一个名称为c的成员。你需要输出如上被访问的最内层元素的起始地址。3dV100150满分答卷(100150.com)-青少年编程等级考试及竞赛题库

4.访问某个内存地址。具体而言,给定非负整数addr,表示所访问的地址,你需要判断是否存在一个基本类型的元素占据了该地址。若是,则按操作3中的访问元素格式输出该元素;否则输出ERR。3dV100150满分答卷(100150.com)-青少年编程等级考试及竞赛题库

【输入格式】3dV100150满分答卷(100150.com)-青少年编程等级考试及竞赛题库

从文件struct.in中读入数据。3dV100150满分答卷(100150.com)-青少年编程等级考试及竞赛题库

第1行:一个正整数n,表示操作的数量。3dV100150满分答卷(100150.com)-青少年编程等级考试及竞赛题库

接下来若干行,依次描述每个操作,每行第一个正整数op表示操作类型:3dV100150满分答卷(100150.com)-青少年编程等级考试及竞赛题库

•若op=1,首先输入一个字符串s与一个正整数k,表示类型名与成员数量,接下来k行每行输入两个字符串ti,ni,依次表示每个成员的类型与名称。3dV100150满分答卷(100150.com)-青少年编程等级考试及竞赛题库

•若op=2,输入两个字符串t,n,表示该元素的类型与名称。3dV100150满分答卷(100150.com)-青少年编程等级考试及竞赛题库

•若op=3,输入一个字符串s,表示所访问的元素。3dV100150满分答卷(100150.com)-青少年编程等级考试及竞赛题库

•若op=4,输入一个非负整数addr,表示所访问的地址。3dV100150满分答卷(100150.com)-青少年编程等级考试及竞赛题库

【输出格式】3dV100150满分答卷(100150.com)-青少年编程等级考试及竞赛题库

输出到文件struct.out中。3dV100150满分答卷(100150.com)-青少年编程等级考试及竞赛题库

输出n行,依次表示每个操作的输出结果,输出要求如题目描述中所述。3dV100150满分答卷(100150.com)-青少年编程等级考试及竞赛题库

 3dV100150满分答卷(100150.com)-青少年编程等级考试及竞赛题库

【样例1输入】3dV100150满分答卷(100150.com)-青少年编程等级考试及竞赛题库

5
1 a 2
short aa
int ab
1 b 2
a ba
long bb
2 b x
3 x.ba.ab
4 10

【样例1输出】3dV100150满分答卷(100150.com)-青少年编程等级考试及竞赛题库

8 4
16 8
0
4
x.bb

【样例1解释】3dV100150满分答卷(100150.com)-青少年编程等级考试及竞赛题库

结构体类型a中,int类型的成员aa占据第0∼3字节地址,short类型的成员ab占据第4∼5字节地址。又由于其对齐要求为4字节,可得其大小为8字节。由此可同理计算出结构体类型b的大小为16字节,对齐要求为8字节。3dV100150满分答卷(100150.com)-青少年编程等级考试及竞赛题库

【样例2】3dV100150满分答卷(100150.com)-青少年编程等级考试及竞赛题库

见选手目录下的struct/struct2.in与struct/struct2.ans。3dV100150满分答卷(100150.com)-青少年编程等级考试及竞赛题库

【样例2解释】3dV100150满分答卷(100150.com)-青少年编程等级考试及竞赛题库

第二个操作4中,访问的内存地址恰好在为了地址对齐而留下的“洞”里,因此没有基本类型元素占据它。3dV100150满分答卷(100150.com)-青少年编程等级考试及竞赛题库

【样例3】3dV100150满分答卷(100150.com)-青少年编程等级考试及竞赛题库

见选手目录下的struct/struct3.in与struct/struct3.ans。3dV100150满分答卷(100150.com)-青少年编程等级考试及竞赛题库

【数据范围】3dV100150满分答卷(100150.com)-青少年编程等级考试及竞赛题库

对于全部数据,满足1≤n≤100,1≤k≤100,0≤addr≤1018。3dV100150满分答卷(100150.com)-青少年编程等级考试及竞赛题库

所有定义的结构体类型名、成员名称和定义的元素名称均由不超过10个字符的小3dV100150满分答卷(100150.com)-青少年编程等级考试及竞赛题库

写字母组成,且都不是byte,short,int,long(即不与基本类型重名)。3dV100150满分答卷(100150.com)-青少年编程等级考试及竞赛题库

所有定义的结构体类型名和元素名称互不相同,同一结构体内成员名称互不相同。3dV100150满分答卷(100150.com)-青少年编程等级考试及竞赛题库

但不同的结构体可能有相同的成员名称,某结构体内的成员名称也可能与定义的结构体或元素名称相同。3dV100150满分答卷(100150.com)-青少年编程等级考试及竞赛题库

保证所有操作均符合题目所述的规范和要求,即结构体的定义不会包含不存在的类型、不会访问不存在的元素或成员等。3dV100150满分答卷(100150.com)-青少年编程等级考试及竞赛题库

保证任意结构体大小及定义的元素占据的最高内存地址均不超过10183dV100150满分答卷(100150.com)-青少年编程等级考试及竞赛题库

第 3 题    结构体(struct)  【题目背景】  在C++等高级语言中,除了int和float等基本类型外,通常还可以自定义结构体类型。在本题当中,你需要模拟一种类似C++的高级语言的结构体3dV100150满分答卷(100150.com)-青少年编程等级考试及竞赛题库

特殊性质A:没有操作1;3dV100150满分答卷(100150.com)-青少年编程等级考试及竞赛题库

特殊性质B:只有一个操作1;3dV100150满分答卷(100150.com)-青少年编程等级考试及竞赛题库

特殊性质C:所有操作1中给出的成员类型均为基本类型;3dV100150满分答卷(100150.com)-青少年编程等级考试及竞赛题库

特殊性质D:基本类型只有long。3dV100150满分答卷(100150.com)-青少年编程等级考试及竞赛题库

【提示】3dV100150满分答卷(100150.com)-青少年编程等级考试及竞赛题库

对于结构体类型的对齐要求和大小,形式化的定义方式如下:3dV100150满分答卷(100150.com)-青少年编程等级考试及竞赛题库

•设该结构体内有k个成员,其大小分别为s1,...,sk,对齐要求分别为a1,...,ak3dV100150满分答卷(100150.com)-青少年编程等级考试及竞赛题库

•则该结构体的对齐要求为a=max{a1,...,ak};3dV100150满分答卷(100150.com)-青少年编程等级考试及竞赛题库

•再设这些成员排布时的地址偏移量分别为o1,...,ok,则:3dV100150满分答卷(100150.com)-青少年编程等级考试及竞赛题库

–o1=0;3dV100150满分答卷(100150.com)-青少年编程等级考试及竞赛题库

–对于i=2,...,k,oi为满足oi−1+si−1≤oi且ai整除oi的最小值;3dV100150满分答卷(100150.com)-青少年编程等级考试及竞赛题库

–则该结构体的大小s为满足ok+sk≤s且a整除s的最小值;3dV100150满分答卷(100150.com)-青少年编程等级考试及竞赛题库

对于定义元素时的内存排布,形式化的定义方式如下:3dV100150满分答卷(100150.com)-青少年编程等级考试及竞赛题库

•设第i个被定义的元素大小为si,对齐要求为ai,起始地址为bi3dV100150满分答卷(100150.com)-青少年编程等级考试及竞赛题库

•则b1=0,对于2≤i,bi为满足bi−1+si−1≤bi且ai整除bi的最小值。3dV100150满分答卷(100150.com)-青少年编程等级考试及竞赛题库

答案解析

相关题目

第 4 题    种树(tree) 【题目描述】 你是一个森林养护员,有一天,你接到了一个任务:在一片森林内的地块上种树,并养护至树木长到指定的高度。 森林的地图有n片地块,其中1号地块连接森林
第 3 题    结构体(struct) 【题目背景】 在C++等高级语言中,除了int和float等基本类型外,通常还可以自定义结构体类型。在本题当中,你需要模拟一种类似C++的高级语言的结构体
第 2 题    消消乐(game) 【题目描述】 小L现在在玩一个低配版本的消消乐,该版本的游戏是一维的,一次也只能消除两个相邻的元素。 现在,他有一个长度为n且仅由小写字母构成的字符串。我们
第 1 题    密码锁(lock) 【题目描述】 小Y有一把五个拨圈的密码锁。如图所示,每个拨圈上是从0到9的数字。每个拨圈都是从0到9的循环,即9拨动一个位置后可以变成0或8, 图1:密
第 20 题 2.(最大值之和)给定整数序列 ,求该序列所有非空连续子序列的最大值之和。上述参数满足  。一个序列的非空连续子序列可以用两个下标 l和 r(其中 0≤l≤r<n)表示,对应的序列
第 19 题 1. (第 k 小路径)给定一张 n 个点 m条边的有向无环图,定点编号从 0到n−1,对于一条路径,我们定义“路径序列”为该路径从起点出发依次经过的顶点编号构成的序列。求所有至少包含一
第 18 题 3. #include <vector>  #include <algorithm>  #include <iostream>    using na
第 17 题 2. #include <iostream>  #include <cmath>  #include <vector>  #include <a
第 16 题 1. #include <iostream>  using namespace std;  unsigned short f(unsigned short x) {     
第15题 现在用如下代码来计算下xn,其时间复杂度为() double quick_power(double x, unsigned n){  If(n == 0) return 1;  If(n =

提示声明

  • 免责声明:本站资源均来自网络或者用户投稿,仅供用于学习和交流:如有侵权联系删除!
  • 温馨提示:本文属于积分文章,需要充值获得积分或升级VIP会员,也可在会员中心投稿获取。

猜你喜欢