1、嵌入式系统设计师-68 及答案解析(总分:45.00,做题时间:90 分钟)一、试题一(总题数:1,分数:15.00)阅读下列说明和图,回答下问题。 说明 操作系统主要功能之一是处理机管理,处理机管理主要是实现处理机扩充,以支持多个进程的并行运行,提高计算机的计算效率。 进程是动态的概念,通常称进程为程序的一次执行。进程的主体部分是程序,包括程序和数据。进程在执行期间具备确定的状态。 线程是进程中某个单独执行的控制流,也称为轻量进程。(分数:15.00)(1).简述抢占(剥夺)式调度算法和非抢占式调度算法的特点。(分数:5.00)_(2).请从下列叙述中选择出正确的叙述。(该题为多选题)(分数
2、:5.00)A.在多进程多线程系统中,处理机调度的最小单位是进程B.线程可定义为进程内的一个执行单位,或者定义为进程内的一个可调度的实体C.一个线程可以属于多个进程D.进程处于可执行状态时,它的线程可以被调度执行,处于阻塞状态时,其所有线程均不能执行E.进程的多个线程共享进程的地址空间(3).进程状态之间切换关系如图所示,具体说明进程三种状态的特点,并将三种状态之间的切换条件(a)至(d)填写出来。 (分数:5.00)_二、试题二(总题数:1,分数:15.00)阅读下列说明和图、表,回答下列问题。 说明 某车载导航系统的结构如图所示,由导航处理系统和显示系统两部分组成。导航处理系统安装在某型车
3、的设备区,显示系统安装在某型车的前方,便于驾驶员观看和操作。 (分数:15.00)(1).GPS天线接收卫星信号,将定位信息以帧的形式,通过 RS232串行接口传输给主处理机模块。通常RS232的管脚规格如下表所示。 采用 RS232通信,如果发送的数据量超过接收方缓冲区时,可能在接收方缓冲区因处理时间延迟等导致接收数据丢失。因此,需要进行流量控制。 表 RS232 的管脚规格定义 号 码 管脚名称 说 明 1 DCD Data Carrier Detect 2 RXD Receive Data 3 TXD Transmit Data 4 DTR Data Terminal Ready 5 G
4、ND Ground 6 DSR Data Set Ready 7 RTS Request To Send 8 CTS Clear To Send 9 RI Ring Indicator 请回答下面三个问题。 (1)如果通过软件进行流量控制,也就是将流量控制信息以特殊的数据进行发送,使用上表中的哪两个管脚进行状态信息发送?(回答管脚名称) (2)如果通过硬件方式进行流量控制,使用上表中的哪两个管脚进行状态信息发送?(回答管脚名称) (3)若 RS232适配器的 FIFO深度为 4B,通信波特率为 9600bps,数据位为 8位,无校验,停止位为 1,无数据流控。在应用设计中每次以 4字节为单位进
5、行数据发送,每两次发送之间严格控制时间间隔为10ms,连续发送 100次,在此过程中,忽略所有由于调度等因素引起的发送延迟。那么,从第 1次发送开始,到第 100次数据发送出去,消耗的时间为多少毫秒?(分数:5.00)_(2).主处理机模块与信号处理模块间通过双端口存储器进行数据交换。李工设计时,将双端口存储器空间划分为两个缓冲区,两个缓冲区分别交替地接收信号处理机传输来的最新数据,然后按数据块方式提供给用户程序使用。 假设每个缓冲区的大小为 512KB,将 512KB数据写入当前空闲缓冲区接口服务为 Write_Buffer,将当前有效的 512KB数据读出缓冲区的接口服务为 Read_Bu
6、ffer,假设双端口存储器中不提供硬件信号量,两个缓冲区间的互斥操作由软件标记实现,软件对双端口存储器的单次操作(读写一个字的操作)为原子操作。 下面是用 C语言设计的一组对双缓冲区的管理程序代码,请填补该程序代码中的空缺。 int *BufferFlag2; /* 0表示无有效数据,0xff 表示有新数据 */ int *Mutex2; /* 软件锁,0 表示未锁定,0xff 表示锁定 */ int Read_Buffer(int id, char *data); /* 从缓冲区读数据,用于数据处理模块,id 表示缓冲的序列号,0 表示缓冲区 1,1 表示缓冲区 2,data 为存放读取数据
7、的缓冲,返回值表示读取到有效数据的长度*/ void Write_Buffer(int id, char *data); /* 向缓冲区写数据,用于信号处理模块,id 表示缓冲的序列号,0 表示缓冲区 1,1 表示缓冲区 2,data 为待写入数据的缓冲*/ int INIT_PPC() /*数据处理模块端的初始化,缓冲区起始地址为 0xffffc000。*/ BufferFlag = ( int * ) 0xffffc000; Mutex = ( int * ) 0xffffc010; *BufferFlag0=0; *BufferFlag1=0; *Mutex0=0; *Mutex1=0;
8、 return (0); int PPC_Read_Data (char *Data) /* 数据处理模块读数据程序段 */ int len = 0; if (!(*BufferFlag0) /*无新数据*/ ) if (*BufferFlag0) if ( _2_ ) *Mutex0 = 0xff; len = Read_Buffer(0, Data); *BufferFlag0 = 0xO0; _3_ ; else if (*BufferFlag1) if (! (*Mutex1) *Mutex1 = 0xff; _4_ ; *BufferFlag1 = 0x00; *Mutex1 = 0
9、x00; return (len); int DSP_Write_Data () /*信号处理模块写数据程序段,初始化与数据处理模块端类似,同样以 BufferFlag表示与数据处理模块端的对应的标志,即两端操作的是相同的地址空间;同样 Mutex也表示与数据处理模块端的对应的软件锁,即两端操作的是相同的地址空间。这里就略去双口在 DSP上的起始地址说明和初始化部分。*/ char Data1024*512; while _2_ /等待信号处理模块产生新的数据并存入数据缓冲 Data中; if (!(*Mutex0) *MutexO = 0xff; Write_Buffer(0, Data);
10、 *BufferFlag0 = 0xff; *Mutex0 = 0x00; else if (!(*Mutex1) *Mutex1 = 0xff; Write_Buffer(1, Data); *BufferFlag1 = 0xff; *Mutex1 = 0x00; return (0); (分数:5.00)_(3).请回答关于面板按键设计过程中的下列问题。 在进行面板键盘处理设计时,通常在扫描键盘过程中,按键会产生机械抖动。针对抖动问题,王工认为只有通过硬件设计才能消除抖动,而李工认为用软件方法就可以解决该问题。针对抖动问题,你认为可以采用哪类方式消除?(分数:5.00)_三、试题三(总题数
11、:1,分数:15.00)阅读下列说明和程序,回答问题 1至问题 3,将解答填入对应栏内。 说明 在开发某嵌入式系统时,设计人员根据系统要求,分别编写了相关程序,其中: 程序 1 是李工编写的一个数据交换子程序。 程序 2 是赵工编写的一段利用递归方法判别链表表示的两个数据结构是否相等的程序,若相等则返回值为 1,否则返回为 0。判别的准则是若两个链表的首指针相等,则相等;否则进行内部元素比较,元素中的 itemid表示后面联合体 un的有效性,itemid 为 0时,联合体 un里面的 data项有效,否则联合体un中的 link项有效。 程序 1 #include stdio.h swap(
12、int x, int y) int t; t=x; x=y; y=t; main() int a, b; a=3; b=4; swap (a,b); printf(“%d, %dn“, a, b); 程序 2 typedef struct Item int itemid; union char data; struct Item *link; un; struct Item *nextItem; ItemNode; int EqualItem(ItemNode *x, ItemNode *y) int res; if x=y) return 1; if ( 1 ) if ( 2 ) if (x
13、-itemid=0) res= 3 ; else res= 4 if (res) return 5 return 0; (分数:15.00)(1).执行程序 1后,打印出来的 a=3,b=4;并没有完成数据交换,请指出李工的问题?并改正程序错误。(分数:5.00)_(2).仔细阅读并分析程序 2中的 C语言代码,完成其中(1)(5)空白填空。(分数:5.00)_(3).李工编写某嵌入式软件时,遇到了一些问题,请帮助李工解答下面 2个问题。 (1)李工在编译时,程序没有通过编译,经检查程序后将文件头的#include filename.h改为#include “filename.h“后编译通过,
14、请问#includefilename.h和#include “filename.h“的区别是什么? (2)李工在编写一段 c+程序时,需要调用一段已编译的 C语言函数,为什么要加 extern “C“?(分数:5.00)_嵌入式系统设计师-68 答案解析(总分:45.00,做题时间:90 分钟)一、试题一(总题数:1,分数:15.00)阅读下列说明和图,回答下问题。 说明 操作系统主要功能之一是处理机管理,处理机管理主要是实现处理机扩充,以支持多个进程的并行运行,提高计算机的计算效率。 进程是动态的概念,通常称进程为程序的一次执行。进程的主体部分是程序,包括程序和数据。进程在执行期间具备确定的
15、状态。 线程是进程中某个单独执行的控制流,也称为轻量进程。(分数:15.00)(1).简述抢占(剥夺)式调度算法和非抢占式调度算法的特点。(分数:5.00)_正确答案:()解析:所谓抢占式,指按照一定的规则(例如优先数),在每次中断处理结束后进行调度,选择条件最优的进程投入运行; 所谓非抢占式调度是指,进程一旦被调度,就将一直运行,除非由于自身原因不能运行。 本题考查操作系统中进程、线程以及进程调度等方面的应用知识。 在操作系统初始化时,创建所有进程,进程运行过程中,也可创建子进程。进程调度算法很多,归结为两类,即抢占(剥夺)式和非抢占式。抢占式调度策略,指按照一定的规则(例如优先数),在每次
16、中断处理结束后进行调度,选择条件最优的进程投入运行。非抢占式调度是指,进程一旦被调度,就将一直运行,除非由于自身原因不能运行。(2).请从下列叙述中选择出正确的叙述。(该题为多选题)(分数:5.00)A.在多进程多线程系统中,处理机调度的最小单位是进程B.线程可定义为进程内的一个执行单位,或者定义为进程内的一个可调度的实体 C.一个线程可以属于多个进程D.进程处于可执行状态时,它的线程可以被调度执行,处于阻塞状态时,其所有线程均不能执行 E.进程的多个线程共享进程的地址空间 解析:在多进程多线程系统中,处理机调度的最小单位是线程,而不是进程。 线程可定义为进程内的一个执行单位,或者定义为进程内
17、的一个可调度的实体。 进程由一个或一组线程组成;一个线程属于且仅属于一个进程。 进程处于可执行状态时,它的线程可以被调度执行,而处于阻塞状态时,其所有线程均不能执行。 进程的多个线程共享进程的地址空间。(3).进程状态之间切换关系如图所示,具体说明进程三种状态的特点,并将三种状态之间的切换条件(a)至(d)填写出来。 (分数:5.00)_正确答案:()解析:运行状态特点:进程占有 CPU,正在运行其程序时处于运行态。 就绪状态特点:进程具备了一切运行的条件,但由于 CPU正在运行别的进程而使它不能运行时,处于就绪态。 等待状态特点:进程由于自身原因必须等待某个条件的具备,否则不能继续运行时,处
18、于等待态。 (a)某个运行条件不能满足(例如等待资源); (b)等待条件消失(例如等待的资源已经获得满足); (c)进程自愿放弃 CPU使用权,或被强制剥夺 CPU使用权; (d)就绪队列中的进程获得 CPU使用权。 图中给出了进程三个状态:运行、就绪、等待之间的切换关系,这三种状态的特点如下:进程拥有 CPU,正在运行其程序时处于运行态;具备了一切运行的条件,但由于 CPU正在运行别的进程而使它不能运行时,进程处于就绪态;由于自身原因必须等待某个条件的具备,否则不能继续运行时,进程处于等待态。 对于正在运行的进程,当某个运行条件不能满足,例如等待某个资源时,便将 CPU让出而转入等待态;当等
19、待条件消失,例如等待的资源已经获得满足,进程从等待态进入就绪态等待调度;处于运行态的进程,如自愿放弃 CPU,或被高优先级进程强制剥夺 CPU使用权后,从运行态转入就绪态;控制权被释放后,CPU将从就绪队列中选取排在最前面的进程投入运行。就绪队列中获得 CPU使用权的进程,便转入运行态。三种状态的特点如下。 (1)运行态:进程占有 CPU,正在运行其程序时处于运行态; (2)就绪态:进程具备了一切运行的条件,但由于 CPU正在运行别的进程而使它不能运行时,处于就绪态;(3)等待态:进程由于自身原因必须等待某个条件的具备,否则不能继续运行时,处于等待态。 三种状态之间的切换条件分别为: (1)某
20、个运行条件不能满足(例如等待资源); (2)等待条件消失(例如等待的资源已经获得满足); (3)进程自愿放弃 CPU使用权,或被强制剥夺 CPU使用权; (4)就绪队列中的进程获得 CPU使用权。二、试题二(总题数:1,分数:15.00)阅读下列说明和图、表,回答下列问题。 说明 某车载导航系统的结构如图所示,由导航处理系统和显示系统两部分组成。导航处理系统安装在某型车的设备区,显示系统安装在某型车的前方,便于驾驶员观看和操作。 (分数:15.00)(1).GPS天线接收卫星信号,将定位信息以帧的形式,通过 RS232串行接口传输给主处理机模块。通常RS232的管脚规格如下表所示。 采用 RS
21、232通信,如果发送的数据量超过接收方缓冲区时,可能在接收方缓冲区因处理时间延迟等导致接收数据丢失。因此,需要进行流量控制。 表 RS232 的管脚规格定义 号 码 管脚名称 说 明 1 DCD Data Carrier Detect 2 RXD Receive Data 3 TXD Transmit Data 4 DTR Data Terminal Ready 5 GND Ground 6 DSR Data Set Ready 7 RTS Request To Send 8 CTS Clear To Send 9 RI Ring Indicator 请回答下面三个问题。 (1)如果通过软件进
22、行流量控制,也就是将流量控制信息以特殊的数据进行发送,使用上表中的哪两个管脚进行状态信息发送?(回答管脚名称) (2)如果通过硬件方式进行流量控制,使用上表中的哪两个管脚进行状态信息发送?(回答管脚名称) (3)若 RS232适配器的 FIFO深度为 4B,通信波特率为 9600bps,数据位为 8位,无校验,停止位为 1,无数据流控。在应用设计中每次以 4字节为单位进行数据发送,每两次发送之间严格控制时间间隔为10ms,连续发送 100次,在此过程中,忽略所有由于调度等因素引起的发送延迟。那么,从第 1次发送开始,到第 100次数据发送出去,消耗的时间为多少毫秒?(分数:5.00)_正确答案
23、:()解析:(1)RXD 和 TXD(或者 TXD和 RXD) (2)RTS和 CTS(或者 CTS和 RTS) (3)993.75 本题主要考查嵌入式系统软硬件协同设计中串口 RS232的基本软硬件应用知识。 在 RS-232标准中,字符是以将比特串一个接一个的串行(serial)方式传输,优点是传输线少,配线简单,传送距离可以较远。最常用的编码格式是异步起停(asynchronous start-stop)格式,它使用一个起始比特后面紧跟 7或 8个数据比特(bit),然后是可选的奇偶校验比特,最后是一或两个停止比特。所以发送一个字符至少需要 10比特,带来的一个好的效果是使用全部的传输速
24、率,发送信号的速率以 10划分。 RS-232设计之初是用来连接调制解调器做传输之用,也因此它的脚位意义通常也和调制解调器传输有关。RS-232的设备可以分为数据终端设备(DTE, Data Terminal Equipment, For example, PC)和数据通信设备(DCE, Data Communication Equipment)两类,这种分类定义了不同的线路用来发送和接受信号。一般来说,计算机和终端设备有 DTE连接器,调制解调器和打印机有 DCE连接器。使用中采用配线分接器测试连接,或者用试误法来判断电缆是否工作,常常需要参考相关的文件说明。RS-232 指定了 20个不同
25、的信号连接,由 25个 D-sub(微型 D类)管脚构成的 DB-25连接器。很多设备只是用了其中的一小部分管脚,出于节省资金和空间的考虑不少机器采用较小的连接器,特别是 9管脚的 D-sub或者是 DB-9型连接器广泛使用在绝大多数 PC机和其他许多设备上。DB-25 和 DB-9型的连接器在大部分设备上是雌型,但不是所有的都是这样。 在使用 RS232进行数据传输时,RXD 和 TXD管脚被用来进行数据的接收和发送,RS232 的流控方式包括无流控,软件流控和硬件流控三种。无流控是指没有流控功能。软件流控也称之为 XON/XOFF流控,使用控制字符 XON、XOFF 来实现。在 RS232
26、数据通信过程中,如果发送方收到 XOFF字符则停止发送数据,反之如果收到 XON字符则重新开始发送数据。XON 一般定义为十六进制数 0x11,XOFF 为十六进制数 0x13。硬件流控又分为 DSR/DTR流控和 CTS/RTS流控。硬件流控是通过硬件的高低电平来通知发送方,接收方的缓冲区是否快满了。CTS/RTS 流控时,RS232(DB9)的 8引脚为 RTS,7 引脚为 CTS。DSR/DTR 流控时,RS232(DB9)的 6引脚为 DSR,4 引脚为 DTR。 在使用 RS232进行数据传送时,需要注意其配置方式,包括流控位宽,起始位宽等。在该题目中,数据位宽为 8bit,停止位为
27、 1bit,无别的流控位,因此,每个字节传输需要的位宽为 9bit,按照 9600bps的速率进行传输时,每个字节需要的时间为 9/9600=0.9375ms,因此传输 4字节需要的时间为40.9375ms=3.75ms。在进行 100次的传输中,每隔 10ms传输一次,又由于同时忽略了其他调度时间,由于 3.75小于 10,可知,在每 10ms传输一次的过程中肯定是可以将对应的 4字节数据传输完毕。因此,在 100次的传输中,前 99次传输需要的时间是 9910ms=990ms,最后一次也就是第 100次传输消耗的时间为 3.75ms,因此,总共需要的时间为 990ms+3.75ms=993
28、.75ms。(2).主处理机模块与信号处理模块间通过双端口存储器进行数据交换。李工设计时,将双端口存储器空间划分为两个缓冲区,两个缓冲区分别交替地接收信号处理机传输来的最新数据,然后按数据块方式提供给用户程序使用。 假设每个缓冲区的大小为 512KB,将 512KB数据写入当前空闲缓冲区接口服务为 Write_Buffer,将当前有效的 512KB数据读出缓冲区的接口服务为 Read_Buffer,假设双端口存储器中不提供硬件信号量,两个缓冲区间的互斥操作由软件标记实现,软件对双端口存储器的单次操作(读写一个字的操作)为原子操作。 下面是用 C语言设计的一组对双缓冲区的管理程序代码,请填补该程
29、序代码中的空缺。 int *BufferFlag2; /* 0表示无有效数据,0xff 表示有新数据 */ int *Mutex2; /* 软件锁,0 表示未锁定,0xff 表示锁定 */ int Read_Buffer(int id, char *data); /* 从缓冲区读数据,用于数据处理模块,id 表示缓冲的序列号,0 表示缓冲区 1,1 表示缓冲区 2,data 为存放读取数据的缓冲,返回值表示读取到有效数据的长度*/ void Write_Buffer(int id, char *data); /* 向缓冲区写数据,用于信号处理模块,id 表示缓冲的序列号,0 表示缓冲区 1,1
30、 表示缓冲区 2,data 为待写入数据的缓冲*/ int INIT_PPC() /*数据处理模块端的初始化,缓冲区起始地址为 0xffffc000。*/ BufferFlag = ( int * ) 0xffffc000; Mutex = ( int * ) 0xffffc010; *BufferFlag0=0; *BufferFlag1=0; *Mutex0=0; *Mutex1=0; return (0); int PPC_Read_Data (char *Data) /* 数据处理模块读数据程序段 */ int len = 0; if (!(*BufferFlag0) /*无新数据*/
31、 ) if (*BufferFlag0) if ( _2_ ) *Mutex0 = 0xff; len = Read_Buffer(0, Data); *BufferFlag0 = 0xO0; _3_ ; else if (*BufferFlag1) if (! (*Mutex1) *Mutex1 = 0xff; _4_ ; *BufferFlag1 = 0x00; *Mutex1 = 0x00; return (len); int DSP_Write_Data () /*信号处理模块写数据程序段,初始化与数据处理模块端类似,同样以 BufferFlag表示与数据处理模块端的对应的标志,即两端
32、操作的是相同的地址空间;同样 Mutex也表示与数据处理模块端的对应的软件锁,即两端操作的是相同的地址空间。这里就略去双口在 DSP上的起始地址说明和初始化部分。*/ char Data1024*512; while _2_ /等待信号处理模块产生新的数据并存入数据缓冲 Data中; if (!(*Mutex0) *MutexO = 0xff; Write_Buffer(0, Data); *BufferFlag0 = 0xff; *Mutex0 = 0x00; else if (!(*Mutex1) *Mutex1 = 0xff; Write_Buffer(1, Data); *Buffer
33、Flag1 = 0xff; *Mutex1 = 0x00; return (0); (分数:5.00)_正确答案:()解析:(1)!(*Mutex0)或者*Mutex0=0x00 或者*Mutex0=0 (2)*Mutex0=0x00或者*Mutex0=0 (3)len=Read_Buffer(1, Data) 本题考查嵌入式系统中的 C程序设计,要求考生正确使用软件锁。 在本题中主处理机模块与信号处理模块间通过双端口存储器进行数据交换。由信号处理模块发送数据,主处理机模块接收数据。 在本题中给出了很多假设条件,如将双端口存储器空间划分为两个缓冲区,两个缓冲区分别交替地接收信号处理机传输来的最
34、新数据;再如假设双端口存储器中不提供硬件信号量,两个缓冲区间的互斥操作由软件标记实现,软件对双端口存储器的单次操作(读写一个字的操作)为原子操作。同时本题也给出了软件程序的架构,BufferFlag 为缓冲区有无新数据的标志,Mutex 为软件锁。 在数据处理模块端的初始化程序 INIT PPC()中,BufferFlag 和 Mutex被分配在缓冲区的前端,并被初始化为无数据和未锁定。 信号处理模块写数据程序 DSP_Write_Data()中,初始化与数据处理模块端类似,同样以 BufferFlag表示与数据处理模块端的对应的标志,即两端操作的是相同的地址空间;同样 Mutex也表示与数据
35、处理模块端的对应的软件锁,即两端操作的是相同的地址空间。信号处理模块写数据程序 DSP_Write_Data()是一个无限循环程序,在等待信号处理模块产生新的数据,之后就将数据写入双缓冲 Data中。具体过程如下: 1)循环等待新数据; 2)如果缓冲区 0未被锁定,则: (1)缓冲区 0加锁; (2)写数据到缓冲区 0; (3)标记缓冲区 0未有数据; (4)缓冲区 0解锁。 3)如果缓冲区 0已被锁定,则对缓冲区 1重复上述步骤。 在数据处理模块端读数据程序 PPC_Read, Data()首先判断双缓冲有无数据,如果缓冲区 0有数据,再判断缓冲区 0是否加锁,如果未加锁,则先加锁,再读数据
36、,再解锁。对缓冲区 1同样如此处理。(3).请回答关于面板按键设计过程中的下列问题。 在进行面板键盘处理设计时,通常在扫描键盘过程中,按键会产生机械抖动。针对抖动问题,王工认为只有通过硬件设计才能消除抖动,而李工认为用软件方法就可以解决该问题。针对抖动问题,你认为可以采用哪类方式消除?(分数:5.00)_正确答案:()解析:硬件方法和软件方法都可以。 在一般的按键设计中,通常的按键所用开关为机械弹性开关。由于机械触电的弹性作用,按键在闭合及断开的瞬间均伴随有一连串的抖动。键抖动会引起一次按键被误读多次。为了确保 CPU对键的一次闭合仅作一次处理,必须去除抖动。消除抖动的方法有硬件和软件两种方法
37、。硬件方法常用专用的去抖芯片或者自己组装一个双稳态消抖电路,就是两个与非门构成的 RS触发器。 软件方法是当检测出键闭合后执行一个 10ms20ms 的延时程序,再一次检测键的状态,如仍保持闭合状态,则确认真正有键按下。 硬件方法和软件方法都可以消除抖动问题。三、试题三(总题数:1,分数:15.00)阅读下列说明和程序,回答问题 1至问题 3,将解答填入对应栏内。 说明 在开发某嵌入式系统时,设计人员根据系统要求,分别编写了相关程序,其中: 程序 1 是李工编写的一个数据交换子程序。 程序 2 是赵工编写的一段利用递归方法判别链表表示的两个数据结构是否相等的程序,若相等则返回值为 1,否则返回
38、为 0。判别的准则是若两个链表的首指针相等,则相等;否则进行内部元素比较,元素中的 itemid表示后面联合体 un的有效性,itemid 为 0时,联合体 un里面的 data项有效,否则联合体un中的 link项有效。 程序 1 #include stdio.h swap(int x, int y) int t; t=x; x=y; y=t; main() int a, b; a=3; b=4; swap (a,b); printf(“%d, %dn“, a, b); 程序 2 typedef struct Item int itemid; union char data; struct
39、Item *link; un; struct Item *nextItem; ItemNode; int EqualItem(ItemNode *x, ItemNode *y) int res; if x=y) return 1; if ( 1 ) if ( 2 ) if (x-itemid=0) res= 3 ; else res= 4 if (res) return 5 return 0; (分数:15.00)(1).执行程序 1后,打印出来的 a=3,b=4;并没有完成数据交换,请指出李工的问题?并改正程序错误。(分数:5.00)_正确答案:()解析:李工的问题:形参不能作为函数的输出参
40、数使用。 对应的 swap函数修改如下: swap (int *x, int *y) int t; t=*x; *x=*y; *y=t; 调用时修改为 swap( t=*x; *x=*y; *y=t; 调用时应修改为 swap(&a,&b)(2).仔细阅读并分析程序 2中的 C语言代码,完成其中(1)(5)空白填空。(分数:5.00)_正确答案:()解析:(1)x!=NULL&y!=NULL (2)x-itemid=y-itemid (3)x-un.data=y-un.data (4)EqualItem(x-un.link, y-un.link); (5)EqualItem(x-nextIte
41、m, y-nextItem); 该段 C语言程序是一段利用递归方法判别链表表示的两个数据结构是否相等的程序,若相等则返回值为 1,否则返回为 0。判别的准则是若两个链表的首指针相等,则相等;否则进行内部元素比较,元素中的 itemid表示后面联合体 un的有效性,itemid 为 0时,联合体 un里面的 data项有效,否则联合体 un中的 link项有效。该程序具体如下: 如果 x=y,则返回 1,表示断定两个数据实际指向是同一地方,当然相等; 如果 x和 y都不为空则继续,否则返回 0; 如果 x-itemid=y-itemid,则继续,否则返回 0; 如果 x-itemid=0,则若
42、x-un.data=y-un.data,res=1,否则 res=0; 如果 x-itemid 不等于 0,联合体 un中的 link项有效,递归调用 EqualItem(x-un.link, y-un.link),继续判断; 如果 res=1,也就是 x-un.data=y-un.data,则递归调用 EqualItem(x-nextItem, y-nextItem),判断下一级链表; 如果 res=0,也就是 x-un.data 不等与 y-un.data,则即可断定两个数据不相等,返回为 0。(3).李工编写某嵌入式软件时,遇到了一些问题,请帮助李工解答下面 2个问题。 (1)李工在编译
43、时,程序没有通过编译,经检查程序后将文件头的#include filename.h改为#include “filename.h“后编译通过,请问#includefilename.h和#include “filename.h“的区别是什么? (2)李工在编写一段 c+程序时,需要调用一段已编译的 C语言函数,为什么要加 extern “C“?(分数:5.00)_正确答案:()解析:(1)对于#includefilename.h,编译器从工程指定路径搜索 filename.h; 对于#include “filename.h“,编译器从当前路径和工程指定路径搜索 filename.h; (2)C+语言支持函数重载,C 语言不支持函数重载,函数被 C+编译后在库中的名字与 C语言不同。C+提供了 C连接交换指定符号 extern “C“来解决名字匹配问题。 本题考查考生对预处理指令 include的正确理解。对于#includefilename.h来说,编译器会从工程指定路径搜索 filename.h文件;对于#include “filename.h“来说,编译器会从当前路径和工程指定路径搜索 filename.h文件。 C+语言支持函数重载,C 语言不支持函数重载,函数被
copyright@ 2008-2019 麦多课文库(www.mydoc123.com)网站版权所有
备案/许可证编号:苏ICP备17064731号-1