46家公司笔试题.pdf
根据提供的文件信息,我们可以整理出以下相关知识点: ### 1. 完成程序输出特定图案 **题目描述:** 给出了一段不完整的 C 语言代码,要求补全代码以输出特定的图案。 **代码框架:** ```c #include<stdio.h> #define N 8 int main() { int i; int j; int k; // 缺失部分 return 0; } ``` **解决方案:** 为了输出给定的图案,我们需要根据图案的特点来构建循环。该图案看起来像是由星号(*)组成的三角形和矩形的组合。因此,可以利用嵌套循环来控制每一行的输出。 **完整代码示例:** ```c #include<stdio.h> #define N 8 int main() { int i, j; for (i = 0; i < N; i++) { for (j = 0; j < N; j++) { if (i == 0 && j != 1 && j != 6) // 第一行 printf("*"); else if (i == 1 && (j == 1 || j == 6)) // 第二行 printf("*"); else if (i == 2 && (j == 1 || j == 4 || j == 6 || j == 7)) // 第三行 printf("*"); else if (i == 3) // 第四行 printf("*"); else if (i == 4 && j % 2 == 1) // 第五行 printf("*"); else if (i == 5 && (j == 1 || j == 4 || j == 6 || j == 7 || j == 9 || j == 12)) // 第六行 printf("*"); else if (i == 6) // 第七行 printf("*"); else if (i == 7 && j % 2 == 1) // 第八行 printf("*"); else printf(" "); } printf("\n"); } return 0; } ``` ### 2. 实现数组降序排序 **题目描述:** 给出一段不完整的 C 语言代码,要求补全以实现对数组的降序排序。 **代码框架:** ```c #include<stdio.h> void sort(); int main() { int array[] = {45, 56, 76, 234, 1, 34, 23, 2, 3}; sort(); return 0; } void sort() { // 缺失部分 } ``` **解决方案:** 可以通过多种方式实现数组的排序,如冒泡排序、选择排序或插入排序等。这里以冒泡排序为例。 **完整代码示例:** ```c #include<stdio.h> void sort(int arr[], int n) { int i, j, temp; for (i = 0; i < n - 1; i++) { for (j = 0; j < n - i - 1; j++) { if (arr[j] < arr[j + 1]) { temp = arr[j]; arr[j] = arr[j + 1]; arr[j + 1] = temp; } } } } int main() { int array[] = {45, 56, 76, 234, 1, 34, 23, 2, 3}; int n = sizeof(array)/sizeof(array[0]); sort(array, n); // 输出排序后的数组 for (int i = 0; i < n; i++) { printf("%d ", array[i]); } return 0; } ``` ### 3. 求斐波那契数列第10项 **题目描述:** 编写程序求斐波那契数列第10项。可以选择使用递归或其他方法,并说明选择的理由。 **解决方案:** 斐波那契数列可以通过递归和非递归两种方法计算。递归方法虽然简洁,但在计算较大的数值时效率较低,因为存在大量的重复计算。而非递归方法更高效,避免了重复计算。 **递归方法示例:** ```c #include<stdio.h> int fibonacci(int n) { if (n <= 1) return n; return fibonacci(n - 1) + fibonacci(n - 2); } int main() { printf("The 10th is %d", fibonacci(10)); return 0; } ``` **非递归方法示例:** ```c #include<stdio.h> int fibonacci(int n) { int a = 0, b = 1, c, i; if (n == 0) return a; for (i = 2; i <= n; i++) { c = a + b; a = b; b = c; } return b; } int main() { printf("The 10th is %d", fibonacci(10)); return 0; } ``` ### 4. 修复程序中的错误 **题目描述:** 给出了一段不完整的 C 语言代码,要求找出并修正错误,同时解释错误的原因。 **代码框架:** ```c #include<stdio.h> #include<malloc.h> typedef struct { TNode *left; TNode *right; int value; } TNode; TNode *root = NULL; void append(int N); int main() { append(63); append(45); append(32); append(77); append(96); append(21); append(17); return 0; } void append(int N) { // 缺失部分 } ``` **解决方案:** 该程序尝试构建一个二叉搜索树,但存在多个问题。`malloc()` 应该检查是否成功分配内存。插入新节点的逻辑存在问题。 **修正后的代码示例:** ```c #include<stdio.h> #include<malloc.h> typedef struct { TNode *left; TNode *right; int value; } TNode; TNode *root = NULL; void append(int N) { TNode *newNode = (TNode *)malloc(sizeof(TNode)); if (newNode == NULL) { printf("Memory allocation failed\n"); return; } newNode->value = N; newNode->left = NULL; newNode->right = NULL; if (root == NULL) { root = newNode; return; } TNode *temp = root; while (1) { if (N >= temp->value) { if (temp->right == NULL) { temp->right = newNode; break; } else { temp = temp->right; } } else { if (temp->left == NULL) { temp->left = newNode; break; } else { temp = temp->left; } } } } int main() { append(63); append(45); append(32); append(77); append(96); append(21); append(17); return 0; } ``` ### 华为笔试题解析 1. **OSI七层模型和TCP/IP五层模型:** - **OSI七层模型**: - 应用层 - 表示层 - 会话层 - 传输层 - 网络层 - 数据链路层 - 物理层 - **TCP/IP五层模型**: - 应用层 - 传输层 - 网络层 - 数据链路层 - 物理层 2. **IP协议定义及作用:** IP(Internet Protocol)协议位于TCP/IP模型的网络层,负责处理分组在网络之间的路由传输。它定义了数据包的格式和寻址规则,使得不同的网络能够通过IP地址进行通信。 - **TCP**:传输控制协议,位于传输层,提供面向连接的服务,确保数据可靠传输。 - **UDP**:用户数据报协议,同样位于传输层,提供无连接的服务,不保证数据传输的可靠性,但速度快。 3. **交换机和路由器的实现原理及层次:** - **交换机**: - 属于第二层设备(数据链路层),基于MAC地址进行数据帧的转发。 - 学习并维护一张MAC地址表,用于决定向哪个端口转发数据。 - **路由器**: - 属于第三层设备(网络层),基于IP地址进行数据包的转发。 - 维护路由表,通过路由协议学习到达不同网络的最佳路径。 4. **C++的类与C中的struct区别:** 在C++中,类是一种更强大的封装机制,它不仅可以包含数据成员,还可以包含成员函数,并支持继承、多态等特性。而C中的struct只是一组数据成员的集合,没有成员函数的概念。 5. **析构函数与虚函数的用法及作用:** - **析构函数**: - 在对象生命周期结束时自动调用,通常用于释放对象占用的资源。 - 在C++中,每个类可以有一个析构函数,它不能有返回类型且不能带参数。 - **虚函数**: - 用于支持多态性,允许基类指针或引用指向派生类对象,并通过基类指针或引用调用派生类的成员函数。 - 虚函数必须在基类中声明,并在派生类中重定义。 6. **全局变量与局部变量的区别及实现:** - **全局变量**: - 在所有函数外部定义,可以在整个程序范围内访问。 - 在程序开始执行时被初始化,并在整个程序运行期间一直存在。 - **局部变量**: - 在函数内部定义,只能在该函数内部访问。 - 在函数被调用时创建,在函数执行完毕后销毁。 操作系统和编译器通过不同的存储区域来区分这两种变量。全局变量通常存储在静态存储区,而局部变量则存储在栈上。 7. **8086系统的位数及数据总线实现:** - **8086系统**是一个16位的系统,这意味着它的寄存器和数据总线宽度都是16位。 - **数据总线**:8086 CPU 使用20位地址总线来寻址1MB的物理地址空间,而数据总线宽度为16位,用于实际的数据传输。 ### 联想笔试题解析 1. **设计函数int atoi(char *s):** 实现一个将字符串转换为整数的函数,类似于标准库函数`atoi()`。需要注意的是,这个函数需要处理可能的正负号以及非数字字符。 2. **表达式求值:** ```c int i = (j = 4, k = 8, l = 16, m = 32); printf("%d", i); ``` 由于逗号运算符按照从左到右的顺序依次计算各个表达式的值,并返回最后一个表达式的值。因此,这里的输出结果是`32`。 3. **局部变量、全局变量与静态变量的含义:** - **局部变量**:在函数内部定义的变量,作用域仅限于该函数。 - **全局变量**:在所有函数外部定义的变量,可以在整个程序范围内访问。 - **静态变量**:可以在函数内部定义,但其作用域仍然局限于该函数,不过生命周期扩展到了整个程序运行期间。 4. **堆与栈的区别:** - **栈**:一种先进后出(LIFO)的数据结构,用于存储局部变量和函数调用信息。栈的空间由编译器自动分配和释放。 - **堆**:动态分配的内存区域,用于存储动态分配的对象。堆的空间需要程序员手动分配和释放。 5. **含参数的宏与函数的优缺点:** - **宏**: - 优点:无需为宏分配内存,执行速度快。 - 缺点:宏展开可能导致代码膨胀,难以调试。 - **函数**: - 优点:易于调试,可读性好。 - 缺点:函数调用开销(入栈出栈等操作)。 ### 普天C++笔试题解析 1. **实现双向链表的操作:** - **删除节点**: 需要调整被删除节点的前驱和后继节点的指针,以绕过被删除节点。 - **插入节点**: 插入节点到指定位置后,更新前后节点的指针以指向新节点。 2. **替换字符串中的\t为四个空格:** 可以遍历字符串,每当遇到`\t`时,用四个空格替换。 3. **Windows程序入口及消息机制流程:** - **入口**:`WinMain` 函数。 - **消息机制**:Windows应用程序通过消息循环处理各种事件,如键盘输入、鼠标点击等。 4. **回调函数的定义与实现:** 回调函数是一种特殊类型的函数,它作为参数传递给另一个函数,并在适当的时候被调用。在C++中,可以通过函数指针或函数对象(functor)来实现回调功能。 5. **关于C++的一些问题:** - **C++中是不是**:这个问题似乎没有完整表述清楚。如果是指“C++中是不是所有的类成员函数都可以被声明为虚函数”,答案是不完全正确。只有当希望实现多态性时,才会声明某些成员函数为虚函数。 以上就是从给定文件的,,,【部分内容】中提取的相关知识点。
剩余27页未读,继续阅读
- 粉丝: 0
- 资源: 11
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助