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 <stdio.h>
int main()
{ /* 本程序打印“Hello,world!”*/:
printf(” Hello,world!\n”);
}
答:在注释行的最后多了一个分号,这将导致编译错误。
1.10 下面的程序有何错误?
#include <stdio.h>;
int main()
{ /* 本程序打印“n = 5”*/
n = 0;
printf(”n = 3+2\n”)
}
答:本程序包含有三个错误,其中两个是编译错误,它们是:预处理命令不能以分号结束;变量n未定义就被引用。第三个错误是未实现程序的要求:应输出“n = 5”而实际输出的是“n = 3+2”,这个错误即不是编译错误也不是运行错误,而是属于算法错误。
1.11 请你改写例1.1,要求是去掉求最大公约数那个函数。
答:下面是它的一种改写方案:
#include <stdio.h> /* 预处理命令 */
#include<stdlib.h> /* 预处理命令 */
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; /* 返回函数计算结果 */
}
答:最典型的存储特性是,数据一次存入,可多次取出,即取出的是它的副本,但一旦数据被覆盖或者关闭计算机,就会导致内存中的数据完全丢失。这个特性使得内存特别适合存储一些临时性数据,因为一旦重新启动,这些数据就自动消失。也正是这个特性,使得内存不适合存储重要的数据,因为一旦死机,这些东西就再也找不回来了。
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 <stdio.h>
int main()
{ /* 本程序打印“Hello,world!”*/:
printf(” Hello,world!\n”);
}
答:在注释行的最后多了一个分号,这将导致编译错误。
1.10 下面的程序有何错误?
#include <stdio.h>;
int main()
{ /* 本程序打印“n = 5”*/
n = 0;
printf(”n = 3+2\n”)
}
答:本程序包含有三个错误,其中两个是编译错误,它们是:预处理命令不能以分号结束;变量n未定义就被引用。第三个错误是未实现程序的要求:应输出“n = 5”而实际输出的是“n = 3+2”,这个错误即不是编译错误也不是运行错误,而是属于算法错误。
1.11 请你改写例1.1,要求是去掉求最大公约数那个函数。
答:下面是它的一种改写方案:
#include <stdio.h> /* 预处理命令 */
#include<stdlib.h> /* 预处理命令 */
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; /* 返回函数计算结果 */
}