【C++笔试强训】第十七天 深藏阁楼爱情的钟 2024-04-20 06:18 83阅读 0赞 > **?C++笔试强训** > > -------------------- > > * **博客主页:**[一起去看日落吗][Link 1] > * **分享博主的C++刷题日常,大家一起学习** > * **`博主的能力有限,出现错误希望大家不吝赐教`** > * **分享给大家一句我很喜欢的话:夜色难免微凉,前方必有曙光** ?。 > > -------------------- > > ![在这里插入图片描述][047d8ad26e314dc7bc7aa19a6ce9ccb0.jpeg_pic_center] ?? -------------------- ## 选择题 ## ### ?第一题 ### 假设A为抽象类,下列声明()是正确的 A int fun(A); B A Obj; C A fun(int); D A \*p; 抽象类不可以实例化对象,所以和对象有关的都是错误的 D 建立相对应类型的指针,所以只有D是正确的,可以用于实现多态 > **`这道题的答案是D`** -------------------- ### ?第二题 ### 虚函数可不可以重载为内联? A 可以 B 不可以 C 语法错误 内联函数不可以当作虚函数,在前几天的题目中我们都有相应的讲解,因为内联函数最后需要展开 > **`这道题的答案是B`** -------------------- ### ?第三题 ### 下面有关虚函数的描述,说法错误的是? A 虚函数的作用是实现了继承性 B 虚函数的作用就是实现“动态联编”,也就是在程序的运行阶段动态地选择合适的成员函数 C 和类的静态成员函数与非类的成员函数相比,虚函数的效率较低 D 要正确的实现虚函数,只能用一个基类的指针或者引用来指向派生类对象 A 继承的目的是为了实现多态,关键要靠的是虚函数,反过来是不对的 B 虚函数的作用就是实现“动态联编”,也就是在程序的运行阶段动态地选择合适的成员函数,这就是多态 C 和类的静态成员函数与非类的成员函数相比,虚函数的效率较低,一个类如果有虚函数会产生虚表,我们要先找到虚表才能调动虚函数,所以效率低 D 实现多态需要子类继承父类,父类需要有虚函数,子类需要重写虚函数,如果要调动多态需要父类的指针和引用,用父类的对象不可以 > **`这道题的答案是A`** -------------------- ### ?第四题 ### #include <iostream> #include <vector> using namespace std; int main(void) { vector<int>array; array.push_back(100); array.push_back(300); array.push_back(300); array.push_back(300); array.push_back(300); array.push_back(500); vector<int>::iterator itor; for(itor=array.begin();itor!=array.end();itor++) { if(*itor==300) { itor=array.erase(itor); } } for(itor=array.begin();itor!=array.end();itor++) { cout<<*itor<<""; } return 0; } 下面这个代码输出的是() A 100 300 300 300 300 500 B 100 300 300 300 500 C 100 300 300 500 D 100 300 数据在尾插之后是 100 300 300 300 300 500 通过循环如果迭代器的值等于300就删除,最后把返回值给回,迭代器并不会失效 迭代器删除数据会把后面的值往前移动,然后返回当前位置的迭代器,然后循环会++,指向下一位,所以并不会删除所有的300 最后打印的是 100 300 300 500 > **`这道题的答案是C`** -------------------- ### ?第五题 ### 在 C++ 中,用于实现动态多态性的是( )。 A 内联函数 B 重载函数 C 模板函数 D 虚函数 这是送分题,内联是提升程序效率,重载和模版都不是实现多态的技术,多态是靠虚函数实现的 > **`这道题的答案是D`** -------------------- ### ?第六题 ### 调用一成员函数时, 使用动态联编的情况是() A 通过对象调用一虚函数 B 通过指针或引用调用一虚函数 C 通过对象调用静态函数 D 通过指针或应用调用一静态函数 使用动态联编的情况是多态,实现多态的条件是调用虚函数 > **`这道题的答案是B`** -------------------- ### ?第七题 ### 下面有关继承、多态、组合的描述,说法错误的是? A 封装,把客观事物封装成抽象的类,并且类可以把自己的数据和方法只让可信的类或者对象操作,对不可信的进行信息隐藏 B 继承可以使用现有类的所有功能,并在无需重新编写原来的类的情况下对这些功能进行扩展 C 隐藏是指派生类中的函数把基类中相同名字的函数屏蔽掉了 D 覆盖是指不同的函数使用相同的函数名,但是函数的参数个数或类型不同 -------------------- A 封装是面向对象的特性之一,并且类可以把自己的数据和方法只让可信的类或者对象操作,对不可信的进行信息隐藏 B 继承可以使用现有类的所有功能,并在无需重新编写原来的类的情况下对这些功能进行扩展,这是继承的一大特点,子类可以继承父类从而把父类的所有信息继承下来 C 隐藏我们是指同名隐藏,是指派生类中的函数把基类中相同名字的函数屏蔽掉了 D 覆盖需要相同的虚函数名,函数参数个数和类型也必须相同 > **`这道题的答案是D`** -------------------- ### ?第八题 ### “引用”与多态的关系? A 两者没有关系 B 引用可以作为产生多态效果的手段 C 一个基类的引用不可以指向它的派生类实例 D 以上都不正确 多态必须通过父类的引用获得指针 > **`这道题的答案是B`** -------------------- ### ?第九题 ### 下面这段程序的输出是什么? class A{ public: A(){ p();} virtual void p(){ print("A")} virtual ~A(){ p();} }; class B:public A{ public: B(){ p();} void p(){ print("B")} ~B(){ p();} }; int main(int, char**){ A* a=new B(); delete a; } A AABB B BBAA C ABAB D ABBA 先构造父类,再构造子类,子类构造完成前virtual无效,析构则会反过来 所以会先打印AB 再打印BA > **`这道题的答案是D`** -------------------- ### ?第十题 ### 以下代码的运行结果为() class Base { public: Base() { echo(); } virtual void echo() { printf("Base"); } }; class Derived:public Base { public: Derived() { echo(); } virtual void echo() { printf("Derived"); } }; int main() { Base* base = new Derived(); base->echo(); return 0; } A DerivedDerivedDerived B DerivedBaseDerived C BaseDerivedBase D BaseDerivedDerived 首先声明Base类型的指针指向实际类型为Derived的对象,先调用基类构造函数,再调用派生类构造函数。输出Base, Derived. base->echo(); 指针是base类型,但是因为有关键词 virtual,所以不是隐藏而是重写.调用的是Derived的方法,输出Derived。 > **`这道题的答案是D`** -------------------- ## 编程题 ## ### ? 第一题 ### 链接:[杨辉三角的变形][Link 2] ![请添加图片描述][a20fbdb8e0f148cfa57964b199bea24d.png] * 解题思路 按照题目意思,可以发现第n行有2n - 1个元素,第i,j元素等于上一行第j - 2,j - 1,j三列元素之和,每一行的第一列和最后一列都为1,如果是第二列,则只是两个元素之和。 * 代码演示: #include <iostream> using namespace std; int main() { // int n; // while(cin >> n) // { // 代码有点捞,写的高级点 // if(n <= 2) // cout << -1 << endl; // else if(n % 4 == 1 || n % 4 == 3) // cout << 2 << endl; // else if (n % 4 == 2) // cout << 4 << endl; // else // cout << 3 << endl; // } // 高级点 int n; int Index[] = { 4, 2, 3, 2}; while (cin >> n) { int res = -1; if (n > 2) res = Index[(n - 2) % 4]; cout << res << endl; } return 0; } -------------------- ### ? 第二题 ### 链接:[计算某字符出现次数][Link 3] ![请添加图片描述][c71bdf3f485647b1bafb25013d2e5688.png] * 题目描述 写出一个程序,接受一个由字母、数字和空格组成的字符串,和一个字符,然后输出输入字符串中该字符的出现次数。(不区分大小写字母) * 解题思路 首先,字符串中包含有空格,因此我们使用gets 函数获取一行数据,而不用scanf ,因为scanf 函数会默认以空格截断输入作为输入的结束. 其次,因为在计算字符出现次数中,要求是不区分大小写的,因此在处理过程中,如果输入的是小写字母, 则计数不但要加上小写字母的计数,还要加上大写字母的计数,反之大写字母也是同样如此,而在ascii 表中,大写字母和小写字母的差值是32 ( 'a’的ascii值是97 ; 'A’的ascii值是65 ) 最后,实现思路,因为ascii字符只有128 个,他们的实际存储是0~127 ,那么我们只需要定义一个具有128 个整形元素的数组,第0 号下标位置存放0 对应的ascii字符出现次数, 1 号下标位置存放1 对应的ascii字符的次数…以此类推,数组每个位置存放的就是对应ascii字符出现的次数。最终以指定字符为下标获取它出现的次数进行打印。 * 代码演示 #include<iostream> using namespace std; int main(){ char ch; string s; getline(cin,s); cin>>ch; int count = 0; for(int i = 0;i<s.length();i++){ if(s[i]>='A'&&s[i]<='Z'){ if(s[i]==ch||s[i]+32==ch) count++; } else if(s[i]>='a'&&s[i]<='z'){ if(s[i]==ch||s[i]-32==ch) count++; } else if(s[i]==ch) count++; } cout<<count; return 0; } -------------------- [Link 1]: https://blog.csdn.net/m0_60338933?type=blog [047d8ad26e314dc7bc7aa19a6ce9ccb0.jpeg_pic_center]: https://image.dandelioncloud.cn/pgy_files/images/2024/04/20/947bf1d6396f47108397752bde22c5b3.jpeg [Link 2]: https://www.nowcoder.com/practice/8ef655edf42d4e08b44be4d777edbf43?tpId=37&&tqId=21276&rp=1&ru=/activity/oj&qru=/ta/huawei/question-ranking [a20fbdb8e0f148cfa57964b199bea24d.png]: https://image.dandelioncloud.cn/pgy_files/images/2024/04/20/fb259794b474453ebbc035857023bd43.png [Link 3]: https://www.nowcoder.com/questionTerminal/a35ce98431874e3a820dbe4b2d0508b1 [c71bdf3f485647b1bafb25013d2e5688.png]: https://image.dandelioncloud.cn/pgy_files/images/2024/04/20/de59ff4c60ec45af8a54801a403fc348.png
还没有评论,来说两句吧...