C++笔试强训12、13、14

news2024/12/22 21:54:43

文章目录

  • 笔试强训12
    • 一、选择题
      • 1-5题
      • 6-10题
    • 二、编程题
      • 题目一
      • 题目二
  • 笔试强训13
    • 一、选择题
      • 1-5题
      • 6-10题
    • 二、编程题
      • 题目一
      • 题目二
  • 笔试强训14
    • 一、选择题
      • 1-5题
      • 6-10题
    • 二、编程题
      • 题目一
      • 题目二


笔试强训12

一、选择题

1-5题

在这里插入图片描述
引用:是一个别名,与其被引用的实体公用一份内存空间,编译器不会给引用变量单独开辟新的空间。A错误

故选A。


在这里插入图片描述
A:析构函数可以在类内定义也可以在类外定义
B:一个类中只有一个析构函数,但可以有多个构造函数
C:析构函数和类名相同,不过是前面多一个~而已。
D:析构函数没有参数

故选B


在这里插入图片描述
运算符重载基础知识不做解释
选A。


在这里插入图片描述
第一行MyClass c1,会调用一次构造函数,而MyClass *c2,则不会调用,在c2调用new的时候才会调用构造函数
第二行new了一个MyClass对象,分配空间的同时会调用构造函数
第三行,引用不会调用构造函数
故一共调用了两次构造函数。
故选B。


在这里插入图片描述

类是面向对象的,C中的结构体是面向过程的,二者不一样,A错误。
故选A。


6-10题

在这里插入图片描述
A:一个类可以有很多个对象,如果把类设置成单例模式的话,那这个类就只能实例化一个对象了。故A错,选A

BCD都是类和对象的一些常识,可以记一记。


在这里插入图片描述

我们知道,在C++中delete的作用是先调用对应的析构函数,然后再释放空间,在本题中,在析构函数中调用delete,而delete又会调用析构函数,析构函数又会调用delete,delete又会调用析构函数,如此一来就停不下来了,会引发无穷递归调用,最终就会导致栈溢出,程序崩溃。

下图中我们也是可以看到,调用堆栈说已经超出了VS支持的最多堆栈帧数。
在这里插入图片描述
但是呢,本题答案并不选B,而是C,无法编译通过,因为题目中有一句this=NULL,C++中this指针是const修饰的,不可以被更改的,所以就会导致无法编译通过。
在这里插入图片描述

故选C。


在这里插入图片描述
C正确,不加解释


在这里插入图片描述
类中的每个非静态成员函数都有一个隐含的this指针
A:普通的函数没有隐含的this指针,因为它不是类的成员函数。
B:被static修饰的静态成员函数没有隐含的this指针,故静态成员函数不能访问类中的非静态的成员变量。
C:友元函数不是类的成员函数,友元函数没有this指针,也不会受到访问限定符的限制。
D:是类的成员函数,且不被static修饰,故有隐含的this指针。

故选D。


在这里插入图片描述
堆上的都是动态分配的,栈上的既可以动态分配,也可以静态分配。
故C错误。选C。


二、编程题

题目一

题目链接:

二进制插入

在这里插入图片描述

提交代码:

class BinInsert {
public:
    int binInsert(int n, int m, int j, int i) {
        // write code here
        return n | (m<<j);
    }
};

运行结果:

在这里插入图片描述


题目二

题目链接:
查找组成一个偶数最接近的两个素数

在这里插入图片描述

提交代码:

#include <iostream>
#include <cmath>
using namespace std;

bool isprime(int sum) {
    for (int i = 2; i <= sqrt(sum); i++) {
        if (sum % i == 0)
            return false;
    }
    return true;
}
int main() {
    int sum, half, i;
    while (cin >> sum) {
        half = sum / 2;
        for (half; half >= 2; half--) {
            if (isprime(half) && isprime(sum - half))
                break;
        }
        cout << half << endl << sum - half << endl;
    }
}
// 64 位输出请用 printf("%lld")

运行结果:

在这里插入图片描述


笔试强训13

一、选择题

1-5题

在这里插入图片描述
父类的公有成员在派生类中的权限取决于公有继承还是私有继承还是保护继承。


在这里插入图片描述

第一次通过A调用display,显示0.然后通过A调用change和display,显示2…之后B调用change和display,显示1.
故选C。


