《新标准 C++程序设计》习题解答
第 1 章-第 10 章
郭炜
第一章
1. 将下列十进制数表示成 16 位二进制形式和 4 位十六进制形式:255,-254,-1,10,20,-12。
解答:题目的意思是,如果在计算机内部用 16 位二进制形式和 4 位 16 进制形式表示上面的数,会
是什么样子。要求最高位是符号位,负数的符号位是 1。因此答案为:
255:
-254:
-1:
10:
20:
-12:
0000 0000 1111 1111, 00FF
1111 1111 0000 0010, FF02
1111 1111 1111 1111, FFFF
0000 0000 0000 1010, 000A
0000 0000 0001 0100, 0014
1111 1111 1111 0100, FFF4
2. 将下列 16 位的有符号二进制数转换成十进制形式:
1000 1111 0000 1111, 0000 1011 0000 1111, 1111 1111 0000 1111
1111 1111 1111 1110, 1000 0000 0000 0000, 0000 0000 1100 1110
解答: -28913,2831,-241,-2,-32768,206
3. 将下列有符号 4 位 16 进制数转换为十进制数:
FC34, 7000, 00a5, 1004, 7F45, 7700, C0C0, 0FFF,FFFF
解答:-972,28672,165,4100,32581,30464,-16192,4095,-1,
第二章
1. 以下哪些是合法的 C++标识符,哪些不是?
2Peter
__day
_num_of
sch-name;
解答:第一个和第四个不是,因为标识符不能以数字开头,中间不能有除了“_”和“-”以外的
标点符号。其他的是合法的。
2. 编写一个程序,输入 3 个整数,输出他们的平均数。
解答:
#include
using namespace std;
int main()
{
}
int a,b,c;
cin >> a >> b >>c;
cout << (a+b+b)/3.0;
return 0;
3. 说出下面各个类型的变量所占的字节数和表示范围:
short , int, unsigned int, long long, unsigned char, char
解答:参见本章正文
4. 已知字母'a'的 ASCII 码是 97,请写出下面程序的输出结果:
#include
using namespace std;
int main()
{
int n1 = 'a';
unsigned short n2 = 0xffff;
int n3 = n2;
short n4 = n2;
cout << n1 << "," << n2 << "," << n3 << "," << n4 << endl;
double f = 6/5;
n3 = 5/(double) 2;
char c = 102;
int n5 = 0xffffffff + 2;
cout << c << "," << f << "," << n3 << "," << n5 << endl;
return 0;
}
解答:
97,65535,65535,-1
f,1,2,1
解释:n4 是有符号的,会表示负数,n4=n2 执行后,n4 的内容是 n2 的拷贝,即 n4 最高位为 1,表示
负数,因此输出 n4,得-1
5. 计算下列表达式的值(答案可写十六进制)
(1) 5 * 4 / 3 + (7 % 2)
(2) 0xfff4 >> 2
(3) 0xea8 << 3
(4) 12 ^ 23
(5) ~24
(6) 0x7fff0000 >> 3
解答:
(1)7
(2)3ffd
(3)7540
(4)1b
(5)ffffffe7
(6)fffe000
6. 已知有 int a = -10, b = 20, c = 30; 请写出以下每个表达式计算结束后 a 的值。
(1) a = b = ++c
(2) a = b | c
(3) a = ( b > c)
(4) b ++ && (a += 10)
(5) a ^= b
(6) a <<= 5
(7) a >> 4
(8) a >>= 4
(9) a = sizeof(int)
(10) a = sizeof(char)
(11) a = sizeof(double)
(12) a+=a-=a*a
解答:
(1)31
(2)30 10100 | 11110 = 11110 即是 30
(3)0 (4)0
(5)-30 a=-10,其十六进制形式是:FFFF FFF6
(6)-320, 因左移 5 位后十六进制形式为 FFFF FEC0
(7)-10 不会改变 a
(8)-1 左移动 4 位后,高位补符号位 1,因此结果的为 FFFF FFFF
(9)4 (10)1
(11)8
(12) -220
7. a 是 int 型变量,请写一个表达式,表达式的值和 a 的第 i 位相等( i = 0 ... 31)。
解答:(a >> i) & 1
8. a 是 int 型变量,请写一个表达式,表达式的值等于 a 的第 i 位取反( i= 0 ... 31)。
解答:((a >> i) & 1)^1
9. 已知有 int 类型变量 a,b,请写一条语句,使得 a 的第 3 位到第 7 位和 b 相同,其余位都是 0。
解答:a = b & 0xf8;
10. 已知有 int 类型变量 a,b,c, 请写一条语句,使得 a 的第 3 位到第 7 位和 b 相同,其余位都和 c
相同。
解答:a = (b & 0xf8) | ( c & 0xff07);
11. 已知有 int 类型变量 a,b,请写一条语句,使得 a 的第 3 位到第 7 位和 b 的第 27 到 31 位相同,
其余位都是 0。
解答:a = ( b & 0xF8000000 ) >> 24;
12. 写出下面程序片断的输出结果:
(1)
int a = 0, b = 30;
bool c = a ++ || b ++;
cout << a << "," << b << "," << c << endl;
解答:1,31,1
(2)
int a = 0, b = 30;
bool c = a ++ && b ++;
cout << a << "," << b << "," << c << endl;
解答: 1,30,0
逻辑表达式是短路计算的,a++的值 0,即为假,则整个表达式 a ++ && b ++ 就可判断为假,后面
的 b++不会被执行,因此 b 的值还是 30
(3)
char c = 'a' + 4;
cout << c << "," << (int) c + 3 << endl;
解答:e,104
(4)
int a = 0,b = 10, c;
c = a++;
c = ++ b;
cout << a << "," << b << "," << c << endl;
解答:1,11,11
(5) int a = 0,b = 10;
bool c = ( a == b);
cout << c << endl;
解答:0
1. 编写程序,每读入 3 个整数,就将他们从大到小排序输出。读到连续的 3 个 0,则程序结束。
第三章
输入样例:
3 4 5
7 2 9
0 0 0
输出样例:
5 4 3
9 7 2
解答:
#include
using namespace std;
int main()
{
int a,b,c;
while(1) {
cin >>a >> b >>c;
if( a == 0 &&b == 0 &&c == 0)
break;
if( a >= b && b >=c )
cout << a << " " << b << " " << c <= c && c >= b)
cout << a << " " << c << " " << b <= a && a >= c)
cout << b << " " << a << " " << c <= c && c >= a)
cout << b << " " << c << " " << a <= a && a >= b)
cout << c << " " << a << " " << b < ***
*****
*******
解答:
#include
using namespace std;
int main()
{
int n;
cin >> n;
int m = 2 * (n-1) + 1;
for(int i = 0;i < n; ++i) {
int k = 2 * i + 1;
for(int j = 0; j < (m - k)/2; ++j )
cout << " ";
for(int j = 0;j < k; ++j )
cout << "*";
for(int j = 0; j < (m - k)/2; ++j )
cout << " ";
cout <
using namespace std;
int main()
{
int n;
cin >> n;
int a1 = 1,a2 = 1;
for(int i = 0;i < n-2; ++i) {
int tmp = a1+a2;
a1 = a2;
a2 = tmp;
}
cout << a2;
return 0;
}
5. 已知今天是星期二,问 n 天后是星期几(n>=0)。程序输入 n,输出“Monday"、"Tuesday"、
"Wednesday"、"Thursday"、"Friday"、"Saturday"或"Sunday"。
解答:
#include
using namespace std;
int main()
{
int n;
cin >>n;
switch( n % 7 ) {
case 0:
cout << "Tuesday";
break;
case 1:
cout << "Wednesday";
break;
case 2:
cout << "Thursday";
break;
case 3:
cout << "Friday";
break;
case 4:
cout << "Saturday";
break;
case 5:
cout << "Sunday";
break;