练习2.1到2.10对应于2.1节到2.12节。练习2.11到2.13对应于2.13节到2.21节。
2.1 填空:
a)所有程序均可用三种控制结构编写:——、——和——。
b)——选择结构用于在条件为true时执行一个操作,条件为false时执行另一个操作。
c)将一组指令重复特定次数称为——重复。
d)事先不知道一组指令重复次数时,可以用——值终止重复。
2.2 编写四种不同的“+语句,对整数变量x加1。
2.3 编写完成下列任务的C++语句:
a)将x和y的和赋给z,并在计算之后将z的值加1。
b)测试变量count的值是否大于10。如果是,则打印“Count is greater than 10"。
c)将变量x减1,然后将total变量的值减去x。
d)计算q除以divisor的余数,并将结果赋给q。用两种方法编写这个语句。
2.4 编写完成下列任务的C++语句:
a)将变量sum和x声明为int类型。
b)将变量x初始化为1。
c)将变量sum初始化为0。
d)将x加进sum中,井将结果赋给sum。
c)打印"The sum is:"加上sum的值。
2.5 将练习2.4的语句合并为一个程序计算和打印从l到10的整数的和。利用while结构在
计算和递增语句之间循环,循环在x为11时终止。
2.6 确定计算完成后每个变量的值。假设每个语句开始执行时,所有变量为整数值5。
a)product*=x++;
b)quotient /=++x;
2.7 编写一条C++语句:
a)用cin和>>输入整型变量x。
b)用cin和>>输入整型变量y。
c)将整型变量i初始化为1。
d)将整型变量power初始化为1。
e)将变量power乘以x并将结果赋给power。
f)将变量i加1。
g)测试i是否小于或等于y。
h)用cout和<<输出整型变量power。
2.8 编写一个C++程序,用练习2.7的语句计算x的y次方。程序采用while重复控制结构。
2.9 判断下列语句的对错,并纠正其中的错误。
a)while(c<=5) { procuct*=c; ++c; b)cin<< value; c)if(gender==1) cout << "Woman" << endl; else; cout << "Man" << endl;
2.10下列while结构错在哪里;
while(z>=O) sum += z;
2.11 判断下列各题是否正确。如果不正确,请说明原因。
a)switch选择结构中必须有default。
b)switch选择结构的default中必须有break语句才能正确退出这个结构。
c)如果表达式x>y为true或a<b为true,则表达式(x>y&&a<b)为true。
d)如果至少有一个操作数为true,则包含||运算符的表达式为true。
2.12编写一条或一组C++语句,完成下列任务:
a)用for结构求1到99的奇数和。假设已经声明整型变量sum和count。
b)在域宽为15个字符、精度分别为1、2、3的输出域中打印数值333.546372。在同行打印每个值,在输出域中左对齐每个值。
c)用pow函数计算2.5的3次方。在域宽为10个字符、精度分别为2的输出域中打印计算结果。
d)用while循环和计数器变量x打印1到10的整数。假设变量x已经声明,但还没有初始化。每行只打印5个整数。提示:用算式x%5。数值为0时,打印换行符,否则打印制表符。
e)用for结构重做练习2.12d)。
2.13 寻找下列代码中的错误并说明如何纠正。
a) x = 1 while (x<=10); x++; b)for(y=.1;y!=1.O;y+=.1) cout << y << endl; c)switch (n) { case 1: cout<<"The number is 1"<< endl; case 2: cout<< "The number is 2" << endl; break; default: cout <<"The number is not 1 or 2" << endl; break;
d)下列代码打印1到10的值。
n = 1; while (n < 10) cout << n++ << endl;
2.1 a)顺序、选择和重复。b)if/else。c)计数器控制或确定。d)标记(记号、标志或哑元)。
2.2 x = X + 1; x += 1; ++X; x++; 2.3 a) z= x++ + y; b) if ( count > 10 ) cout << "Count is greater than 10" << endl; c) total -= --x; d) q %= divisor; q = q % divisor; 2.4 a) int sum, x; b) x = 1; c) sum = 0; d) sum += x;或sum = sum + x; e) cout << "The sum is:" << sum << endl;
2.5 如下所示:
// Calculate the sum of the integers from 1 to 10
#include < iostream.h>
int main()
{
int sum,x;
x= 1;
sum = 0;
while(x <= 10) {
sum += x;
++x;
}
cout << "The sum is:" << sum << endl;
return 0;
} 2.6 a) product = 25, x = 6; b) quotient = 0, x = 6; 2.7 a) cin >> x; b) cin >> y; e) i = 1; d) power = 1; e) power *= x; 或 power = power * x; f) i++; g) if (i <= y) h) cout << power << endl;
// raise x to the y power
#include <iostream.h>
int main()
{
int x, y, i, power;
i= 1;
power = 1
cin >> x;
lO cin >> y;
while( i <=y ) {
power *= x ;
++i;
}
cout << powe << endl;
return O;
}
2.9 a)不正确:while循环缺右花括号。
纠正:在++C;语句后面加上右花括号。
b)不正确:用流插入而不是流读取运算符。
纠正:将<<变为>>。
c)不正确:else后面的分号造成逻辑错误,第二个输出语句总是会执行。
纠正:将else后面的分号删除。
2.10 while结构中变量x的值永远不变。因此如果循环测试条件(z>=0)为true,则会生成无限循环。
要防止生成无限循环,必须递减z,最终达到小于0。
2.11 a)不正确。default是可选的,如果不需要默认操作,则不需要default。
b)不正确。break语句用于退出switch结构。如果defalut为最后一个case,则不需要break语句。
c)不正确。使用&&运算符的两个关系表达式都为true时,整个表达式才能为true。
d)正确。
2.12 a) sum = 0 for ( count = 1; count <= 99; count += 2 ) sum += count; b) cout << setiosflags(ios::fixed | ios::showpoint | ios::left) << setprecision(1) << setw (15) << 333.546372 << setprecision(2) << setw (15) << 333.546372 << setprecision(3) << setw (15) << 333.546372 << endl; 输出如下: 333.5 333.55 333.546 c) cout << setiosflags(ios::fixed | ios::showpoint) << setprecision(2) << setw (10) << pow(2.5,3) << endl; 输出如下: 15.63 d) x = 1; while (x <= 20) { cout << x; if (x % 5 == 0) cout << endl; else cout << '\t'; x++ } e) for (x = 1; x <= 20; x++) { cout << x; if (x % 5 == O) cout << endl; else cout << '\t'; } 或 for (x = 1; x <= 20; x++) if (x % 5 == O} cout << x << endl; else cout << x << '\t';
2.13 a)不正确:while首部后面的分号会导致无限循环。
纠正:将分号换成"{"或删除";"和"}"。
b)不正确:用浮点数控制for重复结构。
纠正:用整数。并进行适当的计算以取得所要的值。
for(y=l;y!=10;y++) cout << ( static cast(y) / lO ) << endl;
c)不正确:第一个case的语句中缺少break语句。
纠正:第一个case语句中补上break语句。注意,如果程序员要让case 1语句每次执行时都执行case 2的语句,则这不是错误。
d)不正确:while重复条件中使用不正确的关系运算符。
纠正:用"<="而不用"<",或将10变为11。
练习2.14到2.38对应2.1节到2.12节。练习2.39到2.63对应2.13节到2.21节。
2.14判断下列语句的对与错(注意,每个代码中可能有多处错误):
a} if ( age >= 65 }; cout <<"Age is greater than or equal to 65" << endl; else cout << "Age is less than 65 << endl"; b) if ( age >= 65 ); cout << "Age is greater than or equal to 65" << endl; else cout << "Age is less than 65 << endl"; c) int x = 1, total; while ( x <= 10 ) { total += x; ++x; } d) while (x <= 100 ) total + = x; ++x; e) while (y > 0) { cout << y << endl; ++y }
2.15 下列程序打印什么结果?
#include
int main()
{
int y, x=1,total=0;
while(x<=10){
y=x*x;
cout<< y<< endl;
total+=y;
++x;
}
cout<<"Total is"<< total<< endl;
return 0;
}SS
对练习2.16到2.19完成下列步聚:
a) 阅读问题。
b) 用伪代码和自上而一逐步完善的方法构造算法。
c) 编写C++程序。
d) 测试、调试和执行程序。
2.16 驾驶员比较注意汽车的行驶里程。经常计算公里数和每箱油使用的加仑数。开发一个C++程序,输入公里数和每箱油使用的加仑数,程序计算和显示每箱油每加仑跑出的公里数。处理所有输入信息后,程序应计算和打印所有油箱每加仑跑出的公里数组合。
Enter the gallons used (-1 to end):12.8 Enter the miles driven:287 The miles / gallon for this tank was 22.421875 Enter the gallons used (-1 to end): 10.3 Enter the miles driven:200 The miles / gallon for this tank was 19,417475 Enter the gallons used (-1 to end): 5 Enter the miles driven:120 The miles / gallon for this tank was 24.000000 Enter the gallons used (-1 to end): -1 The overall average miles/gallon was 21,601423
2.17 开发一个C++程序,确定商场客户支付的款额是否超过付款账号的信用额度。对每个客户,提供下列事实:
a)账号(整数)
b)月初结余
c)该客户当月购买的总物品数
d)该客户当月总付款金额
e)允许的信用额度
程序应输人每个信息,计算新结余<月初结余+付款—透支数),确定新结余是否超过付款账号的信用额度。如果客户的款额超过信用额度,则程序显示该客户的账号、信用额度、新结余和消息"Credit limit execeeded"。
Enter account number (-1 to end): 10O
Enter beginning balance: 5394.79
Enter total charges: 1000.00
Enter total credits: 500.00
Enter credit limit: 5500.00
Account: 100
Credit limit: 5500.00
Balance: 5894.78
Credit Limit Exceeded.
Enter account number {-1 to end): 200
Enter beginning balance: 1000.00
Enter total charges: 123.45
Enter total credits: 321.00
Enter credit limit: 1500.00
Enter account number (-1 to end): 300
Enter beginning balance: 500.00
Enter total charges: 274.73
Enter total credits: 100.00
Enter credit limit: 800.0
Enter account number (-1 to end): -1
2.18一家大型化工公司根据佣金向销售人员发工资。销售人员每周可取得200美元加上本周销售额的9%。例如,如果本周销售额为5000美元,则本周收入为200美元加上5000美元的9%,总共650美元。开发一个c++程序,输入每个员工本周销售额,并计算和显示其总收入。 一次处理一个销售人员的数据。
Enter sales in dollars (-1 to end): 5000.00 Salary is: $650.00 Enter sales in dollars (-1 to end): 6000.00 Salary is: $740.00 Enter sales in dollars (-1 to end): 7000.00 Salary is: $830.00 Enter sales in dollars (-1 to end): -1
2.19开发一个c++程序,确定几个员工的总工资。公司对每个员工的前40个小时发计时工资,此后发加班工资(是原工资的1.5倍)。你可以得到一系列的公司员工名单、每个显工上周工作小时数和每个员工的小时工资。程序要输入每个员工的这些信息,确定和显示员工的总工资。
Enter hours worked (-1 to end): 39 Enter hourly rate of the worker ($00.00): 10.00 Salary is $390.00 Enter hours worked (-1 to end): 40 Enter hourly rate of the worker ($00.00}: 10.00 Salary is $400.00 Enter hours worked (-1 to end): 41 Enter hourly rate of the worker ($00.00): I0.00 Salary is $415.00 Enter hours worked (-1 to end): -1
2.20寻找最大数(即求出一组成员中的最大值)的过程经常在计算机应用程序中使用。例如,确定销售竞赛优胜者的程序要输入每个销售员销售的单位数,销售的单位数最多的员工为销售竞赛优胜者。编写一个伪代码程序,然后变成C++程序,输入10个数,确定和打印其中的最大数。提示:程序应使用如下三个变量。
counter: 从1到10的计数器(即跟踪输入了多少个数,确定何时处理了这10个数)。
number: 当前输入程序的数。
largest: 到目前为止的最大数。
2.21编写一个C++程序,利用循环和制表转义序列" "打印下列数据表:
N lO*N 100*N 1000*N
1 10 100 1000
2 20 200 2000
3 30 3O0 3000
4 40 40O 4000
5 50 500 5000
2.22用练习2.20的方法寻找10个数中的两个最大数。注意:每个数只允许输入一次。
2.23修改图2.11以验证其输入。对任伺输入,如果输入的值不是1和2就一直保持循环,直到用户输入正确的值。
2.24下列程序打印什么结果
#include
int main()
int count = 1;
while ( count <= 10) {
cout << ( count % 2 "*****": "++++++++" )
<< endl;
++cout;
}
return O;
}
2.25下列程序打印什么结果
#include
int main
{
int row = 10, column;
while (row >= 1) {
column = 1;
while ( column <= 10 ) {
cout << (row % 2 "<" : ">" );
++column;
}
--row;
cout << endl;
}
return O;
}
2.26(悬挂else问题)确定x为9和y为11与x为ll和y为9时下列各题的输出。注意,编译器忽略C++程序中的缩排。另外,C++编译器总是将else与前面的if语句相关联,除非用花括号({ })另外指定。由于程序员初看时不知道哪个if与哪个else相配,因此称为悬挂else问题。我们消除下列程序中的缩排,使问题显得更复杂些。提示:采用书中介绍的缩排方法。
a)if(x< lO) if ( y > 10 ) cout << "*****" << endl; else cout << "#####" << endl; cout << "$$$$$" << endl; if ( x < 10 ){ if(y>lO) cout << "*****" << endl; } else { cout << "#####" << endl; cout << "$$$$$" << endl; }
2.27(另一个悬挂else问题)修改下列代码,产生图中所示的输出。用正确的缩排方法,除了插入花括号之外,不能进行其他任何改变。编译器忽略C++程序中的缩排。我们消除下列程序中的缩排,使问题显得更复杂些。注意:可以不进行其他任何改变。
if ( y == 8 ) if ( x == 5 ) cout << "@@@@@" << endl; else cout << "#####" << endl; cout << "$$$$$" << endl; cout << "&&&&&" << endl;
a)假设x=5,y=8,产生下列输出:
@@@@@
$$$$$
&&&&&
b)假设x=5,y=8,产生下列输出:
@@@@@
c)假设x=5,y=8,产生下列输出:
@@@@@
&&&&&
d)假设x=5,y=7,产生下列输出。说明:else后面的三个输出语句放在一个复合语句中。
#####
$$$$$
&&&&&
2.28编写一个程序,读取正方形长度,然后打印一个由星号围成的空心正方形,长度为指定长度。程序适用于边长为1到20的正方形。例如,如果程序读取正方形长度5,则打印:
* * * * * * * * * * * * * * * *
2.29回文是指数字或文本正向和逆向读时都一样的文本。例如,下列五位整数都是回文:
12321、55555、45554和11611。编写一个程序,读取五位整数并确定其是否回文。提示:用除法和求模运算符将数字分成各个位。
2.30输人只包含0和1的整数(如二进制整数),并打印其十进制对应的值。提示:用除法和求模运算符一次一位从右向左取得这个二进制整数的位。和十进制数值系统中一样,最右边的位值为1,向左一位为10,然后为100,然后1000等等,二进制系统中最右边的位值为1,向左一位为2,然后为4,然后为8等等。这样,十进制数234可以解释为
4*1+3*10+2*100。二进制1101的十进制值为1*1+0*2+1*4+1*8或1+0+4+3 即13。
2.31编写一个程序,显示下列棋盘图案。
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
程序只能用三个输出语句,其形式如下:
cout<<"* "; cout<<' '; cout<< endl;
2.32编写一个程序,打印2的倍数2、4、6、8、16、32、64等等。循环不能终止(即生成无 限循环)。运行这个程序时会发生什么情况
2.33缩写一个程序,读取圆的半径(作为float类型的值)并计算和打印直径、周长和面积。
π取值3.14159。
2.34下列语句有什么错误 提供正确语句完成程序员的意图。
cout<< ++ ( x + y );
2.35编写一个程序读取三个float类型的非。值,并确定和打印其能否成为三角形的三个边。
2.36编写一个程序读取三个非0整数值,并确定和打印其能否成为三角形的三个边。
2.37公司要在电话线上传输数据,但担心电话被窃听。所有数据用四位整数传输,他们要求编写一个程序,将数据进行加密,使数据传输更安全。程序读取四位整数并加密如下:
将每个位换成该位与7的和并用10求模。然后交换第一位与第三位,交换第二位与第四位,并打印加密后的整数。再编写一个程序读取加密的四位敷,并解密成原先的四位数。
2.38非负整数的阶乘写成n!(读作“n的阶乘”),定义如下:
n!=n*(n-1)*(n-2)*...*1 (n大于或等于1时)和n!=1(n=0时)
例如,51=5*4*3*1叫等于120。
a)编写一个程序,读取这个非负整数值,计算和打印其阶乘。
b)编写一个程序,估算数学常量e的值,公式如下:
1/1!+1/2!+1/3!+...
c)编写一个程序,计算ex的值,公式如下:
x/1!+x2/2!+x3/3!+...
而’百’面’”
2.39寻找下列各题的错误(注意,可能有多处错误):
a) For ( x = 100, x >= 1 x++ cout <<x<< endl;
b)下列代码打印整数value为奇数或偶数:
case O:
cout << "Even integer" << endl;
case 1:
cout << "odd integer" << endl;
}
c) 下列代码输出19到1的奇数:
for ( x= 19; x>= 1; x += 2 ) cout << x << endl;
d)下列代码输出2到100的偶数:
counter = 2; do { cout << counter << endl; couter += 2; } while ( counter < 100 );
2.40编写一个程序求一系列整数的和。假设第一个读取的整数指定后面要输入的数值个数,程序在每个输入语句中只读取一个值。
典型的输入序列如下:
5 1OO 200 300 400 500
其中5表示指定后面要输入5个值。
2.41编写一个程序计算和打印几个整数的平均值。假设最后一个读取值是标记9999。典型的输入顺序如下:
lO 8 11 7 9 9999
表示计算标记9999之前所有数的平均值。
2.42下列程序有什么作用
#includeint main() { int x,y; cout << "Enter two integers in the range 1-20:"; cin >> x >> y; for (int i = 1; i <= y; i++ ) { for (int j = 1; j <= x; j++ ) cout << '@'; cout << endl; ) return 0; }
2.43编写一个程序,寻找几个整数的最小值。假设第一个值指定后面要输入的数值个数。
2.44编写一个程序,计算和打印1到15的奇数积。
2.45阶乘函数常用于概率问题。正整数n的阶乘写成n!(读作“n的阶乘”)等于从1到n的正整数的积。编写一个程序,求1到5的阶乘。将结果打印成表格形式。要计算20的阶乘会有什么困难
2.46修改第2.15节的复利程序,将利率变为1%、6%、7%、8%、9%和10%。用for循环改变利率。
2.47编写一个程序打印下列图案。使用for循环一个图案一个图案地打印。所有星号(*)应在一条形式为cout<<'*',的语句中打印(使星号靠在一起)。提示:最后两个图案要求每一行以适当空格数开始。附加部分:将这4个问题的代码组合在一个程序中,利用嵌套for循环使4个图案并排打印。2.48计算机的一个有趣应用是绘制图形和条形图(也称直方图)。编写一个程序,读取5个数(1到30之间)。对读取的每个数,程序应打印相应这个数目的星号。例如,如果程序读 取数字7,则打印*******。
2.49邮购公司销售五种不同的零售产品,零售价分别为product1一$2.98、product2--$4.50、product 3--$9.98、product4--$4.49和product5--S6.87。编写一个程序,读取如下一系列数值对:
a)产品号
b)一天销售量
程序要用switch语句确定每种产品的零售价并计算和显示上周所销售产品的总零售额。
2.52假设i=1、i=2、k=3和m=2。下列语句输出什么结果 括号是否需要
a) cout << (i == 1 ) << endl; b) cout << (j == 3 ) << endl; c) cout << ( i >= 1 && j < 4 ) << endl; d) cout << ( m >= 99 && k < m ) << endl; e) cout << (j >- i I I k < m ) << endl; f) cout << ( k + m < j || 3 - j >= k ) << endl; g) cout << ( !m ) << endl; h) cout << ( ! ( j - m ) ) << endl; i) cout << ( ! ( k > m ) ) << endl;
2.53编写一个程序。打印整数1到156的二进制、八进制、十六进制和十进制对照表。如果
不熟悉这些进制,见附录C。
2.54用下列数学表达式计算π的值:
打印用1项、2项、3项等时π的近似值。要用多少项才能得到近似值3.14、3.141、3.1415、3.141597
2.55(直角三角形)直角三角形的三条边都可以取整数,如果两边平方的和等于第三边(弦) 的平方,则这个三角形是直角三角形。编写程序找出500以内直角三角形三边sidel、side2 和hypotenuse值。用三个嵌套for循环求出所有值,这是个强制计算的例子。在高级的计算机学科中还有许多有趣的问题,这些问题没有别的解决办法,只能通过强制计算。
2.56公司员工分为经理<每周发固定工资)、计时工(40小时之内固定小时工资,40小时以外的工资按原工资1.5倍)、佣金工(250美元的基本工资加每月销售额的5.7%)和计件工(每生产一件产品发固定工资,公司的计件工只生产一种产品)。编写一个程序,计算每个员工每周的工资。事先不知道员工人数,每种员工有自己的工资代码.经理的工资
代码为1,计时工的工资代码2,佣金工的工资代码为3,计件工的工资代码为4。用switch根据工资代码计算每个员工的工资。在switch中,提示用户输入根据工资代码计算每个员工的工资时所需的信息。
2.57(摩根定律)本章介绍了逻辑运算符&&、||和!。摩根定律可以使逻辑表达式的表达更方便。摩根定律指出.表达式!(condition1 && condition2逻辑上等价于表达式(!conndition1,condition2),同样表达式!(condition1||condition2)逻辑上等价于表达式(!condition1&&!condition2)。利用摩根定律编写下列表达式的等价表达式,然后编写一个程序,显示原表达式和新表达式的等价性。
a) !(x< 5 ) && !( y>= 7 ) b) !(a==b) || !(g !=5) c) !( (x<=8) && (y>4) ) d) !((i>4) || (j<=6))
2.58编写一个程序,打印下列菱形形状。可以用输出语句打印单个星号(*)或单个空格。充分利用重复结构(用嵌套for结构),减少输出语句个数。
* *** ***** ******* ********* ******* ***** *** *
2.59修改练习2.58所写的程序,读取1到19的奇数,指定菱形形状的行数。然后程序显示相应的菱形形状。
2.60有人认为break语句和continue语句是非结构化的。实际上,break语句和continue语句总是可以转换成结构化语句,但这样做容易出问题。描述如何从程序循环中删除break语句并转换成结构化语句。提示:break语句从循环体中离开循环。另一种离开的方法是让循环条件测试失败。可以在循环条件中进行第二个测试,表示“因为break条件而提前退出”。利用你开发的方法,删除图2.26中的break语句。
2.61下列程序有什么作用
for ( i = 1; i <= 5; i++ ) { for ( j = 1; j <= 3;j++ ) { for(k = 1;k <= 4;k++) cout << '*'; cout << endl; } cout << endl; }
2.62描述如何从程序循环中删除continue语句并转换成结构化语句。利用你开发的方法,删除图2.27中的continue语句。
练习 2.64对应于第2.22节“有关对象的思考”。
2.63用200个左右的字描述汽车及其作用,列出其中的名词和动词。本文曾介绍过,每个名词可能对应一个系统中要实现的对象,这里对应的就是汽车系统中要实现的对象。从列出的对象中选择5个,对每个对象各列出几个属性和行为,简单描述这些对象如何相互交互并与描述的其他对象交互。这样就完成了典型的面向对象设计的几个关键步骤。
2.64(Peter Minuit问题)故事发生在1626年,PeterMinuit用24美元购买了曼哈顿城(Manhattan),这笔投资是否合算呢 要回答这个问题,修改图2.21的复利程序,本金为24.00美元.要计算从1626年到1998年372年的存款利息,分别用利率,5%、6%、7%、8%、9%和10%计算,看看复利有多大。