在这里插入图片描述
A错误:派生类重写的基类虚函数必须参数个数类型顺序都相同
B正确:内联函数不能是虚函数。虚表里要存的是虚函数的地址,而inline是会把函数展开的,没有地址的,所以内联函数不能是虚函数。
C错误:派生类不是必须重新定义基类的虚函数,定义不定义都可以。
D错误:虚函数的调用是需要通过this指针调用对象的信息,才能调用对象的虚表,而static函数没有this指针故D错误。

故选B


在这里插入图片描述
在派生类对象初始化的时候会先调用基类的构造函数,再调用派生类的构造函数。由于要1遵守先构造的后析构,后构造的先析构。所以最后会先调用派生类的析构函数,再调用基类的构造函数。

AB:没有定义,编译器会自动产生,所以还是会调用
D错误

故选C。


在这里插入图片描述
A正确:声明纯虚函数的类不能实例化,继承它的派生类必须重写该函数,才能实例化对象,否则,派生类也不能实例化出对象来。

B错误:声明纯虚函数的类是抽象类,不叫虚基类。解决菱形继承的时候,如下图所示,类A才是虚基类。

在这里插入图片描述
C错误:子类的必须重写父类的虚函数,错误的,想实现多态就重写,不想就不重写。
D错误:纯虚函数也可以是有实现的函数
在这里插入图片描述

故选A


6-10题

在这里插入图片描述

A错误:是一个常量指针,但不是p的值不可以修改,而是p指向的内容不可以修改。
B错误:64位下指针大小是8字节,32位下指针大小是4字节,故大小是8,
C错误:这俩都会展开,效率其实差不多。
D正确:重载是静态多态,是编译时确定的,虚函数是动态多态是运行时绑定的。
静态多态有两种实现方式:

  • 函数重载:包括普通函数的重载和成员函数的重载
  • 函数模板的使用
    故只有一个正确故选A。

在这里插入图片描述
当父类指针指向子类对象的时候即,Base* p=new Derive,当delete p的时候,只会调用父类的析构函数,这样就会导致子类的资源没释放造成资源泄露了。如果父类的析构函数定义成虚函数的话,就会和子类的析构函数构成重载,这样delete p的时候就会根据多态,调用子类的析构函数,子类的析构函数又会自动调用父类的析构函数1,就不会造成资源泄露。

故选A。


在这里插入图片描述
B错误,显然还有运算符重载:
故选B。


在这里插入图片描述
5调用构造函数实例化一个对象,通过拷贝构造赋值给形参b,但编译器会优化,这里直接把5构造出来的对象当b了,省了一次拷贝构造,然后返回b,这里编译器又会直接优化,最后b析构,temp析构。故最后会调用一次构造两次析构。
故选A。


在这里插入图片描述
选B,不多解释了。


二、编程题

题目一

题目链接:

参数解析

提交代码:

#include<iostream>
#include<string>
#include<vector>
using namespace std;

void cmdLineParse(const string& str) {
    string tmp = "";
    vector<string> svec;
    bool flag = false; //用于判断是否处于字符串的状态

    for (int i = 0; i < str.size(); ++i) {
        if (str[i] == '"') { //判断是否是字符串的起始或者结束
            flag = !flag; //说明处于了字符串的状态
        } else if (str[i] == ' ' &&
                   !flag) { //判断参数的分隔或者是否为字符串的内容
            svec.push_back(tmp);
            tmp = "";
        } else { //正常的参数内容
            tmp += str[i]; //xcopy
        }
    }
    svec.push_back(tmp); //追加最后一个参数

    cout << svec.size() << endl;
    for (int i = 0; i < svec.size(); ++i)
        cout << svec[i] << endl;
}

int main() {
    string str;
    while (getline(cin, str)) {
        cmdLineParse(str);
    }
    return 0;
}

运行结果:
在这里插入图片描述


题目二

题目链接:
跳石板

提交代码:

#include<iostream>
#include<vector>
#include<limits.h>
#include<math.h>
using namespace std;

void get_div_num(int v, vector<int>& a) {
    for (int i = 2; i <= sqrt(v); ++i) {
        if (v % i == 0) {
            a.push_back(i);
            if (v / i != i)
                a.push_back(v / i);
        }
    }
}

int Jump(int n, int m) {
    vector<int> step(m + 1, INT_MAX); //int_max表示不可达到
    step[n] = 0; //当前位置初始化

    for (int i = n; i < m; ++i) {
        if (step[i] == INT_MAX)
            continue;

        vector<int> a;
//获取i的约数,并保存
        get_div_num(i, a);

        for (int j = 0; j < a.size(); ++j) {
            if (a[j] + i <= m && step[a[j] + i] != INT_MAX) {
//需要挑选一个最小值
                step[a[j] + i] = step[a[j] + i] < step[i] + 1 ? step[a[j] + i] : step[i] + 1;
            } else if (a[j] + i <= m) {
                step[a[j] + i] = step[i] + 1;
            }
        }
    }
    return step[m] == INT_MAX ? -1 : step[m];
}

