GESP认证C++编程真题解析 | 202406 六级
附上汇总帖GESP认证C编程真题解析 | 汇总单选题第1题面向对象的编程思想主要包括 原则。A. 贪心、动态规划、回溯B. 并发、并行、异步C. 递归、循环、分治D. 封装、继承、多态【答案】D【解析】A选项属于算法范畴。B选项涉及计算机系统和操作系统领域不是面向对象编程的核心原则。C选项也属于语法和算法范畴。D选项是面向对象编程的三大基本原则。第2题运行下列代码屏幕上输出 。#includeiostreamusingnamespacestd;classmy_class{public:staticintcount;my_class(){count;}~my_class(){count--;}staticvoidprint_count(){coutcount ;}};intmy_class::count0;intmain(){my_class obj1;my_class::print_count();my_class obj2;obj2.print_count();my_class obj3;obj3.print_count();return0;}A. 1 1 1B. 1 2 3C. 1 1 2D. 1 2 2【答案】B【解析】程序的主要逻辑my_class类中有一个静态成员变量count用于计数。每创建一个my_class对象时构造函数会将count加1每销毁一个对象时析构函数会将count减1。静态方法print_count(用于输出当前的count值。执行流程及输出分析在main函数开始前my_classcount被初始化为0。创建第一个对象obj1count变为1。调用print_count() 输出1。创建第二个对象obj2count变为2。调用print_count() 输出2。创建第三个对象obj3count变为3。调用print_count() 输出3。因此这段代码的输出结果是123。第3题运行下列代码屏幕上输出 。#includeiostreamusingnamespacestd;classshape{protected:intwidth,height;public:shape(inta0,intb0){widtha;heightb;}virtualintarea(){coutparent class area: endl;return0;}};classrectangle:publicshape{public:rectangle(inta0,intb0):shape(a,b){}intarea(){coutrectangle area: ;return(width*height);}};classtriangle:publicshape{public:triangle(inta0,intb0):shape(a,b){}intarea(){couttriangle area: ;return(width*height/2);}};intmain(){shape*pshape;rectanglerec(10,7);triangletri(10,5);pshaperec;pshape-area();pshapetri;pshape-area();return0;}A. rectangle area: triangle area:B. parent class area: parent class area:C. 运行时报错D. 编译时报错【答案】A【解析】执行流程及输出分析定义并初始化对象定义了一个指向shape类型的指针pshape。创建了两个具体的形状对象矩形rec(10, 7和三角形tri(10, 5)。第一次调用area(方法将pshape指向rec对象并调用pshape-area()。因为area(是虚函数所以会调用rectangle类中的area(方法。水电费水电费coutrectangle area: ;return(width*height);// 返回70但返回值未被使用输出reactangle area:。第二次调用area(方法将pshape指向tri对象并调用pshape-area()。同样因为area(是虚函数会调用triangle类中的area(方法。couttriangle area: ;return(width*height/2);// 返回25但返回值未被使用输出triangle area:。综上所述程序的输出结果是rectangle area: triangle area:第4题向一个栈顶为hs的链式栈中插入一个指针为s的结点时应执行 。A. hs-next s;B. s-next hs, hs s;C. s-next hs-next; hs-next s;D. s-next hs; hs hs-next;【答案】B【解析】在链式栈中新的元素总是插入到链表的头部也就是说新节点将成为第一个节点而之前的第一个节点将成为第二个节点。A. hs-next s;这个选项仅仅是把hs的下一个节点设为s并没有更新hs本身s也没有成为新的栈顶这样会导致链表结构不正确。B. s-next hs, hs s;该选项首先将s的next指向当前的头节点hs然后再将hs更新为s。这样做实际上是在链表头部插入了新的节点s符合要求。C. s-next hs-next; hs-next s;这个选项让新节点s插入到hs后面的第二个位置不符合链式栈的特性。D. s-next hs; hs hs-next;这个选项让新节点s的next指向当前的hs但随后又把hs更新为hs-next所以最后hs并不是指向新节点s逻辑上是不正确的。第5题在栈数据结构中元素的添加和删除是按照什么原则进行的A. 先进先出B. 先进后出C. 最小值先出D. 随机顺序【答案】B【解析】栈是一种“先进后出”或“后进先出的数据结构最新加入的元素会最先被移除第6题要实现将一个输入的十进制正整数转化为二进制表示下面横线上应填入的代码为 。#includeiostreamusingnamespacestd;stackintten2bin(intn){stackintst;intr,m;rn%2;mn/2;st.push(r);while(m!1){rm%2;st.push(r);mm/2;}st.push(m);returnst;}intmain(){intn;cinn;stackintbin;binten2bin(n);while(!bin.empty()){____// 在此处填入代码}return0;}A. cout bin.top(); bin.top();B. bin.pop(); cout bin.top();C. cout bin.back(); bin.pop();D. cout bin.front(); bin.pop();【答案】A【解析】主函数读取输入的整数n调用ten2bin函数将其转换为二进制并将结果存储在bin栈中。然后通过循环遍历该栈输出其中的元素。填空部分分析为了正确地输出二进制表示需要从栈顶依次弹出元素并打印因为栈是LIFO结构而我们需要按顺序输出二进制位。A. cout bin.top(); bin.top();这是正确的选择因为它首先获取栈顶元素并输出然后移除栈顶元素从而实现正确的二进制输出。B. bin.pop(); cout bin.top();这是错误的因为它先移除了栈顶元素再试图访问栈顶这会使得第1位的值没有输出从而导致结果错误。C. cout bin.back(); bin.pop();这是错误的因为stack容器没有back(方法。D. cout bin.front(); bin.pop();这是错误的因为stack容器没有front(方法。因此正确的代码应该是A.cout bin.top(); bin.top();第7题下面定义了一个循环队列的类请补全判断队列是否满的函数横向上应填写 #includeiostreamusingnamespacestd;classcircular_queue{private:int*arr;// 数组用于存储队列元素intcapacity;// 队列容量intfront;// 队头指针intrear;// 队尾指针public:circular_queue(intsize){capacitysize1;// 为了避免队列满时与队列空时指针相等的情况多预留一个空间arrnewint[capacity];front0;rear0;}~circular_queue(){delete[]arr;}boolis_empty(){returnfrontrear;}boolis_full(){____// 在此处填入代码}voiden_queue(intdata){if(is_full()){cout队列已满无法入队endl;return-1;}arr[rear]data;rear(rear1)%capacity;return1;}intde_queue(){if(is_empty()){cout队列为空无法出队endl;return-1;// 出队失败返回一个特殊值}intdataarr[front];front(front1)%capacity;returndata;}};A. return (rear 1) % capacity front;B. return rear % capacity front;C. return rear front;D. return (rear 1) front;【答案】A【解析】为了区分队列满和队列空状态我们使用额外的一个空间。当rear1) % capacity front时说明队列已经满了。第8题对classmycls使用哈夫曼Huffman编码最少需要 比特。A. 10B. 20C. 25D. 30【答案】C【解析】字符串“classmycls”的字符频率c2次l2次a1次s3次m1次y1次构建哈夫曼树根据字符的频率从小到大排序并依次合并节点并生成编码从根节点开始左边路径标记为0右边路径标记为1计算总比特数根据每个字符的频率乘以其编码长度然后求和得到总比特数。c2 * 2 4 bitsl2 * 2 4 bitsa1 * 4 4 bitss3 * 2 6 bitsm1 * 4 4 bitsy1 * 3 3 bits总比特数44464325bits。因此答案应该是C。第9题二叉树的 第一个访问的节点是根节点。A. 先序遍历B. 中序遍历C. 后序遍历D. 以上都是【答案】A【解析】先序遍历按照“根-左-右”的顺序进行遍历。第10题一棵5层的满二叉树中节点数为 。A. 31B. 32C. 33D. 16【答案】A【解析】满二叉树在满二叉树中所有非叶子节点都有两个子节点并且所有叶子节点都在同一层。满二叉树的节点总数可以用公式来表示。其中N是节点总数(h是树的高度层数。对于一棵5层的满二叉树来说节点总数-131。因此正确答案是A。第11题在求解最优化问题时动态规划常常涉及到两个重要性质即最优子结构和 。A. 重叠子问题B. 分治法C. 贪心策略D. 回溯算法【答案】A【解析】动态规划的基本原理和它所依赖的两个关键性质重叠子问题这是指将一个大问题分解成多个小问题这些小问题会被多次重复计算。在动态规划中通过存储这些小问题的结果可以避免重复计算从而提高效率。最优子结构这是指一个问题的最优解可以通过其子问题的最优解来构建这意味着解决了子问题的最优解后可以组合成原问题的最优解。因此正确答案是A。第12题青蛙每次能跳1或2步下面代码计算青蛙跳到第n步台阶有多少种不同跳法。则下列说法错误的是 。intjump_recur(intn){if(n1)return1;if(n2)return2;returnjump_recur(n-1)jump_recur(n-2);}intjump_dp(intn){vectorintdp(n1);// 创建一个动态规划数组用于保存已计算的值// 初始化前两个数dp[1]1;dp[2]2;// 从第三个数开始计算斐波那契数列for(inti3;in;i){dp[i]dp[i-1]dp[i-2];}returndp[n];}A. 函数jump_recur(采用递归方式。B. 函数jump_dp(采用动态规划方法。C. 当n较大时函数jump_recur(存在大量重复计算执行效率低。D. 函数jump_recur(代码量小执行效率高。【答案】D【解析】A. 函数jump_recur(采用递归方式。从代码中可以看到jump_recur函数通过调用自身来解决子问题这正是递归的定义。因此这个选项是正确的B. 函数jump_dp(采用动态规划方法jump_dp函数创建了一个数组dp来存储已经计算过的结果并从底向上地填充该数组。这正是动态规划的典型实现方法。因此这个选项也是正确的C. 当n较大时函数jump_recur(存在大量重复计算执行效率低。由于jump_recur包每次都要重新计算之前的结果当n较大时会导致大量的重复计算从而使得效率很低。因此这个选项也是正确的。D. 函数jump_recur(代码量小执行效率高。虽然jump_recur的代码量确实较少但它的执行效率并不高尤其是在n较大的情况下会有大量的重复计算。因此这个选项是错误的。综上所述正确答案是D。第13题阅读以下二叉树的广度优先搜索代码#includeiostream#includequeueusingnamespacestd;// 二叉树节点的定义structTreeNode{intval;TreeNode*left;TreeNode*right;TreeNode(intx):val(x),left(nullptr),right(nullptr){}};// 宽度优先搜索BFS迭代实现TreeNode*bfs(TreeNode*root,inta){if(rootnullptr)returnnullptr;queueTreeNode*q;q.push(root);while(!q.empty()){TreeNode*nodeq.front();q.pop();if(node-vala)returnnode;coutnode-val ;// 先访问当前节点if(node-left)q.push(node-left);// 将左子节点入队if(node-right)q.push(node-right);// 将右子节点入队}returnnullptr;}使用以上算法在以下这棵树搜索数值20时可能的输出是 。A. 5 2 -4 3 17 9B. -4 2 3 5 9 17C. 5 2 17 -4 3 9D. 以上都不对【答案】C【解析】bfs函数实际上对于二叉树进行层次遍历在遍历的过程中来找值val为20的结点由于没有该结点所以会把整棵树遍历结束之后就返回nullptr。因此最终的输出就是层次遍历的结果5 2 17 -4 3 9。第14题同上题中的二叉树阅读以下二叉树的深度优先搜索代码#includeiostream#includestackusingnamespacestd;// 非递归深度优先搜索DFSTreeNode*dfs(TreeNode*root,inta){if(rootnullptr)returnnullptr;stackTreeNode*stk;stk.push(root);while(!stk.empty()){TreeNode*nodestk.top();stk.pop();if(node-vala)returnnode;coutnode-val ;// 访问当前节点if(node-right)stk.push(node-right);// 先压入右子节点if(node-left)stk.push(node-left);// 再压入左子节点}returnnullptr;}使用以上算法在二叉树搜索数值20时可能的输出是 。A. 5 2 -4 3 17 9B. -4 2 3 5 9 17C. 5 2 17 -4 3 9D. 以上都不对【答案】A【解析】dfs函数实际上对于二叉树进行先序遍历在遍历的过程中来找值ual为20的结点由于没有该结点所以会把整棵树遍历结束之后就返回null ptr。因此最终的输出就是先序遍历的结果5 2 -4 3 17 9。第15题在上题的树中搜索数值3时采用深度优先搜索一共比较的节点数为 。A. 2B. 3C. 4D. 5【答案】C【解析】深度优先搜索过程从根节点5开始将其加入栈。弹出栈顶元素5检查是否等于目标值3。不是于是将5的右子节点17和左子节点2压入栈。弹出栈顶元素2检查是否等于目标值3。不是于是将2的右子节点3和左子节点-4压入栈。弹出栈顶元素-4检查是否等于目标值3。不是继续。弹出栈顶元素3检查是否等于目标值3。是找到目标节点。根据上述步骤共访问了四个节点52-43需要比较的节点数是4个。所以正确答案是C。判断题第1题哈夫曼编码本质上是一种贪心策略。A. 正确B. 错误【答案】A【解析】哈夫曼编码Huffman coding是一种用于数据压缩的算法确实基于贪心策略来构建最优前缀码。第2题创建一个对象时会自动调用该对象所属类的构造函数。如果没有定义构造函数编译器会自动生成一个默认的构造函数。A. 正确B. 错误【答案】A【解析】在C中如果没有定义任何构造函数编译器会提供一个隐式的默认构造函数。第3题定义一个类时必须手动定义一个析构函数用于释放对象所占用的资源。A. 正确B. 错误【答案】B【解析】在C中如果不定义析构函数编译器会生成一个默认的析构函数但如果类管理动态内存或其他资源通常需要自定义析构函数以确保资源被正确释放。第4题C中类内部可以嵌套定义类。A. 正确B. 错误【答案】A【解析】在C中可以在一个类的内部定义另一个类这称为嵌套类。第5题000, 001, 011, 010, 110, 111, 101, 100是一组格雷码。A. 正确B. 错误【答案】A【解析】格雷码是一种二进制数系其中相邻两个数只有一位不同。这组数字确实符合格雷码的定义。第6题n个节点的双向循环链表在其中查找某个节点的平均时间复杂度是O(logn)。A. 正确B. 错误【答案】B【解析】对于链表结构无论是单向还是双向其查找操作的平均时间复杂度都是O(n而不是O(logn)。第7题完全二叉树可以用数组存储数据。A. 正确B. 错误【答案】A【解析】完全二叉树可以非常方便地用数组来存储数据。对于一个节点在数组中的位置i)假设从1开始计数其子节点和父节点的位置可以通过以下公式计算左孩子节点的位置2i右孩子节点的位置2i1父节点的位置这种方式利用了完全二叉树的性质即除了最后一层外每一层都是满的并且最后一层的所有节点尽可能靠左排列。第8题在C中静态成员函数只能访问静态成员变量。A. 正确B. 错误【答案】A【解析】静态成员函数不能访问非静态成员变量因为它们属于类本身而不是某个具体的对象实例。第9题在深度优先搜索中通常使用队列来辅助实现。A. 正确B. 错误【答案】A【解析】深度优先搜索DFS通常使用栈来实现而广度优先搜索BFS才使用队列。第10题对0-1背包问题贪心算法一定能获得最优解。A. 正确B. 错误【答案】A【解析】0-1背包问题是NP完全问题贪心算法不能保证求得最优解通常需要使用动态规划或搜索等方法。编程题题解洛谷 P10721 [GESP202406 六级] 计算得分题解洛谷 P10722 [GESP202406 六级] 二叉树