【C++笔试强训】第五天 雨点打透心脏的1/2处 2024-04-20 06:08 97阅读 0赞 > **?C++笔试强训** > > -------------------- > > * **博客主页:**[一起去看日落吗][Link 1] > * **分享博主的C++刷题日常,大家一起学习** > * **`博主的能力有限,出现错误希望大家不吝赐教`** > * **分享给大家一句我很喜欢的话:夜色难免微凉,前方必有曙光** ?。 > > -------------------- > > ![在这里插入图片描述][047d8ad26e314dc7bc7aa19a6ce9ccb0.jpeg_pic_center] ?? -------------------- ## 选择题 ## ### ?第一题 ### 在上下文和头文件均正常情况下,以下程序的输出结果是() int x = 1; do{ printf("%2d\n",x++); }while(x--); A 1 B 无任何输出 C 2 D 陷入死循环 这道题是一个do while循环,先执行循环体,再检测条件,如果满足条件才会再次循环,打印的是x++,因为这是后置++,所以会先打印1再进行++。 ![请添加图片描述][1e18c3edb817487299034fd84d95e7a7.png] 经过分析,我们会发现这个程序会一直进入死循环无法跳出来 > **`所以这道题的答案是D`** -------------------- ### ?第二题 ### 定义char dog\[\]=“wang\\0miao”;那么sizeof(dog)与strlen(dog)分别是多少() A 10,4 B 4,4 C 9,9 D 9,4 这道题主要是考验sizeof和strlen区别的理解 * sizeof:求变量对应类型占的字节数 * strlen:求字符串长度,不包括\\0; 即strlen遇到\\0就会停止,而sizeof会继续统计\\0直到字符串完结。 > **`所以这道题的答案是A`** -------------------- ### ?第三题 ### 下列程序的打印结果是() char p1[15] = "abcd", *p2 = "ABCD", str[50] = "xyz"; strcpy(str + 2, strcat(p1 + 2, p2 + 1)); printf("%s", str); A xyabcAB B abcABz C ABabcz D xycdBCD 这道题需要知道strcpy和strcat的作用 ![请添加图片描述][7fad0a88f7b0468995dd6aaa313470f8.png] ![请添加图片描述][a9aea37a22d343d985df4b44f96d1d7b.png] > **`所以这道题的答案是D`** -------------------- ### ?第四题 ### 下面程序的输出结果是() #include<iosteam.h> void main(){ int n[][3] = { 10,20,30,40,50,60}; int (*p)[3]; p=n; cout<<p[0][0]<<","<<*(p[0]+1)<<","<<(*p)[2]<<endl; } A 10,30,50 B 10,20,30 C 20,40,60 D 10,30,60 根据数组内的元素个数可以得到这是个两行三列的数组 p是一个数组指针:本质是一个指针,该指针只能指向具有三个int类型元素的一段空间。 ![请添加图片描述][961ad44383b24731aaaca3732e99ef81.png] ![请添加图片描述][c4ef59a8e69645ed9242ce760e544fde.png] > **`这道题的答案是B`** -------------------- ### ?第五题 ### 以下说法中正确的是( )。 A C++程序中的main()函数必须放在程序的开始部分 B C++程序的入口函数是main函数 C 在C++程序中,要调用的函数必须在main()函数中 A main可以放在任意位置,没有要求 C 在C和C++中,函数的定义是不可以嵌套的 > **`这道题的答案是C`** -------------------- ### ?第六题 ### 有以下程序运行结果为() #include <iostream> using namespace std; char fun(char x, char y) { if (x < y) return x; return y; } int main() { int a = '1', b = '1', c = '2'; cout << fun(fun(a, b), fun(b, c)); return 0; } A 运行出错 B 2 C 3 D 1 这道题我们先看fun,fun返回的结果是拿到x和y中的最小值 fun(a,b)= 1 fun(b,c)= 1 fun(1,1)= 1 > **`所以这道题的答案是D`** -------------------- ### ?第七题 ### 对于int\* pa\[5\];的描述,以下哪个选项是正确的() A pa是一个具有5个元素的指针数组,每个元素是一个int类型的指针; B pa是一个指向数组的指针,所指向的数组是5个int类型的元素; C pa\[5\]表示某个数的第5个元素的值; D pa是一个指向某个数组中第5个元素的指针,该元素是int类型的变量 这道题的pa是一个指针数组,该数组中每个元素都是int\*类型的指针 B 如果是(\*pa)才是一个指向指针的数组 C pa\[5\]中的5表示数组的大小 > **`这道题的答案是A`** -------------------- ### ?第八题 ### 下面两个结构体 struct One{ double d; char c; int i; } struct Two{ char c; double d; int i; } 在\#pragma pack(4)和\#pragma pack(8)的情况下,结构体的大小分别是() A 16 24,16 24 B 16 20,16 20 C 16 16,16 24 D 16 16,24 24 这道题是考验结构体的内存对齐,计算在4字节和8字节的大小,这几天的笔试强训基本每天都有这种类型的题 ![请添加图片描述][2fb265de0bdd44ad86a9f68a44c9b741.png] 我们可以来计算第一个结构体 ![在这里插入图片描述][fe2721008d324f828121e63830ba53f9.png_pic_center] 这道题就不进行详细讲解了,只讲解一个 > **`这道题的答案是C`** -------------------- ### ?第九题 ### 下面哪个指针表达式可以用来引用数组元素a\[i\]\[j\]\[k\]\[l\]() A (((a+i)+j)+k)+l) B *(*(*(*(a+i)+j)+k)+l) C (((a+i)+j)+k+l) D ((a+i)+j+k+l) 这道题乍一看是四维数组,看起来非常复杂,其实我们可以用二维数组来举例,一步一步分解 ![请添加图片描述][8fda56ac6f4f4d1aaa909475cba3a29a.png] 一步一步分解之后我们会知道,B选项格式完全符合 > **`所以这道题的答案是B`** -------------------- ### ?第十题 ### 由多个源文件组成的C程序,经过编辑、预处理、编译、链接等阶段会生成最终的可执行程序。下面哪个 阶段可以发现被调用的函数未定义() A 预处理 B 编译 C 链接 D 执行 这道题主要是对程序运行的理解 * 编辑:写代码的过程 * 预处理:宏展开 * 编译:让编译器来检测程序中是否存在语法问题,如果存在语法问题则编译失败 * 汇编:将编译完成之后的汇编指令翻译成对应的二进制格式 * 链接:将多个目标文件拼接成一个,还需要解决地址问题 所以还输未被定义会在链接被发现 > **这道题的答案是C** -------------------- ## 编程题 ## ### ?第一题 ### 链接:[统计回文][Link 2] ![请添加图片描述][2e156e99dda64d72ae6da0c1cd60c25f.png] 什么是回文字符串,题目里面说就是一个正读和反读都一样的字符串 ,回文串也就是前后对称的字符串。本 题是判断是否是回文串的变形题。字符串本身不一定是回文,把第二个字符串插入进去看是否是回文。 * 解题思路 本题使用暴力求解方式计算即可,遍历str1,将str2 insert进入str1的每个位置,判断是否是回文,是就++count;需要注意的是这里不能 str1.insert(i, str2),这样的话str1改变了,判断下一个位置就不对了。所以每次使用str1拷贝构造一个str,然后str.insert(i, str2),再判断。 判断是否回文有两个方法,直接将字符串逆转或者给前后指针遍历是否相等都可以 * 代码演示: #include <iostream> #include <string> #include <algorithm> using namespace std; // bool IsCircle(string s) // { // int begin = 0; // int end = s.size()-1; // while(begin < end) // { // if(s[begin] != s[end]) // { // return false; // } // ++begin; // --end; // } // return true; // } bool IsCircle(string s) { string _s = s; reverse(s.begin(),s.end()); if(_s == s) { return true; } else return false; } int main() { std::string str1 ,str2; getline(cin,str1); getline(cin,str2); int count = 0; for(int i = 0;i <= str1.size();i++) { string str = str1; str.insert(i,str2); if(IsCircle(str)) { count++; } } cout << count << endl; } -------------------- ### ?第二题 ### 链接:[连续最大和][Link 3] ![请添加图片描述][1e7223476a534c61b447a09f7d6f233b.png] 本题是一个经典的动规问题,简称dp问题,但是不要害怕,这个问题是非常简单的dp问题,而且经常会考 察,所以大家一定要把这个题做会。本题题意很简单,就是求哪一段的子数组的和最大。 * 解题思路 状态方程式: max( dp[ i ] ) = getMax( max( dp[ i -1 ] ) + arr[ i ] ,arr[ i ] ) dp\[i\] 就是以数组下标为i 的数做为结尾的最大子序列和,注意是以i 为结尾,比如说现在有一个数组\{6,-3,-2,7,-15,1,2,2\},dp\[2\]就是以-2为结尾的,那么显然dp\[2\]的最大值就是1(6,-3,-2),dp\[3\]要以7结尾那么以7结尾的子序列最大和就是8(6,-3,-2,7)。现在我们开始细细品一下上面这个递推式,求dp\[i\]的时候是不是有两种可能,要么就是像上面的dp\[3\]一样,dp\[2\]求出来是1了,再加上自己array\[3\]是最大的,那么还有一种可能就是说如果dp\[2\]我求出来是-100,那如果我也是dp\[2\]+array\[3\]的话是-93, 这时候 dp\[2\]反而是累赘,最大就是自己(因为前面定义了必须以i为结尾,也就说必须以7结尾)。 ![请添加图片描述][a5ec663357ef47669f3ca30e11233124.png] * 代码演示: #include <iostream> #include <vector> using namespace std; int GetMax(int a, int b) { //得到两个数的最大值 return (a) > (b) ? (a) : (b); } int main() { int size; cin >> size; vector<int> nums(size); for (int i = 0; i < size; i++) { cin >> nums[i]; } int sum = nums[0]; int max = nums[0]; for (int i = 1; i<size;i++ ) { sum = GetMax(sum + nums[i], nums[i]); if(sum > max) max = sum; } cout << max << endl; } -------------------- [Link 1]: https://blog.csdn.net/m0_60338933?type=blog [047d8ad26e314dc7bc7aa19a6ce9ccb0.jpeg_pic_center]: https://image.dandelioncloud.cn/pgy_files/images/2024/04/20/5267e7f349ef4c03926a12a9f9275fa2.jpeg [1e18c3edb817487299034fd84d95e7a7.png]: https://image.dandelioncloud.cn/pgy_files/images/2024/04/20/92578c40a97843fc9ca069f9e1f2a11f.png [7fad0a88f7b0468995dd6aaa313470f8.png]: https://image.dandelioncloud.cn/pgy_files/images/2024/04/20/785826d54c7148939075983986384219.png [a9aea37a22d343d985df4b44f96d1d7b.png]: https://image.dandelioncloud.cn/pgy_files/images/2024/04/20/b336380cffa34da9a52323cbd776e5ce.png [961ad44383b24731aaaca3732e99ef81.png]: https://image.dandelioncloud.cn/pgy_files/images/2024/04/20/249fa039eb8640bb82ca3fc311bdc873.png [c4ef59a8e69645ed9242ce760e544fde.png]: https://image.dandelioncloud.cn/pgy_files/images/2024/04/20/6a1bfd8abc7c4801b17d65dff60398c4.png [2fb265de0bdd44ad86a9f68a44c9b741.png]: https://image.dandelioncloud.cn/pgy_files/images/2024/04/20/47a7d11abdd34e01837f2019a6f6cdd6.png [fe2721008d324f828121e63830ba53f9.png_pic_center]: https://image.dandelioncloud.cn/pgy_files/images/2024/04/20/a2f8a47ddcb04ee491cb3c8386d10928.png [8fda56ac6f4f4d1aaa909475cba3a29a.png]: https://image.dandelioncloud.cn/pgy_files/images/2024/04/20/878d32831fac474a8a45edf301eab892.png [Link 2]: https://www.nowcoder.com/practice/9d1559511b3849deaa71b576fa7009dc?tpId=85&&tqId=29842&rp=1&ru=/activity/oj&qru=/ta/2017test/question-ranking [2e156e99dda64d72ae6da0c1cd60c25f.png]: https://image.dandelioncloud.cn/pgy_files/images/2024/04/20/947d798ee4ea46428286f2d365e86654.png [Link 3]: https://www.nowcoder.com/practice/5a304c109a544aef9b583dce23f5f5db?tpId=85&&tqId=29858&rp=1&ru=/activity/oj&qru=/ta/2017test/question-ranking [1e7223476a534c61b447a09f7d6f233b.png]: https://image.dandelioncloud.cn/pgy_files/images/2024/04/20/2f0f411685074bb2a65f508e9e11c899.png [a5ec663357ef47669f3ca30e11233124.png]: https://image.dandelioncloud.cn/pgy_files/images/2024/04/20/e25c906720c4439c85ea7edf89395d3c.png
还没有评论,来说两句吧...