int main() {
    int n, m, min_step;
    while (cin >> n >> m) {
        min_step = Jump(n, m);
        cout << min_step << endl;
    }
    return 0;
}

运行结果:
在这里插入图片描述


笔试强训14

一、选择题

1-5题

在这里插入图片描述
this指针的作用就是实例化出很多对象,保证A的对象中可以通过this指针找到A的数据成员,而不是其他对象的数据。
故选D。


在这里插入图片描述
引用和const修饰的必须在初始化列表中初始化。
static const可以在类外初始化。
故选F。


在这里插入图片描述
A:不能重载下面的运算符:

  • sizeof sizeof 运算符。
  • . 成员运算符。
  • .* 成员指针运算符。
  • :: 作用域解析运算符。
  • ?: 条件运算符。

B正确
C错误:析构函数可以是虚函数,构造函数不行
D错误:函数重载返回值不一定得相同

故选B。


在这里插入图片描述
A正确,6大默认函数编译器会自动生成

B错误:析构函数只能有一个

C错误: 析构函数可以为virtual,但不能重载
D错误:可以利用一个static成员函数new并返回该类的指针,这样就可以创建了

故选A。


在这里插入图片描述
优先用组合,而不是继承故C错误
选C。

在这里插入图片描述


6-10题

在这里插入图片描述
A错误:如果子类没有重写父类的虚函数,或者父类压根没有虚函数的话,即使子类父类中的函数一摸一样,那父类指针调用的也是父类的函数,即使该父类指针指向的是子类对象。
在这里插入图片描述
C:错误,重载和子类一点关系都没有
D:错误a是个指针,调用的时候应该a->而不是a.

故全错,选B。


在这里插入图片描述
父类指针指向子类对象, i初始值为1.之后pb调用func1函数,由于该函数不是虚函数,所以调用的是父类的func1,i*=10,i变成10,之后调用了func2,func2是虚函数,构成多态了,调用的是子类的func2,i+=2,i变成12。

故最后输出12,选C。


在这里插入图片描述
void func(B0 ptr);这里形参不是父类的指针,也不是父类的引用,所以不会发生多态,所以输出的都是B0::display()
故选A。


在这里插入图片描述
A:构造函数不能为虚函数A错
B:析构函数可以被定义为虚函数B正确
C:内敛成员函数没有地址,虚表中要存函数的地址的,没地址没办法构成多态,所以不能定义为虚函数
D:静态成员函数没有this指针,而多态需要用this指针找对应的资源,故D错误。
故选B。


在这里插入图片描述
考察的是构造函数先调用父类构造函数,再调用子类构造函数。由此可以得出再构造D的时候会先构造B,B构造的时候要先构造A,A构造完构造B,B构造完构造C,由于这里是virtual继承,所以A只有一份,C构造完构造D,综上选A。


二、编程题

题目一

题目链接:

计算日期到天数转换

提交代码:

#include <iostream>
using namespace std;

bool isLeap(int year) {
    return (year % 4 == 0 && year % 100 != 0) || (year % 400 == 0);
}
int get(int year, int month, int day) {
    int mon[12] = {31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31};
    int res = 0;
    if (month == 1) return day;
    for (int i = 0; i < month - 1; i++) {
        res += mon[i];
    }
    if (isLeap(year) && month > 2) res += 1;
    return res + day;
}

int main() {
    int year, month, day;
    while (cin >> year >> month >> day ) {
        cout << get(year, month, day);
    }
}

运行结果:

在这里插入图片描述


题目二

题目链接:
幸运的袋子

提交代码:

#include <cstddef>
#include<vector>
#include <iostream>
#include<algorithm>
using namespace std;

int getLuckyPacket(int x[], int n, int pos, int sum, int multi) {
    int count = 0;
    for (int i = pos; i < n; i++) {
        sum += x[i];
        multi *= x[i];
        if (sum > multi) {
            count += 1 + getLuckyPacket(x, n, i + 1, sum, multi);
        } else if (x[i] == 1) {

            count += getLuckyPacket(x, n, i + 1, sum, multi);
        } else {

            break;
        }
        sum -= x[i];
        multi /= x[i];

        while (i < n - 1 && x[i] == x[i + 1]) {
            i++;
        }
    }
    return count;
}
int main() {
    int n;
    while (cin >> n) {
        int x[n];
        for (int i = 0; i < n; i++) {
            cin >> x[i];
        }
        sort(x, x + n);
//从第一个位置开始搜索
        cout << getLuckyPacket(x, n, 0, 0, 1) << endl;
    }
    return 0;
}

