欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

嵌入式Linux工程师笔试记录 -- 2020.7.31 (二)

程序员文章站 2022-06-09 08:42:41
...

做题时间:2020.7.30 23:38
总结时间:2020.7.31

1.按以下三种方式定义的数组有什么区别?

char p1[] = {"abcdef"};
char p2[] = "abcdef";
char p3[] = {'a','b','c','d','e','f'};

考点字符数组与字符串数组
回答
1) p1和p2位字符串数组,编译器自动为其在末尾加’\0’,作为字符串结束标志。
2) p2是p1的简写,相当于字符数组

p[] =  {‘a’,’b’,’c’,’d’,’e’,’f’,’\0};长度为7

3)而p3是字符数组,字符数组不要求最后一个字符为’\0’,初始化时系统不会自动加’\0’,长度为6.

2.程序中使用宏定义有哪些好处

参考:#define宏定义的优点和缺点
1)宏定义的优点

a.方便程序修改:使用宏代替在程序中经常使用的常量,比如某个io的寄存器地址、延时时间等。或者将较长的标识符用较短且有意义的标识符来宏定义,方便写程序。同时,将这些参数宏定义于程序头部,方便其他人阅读与修改并使用。
b. 提高程序运行效率(宏函数):宏函数相比普通函数,是直接替换到使用宏的位置,少了跳转到函数位置,并在结束的时候返回到原程序的步骤,提高程序效率。

2)宏定义的缺点

a.使用过vs编写c++应该都看到编译器推荐将#define修改为const,原因就是宏定义的一个缺点:无法对宏定义中的变量进行类型检查

3)宏定义的注意点

必须在各个分量中加括号(不能说缺点把emmm,应该指注意事项)
由于宏定义只是单纯替换,所以不加括号可能会由于运算符优先级问题导致结果不符预期。

3.结合实际简述软件工程中关于内聚和耦合的理解

参考 : 简述耦合与内聚

1.耦合是指模块之间的关联程度。如果一个模块依赖另一个模块,A依赖B,B依赖C,当C要更新版本的时候,那么B也要更新,A也要更新。所以,为了便于维护更新,需要低耦合。像计算机网络,Linux操作系统,都使用分层思想,每一层的工程师都主要专注于自己这一层的开发就行了。
2.内聚是对于块内联系,高内聚是指一个模块只左一件事。比如在类中,显示用display,赋值用set。

一个工程要便于维护,最好的方式就是低耦合,高内聚。

4.简述面向对象程序设计方法的核心特点及你的理解

参考链接:c++面向对象的三个特点

面向对象三大特征:封装、继承、多态
嵌入式Linux工程师笔试记录 -- 2020.7.31 (二)
封装:把客观事物封装成抽象的类,并且类可以把自己的数据和方法只让可信的类或者对象操作,对不可信的进行信息隐藏。
继承:扩展已存在的类。继承创建的新类称为子类,被继承的类称为父类。目的是代码可重用。
多态:目的是为了接口重用。具体实现有两种方式:覆盖和重载,覆盖是指子类重新定义弗雷的虚函数的做法。重载是指允许多个同名但参数表不同的函数,程序调用时会根据参数不同而调用不同函数。

5.用C语言些一个模块化函数,实现将一个字符串插入到另一个字符串中的指定位置

不同于之前的内存拷贝函数,
嵌入式Linux工程师笔试记录 – 2020.7.28 (一)–14.写一个函数完成内存拷贝。

此题说明了一个字符串插入到另一个字符串指定位置,表示两个字符串互相独立,假设无地址重叠,得以下解:

#include <stdio.h>
#include <assert.h>
#include <string.h>

/*
    功能:将s2插入到s1的count位置
*/
void insert ( char *s1, const char *s2 , int count ){

    assert( s1 && s2 );               /* 检查是否为空 */
    assert( strlen(s1) >= count );    /* 所给count是否合法 */
    int i = 0 ;
    int s1_cur_len = strlen(s1);

    char temp[strlen(s1)] ;
    for( i = count ; i < s1_cur_len ; i ++ ){
        /* 1.存储count之后的字符临时存储到temp中 */
        temp[i-count] = s1[i];
        s1[i] = '\0';     // 清空
    }

    for( i = 0 ; i < strlen(s2) ; i ++ )
        /* 2.将s2插入到s1的count之后 */
        s1[i+count] = s2[i];

    s1_cur_len = strlen(s1);         // 更新s1当前长度
    for( i = 0 ; i < strlen(temp) ; i ++ )
        /* 3.将temp插入到s1末尾 */
        s1[s1_cur_len+i] = temp[i];
    return;
}


int main(int argc , char **argv ){

    assert(argc>2);

    char s1[strlen(argv[1])];
    char s2[strlen(argv[2])];
    strcpy(s1 , argv[1]);
    strcpy(s2 , argv[2]);
    printf("s1 = %s\ns2 = %s\n" , s1, s2);
    insert( s1 , s2 , 2 );
    printf("s3 = %s\n" , s1);
    return 0;
}