嵌入式软件工程师面试题——2025校招专题(四)

news2024/11/19 13:27:02

说明:

  • 面试题来源于网络书籍,公司题目以及博主原创或修改(题目大部分来源于各种公司);
  • 文中很多题目,或许大家直接编译器写完,1分钟就出结果了。但在这里博主希望每一个题目,大家都要经过认真思考,答案不重要,重要的是通过题目理解所考知识点,好应对题目更多的变化;
  • 博主与大家一起学习,一起刷题,共同进步;
  • 写文不易,麻烦给个三连!!!

1.递归函数mystrlen(char *buf, int N)是用来实现统计字符串中第一个空字符前面字符长度

例如:字符串buf,当输入N=10或者20,期待输出结果是6;当输入N=3或5,期待输出结果是3
或5。

char buf[] = {'a', 'b', 'c', 'd', 'e', 'f', '\0', 'x', 'y', 'z'};

答案

#include <iostream>
using namespace std;

int mystrlen(char *buf, int N)
{
    if(buf[0] == 0 || N == 0) // 如果空字符出现,返回0
        return 0; 
    else if(N == 1) // 如果字符长度为1,返回1
        return 1; 
    
    int t = mystrlen(buf, N/2); // 折半递归取长度
    if(t < N/2) // 如果长度小于输入N值的一半,取当前长度
        return t;
    else    // 反之取下面一个祖父并继续递归
        return (t + mystrlen(buf + N/2, (N+1)/2));

}


int main()
{
    char buf[] = {'a', 'b', 'c', 'd', 'e', 'f', '\0', 'x', 'y', 'z'};
    int k;
    k = mystrlen(buf, 20);
    cout << k << endl;

    return 0;
}

2.算法从一个等边三角形开始,在随后的每次迭代中,在外部添加新的三角形。n的前三个值的结果如下图所示。在经过100次迭代之后,会有多少个小三角形?

在这里插入图片描述
A.19800
B.14501
C.14851
D.14702

解析
本题规律如下,新增加的小三角形数目为3*(n-1)
f(1)=1;
f(2)=f(1)+3 * (2-1);
f(3)=f(2)+3 * (3-1);

f(n)=f (n-1)+3 * (n-1)

答案:C

3.这段代码的输出结果为?

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


int main()
{
    int x = 10, y = 10, i;
    for(i=0; x > 8; y=i++)
    {
        printf("%d %d ", x--, y);
    }

    return 0;
}

A.10,0,9,1
B.10,10,9,0
C.10,1,9,2
D.9,10,8,0

解析
for循环括号内被两个分号分为3部分:i=0是初始化变量;x>8是循环条件,也就是只要x>8就执行循环;那y=i++是什么?在第一次循环时执行了么?
答案是不执行,y=i++实际上是个递增条件,仅在第二次循环开始时才执行。
所以结果是10,10,9,0。
答案:B
题目变形:

int main()
{
    int x = 10, y = 10, i;
    for(i=0; x > 8; )
    {   
        y=i++;
        printf("%d %d ", x--, y);   // 10 0 9 1
    }

    return 0;
}

4.有两等长数组A、B,所含元素相同,但顺序不同,只能取得A数组某值和B数组某值进行比较,比较结果为大于、小于或等于,但是不能取得同一数组A或B中的两个数组进行比较,也不能取得某数组中的某个值。写一个算法实现正确匹配

答案

#include <iostream>
using namespace std;

void matching(int a[], int b[], int k)
{
    int i = 0;
    while(i <= k-1)
    {
        int j = 0;
        while(j <= k-1)
        {
            if(a[i] == b[j])
            {
                cout << "a[" << i << "]" << "match" << "b[" << j << "] " << endl;
                break;
            }
            j++;
        }
        i++;
    }
    cout << endl;
}


int main()
{
    int a[10] = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10};
    int b[10] = {10, 6, 4, 5, 1, 8, 7, 9, 3, 2};

    int k = sizeof(a) / sizeof(int);

    matching(a, b, k);

    return 0;
}

5.介绍一下STL和包容器,如何实现?举例实现vector

