课后习题解答(第1-7章)
第一章
1_1.
1_1_2 判断正误:即使两个整型数据未超出该数据的取值范围,它们的和也可能会超出该数据取值范围。 正确。
1_1_4 判断正误:一个C程序可以有多个函数,其中主函数必须在程序的最开头。 错误。其它函数如果要在主函数中使用的话,必须先在主函数之前定义或者声明。
1_1_6 判断正误:若有定义“float x=1.3;”,则表达式(int)x的值为1,因此可以说x中存放的值就是1。
错误。(int)x表达式的值与x的值是不一样的,前者是对x取整后的数值,而取整运算对x自身的值不会产生影响。
1_1_8 判断正误:若有命令行“#define N 1000”,则N++是不合法的表达式。 正确。N为符号常量,不能对符号常量进行修改。
1_1_10 C程序是由函数构成的,一个C程序必须有一个主函数。
1_1_12 以下变量中不合法的是②、④、⑥,合法的是①、③、⑤、⑦、⑧。 ①name ②double ③Int ④if ⑤for_1 ⑥2k ⑦a12345678 ⑧_a 1_1_14 下面程序段的输出结果是1,1.000000 int a; double b; a=b=123/100%2; printf(\
1_1_16 a*a*a*b*b/(c-d) 1_1_20 假设圆柱体的底面半径为r(=2.5),高为h(=3.5),请按下面给定的步骤编写求体积(体积=底面积X高)的程序。
①定义变量r,h,v(存放体积值),注意变量的数据类型。 ②给变量r,h赋值。
③计算体积,并将结果存放在v中。 ④输出r,h,v的值。 程序如下:
#include
float r, h, v; r=2.5; h=3.5;
v=PI*r*r*h;
printf(\, h, v); }
1_1_22 编写输出以下图形的程序。 * * # # # 3 3 3 3
程序如下:
#include
printf(\ printf(\
printf(\} 1_2
1_2_2 下面程序段的输出结果是a=3,b=-27 int a=10, b=10; a+=b-=a*=b/=3;
printf(\
本题考查复合赋值运算符及其运算过程。(从右到左运算,运算过程中变量的值会发生改变) 1_2_4 下面程序段的输出结果是a=10,b=10,c=12,d=11 int a=10, b=10, c, d;
c=(++a, b++, a++, ++b); /*该语句从整体来看完成一个赋值运算,而赋值运算的右侧表达式则是作逗号运算*/
d=--a, b--, --a, b--; /*这个语句从整体来看是作逗号运算,逗号运算的第一个子表达式是赋值运算,其它三个是自减运算*/
printf(\本题考查逗号运算,自加自减运算符以及它们与括号、赋值运算符等各种运算符的运算优先级次序。
1_2_6 语句printf(\的输出结果是-32765
第二章
2.1 基础部分习题
2_1_1. 判断正误:程序中的所有语句都被执行一次,而且只能执行一次。 错误。循环结构中循环体部分的语句就可执行多次,分支结构中只能选择其中的一个子句执行。
2_1_2. 判断正误:在C语言中,任何表达式的尾部加上一个分号就可以构成语句。 正确。
2_1_4. 编写程序输出12.5X3.4的值(要求:不使用变量); #include
printf(\ }
2_1_6
改正后的程序: #include
{
int m, h; h = 500/60; m = 500`;
printf(\分钟是%d小时%d分钟\ h, m); }
2_1_8
#include
char x, y, t; x=getchar(); y=getchar();
printf(\交换前: x=%c,y=%c\ t=x; x=y; y=t;
printf(\交换后: x=%c,y=%c\
}
2_2 提高部分习题
2_2_2 已有定义“int a; double b; char c;\和语句\c);\若通过键盘给变量a、b、c分别赋值12, 3.4和字符A,其正确的输入形式为12 3.4A
第三章
3_1 基础部分习题
3_1_1. 判断正误:逻辑运算符两侧的运算量可以是任何类型的数据。
正确。进行逻辑运算时,如果运算量是0值则被看成是逻辑值为0,非0值则被看作逻辑值1,最后的计算结果要么为0,要么为1(具体计算过程按逻辑运算规则进行)。 3_1_2. 判断正误:关系表达式和逻辑表达式的值只能是0或1。
正确。关系运算和逻辑运算的结果要么为真要么为假,在C语言中分别用1和0表示。 3_1_4. 能正确表示0≤a≤10的逻辑表达式是a>=0&&a<=10 3_1_6. 如果字符变量c中的字符为大写英文字母,则转换为小写英文字母的语句是c+=32; 3_1_8. 下面程序段的输出结果是1,1 char ch='b'; int x, y; x=ch=='B'+'a'-'A'; y='0'||'1'-'1';
printf(\解答:
对于x=ch=='B'+'a'-'A',首先要清楚运算符计算的优先次序(从整体来看是执行一个赋值运算,而赋值运算符右边的表达式是执行一个关系运算,关系运算的左侧变量ch值为'b',右侧为算术表达式(对于字符型数据的算术运算和关系运算等都是依据各字符的ASCII码值进行,因此该表达式的值为'b'),从而赋值运算右侧关系表达式值为1,x即被赋值为1)。
对于y='0'||'1'-'1',逻辑运算符两侧的运算量要先转换为0或1值。对于字符?0?,由于其ASCII码值48为非0值,因此||右边的运算不用再进行,整个逻辑表达式结果为1,则y被赋值1。
3_1_10. 下面程序段的输出结果是BBBCCC 该题主要考查switch结构,要注意各case子句中有无break语句的区别。
3_2 提高部分习题
3_2_2. 下面程序段的输出结果是2 该题考查条件运算符 ? : , 它的一般形式是: 表达式1?表达式2:表达式3
当表达式1的计算结果为非0值(即它所表达的条件为真)时,运算结果取表达式2的值,否则取表达式3的值。
第四章
4_1 基础部分习题
4_1_2 判断正误:由于表达式x%3 != 0和x%3的值相等,所以while(x%3 != 0)和while(x%3)等价。
错误。条件存在问题,故因果关系不成立。因为x%3 != 0的值只能为0或者1,而x%3的值可为0,1或2。
4_1_4 若分别运行以下程序段,从键盘输入eor
4_1_12
#include
{ if(ch>='A' && ch<='Z') ch=ch+32; if(ch>='a' && ch<='z') { ch=ch+2; if(ch>'z') ch=ch-26; } putchar(ch); ch=getchar(); }while(ch!='#'); }
4_1_14
提示:如果要通过数据验证一个程序是否正确,应该将各种可能的情况都考虑到。
如输入的字符串数据可能出现的情况有:所有字符都为大写字母,所有字符都为小写字母,大小写字母混合,所有字符不是字母,大写字母与其它字符混合等等。 4_1_15
#include
int n = 0, sum = 0; do {
n++;
sum += n;
}while(sum < 1000); sum -= n; n--;
printf(\}
4_1_16
#include
int n, sum = 0;
for(n = 2; sum <= 1000; n+=2) sum += n; n-=2;
printf(\} 或者
#include