GESP认证C++编程真题解析 | 202406 五级
附上汇总帖GESP认证C编程真题解析 | 汇总单选题第1题下列代码中输出结果是 #includeiostreamusingnamespacestd;intfunc(intx,inty){intax,by;intt;ta;ab;bt;couta b ;}intmain(){intc,d;c12;d24;func(12,24);coutc dendl;}A.12 24 24 12B.24 12 12 24C.12 12 24 24D.24 24 12 12【答案】B【解析】模拟一下func(函数的过程可以发现它将变量x和y的值进行了交换而传入的x、y的分别是12和24交换之后便是24和12因此前两个数输出24和12后两个数字就是顺序输出的c、d的值也就是12和24。第2题下面函数不能正常执行的是 A.#includeiostreamusingnamespacestd;intfunc(){//...}intmain(){//...}B.#includeiostreamusingnamespacestd;intmain(){func();}intfunc(){//...}C.#includeiostreamusingnamespacestd;intfunc(){//...}intmain(){func();}D.#includeiostreamusingnamespacestd;intfunc();intmain(){func();}intfunc(){//...}【答案】B【解析】在调用函数之前应该先定义函数。第3题下面程序输出的是 #includeiostreamusingnamespacestd;intfunc();intmain(){inti2;coutiendl;for(intx0;x1;x){inti10;coutiendl;}ii1;coutiendl;{ii*i;coutiendl;}}A.2 2 3 9B.2 10 3 9C.2 10 11 121D.2 10 3 100【答案】B【解析】注意for循环内部的变量i只作用于for循环内部因此第二个输出的数应该是10而第6行的变量i的作用域则不包含for循环内部的部分因此第3、4个数的值取决于第6行变量i的初始值模拟计算一下即可。第4题假设变量a的地址是0x6ffe14下面程序的输出是 。#includeiostreamusingnamespacestd;intmain(){int*p;inta10;pa;p;coutpendl;}A.10B.0x6ffe14C.0x6ffe15D.0x6ffe18【答案】D【解析】一个int变量占4字节因此当指针p移动到下一个地址时应当加上对应的字节数4。第5题如果下列程序输出的地址是0x6ffe00则couta1endl;输出的是 #includeiostreamusingnamespacestd;intmain(){inta[2][3]{0};coutaendl;}A.0x6ffe04B.0x6ffe0CC.0x6ffe08D.0x6ffe00【答案】B【解析】一个int变量占4字节而a是一个2*3规模的二维数组相当于是2个3长度的一维数组 a 的地址是第0个数组的第0个元素的地址而a1的地址是第1个数组的第0个元素的地址中间间隔了3个int变量因此应当加上对应的总字节数12。第6题C中关于文件路径说法错误的是 A. “GESP.txt”指定与当前工作目录中的程序文件相同目录中的GESP.txt文件B. “…/data/GESP.txt”指定与当前工作目录中的程序文件上一级目录下的data目录中的GESP.txt文件C. “./data/GESP.txt”指定与当前工作目录中的程序文件同级目录下的data 目录中的GESP txt文件D. GESP.txt是绝对路径【答案】D【解析】当“GESP.txt”文件前面没有其他前置路径的时候其表示的意思就是与当前工作目录中的程序文件相同目录中的GESP.txt文件第7题关于直接插入排序下列说法错误的是 A. 插入排序的最好情况是数组已经有序此时只需要进行n − 1 n-1n−1次比较时间复杂度为O ( n ) O(n)O(n)B. 最坏情况是数组逆序排序此时需要进行n ( n − 1 ) / 2 n(n-1)/2n(n−1)/2次比较以及n − 1 n-1n−1次赋值操作插入C. 平均来说插入排序算法的复杂度为O ( n 2 ) O(n^2)O(n2)D. 空间复杂度上直接插入法是就地排序空间复杂度为O ( n ) O(n)O(n)【答案】D【解析】就地排序只需要O(1的额外空间。第8题下列程序横线处应该输入的是 。#includeiostreamusingnamespacestd;intn,a[10001];voidswap(inta,intb){intta;ab;bt;}intmain(){cinn;for(inti1;in;i)cina[i];for(intin;i1;i--)for(intj1;ji;j)if(a[j]a[j1])____;for(inti1;in;i)couta[i] ;coutendl;return0;}A.swap(a[j], a[j1]);B.swap(a[j-1], a[j]);C.swap(a[j-1], a[j1]);D.swap(a[j-1], a[j1]);【答案】A【解析】考察冒泡排序的过程不断地把较大的值往后放因此如果a[j]a[j1]成立说明a[j]是较大的值应当通过交换操作来将a[j]换到后面去。第9题下面关于递推的说法不正确的是 。A. 递推表现为自己调用自己B. 递推是从简单问题出发一步步的向前发展最终求得问题最终求得问题。是正向的C. 递推中问题的n要求是在计算中确定不要求计算前就知道nD. 斐波那契数列可以用递推实现求解【答案】A【解析】自己调用自己是递归的表现而不是递推注意区分。第10题关于几种排序算法的说法下面说法错误的是 。A. 选择排序不是一个稳定的排序算法B. 冒泡排序算法不是一种稳定的排序算法C. 插入排序是一种稳定的排序算法D. 如果排序前2个相等的数在序列中的前后位置顺序和排序后它们2个的前后位置顺序相同则称为一种稳定的排序算法【答案】B【解析】在冒泡排序中两个元素交换的条件是a[j]a[j1]如果两个元素的值相等他们并不会发生交换因此是一种稳定的排序算法。第11题数组{456623110975288533}进行从小到大冒泡排序过程中第一遍冒泡过后的序列是 。A. {452311066528853397}B. {456612310975288533}C. {456623110528853397}D. {456623110975288335}【答案】A【解析】按照冒泡排序的过程模拟一遍即可66会被一直交换到97的前面的位置97会被一直交换到数组末尾的位置。第12题下面的排序算法程序中横线处应该填入的是 。inta[8]{2,3,4,5,6,2,3,1};for(inti1;i8;i){intkeya[i];intji-1;while(a[j]keyj0){____;j-1;}a[j1]key;}A.a[j] a[j-1];B.a[j] a[j1];C.a[j1] a[j-1];D.a[j1] a[j];【答案】D【解析】考察插入排序的过程不断地将a[i]与前面的数字比较以便找到合适的位置插入进去因此在已排好序的部分中所有比a[i]大的数字都要整体往右移动一个单位若a[j]比a[i]大那么它往右移动一个单位之后的位置是j1所以应该将a[j]赋值给a[j1]。第13题下面的程序中如果输入10 0会输出 。#includeiostreamusingnamespacestd;doubleDivision(inta,intb){if(b0)throwDivision by zero condition!;elsereturn((double)a/(double)b);}voidfunc(){intlen,time;cinlentime;coutDivision(len,time)endl;}intmain(){try{func();}catch(constchar*errmsg){couterrmsgendl;}catch(constinterrmsg){couterrmsgendl;}return0;}A.Division by zero condition!B.0C.10D.100【答案】A【解析】输入len10与time0分别传入Division(函数中的a、b于是有a10、b0条件b0成立。第14题10条直线最多可以把平面分为多少个区域 。A.55B.56C.54D.58【答案】B【解析】当第x条直线加入进来的时候我们总有一种贪心的方法让这条直线与前面的所有x-1条直线相交每发生一次相交都会额外产生一个区域因此会产生x-1个区域再加上整个平面本身会被分割一次所以会产生×个区域于是10条直线能够分割出来的区域数量就是1234567891055最后不要忘记整个平面本身最初也有一个区域所以还要加1答案是55156。第15题下面程序中如果语句coutpendl;输出的是0x6ffe000则coutpendl;输出的是 intx[10][10][10]{{0}};int*p;px[0][0][0];coutpendl;coutpendl;A.0x6ffe0cB.0x6ffe09C.0x6ffe06D.0x6ffe04【答案】D【解析】一个int变量占4字节p指针指向了x数组的首地址因此在p之后p指针移动到了下一个元素的地址需要加上对应的int变量的字节数。判断题第1题int a和a是一样的都是取a的地址。A. 正确B. 错误【答案】B【解析】a是取a的地址而int a是引用变量作用是获取某个变量的“引用”即给某一个变量起一个别名。第2题以下代码不能够正确执行。#includeiostreamusingnamespacestd;intmain(){inta20;intra;raa;coutraendl;}A. 正确B. 错误【答案】B【解析】同上一题int ra是引用变量需要在定义时设置一个初始值。第3题引用是一个指针常量。A. 正确B. 错误【答案】A【解析】指针常量指向的内存地址无法修改而指向的内存地址对应的值可以修改。第4题下面程序两个输出结果是一样的#includeiostreamusingnamespacestd;intmain(){inta[2][3]{0};coutaendl;couta[0][0]endl;}A. 正确B. 错误【答案】A【解析】输出a即直接输出数组a的首地址而a[0][0]是数组a的第0个元素因此a[0][0]相当于就是去了第0个元素的地址即首地址。第5题函数不可以调用自己。A. 正确B. 错误【答案】B【解析】递归算法的实现就是“函数调用自己”。第6题函数参数传递过程中如果传常量值、常量引用和常量指针都是不能被修改的它们可以防止函数对实参的值或地址进行修改。A. 正确B. 错误【答案】A【解析】常量无法被修改因此若想要实参的值不被修改传入常量即可。第7题下面代码输出的值等于0。#includeiostreamusingnamespacestd;intmain(){int*pNULL;coutpendl;}A. 正确B. 错误【答案】A【解析】空指针指向0地址。第8题在下面这个程序里a[i][j]和一个普通的整型变量一样使用。#includeiostreamusingnamespacestd;intmain(){inta[10][10]{0};for(inti0;i10;i){for(intj0;j10;j){if(ij){a[i][j]1;}}}A. 正确B. 错误【答案】A【解析】整型二维数组中的每一个元素都是一个整型变量第9题一个一维数组至少含有一个自然数N是一个合法的数列。可以在一维数组末尾加入一个自然数MM不能超过一维数组末尾元素的一半形成一个新的合法的一维数组如果N6那么可以有6个不同的合法数组。A. 正确B. 错误【答案】A【解析】合法的6个数组分别是{6}、{61}、{62}、{63}、{631}、{621}第10题插入排序算法中平均时间复杂度是O ( n 2 ) O(n^2)O(n2)最坏的情况逆序情况下达到最大时间复杂度。A. 正确B. 错误【答案】A【解析】在最坏的逆序情况下每一个元素都会被插入到已排好序部分的最前面。编程题题解洛谷 B4005 [GESP202406 四级] 黑白方块题解洛谷 B4006 [GESP202406 四级] 宝箱