运行结果:

在这里插入图片描述


本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2114491.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

认知杂谈54

I I 内容摘要&#xff1a; 这篇内容主要有以下几个要点&#xff1a;首先&#xff0c;沟通不在一个调时可学习人际交往心理学知识、线上课程及关注名师来改善。其次&#xff0c;挑房子、工作、搭档和人生伴侣要谨慎&#xff0c;找心灵相通能共同进步的人。再者&#xff0c;远离…

AI周报(9.1-9.7)

AI应用-Tidal 引领海洋养殖革命 Tidal团队&#xff0c;一个源自Alphabet X的创新项目&#xff0c;今年七月顺利从X实验室毕业&#xff0c;成为一家独立的公司。Tidal正在通过人工智能技术改变海洋养殖&#xff0c;特别是鲑鱼养殖。Tidal的总部位于挪威特隆赫姆&#xff0c;他们…

Java-数据结构-栈和队列-Stack和Queue (o゚▽゚)o

文本目录&#xff1a; ❄️一、栈(Stack)&#xff1a; ▶ 1、栈的概念&#xff1a; ▶ 2、栈的使用和自实现&#xff1a; ☑ 1&#xff09;、Stack(): ☑ 2&#xff09;、push(E e): ☑ 3&#xff09;、empty(): ☑ 4&#xff09;、peek(E e): ☑ 5&#xff09;、pop(E e): …

将添加功能的抽屉剥离,在父组件调用思路

一、新建组件 新建AddRoleEditerDrawer.vue<template><div><el-drawer v-model"dialog" title"添加角色" :before-close"handleClose" direction"rtl" colse"cancelForm"class"demo-drawer" moda…

基于UE5和ROS2的激光雷达+深度RGBD相机小车的仿真指南(五):Blender锥桶建模

前言 本系列教程旨在使用UE5配置一个具备激光雷达深度摄像机的仿真小车&#xff0c;并使用通过跨平台的方式进行ROS2和UE5仿真的通讯&#xff0c;达到小车自主导航的目的。本教程默认有ROS2导航及其gazebo仿真相关方面基础&#xff0c;Nav2相关的学习教程可以参考本人的其他博…

MQ-2烟雾传感器详解(STM32)

目录 一、介绍 二、传感器原理 1.原理图 2.引脚描述 3.工作原理介绍 三、程序设计 main.c文件 mq2.h文件 mq2.c文件 四、实验效果 五、资料获取 项目分享 一、介绍 MQ-2气体传感器是一种常用的气体传感器&#xff0c;用于检测空气中的烟雾浓度。工作原理是基于半导…

App Store最低版本要求汇总

1&#xff0c;自此日期起&#xff1a; 2024 年 4 月 29 日 自 2024 年 4 月 29 日起&#xff0c;上传到 App Store Connect 的 App 必须是使用 Xcode 15 为 iOS 17、iPadOS 17、Apple tvOS 17 或 watchOS 10 构建的 App。将 iOS App 提交至 App Store - Apple Developer 2&…

天然药物化学史话:“四大光谱”在天然产物结构鉴定中的应用-文献精读46

天然药物化学史话&#xff1a;“四大光谱”在天然产物结构鉴定中的应用&#xff0c;天然产物化学及其生物合成必备基础知识~ 摘要 天然产物化学研究在药物研发中起着非常重要的作用&#xff0c;结构研究又是天然产物化学研究中最重要的工作之一。在天然药物化学史话系列文章的…

Elasticsearch:无状态世界中的数据安全

作者&#xff1a;来自 Elastic Henning Andersen 在最近的博客文章中&#xff0c;我们宣布了支持 Elastic Cloud Serverless 产品的无状态架构。通过将持久性保证和复制卸载到对象存储&#xff08;例如 Amazon S3&#xff09;&#xff0c;我们获得了许多优势和简化。 从历史上…

科研绘图系列:R语言富集散点图(enrichment scatter plot)

介绍 富集通路散点图(Enrichment Pathway Scatter Plot)是一种数据可视化工具,用于展示基因集富集分析(Gene Set Enrichment Analysis, GSEA)的结果。 横坐标是对应基因名称,纵坐标是通路名称,图中的点表示该基因在某个通路下的qvalue,可以简单理解为不同环境下的贡献…

