GESP认证C++编程真题解析 | 202506 六级

📅 2026/7/18 10:46:02
GESP认证C++编程真题解析 | 202506 六级
附上汇总帖GESP认证C编程真题解析 | 汇总单选题第1题下列哪一项不是⾯向对象编程的基本特征A.继承B.封装C.多态D.链接【答案】D【解析】面向对象编程(OOP)的三大重要特性是封装、继承和多态。链接不是重要的OOP特性。第2题为了让Dog类的构造函数能正确地调⽤其⽗类 Animal 的构造⽅法横线线处应填⼊ 。classAnimal{public:std::string name;Animal(std::string str):name(str){std::coutAnimal created\n;}virtualvoidspeak(){coutAnimal speaksendl;}};classDog:publicAnimal{std::string breed;public:Dog(std::string name,std::string b):_________________,breed(b){std::coutDog created\n;}voidspeak()override{coutDog barksendl;}};intmain(){Animal*pnewDog(Rex,Labrador);p-speak();deletep;return0;}A.Animal(name)B.super(name)C.Animal::Animal(name)D.Animal()【答案】A【解析】在派生类构造函数中初始化基类成员时必须显式调用基类构造函数。正确语法是基类名(参数)因此应填Animal(name)。第3题代码同上一题代码执行结果是 。A.输出 Animal speaksB.输出 Dog barksC.编译错误D.程序崩溃【答案】B【解析】通过基类指针调用虚函数时实际执行的是派生类重写的版本。p-speak()会调用Dog::speak()输出Dog barks。第4题以下关于栈和队列的代码执行后输出是 。stackints;queueintq;for(inti1;i3;i){s.push(i);q.push(i);}couts.top() q.front()endl;A.1 3B.3 1C.3 3D.1 1【答案】B【解析】栈是LIFO((后进先出)结构最后push的3在栈顶队列是FIFO(先进先出)结构最先push的1在队首。故输出31。第5题在一个循环队列中 front 是指向队头的指针rear 指向队尾的指针队列最大容量为 maxSize。判断队列已满的条件是 。A.rear frontB.(rear 1) % maxSize frontC.(rear - 1 maxSize) % maxSize frontD.(rear - 1) front【答案】B【解析】循环队列满的条件是队尾指针的下一个位置是队首即(rear1)%maxSize front通过取模实现环形结构。第6题 只有最底层的节点未被填满且最底层节点尽量靠左填充。A.完美二叉树B.完全二叉树C.完满二叉树D.平衡二叉树【答案】B【解析】完全二叉树的定义要求除最后一层外完全填充且最后一层节点尽量靠左排列。第7题在使⽤数组表⽰完全二叉树时如果一个节点的索引为 i从 0 开始计数那么其左⼦节点的索引通常是 。A.(i - 1) / 2B.i 1C.i * 2D.2 * i 1【答案】D【解析】数组存储完全二叉树时若父节点索引为i则左子节点索引为2i1(从0开始计数)这是层序存储的数学关系。第8题已知一棵二叉树的前序遍历序列为 GDAFEMHZ 中序遍历序列为 ADFGEHMZ 则其后序遍历序列为 。A.ADFGEHMZB.ADFGHMEZC.AFDGEMZHD.AFDHZMEG【答案】D【解析】前序首字符G是根节点根据中序分割左子树(ADF)和右子树(EHMZ)。递归推导可得后序为AFDHZMEG。第9题设有字符集 {a, b, c, d, e}其出现频率分别为 {5, 8, 12, 15, 20}得到的哈夫曼编码为 。A.a: 010 b: 011 c: 00 d: 10 e: 11B.a: 00 b: 10 c: 011 d: 100 e: 111C.a: 10 b: 01 c: 011 d: 100 e: 111D.a: 100 b: 01 c: 011 d: 100 e: 00【答案】A【解析】按频率构建哈夫曼树后高频字符e/d编码较短(11/10)低频字符a编码较长(010)符合选项A的编码分布。第10题3位格雷编码中编码 101 之后的下一个编码不可能是 。A.100B.111C.110D.001【答案】C【解析】格雷码相邻编码仅1位不同。101的下一个可能是100/111/001110需改变2位违反规则。第11题请将下列 C 实现的深度优先搜索DFS代码补充完整横线处应填⼊ 。structTreeNode{intval;TreeNode*left;TreeNode*right;TreeNode(intx):val(x),left(nullptr),right(nullptr){}};voiddfs(TreeNode*root,vectorintresult){if(rootnullptr)return;__________________________}A.result.push_back(root-val);dfs(root-left);dfs(root-right);B.result.push_back(root-left-val);dfs(root-right);dfs(root-left);C.result.push_back(root-left-val);dfs(root-left);dfs(root-right);D.result.push_back(root-right-val);dfs(root-right);dfs(root-left);【答案】A【解析】DFS前序遍历需先访问当前节点再递归左右子树。选项A的result.push_back(root-val)正确实现了节点访问顺序。第12题给定一个二叉树返回每一层中最⼤的节点值结果以数组形式返回横线处应填⼊ 。#includevector#includequeue#includealgorithmstructTreeNode{intval;TreeNode*left;TreeNode*right;TreeNode(intx):val(x),left(nullptr),right(nullptr){}};vectorintlargestValues(TreeNode*root){vectorintresult;if(!root)returnresult;queueTreeNode*q;q.push(root);while(!q.empty()){intszq.size();intmaxValINT_MIN;for(inti0;isz;i){TreeNode*node;_______________________________ maxValmax(maxVal,node-val);if(node-left)q.push(node-left);if(node-right)q.push(node-right);}result.push_back(maxVal);}returnresult;}A.nodeq.end();B.nodeq.front();C.q.pop();nodeq.front();D.nodeq.front();q.pop();【答案】D【解析】队列先取出队首节点(q.front())再将其移出队列(q.pop())选项D的操作顺序正确。第13题下⾯代码实现一个二叉排序树的插⼊函数没有相同的数值横线处应填⼊ 。structTreeNode{intval;TreeNode*left;TreeNode*right;TreeNode(intx):val(x),left(nullptr),right(nullptr){}};voidinsert(TreeNode*root,intkey){if(!root){rootnewTreeNode(key);return;}_______________________________}A.if(keyroot-val)insert(root-left,key);elseif(keyroot-val)insert(root-right,key);B.if(keyroot-val)insert(root-right,key);elseif(keyroot-val)insert(root-left,key);C.insert(root-left,key);insert(root-right,key);D.insert(root-right,key);insert(root-left,key);【答案】A【解析】二叉排序树插入规则小于当前节点值插入左子树大于则插入右子树。选项A严格遵循此规则。第14题以下关于动态规划算法特性的描述正确的是 。A.⼦问题相互独立不重叠B.问题包含重叠⼦问题和最优⼦结构C.只能从底⾄顶迭代求解D.必须使⽤递归实现不能使⽤迭代【答案】B【解析】动态规划的两个核心特性重叠子问题和最优子结构内(问题最优解包含子问题最优解)第15题给定 个物品和一个最⼤承重为 的背包每个物品有一个重量 和价值 每个物品只能选择放或 不放。⽬标是选择若⼲个物品放⼊背包使得总价值最⼤且总重量不超过 。关于下⾯代码说法正确的是 。intknapsack1D(intW,vectorintwt,vectorintval,intn){vectorintdp(W1,0);for(inti0;in;i){for(intwW;wwt[i];--w){dp[w]max(dp[w],dp[w-wt[i]]val[i]);}}returndp[W];}A.该算法不能处理背包容量为 0 的情况B.外层循环 i 遍历背包容量内层遍历物品C.从大到小遍历 w 是为了避免重复使用同一物品D.这段代码计算的是最小重量而非最大价值【答案】C【解析】从大到小遍历w是为了防止重复使用同一物品(01背包)。若从小到大遍历则变成完全背包问题。判断题第1题构造函数可以被声明为 virtual。A.正确B.错误【答案】B【解析】构造函数不能是虚函数。虚函数调用需要通过虚函数表(vtable)而构造函数执行时对象尚未完全构造虚函数表未初始化。第2题给定一组字符及其出现的频率构造出的哈夫曼树是唯一的。A.正确B.错误【答案】B【解析】当存在多个相同频率的字符时哈夫曼树的构建可能有多种形态(如左右子树顺序不同)但带权路径长度相同。第3题为了实现一个队列使其出队操作 pop 的时间复杂度为O ( 1 ) O(1)O(1)并且避免数组删除首元素的O ( n ) O(n)O(n)问题一 种常见且有效的方法是使用环形数组通过调整队首和队尾指针来实现。A.正确B.错误【答案】A【解析】环形数组利用模运算实现指针循环避免数据搬移使入队(rear)和出队(front)均达到O(1)时间复杂度。第4题对一棵二叉排序树进行中序遍历可以得到一个递增的有序序列。A.正确B.错误【答案】A【解析】二叉排序树的定义要求左子树所有节点值小于根节点右子树所有节点值大于根节点因此中序遍历必然有序。第5题如果二叉搜索树在连续的插入和删除操作后所有节点都偏向一侧导致其退化为类似于链表的结构这时 其查找、插入、删除操作的时间复杂度会从理想情况下的O ( l o g n ) O(logn)O(logn)退化到O ( n l o g n ) O(nlogn)O(nlogn)。A.正确B.错误【答案】B【解析】退化后时间复杂度应为O(n)(如链表遍历)而非O(n log n)。O(n log n) 是排序算法的时间复杂度。第6题执行下列代码 my_dog.name 的最终值是 Charlie 。classDog{public:std::string name;Dog(std::string str):name(str){}};intmain(){Dogmy_dog(Buddy);my_dog.nameCharlie;return0;}A.正确B.错误【答案】A【解析】通过公开成员变量 name 直接赋值最终值确实被修改为 Charlie。第7题下列 C 代码可以成功编译并且子类 Child 的实例能通过其成员函数访问父类 Parent 的属性 value 。classParent{private:intvalue100;};classChild:publicParent{public:intget_private_val(){returnvalue;// 尝试访问父类的私有成员}};A.正确B.错误【答案】B【解析】私有成员仅允许在定义它们的类内访问派生类无法直接访问父类的私有成员。第8题下列代码中的 tree 向量表示的是一棵完全二叉树 ( -1 代表空节点)按照层序遍历的结果。#includevectorstd::vectorinttree{1,2,3,4,-1,6,7};A.正确B.错误【答案】B【解析】完全二叉树要求非最后一层的空节点必须连续出现在末尾。-1出现在中间(第4个位置)违反完全性定义。第9题在树的深度优先搜索DFS中使用栈作为辅助数据结构以实现“先进后出”的访问顺序。A.正确B.错误【答案】A【解析】递归DFS本质是系统栈调用非递归DFS需显式使用栈保存节点均符合后进先出(LIFO)特性。第10题下面代码采用动态规划求解零钱兑换问题给定n nn种硬币第i ii种硬币的面值为coints[i-1]目标金额为amt每种硬币可以重复选取求能够凑出目标金额的最少硬币数量如果不能凑出目标金额返回-1。intcoinChangeDPComp(vectorintcoins,intamt){intncoins.size();intMAXamt1;vectorintdp(amt1,MAX);dp[0]0;for(inti1;in;i){for(inta1;aamt;a){if(coins[i-1]a)dp[a]dp[a];elsedp[a]min(dp[a],dp[a-coins[i-1]]1);}}returndp[amt]!MAX?dp[amt]:-1;}A.正确B.错误【答案】A【解析】代码正确使用dp数组记录最少硬币数并通过双重循环状态转移符合动态规划求解要求。编程题