答案
C++的一个新特性就是采用了标准模板库(STL)。所有主要编译器销售商现在都把标准模板库作为编译器的一部分进行提供。标准模板库是一个基于模板的容器类库,包括链表、列表、队列和堆栈。标准模板库还包含许多常用的算法,包括排序和查找。
标准模板库的目的是提供对常用需求重新开发的一种替代方法。标准模板库已经经过测试和调试,具有很高的性能并且是免费的。最重要的是,标准模板库是可重用的。当你知道如何使用一个标准模板库的容器以后,就可以在所有的程序中使用它而不需要重新开发了。
容器是包容其他对象的对象。标准C++库提供了一系列的容器类,它们都是强有力的工具,可以帮助C++开发人员处理一些常见的编程任务。标准模板库容器类有两种类型,分别为顺序和关联。顺序容器可以提供对其成员的顺序访问和随机访问。关联容器则经过优化关键值访问它们的元素。标准模板库在不同操作系统间是可移植的。所有标准模板库容器类都在namespace std中定义。
举例实现vector如下:

#include <iostream>
#include <vector>
#include <algorithm>

using namespace std;

int main() {
    // 创建一个空的 vector
    vector<int> vec;

    // 检查 vector 是否为空
    if (vec.empty()) {
        cout << "Vector is empty" << endl;
    }

    // 添加元素到 vector
    vec.push_back(10);
    vec.push_back(20);
    vec.push_back(30);

    // 获取 vector 的大小
    cout << "Vector size: " << vec.size() << endl;

    // 访问 vector 中的元素
    cout << "Elements in vector: ";
    for (const auto& element : vec) {
        cout << element << " ";
    }
    cout << endl;

    // 修改 vector 中的元素
    vec[1] = 50;

    // 删除 vector 中的最后一个元素
    vec.pop_back();

    // 插入元素到指定位置
    vec.insert(vec.begin() + 1, 100);

    // 删除指定位置的元素
    vec.erase(vec.begin() + 2);

    // 判断指定元素是否存在于 vector 中
    int searchElement = 50;
    auto iter = find(vec.begin(), vec.end(), searchElement);
    if (iter != vec.end()) {
        cout << searchElement << " found in vector" << endl;
    } else {
        cout << searchElement << " not found in vector" << endl;
    }

    // 清空 vector
    vec.clear();

    // 检查 vector 是否为空
    if (vec.empty()) {
        cout << "Vector is empty" << endl;
    }

    return 0;
}

6.解释一下什么是泛型编程,泛型编程和C++及STL的关系是什么?并且,你是怎么在C++环境里进行泛型编程的?

答案
泛型编程是一种编程方式,它允许我们编写可以适用于多种数据类型的代码。通过使用模板技术,泛型编程可以实现高度重用性和通用性,从而提高代码的可维护性和扩展性。
在 C++ 中,泛型编程被广泛应用于标准模板库(STL)中。STL 是 C++ 标准库的一部分,包含了许多常用的容器、算法和迭代器等组件。这些组件都是使用泛型编程技术实现的,因此可以适用于不同的数据类型,从而提高了代码的重用性和可扩展性。
在 C++ 环境中,进行泛型编程需要使用模板技术。C++ 的模板是一种通用的编程机制,它允许我们编写可以适用于多种数据类型的代码。通过使用模板,我们可以将函数或类定义为通用的,从而可以在不同的数据类型上进行操作。
例如,下面是一个简单的模板函数示例,用于比较两个值的大小:

template <typename T>
T max(T a, T b) {
    return (a > b) ? a : b;
}

在上述示例中,max 函数使用了模板技术,其中 表示这是一个通用的模板函数,可以适用于不同的数据类型。在函数体中,我们比较了两个值的大小,并返回其中较大的值。

当我们需要使用该函数时,可以将不同类型的参数传递给它,例如:

int a = 10, b = 20;
std::cout << "max(a, b) = " << max(a, b) << std::endl;

double c = 3.14, d = 2.71;
std::cout << "max(c, d) = " << max(c, d) << std::endl;

在上述示例中,我们分别使用了 int 和 double 类型的参数调用了 max 函数,从而实现了泛型编程。

总之,泛型编程是一种强大的编程技术,可以提高代码的重用性和可扩展性。在 C++ 中,STL 是一个优秀的泛型编程库,可以帮助我们更加高效地开发各种应用程序。在进行泛型编程时,需要使用模板技术来实现通用性,从而可以适用于不同的数据类型。

7.下面哪个些关键字与封装相关?

