嵌入式软件工程师综合测试试题答案

更新时间:2023-09-21 19:05:01 阅读量: 工程科技 文档下载

说明:文章内容仅供预览,部分内容可能不全。下载后的文档,内容与下面显示的完全一致。下载之前请确认下面内容是否您想要的,是否完整无缺。

----------------------------精品word文档 值得下载 值得拥有---------------------------------------------- 综合复习试题

第一部分:C语言

一、请填写BOOL , float, 指针变量 与“零值”比较的 if 语句。 提示:这里“零值”可以是0, 0.0 , FALSE或者“空指针”。例如 int 变量 n 与“零值”比较的 if 语句为: if ( n == 0 ) if ( n != 0 ) 以此类推。 请写出 BOOL flag 与“零值”比较的 if 语句: if ( flag ) if ( !flag ) 请写出 float x 与“零值”比较的 if 语句: 标准答案示例: const float EPSINON = 0.00001; if ((x >= - EPSINON) && (x <= EPSINON) 不可将浮点变量用“==”或“!=”与数字 比较,应该设法转化成“>=”或“<=”此 类形式。 请写出 char *p 与“零值”比较的 if 语句: 标准答案: if (p == NULL) if (p != NULL) 二、以下为Windows NT下的32位C++程序,请计算sizeof的值 char str[] = “Hello” ; void Func ( char str[100]) char *p = str ; { int n = 10; 请计算 请计算 sizeof( str ) = 4 sizeof (str ) = 6 } sizeof ( p ) = 4 void *p = malloc( 100 ); 请计算 sizeof ( n ) = 4 sizeof ( p ) = 4 三、简答题

1、头文件中的 ifndef/define/endif 干什么用? 答:防止该头文件被重复引用。

2、#include 和 #include “filename.h” 有什么区别? 答:对于#include ,编译器从标准库路径开始搜索 filename.h

----------------------------精品word文档 值得下载 值得拥有----------------------------------------------

-----------------------------------------------------------------------------------------------------------------------------

----------------------------精品word文档 值得下载 值得拥有---------------------------------------------- 对于#include “filename.h” ,编译器从用户的工作路径开始搜索 filename.h

3、const 有什么用途?(请至少说明两种) 答:

(1)可以定义 const 常量

(2)const 可以修饰函数的参数、返回值,甚至函数的定义体。被 const 修饰的东西都受到强制保护,可以预防意外的变动,能提高程序的健壮性。

4、在C++ 程序中调用被 C编译器编译后的函数,为什么要加 extern “C”声明?

答:C++语言支持函数重载,C 语言不支持函数重载。函数被 C++编译后在库中的名字

与 C 语言的不同。假设某个函数的原型为: void foo(int x, int y); 该函数被 C 编译器编译后在库中的名字为_foo,而 C++编译器则会产生像 _foo_int_int 之类的名字。

C++提供了 C 连接交换指定符号 extern“C”来解决名字匹配问题。

5、请简述以下两个for循环的优缺点 // 第一个 // 第二个 for (i=0; i

----------------------------精品word文档 值得下载 值得拥有---------------------------------------------- -----------------------------------------------------------------------------------------------------------------------------

----------------------------精品word文档 值得下载 值得拥有---------------------------------------------- void GetMemory(char *p) char *GetMemory(void) { { p = (char *)malloc(100); char p[] = \} return p; void Test(void) } { void Test(void) char *str = NULL; { GetMemory(str); char *str = NULL; strcpy(str, \str = GetMemory(); printf(str); printf(str); } } 请问运行Test函数会有什么样的结请问运行Test函数会有什么样的结果? 果? 答:程序崩溃。 答:可能是乱码。 因为 GetMemory 并不能传递动态内因为 GetMemory 返回的是指向“栈内存, 存” Test 函数中的 str 一直都是 NULL。 的指针,该指针的地址不是 NULL,但strcpy(str, \将使程其原现的内容已经被清除,新内容不可序崩 知。 溃。 Void GetMemory2(char **p, int num) void Test(void) { { *p = (char *)malloc(num); char *str = (char *) } malloc(100); void Test(void) strcpy(str, “hello”); { free(str); char *str = NULL; if(str != NULL) GetMemory(&str, 100); { strcpy(str, \ strcpy(str, “world”); printf(str); printf(str); } } 请问运行Test函数会有什么样的结} 果? 请问运行Test函数会有什么样的结答:(1)能够输出 hello 果? (2)内存泄漏 答:篡改动态内存区的内容,后果难以预 料,非常危险。 因为 free(str);之后,str 成为野指针, if(str != NULL)语句不起作用。 ----------------------------精品word文档 值得下载 值得拥有---------------------------------------------- -----------------------------------------------------------------------------------------------------------------------------

----------------------------精品word文档 值得下载 值得拥有----------------------------------------------

五、编写strcpy函数

已知strcpy函数的原型是

char *strcpy(char *strDest, const char *strSrc); 其中strDest是目的字符串,strSrc是源字符串。

(1)不调用C++/C的字符串库函数,请编写函数 strcpy

char *strcpy(char *strDest, const char *strSrc); {

assert((strDest!=NULL) && (strSrc !=NULL)); // 2分 char *address = strDest; // 2分

while( (*strDest++ = * strSrc++) != ‘\\0’ ) // 2分 NULL ;

return address ; // 2分 }

(2)strcpy能把strSrc的内容复制到strDest,为什么还要char * 类型的返回值?

答:为了实现链式表达式。 // 2 分

例如 int length = strlen( strcpy( strDest, “hello world”) ); 六:编程题

1、写出程序把一个链表中的接点顺序倒排

listNode* reverse_list( listNode* head) //逆序 {

ListNode* new_head=head;

if(head==NULL || head->next==NULL) return head;

new_head = reverse_list(head->next); head->next->next=head; head->next=NULL; //防止链表成为一个环,这是最关键的。 return new_head; }

2、写出程序删除链表中的所有接点

void del_all(node *head) {

node *p;

while(head!=NULL) {

p=head->next; free(head); head=p; }

----------------------------精品word文档 值得下载 值得拥有---------------------------------------------- -----------------------------------------------------------------------------------------------------------------------------

----------------------------精品word文档 值得下载 值得拥有---------------------------------------------- cout<<\释放空间成功!\}

3、使用冒泡、选择法、快速排序法对数组进行排序

1)“冒泡法”

冒泡法大家都较熟悉。其原理为从a[0]开始,依次将其和后面的元素比较, 若a[0]>a[i],则交换它们,一直比较到a[n]。 同理对a[1],a[2],...a[n-1]处理,即完成排序。

void bubble(int *a,int n) /*定义两个参数:数组首地址与数组大小*/ {

int i,j,temp;

for(i=0;i

for(j=i+1;ja[j]) {

temp=a[i]; a[i]=a[j]; a[j]=temp; }

}/*注意循环的上下限*/ } }

冒泡法原理简单,但其缺点是交换次数多,效率低。

下面介绍一种源自冒泡法但更有效率的方法“选择法”。 (2)“选择法”

选择法循环过程与冒泡法一致,它还定义了记号k=i

然后依次把a[k]同后面元素比较,若a[k]>a[j],则使k=j. 最后看看k=i是否还成立,不成立则交换a[k],a[i] 这样就比冒泡法省下许多无用的交换,提高了效率。

void choise(int *a,int n) {

int i,j,min,temp; for(i=0;i

min=i; /*给记号赋值*/ for(j=i+1;j

if(a[min]>a[j])

min=j; /*是min总是指向最小元素*/

----------------------------精品word文档 值得下载 值得拥有---------------------------------------------- -----------------------------------------------------------------------------------------------------------------------------

本文来源:https://www.bwwdw.com/article/n73h.html

Top