游洪跃的C语言程序设计第7章 习题解答

更新时间:2023-12-09 10:15:01 阅读量: 教育文库 文档下载

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

第7章 习题解答

一、选择题

1.有以下程序:

/* 文件路径名:ex7_1_1\\main.c */ #include #define HDY(a, b) a/b int main(void) { int a = 1, b = 2, c = 3, d = 4, y; y = HDY(a + c, b + d); printf(\ return 0; }

/* 标准输入/输出头文件 */ /* 带参宏 */

/* 主函数main() */

/* 定义变量 */

/* 调用带参宏HDY */ /* 输出k */

/* 返回值0, 返回操作系统 */

下面针对该程序的叙述正确的是 。 A)编译有错 B)运行出错 C)运行结果为y=0 D)运行结果为y=6

解析:宏替换后,表达式\即变为k=a+c/b+d=6。 答案:D

2.有以下程序:

/* 文件路径名:ex7_1_2\\main.c */ #include #define N 5 #define M N+1 #define f(x) (x*M) int main(void) { int i1, i2; i1 = f(2); i2 = f(1 + 1); printf(\ %d\\n\ return 0; }

/* 标准输入/输出头文件 */ /* 无参宏 */ /* 无参宏 */ /* 带参宏 */

/* 主函数main() */

/* 定义变量 */ /* 调用带参宏 */ /* 输出i1,i2 */

/* 返回值0, 返回操作系统 */

程序的运行结果是 。 A)12 12 B)11 7 C)11 11 D)12 7 解析:根据宏定义可得f(2)=2*5+1=11,f(1+1)=1+1*5+1=7。 答案:B

3.以下叙述中正确的是 。

A)预处理命令行必须位于C源程序的起始位置 B)在C语言中,预处理命令行都以#开头

C)每个C程序必须在开头包括预处理命令行:#include D)C语言的预处理不能实现宏定义和条件编译的功能

解析:以#开头的行都称为“编译预处理”行;预处理功能主要包括宏定义、文件包含和条件编译等。预处理命令行可放在C源程序的任何位置,“#include”实现文件包含的功能,不是每个C程序都必须包含#include命令。

答案:B

4.有以下程序:

/* 文件路径名:ex7_1_4\\main.c */ #include /* 标准输入/输出头文件 */ #define f(x) (x*x) /* 带参宏 */ int main(void) /* 主函数main() */ { int i1, i2; /* 定义变量 */ i1 = f(8) / f(4); i2 = f(4+4) / f(2+2); /* 调用带参宏 */ printf(\ %d\\n\ /* 输出i1,i2 */ return 0; /* 返回值0, 返回操作系统 */ }

程序运行后的输出结果是 。 A)64,28 B)4,4 C)4,3 D)64,64

解析: il=f(8)/f(4)进行宏替换后il=(8*8)/(4*4)=4,i2=f(4+4)/f(2+2)= (4+4*4+4)/(2+2*2+2) = 24/8 = 3。所以输出结果为4, 3。

答案:C

5.以下叙述中正确的是 。

A)预处理命令行必须位于源文件的开头 B)在源文件的一行上可以有多条预处理命令 C)宏名必须用大写字母表示

D)宏替换不占用程序的运行时间

解析:预处理命令行可以出现在源程序的任何位置上,所以选项A是错误的。源程序的一行上只能出现一条预处理命令,因此选项B也是错误的。宏名只要是符合要求的标识符都可以,没有规定一定要大写,因此选项C也是错误的。宏替换在程序编译时,就由编译程序对出现的宏名进行了相应的宏替换,因此宏替换不占用程序的运行时间。选项D是正确的。

答案:D

*6.下列描述中正确的是 。

A)软件工程只是解决软件项目的管理问题 B)软件工程要解决软件产品的生产率问题

C)软件工:程的主要思想是强调在软件开发过程中需要应用工程化原则 D)软件工程只是解决软件开发中的技术问题

解析:软件工程是计算机软件开发和维护的工程学科,采用工程的概念原理、技术和方法来开发和维护软件,它把经过时间考验而证明正确的原理技术和当前能够得到的最好技术结合起来。

答案:C

*7.下列描述中正确的是 。 A)程序就是软件 B)软件开发不受计算机系统的限制 C)软件既是逻辑实体,又是物理实体 D)软件是程序、数据与相关文档的集合 解析:计算机软件包括程序、数据及相关文档的完整集合。软件具有以下特点:(1)软件是一种逻辑实体,而不是物理实体;(2)软件的生产过程与硬件不同,它没有明显的制作过程;(3)软件在运行、使用期间不存在磨损、老化问题;(4)软件的开发、运行对计算机系统具有依赖性,受计算机系统的限制,这导致软件移植的问题;(5)软件复杂性高,成本昂贵;(6)软件开发涉及诸多的社会因素。

答案: 二、填空题

1.下面程序编译运行的结果是 。

/* 文件路径名:ex7_2_1\\main.c */ #include #define N 10 #define f(x) (x*N) int main(void) { int i; i = f(1+1); printf(\ return 0; }

/* 标准输入/输出头文件 */ /* 无参宏 */ /* 带参宏 */

/* 主函数main() */