以后写代码都是AI自动写了,Cursor+Claude-3.5-Sonnet,Karpathy 点赞的 AI 代码神器。如何使用详细教程

Cursor 情况简介 AI 大神 Andrej Karpathy 都被震惊了&#xff01;他最近在试用 VS Code Cursor Claude Sonnet 3.5&#xff0c;结果发现这玩意儿比 GitHub Copilot 还好用&#xff01; Cursor 在短短时间内迅速成为程序员群体的顶流神器&#xff0c;其背后的原因在于其默认使…

AIGC批量处理文件系列:word、pdf文件改名

1.背景 大家应该也有遇到&#xff0c;自己电脑有很多文件命名不合理的文件&#xff0c;比如&#xff1a;文件1、想法3 &#xff0c;当你长时间再看到这个文件的时候&#xff0c;已经很难知道文件内容。 今天我们将借助AIGC的编码能力&#xff0c;帮我们生成一个批量改文件名的…

【H2O2|全栈】Markdown | Md 笔记到底如何使用?【前端 · HTML前置知识】

Markdown的一些杂谈 目录 Markdown的一些杂谈 前言 准备工作 认识.Md文件 为什么使用Md&#xff1f; 怎么使用Md&#xff1f; ​编辑 怎么看别人给我的Md文件&#xff1f; Md文件命令 切换模式 粗体、倾斜、下划线、删除线和荧光标记 分级标题 水平线 引用 无序…

哪种超声波清洗机效果好?较好的超声波眼镜清洗机品牌推荐

作为一名拥有20年戴镜经验的眼镜爱好者&#xff0c;我深深体会到眼镜清洁的挑战&#xff1a;微小缝隙里的污垢难以触及&#xff0c;频繁的脏污让我苦于找不到清洁时机&#xff0c;而用力不当的擦拭方法更是可能对眼镜特别是镜片造成伤害&#xff0c;这确实让人感到苦恼&#xf…

js 写个 最简单的 chrome 插件,修改网页背景颜色

起因(目的): 阅读电子书的时候&#xff0c; 网页背景太亮了&#xff0c;看久了眼睛难受。 最近看的书是: 金瓶梅 估计至少需要2个星期才能看完。 操作步骤: 新建一个 manifest.json 文件, 填入一些信息。 “manifest_version”: 3, # 2 已经被废弃了。新建图片文件夹&#x…

JVM - Java内存区域

文章目录 目录 文章目录 运行时数据区域 程序计数器 栈 Java虚拟机栈 本地方法栈 栈帧的组成 局部变量表 操作数栈 帧数据 堆 方法区 直接内存 总结 运行时数据区域 Java虚拟机在执行Java程序的过程中会把它所管理的内存区域划分为若干个不同的数据区域。这些区…

FPGA开发:初识FPGA × 开发环境

FPGA是什么&#xff1f; FPGA的全称是现场可编程门阵列&#xff08;Field Programmable Gate Array&#xff09;&#xff0c;一种以数字电路为主的集成芯片&#xff0c;属于可编程逻辑器件PLD的一种。简单来说&#xff0c;就是能用代码编程&#xff0c;直接修改FPGA芯片中数字…

Java+Selenium+ChromeDriver谷歌版环境搭建

1、创建测试项目 创建一个Maven项目即可 2、添加Selenium依赖 最好使用Selenium3版本 3、下载对应版本的ChromeDriver 找到自己浏览器对应的版本 下载ChromeDriver&#xff08;114版本以后的&#xff0c;114版之前的直接到官网下载&#xff09;下载地址 将下载好的驱动…

Windows下Python和PyCharm的应用(六)__应用Opencv的第一个程序(图片载入)

1、首先创建一个Pycharm工程 2、然后新建一个Python file 录入基本的内容&#xff1a; import cv2imgcv2.imread(pedal.jpg)#显示图片cv2.imshow(image,img)#等待按键cv2.waitKey(0)#结束显示&#xff0c;销毁窗口cv2.destroyAllWindows()#保存图片cv2.imwrite(example2.jpg,i…

解决 Ant Design Vue Upload 组件在苹果手机上只能拍照无法选择相册的问题

最近上线发现了这个问题&#xff0c;看别的文档改了很多属性也不行&#xff0c;发现element组件就可以&#xff0c;对比之后就知道问题所在。 原因&#xff1a; 默认情况下&#xff0c;iOS 设备会将 <input type"file"> 的 capture 属性设置为 true&#xff0…