附上汇总帖GESP认证C编程真题解析 | 汇总单选题第1题以下 没有涉及 C 语言的面向对象特性支持。A. C中构造一个 class 或 structB. C中调用printf 函数C. C中调用用户定义的类成员函数D. C 中构造来源于同一基类的多个派生类【答案】B【解析】选项B 调用的是C语言中的函数printf这与面向对象特性无关。第2题关于以下C代码 行代码会引起编译错误。#includeiostreamusingnamespacestd;classBase{private:inta;protected:intb;public:intc;Base():a(1),b(2),c(3){}};classDerived:publicBase{public:voidshow(){coutaendl;// Line 1coutbendl;// Line 2coutcendl;// Line 3}};A. Line1B. Line2C. Line3D. 没有编译错误【答案】A【解析】a是 Base 类中的私有成员变量。在派生类 Derived 中无法直接访问基类的私有成员因此这一行会引发编译错误。第3题有6个元素按照654321的顺序进入栈S下列 的出栈序列是不能出现的 。A. 543612B. 453126C. 346521D. 234156【答案】C【解析】C选项346521入栈6入栈5入栈4入栈3出栈3出栈4出栈6不可能因为6后面还有5在栈中这个序列是不可能的。第4题采用如下代码实现检查输入的字符串括号是否匹配。横线处应填入的代码为 。#includeiostream#includestack#includestringusingnamespacestd;boolis_valid(string s){stackcharst;chartop;for(charch:s){if(ch(||ch{||ch[){st.push(ch);// 左括号入栈}else{if(st.empty())returnfalse;___________________________// 在此处填入代码if((ch)top!()||(ch}top!{)||(ch]top![)){returnfalse;}}}returnst.empty();// 栈为空则说明所有括号匹配成功}A. topst.top(); st.pop();​B. st.pop(); topst.top();​C. st.pop(); topst.front();​D. topst.front(); st.pop();​【答案】A【解析】在处理右括号时需要从栈中弹出一个元素进行匹配我们需要先获取栈顶元素再将其从栈中移除。第5题下面代码判断队列的第一个元素是否等于a并删除该元素横向上应填写 。#includeiostream#includequeueusingnamespacestd;boolis_front_equal(std::queueintq,inta){boolis_equalfalse;if(!q.empty()){_________________________// 在此处填入代码}returnis_equal;}A. is_equal (q.front() a);​B. is_equal (q.front() a); q.pop();​C. q.pop(); is_equal (q.front()a);​D. q.pop(); is_equal (q.pop()a);​【答案】B【解析】首先检查队列首元素是否等于a然后弹出该元素。选项正确地执行了这两步操作保证逻辑完整性和顺序正确性。第6题假设字母表 {abcde} 在字符串出现的频率分别为10%15%30%16%29%。若使用哈夫曼编码方式对字母进行二进制编码则字符 abcdef 分别对应的一组哈夫曼编码的长度分别为 。A. 44132B. 33222C. 33121D. 44122【答案】B【解析】画出哈夫曼树选项B正确。第7题以下C代码实现n位的格雷码则横线上应填写 。#includeiostream#includevector#includestringusingnamespacestd;// 生成 n 位的格雷码vectorstringgenerate_graycode(intn){vectorstringgraycode_list;if(n0){returngraycode_list;}// 初始1位格雷码graycode_list.push_back(0);graycode_list.push_back(1);// 迭代生成 n 位的格雷码for(inti2;in;i){intcurrent_sizegraycode_list.size();for(intjcurrent_size-1;i0;j--){graycode_list.push_back(1graycode_list[j]);}for(intj0;jcurrent_size;j){__________________// 在此处填入代码}}returngraycode_list;}A. graycode_list.push_back(“0”graycode_list[j]);​B. graycode_list[j]“0”graycode_list[j];​C. graycode_list.push_back(“1”graycode_list[j]);​D. graycode_list[j]“1”graycode_list[j];​【答案】B【解析】A错误。这个操作会在列表末尾添加带有前缀’0’的新格雷码但应当是在已有格雷码前面加’0’。B正确。在已存在的格雷码前面加’0’这是对称性要求的一部分。C错误。这段代码重复了之前的操作应避免。D错误。这将破坏原有顺序使得两部分不再对称。因此正确答案是B。第8题给定一棵二叉树其前序遍历结果为ABDECFG中序遍历结果为DEBACFG则这棵树的正确后序遍历结果是 。A. EDBGFCAB. EDGBFCAC. DEBGFCAD. DBEGFCA【答案】A【解析】根据先序遍历与中序遍历的结果可以得到树的结构由此得出后序遍历为EDBGFCA选A。第9题一棵有n个结点的完全二叉树用数组进行存储与表示已知根结点存储在数组的第1个位置。若存储在数组第9个位置的结点存在兄弟结点和两个子结点则它的兄弟结点和右子结点的位置分别是 。A. 818B. 1018C. 819D. 1019【答案】C【解析】假设根节点存在数组的第1个位置那么根据完全二叉树的性质父节点第9个位置的节点的父节点位置为 floor(9 / 2) 4.兄弟节点若第9个位置的节点有兄弟节点则其兄弟节点应该在位置8即9的前一个位置。左孩子节点第9个位置的节点的左孩子节点位置为2 * 9 18。右孩子节点第9个位置的节点的右孩子节点位置为2 * 9 1 19。综上所述第9个位置的节点的兄弟节点位置为8左孩子节点位置为18右孩子节点位置为19。第10题二叉树的深度定义为从根结点到叶结点的最长路径上的结点数则以下基于二叉树的深度优先搜索实现的深度计算函数中横线上应填写 。// 定义二叉树的结点结构structtree_node{intval;tree_node*left;tree_node*right;tree_node(intx):val(x),left(nullptr),right(nullptr){}};// 计算二叉树的深度intmax_depth(tree_node*root){if(rootnullptr){return0;// 如果根节点为空则深度为0}intleft_depthmax_depth(root-left);intright_depthmax_depth(root-right);_______________________// 在此处填入代码}A. return left_depth right_depth;​B. return max(left_depth, right_depth);​C. return max(left_depth, right_depth) 1;​D. return left_depth right_depth 1;​【答案】C【解析】函数 max_depth 递归地计算左右子树的深度最后返回两者中的较大值加1选项C正确。第11题上一题的二叉树深度计算还可以采用二叉树的广度优先搜索来实现。以下基于二叉树的广度优先搜索实现的深度计算函数中横线上应填写 。#includequeueintmax_depth_bfs(tree_node*root){if(rootnullptr){return0;// 如果树为空深度为0}queuetree_node*q;q.push(root);intdepth0;// 使用队列进行层序遍历while(!q.empty()){_____________________// 在此处填入代码for(inti0;ilevel_size;i){tree_node*nodeq.front();q.pop();if(node-left){q.push(node-left);}if(node-right){q.push(node-right);}}}returndepth;}A. int level_size q.size(); depth;​B. int level_size 2; depth;​C. int level_size q.size(); depth level_size;​D. int level_size 2; depth level_size;​【答案】A【解析】题目要求使用广度优先搜索计算二叉树的深度。每遍历一层深度增加1。level_size 记录当前层节点数每次循环后深度加1以反映已完成的一层遍历。选项A正确。第12题二叉搜索树中的每个结点其左子树的所有结点值都小于该结点值右子树的所有结点值都大于该结点值。以下代码对给定的整数数组假设数组中没有数值相等的元素构造一个对应的二叉搜索树横线上应填写 // 定义二叉树的结点结构structtree_node{intval;tree_node*left;tree_node*right;tree_node(intx):val(x),left(nullptr),right(nullptr){}};// 插入结点到二叉搜索树中tree_node*insert(tree_node*root,intval){if(rootnullptr){returnnewtree_node(val);}___________________________// 在此处填入代码returnroot;}// 根据给定数组构造二叉搜索树tree_node*constructBST(constintarr[],intsize){tree_node*rootnullptr;for(inti0;isize;i){rootinsert(root,arr[i]);}returnroot;}A.if(valroot-val)root-leftinsert(root-left,val);elseroot-rightinsert(root-right,val);B.if(valroot-val)root-leftinsert(root-left,val);elseroot-rightinsert(root-right,val);C.if(valroot-val)root-leftinsert(root,val);elseroot-rightinsert(root,val);D.if(valroot-val)root-leftinsert(root,val);elseroot-rightinsert(root,val);【答案】A【解析】题目要求在 insert 函数中插入代码以构建二叉搜索树。二叉搜索树的性质决定了若插入值小于当前节点值则递归插入左子树否则递归插入右子树。选项A正确。第13题对上题中的二叉搜素树当输入数组为[5,3,7,2,4,6,8]时构建二叉搜索树并采用如下代码实现的遍历方式得到的输出是 。#includeiostreamusingnamespacestd;// 遍历二叉搜索树输出结点值voidtraversal(tree_node*root){if(rootnullptr){return;}traversal(root-left);coutroot-val ;traversal(root-right);}A. 5 3 7 2 4 6 8B. 2 3 4 5 6 7 8C. 2 4 3 6 8 7 5D. 2 4 3 5 6 7 8【答案】B【解析】题目要求对构建的二叉搜索树进行中序遍历。插入顺序[5,3,7,2,4,6,8]构建的二叉搜索树后进行中序遍历结果为2 3 4 5 6 7 85 / \ 3 7 / \ / \ 2 4 6 8第14题动态规划通常用于解决 。A. 无法分解的问题B. 可以分解成相互依赖的子问题的问题C. 可以通过贪心算法解决的问题D. 只能通过递归解决的问题【答案】B【解析】动态规划用于解决可分解成重叠子问题并通过保存子问题结果避免重复计算的问题。选项正确。第15题阅读以下用动态规划解决的0-1背包问题的函数假设背包的容量W是10kg假设输入4个物的重量weight 分别为1346单位为kg每个物品对应的价值values 分别为20305060则函数的输出为 。#includeiostream#includevectorusingnamespacestd;// 0/1背包问题intknapsack(intW,constvectorintweights,constvectorintvalues,intn){vectorvectorintdp(n1,vectorint(W1,0));for(inti1;in;i){for(intw0;wW;w){if(weight[i-1]w){dp[i][w]max(dp[i-1][w],dp[i-1][w-weight[i-1]]values[i-1]);}else{dp[i][w]dp[i-1][w];}}}returndp[n][W];}A. 90B. 100C. 110D. 140【答案】C【解析】通过填充dp表可以得出当背包容量为10时能够获得的最大价值为110。选项C正确。判断题第1题C、Python 和JAVA等都是面向对象的编程语言。A. 正确B. 错误【答案】A【解析】C、Python 和Java 都是面向对象的编程语言它们都支持类和对象的概念允许封装、继承和多态等特性。第2题在C中类的静态成员变量只能被该类对象的成员函数访问。A. 正确B. 错误【答案】B【解析】在C中类的静态成员变量可以通过类名直接访问而不仅仅是通过该类对象的成员函数访问。第3题栈是一种线性结构可通过数组或链表来实现。二者相比数组实现占用的内存较少链表实现的入队和出队操作的时间复杂度较低。A. 正确B. 错误【答案】B【解析】数组与链表实现的栈其入队与出队操作的时间复杂度均为。第4题运行以下 C代码屏幕将输出“derived class”。#includeiostreamusingnamespacestd;classbase{public:virtualvoidshow(){coutbase classendl;}};classderived:publicbase{public:voidshow()override{coutderived classendl;}};intmain(){base*b;derived d;bd;b-show();return0;}A. 正确B. 错误【答案】A【解析】代码中基类 base 的虚函数 show(被派生类 derived重写。在main函数中通过基类指针b调用show()实际会调用派生类的 show(方法因此输出“derived class”。第5题如下列代码所示的基类base及其派生类derived则生成一个派生类的对象时只调用派生类的构造函数。#includeiostreamusingnamespacestd;classbase{public:base(){coutbase constructorendl;}~base(){coutbase destructorendl;}};classderived:publicbase{public:derived(){coutderived constructorendl;}~derived(){coutderived destructorendl;}};A. 正确B. 错误【答案】B【解析】根据代码当派生类 derived 的对象被创建时会依次调用基类 base 和派生类derived的构造函数当对象销毁时会依次调用派生类和基类的析构函数。因此输出顺序如下1、调用基类构造函数输出base constructor2、调用派生类构造函数输出derived constructor3、销毁对象时先调用派生类析构函数输出derived destructor4、再调用基类析构函数输出base destructor第6题哈夫曼编码本质上是一种贪心策略。A. 正确B. 错误【答案】A【解析】哈夫曼编码是一种贪心策略用于构建最优前缀码以实现数据压缩。通过频率最低的字符分配最长的编码达到最小化平均编码长度的目的。第7题如果根结点的深度记为1则一棵恰有2024 个叶结点的二叉树的深度最少是12。A. 正确B. 错误【答案】A【解析】对于一棵包含2024 个叶节点的二叉树最小深度可以通过计算 log2(2024得到其结果约为11.98。因此向下取整并加1后最小深度为12。第8题在非递归实现的树的广度优先搜索中通常使用栈来辅助实现。A. 正确B. 错误【答案】B【解析】在非递归实现的树的广度优先搜索BFS中通常使用队列来辅助实现。第9题状态转移方程是动态规划的核心可以通过递推方式表示问题状态的变化。A. 正确B. 错误【答案】A【解析】状态转移方程是动态规划的核心通过递推方式表示问题状态的变化逐步求解最优解。第10题应用动态规划算法时识别并存储重叠子问题的解是必须的。A. 正确B. 错误【答案】A【解析】应用动态规划算法时识别并存储重叠子问题的解是关键步骤。这通过记忆化或表格法来实现以避免重复计算提高效率。编程题题解洛谷 P11246 [GESP202409 六级] 小杨和整数拆分题解洛谷 P11247 [GESP202409 六级] 算法学习