/* 定义变量 */ /* 调用带参宏 */ /* 输出i */

/* 返回值0, 返回操作系统 */

解析:宏替换后可得i=(1+1*10)=11。 答案:11

2.执行以下程序的输出结果是 。

/* 文件路径名:ex7_2_2\\main.c */ #include #define M 5 #define N M+M int main(void) { int k; k = N * N * 5; printf(\ return 0;

/* 标准输入/输出头文件 */

/* 无参宏 */ /* 无参宏 */

/* 主函数main() */

/* 定义变量 */ /* 调用无参宏 */ /* 输出k */

/* 返回值0, 返回操作系统 */

}

解析:宏替换成k= M+M*M+M*5=5+5*5+5*5=55。 答案:55 三、编程题

1.请编写一个宏定义MOD(a,b),用来求a除以b的余数,并编写测试程序。 参考程序:

/* 文件路径名:ex7_3_1\\main.c */ #include /* 包含库函数printf()所需要的信息 */ #include /* 包含库函数system()所需要的信息 */

#define MOD(a, b) ((a) % (b)) /* 带参宏定义 */

int main(void) /* 主函数main() */ { int a, b; /* 定义变量 */ printf(\输入两个整数:\ /* 输入提示 */ scanf(\ /* 输入a,b */ printf(\输出结果 */ system(\ /* 调用库函数system( ),输出系统提示信息 */ return 0; /* 返回值0, 返回操作系统 */ }

2.请编写一个宏定义SWAP(type,a,b),用以交换type类型的两个参数,并编写测试程序。

提示:用复合语句实现。 参考程序:

/* 文件路径名:ex7_3_2\\main.c */ #include /* 包含库函数printf()所需要的信息 */ #include /* 包含库函数system()所需要的信息 */

#define SWAP(type, a, b) { type tem = (a); (a) = (b); (b) = tem; } /* 带参宏定义 */

int main(void) /* 主函数main() */ { int a, b; /* 定义变量 */ printf(\输入两个整数:\ /* 输入提示 */ scanf(\ /* 输入a,b */ SWAP(int, a, b); /* 交换a,b */ printf(\ %d\\n\ /* 输出a,b */

}

system(\return 0;

/* 调用库函数system( ),输出系统提示信息 */ /* 返回值0, 返回操作系统 */

3.请编写一个宏定义IS_DIGIT(c),用以判断c是否为数字字符,如果是,得1,否则得0,并编写测试程序。

参考程序:

/* 文件路径名:ex7_3_3\\main.c */ #include /* 包含库函数printf()所需要的信息 */ #include /* 包含库函数system()所需要的信息 */

#define IS_DIGIT(c) ((((c) >= '0') && ((c) <='9')) ? 1 : 0) /* 带参宏定义 */

int main(void) /* 主函数main() */ { char c; /* 定义变量 */ printf(\输入一个字符:\ /* 输入提示 */ c = getchar(); /* 输入一个字符 */ if (IS_DIGIT(c)) printf(\是数字字符\\n\ else printf(\不是数字字符\\n\ system(\ /* 调用库函数system( ),输出系统提示信息 */ return 0; /* 返回值0, 返回操作系统 */ }

4.请编写一个宏定义LEAP_YEAR(year),用以判断年份year是否为闰年,如果是,得1,否则得0,并编写测试程序。

参考程序:

/* 文件路径名:ex7_3_4\\main.c */ #include /* 包含库函数printf()所需要的信息 */ #include /* 包含库函数system()所需要的信息 */

#define LEAP_YEAR(year) (((year) % 4 == 0 && (year) % 100 != 0 || (year) % 400 == 0) ? 1 : 0) /* 带参宏定义 */

int main(void) /* 主函数main() */ { int year; /* 定义变量 */ printf(\输入年份:\ /* 输入提示 */ scanf(\ /* 输入年份 */ if (LEAP_YEAR(year)) printf(\是闰年\\n\ else printf(\不是闰年\\n\ system(\ /* 调用库函数system( ),输出系统提示信息 */ return 0; /* 返回值0, 返回操作系统 */ }

*5.三角形的面积为s?p(p?a)(p?b)(p?c),其中p?1(a?b?c),定义两个2宏,一个宏P(a, b, c)用来求p,一个宏S(a, b, c)用来求面积s,并编写测试程序。

参考程序:

/* 文件路径名:ex7_3_5\\main.c */ #include /* 包含库函数printf()所需要的信息 */ #include /* 包含库函数system()所需要的信息 */ #include /* 包含库函数sqrt()所需要的信息 */

#define P(a, b, c) (((a) + (b) + (c)) / 2) /* 定义带参宏 */

#define S(a, b, c) sqrt(P(a, b, c) * (P(a, b, c) - a) * (P(a, b, c) - b) * (P(a, b, c) - c)) /* 定义带参宏 */

int main(void) /* 主函数main() */ { float a, b, c; /* 定义变量 */ printf(\输入三角形的三边:\ /* 输入提示 */ scanf(\ /* 输入三边 */ printf(\三角形的面积为%f\\n\/* 输出结果 */ system(\ /* 调用库函数system( ),输出系统提示信息 */ return 0; /* 返回值0, 返回操作系统 */ }

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

Top