顺序结构作业解答(2)
一、选择题:
1. 有以下程序:
#include
{ int a=10, b=20, c=30; printf(“%d\\n”, (a=50, b*a,c+a)); }
程序运行后输出结果是
a) 40 b)50 c)600 d)80
答案:d)
解答:(a=50, b*a,c+a)是一个逗号表达式,执行的顺序按排列顺序进行,整个表达式的值
是括号中最后一个表达式的值。计算过程: a=50,——> a的值为50;
a*b, ——> a的值仍然为50,b的值仍然为20;a*b的值为1000;
c+a, ——> a的值仍然为50,c的值仍然为30;c+c的值为30+50,即80;
2. 有以下程序:
#include
x=x++;
printf(\
}
程序运行后输出结果是
a) 1 b)0 c)编译出错 d)不错定
答案:d)
解答:x=x++;的执行顺序为: 首先取x的值,那么x的值是什么呢?在一对{ } 之间定义的变量,称为局部变量,系统对没有赋初值的局部变量不作任何处理,即,它的值是不确定的。 然后将取出的x值赋给“=”左边的x,最后x的值增1; 进一步思考:如果上面的程序段改成: #include
void main() { int x=1;
x=x++;
printf(\ } 程序运行后输出结果应该是什么值?
3. 有以下程序:
#include
z++;
printf(“%d\\n”, z);
}
{ int x=1, y=5,z; z=x%y; 程序运行后输出结果是
a) 1 b)2 c)5 d)0
答案:b)
解答:z=x%y;的执行结果为:1%5(1除以5的余数)的值为1;将1赋给z; z++; 的执行结果为:z的值增1;
4. 有以下程序: #include
void main() {
float x=1, y=5,z; z=x%y; z++;
}
printf(“%d\\n”, z); 程序运行后输出结果是
a) 2 b)5
c)编译程序指出,程序第5行有错 d) 编译程序指出,程序第5、6、8行有错
答案:c)
解答: 1. %运算两个运算数必须是整数;
2. ++运算的运算量必须是整型变量;但是因为在之前已经指出z的错误,所以这 里不再给出错误信息。
3. “printf(“%d\\n”, z);”的错误是用“%d”说明一个float类型量的输出格式, 输出结果是错误的,但语法检查,不提示错误信息。
5. 有以下程序: #include
{ int x; x=32768; printf(“%d\\n”, x); } 程序运行后输出结果是
a) -32768 b)32768 c)0 d)编译出错
答案:a) 解答: 1. 32768对应的二进制数为10000000 00000000;最高位为1。 2. 按“%d”格式输出,意味着,将x中的值识别为十进制有符号整数。即:
最高位为符号位。当最高位为0时,该数为正数,后15位存放的是数的原码; 当最高位为1时,该数为负数,后15位存放的是数的反码。
3. 32768对应的二进制数为10000000 00000000;最高位为1。后15位“0000000 00000000”为一个数的补码,补码=反码+1;所以反码为01111111 11111111,
15
原码为100000000 00000000,即原码=2=32768,x的值为-32768。
6. 有以下程序:
#include
}
{ int m=10; printf(“%d\\n”, (--m*3/5)); 程序运行后输出结果是
a) 6 b)5 c)4 d)7
答案:b) 解答:
“printf(“%d\\n”, (--m*3/5));”的执行结果是输出表达式(--m*3/5)的值; 表达式(--m*3/5)的计算过程:
1. m作自减运算,m变为9;
2. 然后取m的值与3作乘法,结果味27; 3. 27与5作整除,结果为5;
7. 有以下程序:
#include
}
{ int m=10,n=20; printf(“m=%d\\nn=%d\\n”, m,n); 程序运行后输出结果是
a) 10 20 b)10 c)m=10 n=10 d)m=10
20 n=10 答案:d)
解答:
printf语句的格式控制串中有三类字符:
? 格式控制字符:控制输出的表达式的值的格式,%d、%f、%c等;
? 转义字符:\\n等控制输出换行等。 ? 按原样输出的普通字符:除格式控制字符、转义字符以外的所有字符都成为普通字符,这类字符会按他所在的位置和样式按原样输出。
8. 有以下程序:
#include
float y;
printf(“input 1020304050
scanf(“-_=”,&x,&y,&z); printf(“x=%d y=%f z=%d\\n”,x,y,z); }
程序运行后输入1020304050<回车>,则输出结果是
a) x=10 y=20304 z=050 b) x=10 y=20304.000000 z=050 c) x=10 y=20304 z=50 d) x=10 y=20304.000000 z=50 答案:d)
解答:
scanf语句的格式控制串中的域宽的作用: 当输入数据宽度够用时,按宽度读取数据;对于本问题,首先提示用户:输入 1020304050 ,然后按回车键;当用户输入:1020304050并按了Enter键后,程序的执行过程式这样的:
? 首先按-格式,读取两个数字,按有符号十进制数送入变量x中。x=10
? 然后按_格式,读取5个数字,按十进制float数送入变量y中。 _意味着从当前位置开始包括小数点读取5位。如果输入的数据有小数点,将小数点读入;如果输入的数据没有小数点,则在数的末尾加上小数点;所以,y=20304.000000
? 最后按=格式,读取三个数字,按有符号十进制数送入变量z中。z=50 ? 需要说明的一点:
? ?
在scanf语句中 读入float类型数据时 ,用%f格式,可以加整数域宽,例:_,但不可以写成%5.1f。
在scanf语句中 读入double类型数据时 ,用%lf格式,可以加整数域宽,例:%5Lf,但不可以写成%5.1Lf。
9. 若有定义“long x=100000;”,则正确输出x的值的语句是
a) printf(“x=%d” , x); b) printf(“x=%ld” , x); c) printf(“x=%f” , x); d) printf(“x=%lf” , x);
答案:b) 解答:
printf语句的格式控制字符控制输出的表达式的值的格式,%d、%f、%c等;不同类
型的数据需要按指定格式符输出;
int %d; long ld; float %f; double %lf; char %c;
10. 若有定义“double x=123.5;”,则正确输出x的值的语句是
a) printf(“x=%d” , x); b) printf(“x=%ld” , x);
c) printf(“x=%f” , x); d) printf(“x=%lf” , x); 答案:d)
11. 若有输入语句“scanf(“%d,%d,%d”,&x,&y,&z);”,欲使x值为10,y值为20,z值为30,
则正确的输入是
a) 10 ,20 ,30<回车> b)10 20 30<回车>
c) 10,20,30<回车> d)10<回车>,20<回车>,30<回车> 答案:c)
解答:若输入语句scanf的格式控制串中有普通字符,在输入数据时,必须按格式控制串中的样式一点不差的输入,才能读入正确的数据。
二、填空题:
1. 结构化程序设计提倡使用的三种基本控制结构为 顺序结构、选择结构、循环结构 。 2. 顺序结构中的语句可被执行 一 次。 3. 有以下程序:
#include
{ int a=021, b=216;
printf(“%d %x\\n”, a,b ); } 程序运行后输出结果是 17 d8 。
4. 若有定义“int a=1,b=2;”,则语句“a=a+b;b=a-b;a=a-b;”的作用是 将a与b的内容交
换 。
5. 有以下程序:
#include
{ double a; int b; b=a=10/4; printf(“%d,%f\\n”, b,a); 程序运行后输出结果是 2, 2.000000 。
}