列表

详情


阅读下列说明和程序,回答问题1至问题3,将解答填入答题纸的对应栏内。
【说明】
在开发某嵌入式系统时,设计人员根据系统要求,分别编写了相关程序,其中:
【程序1】是李工编写的一个数据交换子程序。
【程序2】是赵工编写的一段利用递归方法判别链表表示的两个数据结构是否相等的程序,若相等则返回值为1,否则返回为0。判别的准则是若两个链表的首指针相等,则相等;否则进行内部元素比较,元素中的itemid表示后面联合体union的有效性,itemid为0时,联合体union里面的data项有效,否则联合体union中的Link项有效。




【问题1】(6分)
执行【程序1】后,打印出来的a=3,b=4;并没有完成数据交换,请指出李工的问题?并改正程序错误。将答案填写在答题纸中对应的栏目。
【问题2】(5分)
仔细阅读并分析【程序2】中的C语言代码,完成其中(1)~(5)空白填空,将答案填入答题纸的对应栏内。
【问题3】(4分)
李工编写某嵌入式软件时,遇到了一些问题,请帮助李工解答下面2个问题,并将答案填写在答题纸中对应的栏目。
(1)李工在编译时,程序没有通过编译,经检查程序后将文件头的# include 改为 # include "filename.h"后编译通过,请问 # include < filename.h >和 # include "filename.h"的区别是什么?
(2)李工在编写一段C++程序时,需要调用一段已编译的C语言函数,为什么要加 extern "C"?

参考答案:

李工的问题:形参不能作为函数的输出参数使用。
对应的swap函数修改如下:


调用时修改为swap(&a,&b)
【问题2】
(1)x!-NULL&& y!-NULL
(2)x->itemid = y->itemid
(3)x->un.data = y->un.data
(4)Equalltem(x->un.link, y->un.link);
(5)Equalltem(x->nextltem,y->nextltem);
【问题3】
(1)对于# include <filename.h>,编译器从工程指定路径搜索filename.h;
对于#include "filename.h",编译器从当前路径和工程指定路径搜索filename.h;
(2)C++语言支持函数重载,C语言不支持函数重载,函数被C++编译后在库中的名字与C语言不同。C++提供了C连接交换指定符号extern "C"来解决名字匹配问题。 

详细解析:

本题考查嵌入式C/C++编程知识与应用。
【问题1】
函数swap采用值传递,虽然将形参x和y交换了,但是并不影响到实参,所以执行【程序1】后,打印出来的a=3,b=4;并没有完成数据交换。将值传递改成指针传递就可以了。
【问题2】
该段C语言程序是一段利用递归方法判别链表表示的两个数据结构是否相等的程序,若相等则返回值为1,否则返回为0。
【问题3】
本题考查考生对预处理指令include的正确理解。对于#include <filename.h>来说,编译器会从工程指定路径搜索filename.h文件;对于# include "filename.h"来说,编译器会从当前路径和工程指定路径捜索filename.h文件。
C++语言支持函数重载,C语言不支持函数重载,函数被C++编译后在库中的名字与C语言不同。为了C++程序中能够调用C程序,就需要C++提供C连接交换指定符号extern "C"来解决名字匹配问题。
#include是文件包含指令,#include < filename.h >,这条指令会导致预处理器把#include后面跟的文件(即filename.h文件)的内容替换到这条指令的位置。如果文件名由< >括起来,将表示在依赖于系统的目录中寻找这个文件。如果文件名由" "括起来,系统将会首先在当前程序目录中查找对应文件,如果找不到,再到其他依赖于系统的目录中寻找。
在C++中调用C库函数,就需要在C++程序中用extern “C”声明要引用的函数。这是给链接器用的,告诉链接器在链接的时候用C函数规范来链接。主要原因是C++和C程序编译完成后在目标代码中命名规则不同。

上一题