问答题
试题五
阅读以下说明,回答下列问题。
[说明]
在某嵌入式处理器上,编写以下两段程序(编译选项中,存储采用4字节对齐方式)。
程序段1:
struct student1{
char name[10];
long sno;
char sex;
float score[4];
} *p1, a1, b1;
程序段2:
union student2{
char name[10];
long sno;
char sex;
float score[4];
} *p2, a2, b2;
汉诺塔问题说明:有n个盘子在A处,盘子从小到大,最上面的盘子最小,程序要把这n个盘子从A处搬到C处,可以在B处暂存,但任何时候都不能出现大的盘子压在小的盘子上面的情况。
下列是一段求解汉诺塔问题的C语言程序。
#include <stdio.h>
void move(int n, char a, char c)
{
static int Step=1;
printf("Step %2d: Disk %d %c---> %c\n",Step,n,a,c);
Step++;
}
void Hanoi(int n, char a, char b, char c)
{
if (n>1)
{
Hanoi(n-1, a, c, b);
move(n, a, c);
Hanoi(n-1, b, a, c) ;
}
else move(n, a, c);
}
void main()
{
Hanoi(3,'A', 'B', 'C');
}
问答题
C语言函数的一般格式为:
<函数类型> <函数名> (<参数列表>)
{
<函数体>;
}
简答下述问题。
(1)<函数类型>的含义是什么?
(2)<参数列表>的含义是什么?
(3)C语言函数之间的参数如何传递?
【正确答案】 (1)的含义是:函数返回值的类型,无返回值时应写为void。
(2)的含义是:函数的接口参数,可以为空,即表示没有参数,但函数名后面的()不能省略。
(3)C语言函数之间的参数传递是传值,是通过栈来传递的。
【答案解析】 本题考查C语言应用知识。
C语言函数的一般格式为:
<函数类型> <函数名> (<参数列表>)
{
<函数体>;
}
其中<函数类型>为函数返回值的类型,无返回值时应写void;<参数列表>为函数的接口参数,可以为空,即表示没有参数,但函数名后面的()不能省略。
C语言函数之间的参数传递是传值,是通过栈来传递的。调用时所有参数在栈中新开辟相应类型的单元并将实参值填入,函数中对参数的任何操作都是对栈中单元的操作,调用结束,栈中开辟的相应单元都会释放,并不影响实参变量的值。
问答题
回答问题。
(1)sizeof(struct student1)结果是多少?
(2)sizeof(union student2)结果是多少?
(3)变量a2在程序段2中定义,写出执行以下语句后的输出结果。
strcpy(a2. name, "zhangwei");
a2. Sex='f';
printf("%s", a2.name);
【正确答案】 (1)sizeof(struct student1)结果为:31
(2)sizeof(union student2)结果为:16
(3)执行语句后的结果为:“fhangwei”
【答案解析】 student1是一个结构体,sizeof(struct student1)结果为所有元素字节数之和,因此sizeof(struct student1)结果为:10+4+1+16=31字节。
student2是联合体(或共用体),sizeof(union student2)结果为其中最长一个元素的字节数。因此sizeof(union student2)结果为:16字节。
变量a2在程序段2中定义,执行以下语句:
strcpy(a2. name, "zhangwei");
a2. sex='f';
printf("%s", a2. name);
结果为:"fhangwei"
问答题
仔细阅读求解汉诺塔问题的C语言程序,完成其中(1)~(4)空白填空。
运行结果为:
Step 1:Disk 1 A--->C
Step 2: ____(1)____
Step 3:Disk 1 C--->B
Step 4: ____(2)____
Step 5: ____(3)____
Step 6:Disk2 B--->C
Step 7: ____(4)____
【正确答案】 (1)Disk 2 A--->B
(2)Disk 3 A--->C
(3)Disk 1 B--->A
(4)Disk 1 A--->C
【答案解析】 汉诺塔问题是指有n个盘子在A处,盘子从大到小,最上面的盘子最小,现在要把这n个盘子从A出搬到C处,可以在B处暂存,但任何时候不能出现大的盘子压在小的盘子上面的情况。算法如下:
(1)若n=1,则可以将盘子直接从A处搬到C处;
(2)假设n-1时,指导如何解;
(3)则n时,根据(2)的假设,可以先把前n-1个盘子从A处通过C处搬到B处,就可以把第n个盘子直接从A处搬到C处,再把前n-1个盘子从B处通过A处搬到C处,则完成了全部盘子搬动。
因此,运行结果为:
Step 1:Disk 1 A--->C
Step 2:Disk 2 A--->B
Step 3:Disk 1 C--->B
Step 4:Disk 3 A--->C
Step 5:Disk 1 B--->A
Step 6:Disk 2 B--->C
Step 7:Disk 1 A--->C