1.1内存的存储特性是什么? 答:最典型的存储特性是,数据一次存入,可多次取出,即取出的是它的副本,但一旦 数据被覆盖或者关闭计算机,就会导致内存中的数据完全丢失。这个特性使得内存特别适合 存储一些临时性数据,因为一旦重新启动,这些数据就自动消失。也正是这个特性,使得内 存不适合存储重要的数据,因为一旦死机,这些东西就再也找不回来了。 1.2自顶向下和逐步求精的具体含义是什么? 答:自顶向下逐步求精是结构化程序设计的基本准则,它们分别从两个不同的方面概括 了结构化程序设计的方法:自顶向下指的是程序功能模块的划分方法,强调“自顶向下”分 解功能模块,即由上到下、由抽象到具体将程序功能逐层分解:逐步求精指的是编码应遵循 的方法:由粗到细,逐步降低程序的抽象级 1.3在编写程序时,为什么要尽可能地利用标准库函数而不是自己去实现它 答:因为标准库函数通常是开发商经过反复验证并具有准确性、高效性和可移植性的函 数,因此,使用标准库函数既不会出错,又可以提高开发效率,降低开发成本,还可以使得 程序的结构更清晰、易读。 1.4一个C语言程序往往不是由一个而是由多个函数构成。为什么不写成一个函数呢? 答:一个程序如果是由一个函数构成,至少有两个重大缺陷。首先,程序的结构很糟糕 易读性极差;其次,调试和验证程序的正确性很困难甚至成为不可能。 1.5“在c语言程序中,语句之间必须用分号分隔”这个命题成立吗 答:不成立。分号不是C语言语句的分隔符,而是语句的终结符。 1.6c语言程序的文本外观格式非常自由,几乎无规则可言。但例1.1似乎遵循了某种 空白使用规则。你对此有和想法? 答:至少是视觉效果不错,程序结构很清晰,给读懂程序带来很大帮助 1.7什么是编译时错误?什么是运行时错误。请分别举出两种不同的错误例子。 答:分别指的是程序在编译期间出现的错误和运行期间出现的错误。将关键字定义为变 量或语句没有用分号结束都会导致编译时错误;被0除或数值溢出会导致程序运行时异常终 1.8预处理命令( preprocessor directives)是怎么处理的? 答:预处理命令是由预处理器解释执行的。解释执行过程可以简单描述为:预处理器首 先读入源程序文件,然后根据预处理命令修改源程序(比如文件包含命令 include,它将指 定的头文件中的内容替换这条命令),最后将修改后的源程序交编译器处理。 1.9下面的程序有何错误? #include <stdio. h /*本程序打印“ Hello, world!”*/ printf(”Helo, world!n”) 答:在注释行的最后多了一个分号,这将导致编译错讠 1.10下面的程序有何错误 #include <stdio. h int maino /*本程序打印“n=5”*/ printf(”n=3+2\n”)
1.1 内存的存储特性是什么? 答:最典型的存储特性是,数据一次存入,可多次取出,即取出的是它的副本,但一旦 数据被覆盖或者关闭计算机,就会导致内存中的数据完全丢失。这个特性使得内存特别适合 存储一些临时性数据,因为一旦重新启动,这些数据就自动消失。也正是这个特性,使得内 存不适合存储重要的数据,因为一旦死机,这些东西就再也找不回来了。 1.2 自顶向下和逐步求精的具体含义是什么? 答:自顶向下逐步求精是结构化程序设计的基本准则,它们分别从两个不同的方面概括 了结构化程序设计的方法:自顶向下指的是程序功能模块的划分方法,强调“自顶向下”分 解功能模块,即由上到下、由抽象到具体将程序功能逐层分解;逐步求精指的是编码应遵循 的方法:由粗到细,逐步降低程序的抽象级。 1.3 在编写程序时,为什么要尽可能地利用标准库函数而不是自己去实现它? 答:因为标准库函数通常是开发商经过反复验证并具有准确性、高效性和可移植性的函 数,因此,使用标准库函数既不会出错,又可以提高开发效率,降低开发成本,还可以使得 程序的结构更清晰、易读。 1.4 一个 C 语言程序往往不是由一个而是由多个函数构成。为什么不写成一个函数呢? 答:一个程序如果是由一个函数构成,至少有两个重大缺陷。首先,程序的结构很糟糕, 易读性极差;其次,调试和验证程序的正确性很困难甚至成为不可能。 1.5 “在 C 语言程序中,语句之间必须用分号分隔”这个命题成立吗: 答:不成立。分号不是 C 语言语句的分隔符,而是语句的终结符。 1.6 C 语言程序的文本外观格式非常自由,几乎无规则可言。但例 1.1 似乎遵循了某种 空白使用规则。你对此有和想法? 答:至少是视觉效果不错,程序结构很清晰,给读懂程序带来很大帮助。 1.7 什么是编译时错误?什么是运行时错误。请分别举出两种不同的错误例子。 答:分别指的是程序在编译期间出现的错误和运行期间出现的错误。将关键字定义为变 量或语句没有用分号结束都会导致编译时错误;被 0 除或数值溢出会导致程序运行时异常终 止。 1.8 预处理命令(preprocessor directives)是怎么处理的? 答:预处理命令是由预处理器解释执行的。解释执行过程可以简单描述为:预处理器首 先读入源程序文件,然后根据预处理命令修改源程序(比如文件包含命令 include,它将指 定的头文件中的内容替换这条命令),最后将修改后的源程序交编译器处理。 1.9 下面的程序有何错误? #include int main() { /* 本程序打印“Hello,world!”*/: printf(” Hello,world!\n”); } 答:在注释行的最后多了一个分号,这将导致编译错误。 1.10 下面的程序有何错误? #include ; int main() { /* 本程序打印“n = 5”*/ n = 0; printf(”n = 3+2\n”) }
答:本程序包含有三个错误,其中两个是编译错误,它们是:预处理命令不能以分号结 東:变量n未定义就被引用。第三个错误是未实现程序的要求:应输出“n=5”而实际输 出的是“n=3+2”,这个错误即不是编译错误也不是运行错误,而是属于算法错误 1.11请你改写例1.1,要求是去掉求最大公约数那个函数。 答:下面是它的一种改写方案: include /*预处理命令* #include /*预处理命令* int lcm(int, int) /*求最小公倍数函数原型声明* int main(void) /*以下是主函数模块* int a. b /*定义两个整型变量a和b*/ printf(" Enter2 Integers: a and b.(a>0,b>0):");/*输出提示行*/ scanf(%d%d",a, &b /*输入a和b*/ printf("lcm(%d, %d)=%d \n, a, b, lcm(a, b)) /*输出结果*/ return EXIT SUCCESS /*程序正常结束返回*/ int Icm(int m, int n) /*以下是求最小公倍数函数模块*/ nt a, b,r: while(b!=0) r= a %b return mkn/a;/*返回函数计算结果*/
答:本程序包含有三个错误,其中两个是编译错误,它们是:预处理命令不能以分号结 束;变量 n 未定义就被引用。第三个错误是未实现程序的要求:应输出“n = 5”而实际输 出的是“n = 3+2”,这个错误即不是编译错误也不是运行错误,而是属于算法错误。 1.11 请你改写例 1.1,要求是去掉求最大公约数那个函数。 答:下面是它的一种改写方案: #include /* 预处理命令 */ #include /* 预处理命令 */ int lcm(int,int); /* 求最小公倍数函数原型声明 */ int main(void) /* 以下是主函数模块 */ { int a, b; /* 定义两个整型变量 a 和 b */ printf( "Enter 2 integers:a and b.(a>0,b>0): " ); /* 输出提示行 */ scanf( "%d%d",&a,&b ); /* 输入 a 和 b */ printf( "lcm(%d, %d) = %d \n",a,b,lcm(a,b)); /* 输出结果 */ return EXIT_SUCCESS; /* 程序正常结束返回 */ } int lcm(int m,int n) /* 以下是求最小公倍数函数模块 */ { int a,b,r; a = m; b = n; while(b != 0) { r = a % b; a = b; b = r; } return m*n/a; /* 返回函数计算结果 */ }