A.virtual
B.void
C.interface
D.private
E.all of the above
解析
什么是封装?
从字面意思来看,封装就是把一些相关的东西打包成一“坨”。封装最广为人知的例子,就是在面向对象编程里面,把数据和针对该数据的操作,统一到一个class里。
很多人把封装的概念局限于类,认为只有OO中的class才算是封装。这实际上是片面的。在很多不使用“类”的场合,一样能采用封装的手法:
(1)通过文件。
比如C和C++支持对头文件的包含(#include)。因此,可以把一些相关的常量定义、类型定义、函数声明,统统封装到某个头文件中。
(2)通过namespace/package/module。
C++的namespace、Java的package、Python的module,这些语法虽然称呼各不相同,但具有相同的本质。因此,也可以利用这些语法来进行封装。那么封装有一个主要的好处,就是增加软件代码的内聚性。通过增加内聚性,进而提高可复用性和可维护性。此外还可以“信息隐藏”:把不该暴露的信息藏起来。如private、protected之类的关键字。这些关键字可以通过访问控制,来达到信息隐藏的目的。
本题中,interface属于继承,virtual属于多态,private才是与封装相关。
答案:D

8.C++中的空类默认产生哪些类成员函数?

答案
对于一个空类,编译器默认产生4个成员函数:默认构造函数、析构函数、拷贝构造函数和赋值函数。

9.哪一种成员变量可以在同一个类的实例之间共享?

答案
在同一个类的实例之间,静态成员变量是可以共享的。静态成员变量属于类本身而不是类的实例,因此它们在类的所有实例之间共享相同的值。
当我们声明一个静态成员变量时,无论创建多少个类的实例,都只有一个静态成员变量的副本存在。这意味着对静态成员变量的修改会影响到所有实例。
以下是一个示例代码,演示了静态成员变量的共享特性:

#include <iostream>

class MyClass {
public:
    static int sharedVariable;
};

int MyClass::sharedVariable = 0; // 静态成员变量的定义和初始化

int main() {
    MyClass obj1;
    MyClass obj2;

    obj1.sharedVariable = 10;
    std::cout << "obj1.sharedVariable: " << obj1.sharedVariable << std::endl;
    std::cout << "obj2.sharedVariable: " << obj2.sharedVariable << std::endl;

    obj2.sharedVariable = 20;
    std::cout << "obj1.sharedVariable: " << obj1.sharedVariable << std::endl;
    std::cout << "obj2.sharedVariable: " << obj2.sharedVariable << std::endl;

    return 0;
}

10.这个类声明正确吗?为什么?

class A {
    const int Size = 0;
};

答案
这道程序题存在着成员变量问题。常量必须在构造函数的初始化列表里面初始化或者将其设置成static。

// 方式1
class A {
    A() {
        const int Size = 0;
    }
};

// 方式2
class A {
    static const int Size = 0;
};

11.析构函数可以为virtual型,构造函数则不能。那么为什么构造函数不能为虚呢?

答案
构造函数不能为虚函数的主要原因是在对象创建时,虚函数表还没有被创建。虚函数表是在对象创建后才被创建的,它存储了类的虚函数的地址。因此,在对象创建期间,调用虚函数是不可能的。

在 C++ 中,当我们创建一个对象时,会先分配内存空间,然后调用构造函数来初始化该对象。在构造函数执行期间,对象的虚函数表还没有被创建,因此无法调用虚函数。如果将构造函数声明为虚函数,那么编译器也无法确定应该调用哪个虚函数,因为虚函数表还没有被创建。另外,虚函数的调用需要使用虚函数表,这会带来一定的额外开销。但是,由于构造函数在对象创建时只会被调用一次,因此将构造函数声明为虚函数并不能带来性能上的优势,反而会增加额外的开销。

因此,C++ 标准规定,构造函数不能为虚函数。而析构函数可以为虚函数,因为在对象销毁时,虚函数表仍然存在,可以通过虚函数表来调用析构函数,从而保证正确的析构顺序。

12.析构函数可以是内联函数吗?

答案
析构函数可以是内联函数。在 C++ 中,我们可以使用 inline 关键字将函数声明为内联函数。
内联函数是一种编译器优化的手段,它的作用是将函数的定义插入到调用它的地方,而不是通过函数调用的方式执行。这样可以减少函数调用的开销,提高程序的执行效率。
对于简单且频繁调用的函数,通常会将其声明为内联函数。析构函数通常是在对象销毁时自动调用的,因此对于小型、简单的类,将析构函数声明为内联函数是合理的
要将析构函数声明为内联函数,只需在类定义中的析构函数声明前加上 inline 关键字即可,例如:

class MyClass {
public:
    inline ~MyClass(); // 内联析构函数的声明
};

inline MyClass::~MyClass() {
    // 析构函数的定义
    // ...
}

需要注意的是,虽然将析构函数声明为内联函数可以提高程序的执行效率,但并不是所有情况下都适合将析构函数声明为内联函数。如果析构函数的实现较为复杂或包含大量代码,那么将其声明为内联函数可能会导致代码膨胀,反而降低了性能。因此,在决定是否将析构函数声明为内联函数时,需要综合考虑函数的复杂性和调用频率。

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

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

相关文章

python——requests模块

requests不是python的内置库&#xff0c;需要手动安装&#xff1a; pip install requests 一. 一个类型和六个属性 1.1 类型 requests访问url后返回的对象类型为requests.models.Response类型。 1.2 属性 下面是requests.models.Response类型对象的方法。 text&#xff1a;以…

【Javascript】json

目录 什么是json&#xff1f; 书写格式 json 序列化和反序列化 序列化 反序列化 什么是json&#xff1f; JSON(JavaScript Object Notation)是⼀种轻量级的数据交换格式&#xff0c;它基于JavaScript的⼀个⼦集&#xff0c;易于⼈的编写和阅读&#xff0c;也易于机器解析…

OSG开发笔记(二十九):OSG加载模型文件、加载3DMax三维型文件Demo

​ 若该文为原创文章&#xff0c;未经允许不得转载 本文章博客地址&#xff1a;https://blog.csdn.net/qq21497936/article/details/134064988 各位读者&#xff0c;知识无穷而人力有穷&#xff0c;要么改需求&#xff0c;要么找专业人士&#xff0c;要么自己研究 红胖子(红模…

班主任必get,超实用的成绩发布方式

分享给老师们一个超级实用的教程&#xff0c;看看如何使用各种代码和Excel实现学生自主查询成绩的功能吧&#xff01;不用再繁琐的手动操作&#xff0c;让学生和家长自己就能查到成绩&#xff01; 成绩查询系统是什么&#xff1f; 成绩查询系统是一种方便学生查询考试成绩的应…

Android 和 iOS APP 测试的那些区别

目前市面上主流的移动操作系统就是 Android 和 iOS 两种&#xff0c;移动端测试本身就跟 Web 应用测试有自己的专项测试&#xff0c;比如安装、卸载、升级、消息推送、网络类型测试、弱网测试、中断测试、兼容性测试等都是区别于 Web 应用需要关注的测试领域。 那么&#xff0…

办公用品经营配送小程序商城的作用是什么

对办公人员来说&#xff0c;办公设备是不可缺少的&#xff0c;对办公用品经营商家来说&#xff0c;市场生意很高很多&#xff0c;但想要获取却也不容易&#xff0c;线下方式难以拓展&#xff0c;线上无平台&#xff0c;入驻第三方也有诸多限制与不足&#xff0c;私域是商家们增…

关键词搜索1688商品数据接口(标题|主图|SKU|价格|优惠价|掌柜昵称|店铺链接|店铺所在地)

1688商品列表接口是一个用于获取1688网站上商品列表信息的接口。通过该接口&#xff0c;您可以获取到1688网站上不同类别的商品列表&#xff0c;包括商品的名称、价格、图片等信息。 要使用1688商品列表接口&#xff0c;您需要按照以下步骤进行操作&#xff1a; 登录1688网站…

Linux 磁盘挂载2(文件系统格式化、磁盘挂载、VFS虚拟化文件系统)

目录 Linux文件系统 文件系统类型 Linux如何保存文件 VFS虚拟文件系统 文件格式化命令 mkfs 格式化文件系统 磁盘挂载命令 mount 临时挂载命令 umount 卸载文件系统 vim /etc/fstab 永久挂载 Linux文件系统 Linux 磁盘挂载1&#xff08;硬盘分区&#xff09;_linux磁…

高效遮挡!一键隐藏Logo标志,让您的内容更自由!

亲爱的用户&#xff0c;您是否曾经因为在营销、宣传、推广等领域使用的图片或视频中&#xff0c;存在不合适的Logo标志而感到烦恼&#xff1f;现在&#xff0c;我们向您推荐一款高效的遮挡工具&#xff0c;让您轻松隐藏Logo标志&#xff0c;让您的内容更自由&#xff01; 第一…

面试题:为什么HashMap 使用的时候指定容量?

文章目录 前言正文为什么要指定容量&#xff1f; 前言 其实可以看到我写了这么久的博客&#xff0c;很少去写hashMap的东西。 为什么&#xff1f;因为这个东西感觉是java面试必备的&#xff0c;我感觉大家都看到腻了&#xff0c;所以一直没怎么去写hashMap相关的。 本篇内容&…

eclispe项目中静态文件出现错误解决方法

博主主页&#xff1a;猫头鹰源码 博主简介&#xff1a;Java领域优质创作者、CSDN博客专家、公司架构师、全网粉丝5万、专注Java技术领域和毕业设计项目实战 主要内容&#xff1a;毕业设计(Javaweb项目|小程序等)、简历模板、学习资料、面试题库、技术咨询 文末联系获取 很多时间…

C++项目——云备份-⑧-客户端各模块实现

文章目录 专栏导读1.客户端数据管理模块实现2.客户端文件检测模块实现3.客户端文件备份模块设计4.客户端文件备份模块实现 专栏导读 &#x1f338;作者简介&#xff1a;花想云 &#xff0c;在读本科生一枚&#xff0c;C/C领域新星创作者&#xff0c;新星计划导师&#xff0c;阿…

创建一个具有背景轮播和3D卡片翻转效果的个人名片网页

目录 项目展示 图片展示 前言 项目目标 项目目标 步骤 3&#xff1a;CSS 样式 步骤 4&#xff1a;JavaScript 动画 项目源码 知识点介绍 &#xff08;大佬请绕道&#xff09; HTML 结构的构建 2. CSS 样式的设计 3. JavaScript 动画的实现 4. 背景图轮播的逻辑 5…

java智慧工地云平台源码 人工智能AI+多系统集成+智能预警平台

智慧工地云平台源码 人工智能AI多系统集成智能预警平台 智慧工地企业级监管平台融入AIoT、移动互联网和物联网等领先技术&#xff0c;再结合工地“人、机、料、法、环”五大要素&#xff0c;劳务实名制管理、环境监测管理、安全施工管理、质量及能耗管理等智慧化应用&#xff0…

21.8 Python 使用BeautifulSoup库

BeautifulSoup库用于从HTML或XML文件中提取数据。它可以自动将复杂的HTML文档转换为树形结构&#xff0c;并提供简单的方法来搜索文档中的节点&#xff0c;使得我们可以轻松地遍历和修改HTML文档的内容。广泛用于Web爬虫和数据抽取应用程序中。 读者如果需要使用这个库&#x…

Leetcode---368周赛

题目列表 2908. 元素和最小的山形三元组 I 2909. 元素和最小的山形三元组 II 2910. 合法分组的最少组数 2911. 得到 K 个半回文串的最少修改次数 一、元素和最小的山形三元组I 没什么好说的&#xff0c;不会其他方法就直接暴力&#xff0c;时间复杂度O(n^3)&#xff0c;代…

SpringCloudGateway 入门

目录 POM 依赖一、内容网关的作用Spring-Cloud-Gateway的核心概念 二、基于Ribbon的负载均衡三、核心概念详细3.1 断言 Predicate3.2 过滤器3.2.1 内置过滤器3.2.2 自定义过滤器构造器&#xff08;原理&#xff09;资源结构Route / Predicate 的构造器构造器的增强器整体协同关…

人大金仓(Kingbase)部署

点击上方蓝字关注我 1. 介质下载 下载地址&#xff1a;https://www.kingbase.com.cn/rjcxxz/index.htm 选择安装包及授权文件&#xff1a;根据对应的操作系统类型选择安装包 2. 部署环境配置 2.1 部署环境&#xff1a; 8C 16G KylinV10SP3系统 2.2 修改操作系统内核参数 sy…

什么是pmp证书,pmp证书有什么用,pmp项目管理证书的认证考试时间是什么时候啊?

PMP是项目管理证书&#xff0c;目标是项目经理。 英文全称是Project Management Professional&#xff0c;中文全称叫做项目管理专业人士资格认证。 它是由美国项目管理协会&#xff08;PMI&#xff09;在全球范围内推出的针对项目经理的资格认证体系&#xff0c;严格评估项目…

贪心算法总结(未完结)

贪心的定义&#xff08;摘自百度百科&#xff09; 贪心算法&#xff08;greedy algorithm&#xff0c;又称贪婪算法&#xff09;是指&#xff0c;在对问题求解时&#xff0c;总是做出在当前看来是最好的选择。也就是说&#xff0c;不从整体最优上加以考虑&#xff0c;算法得到的…