2.27 练习
练习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<iostream.h>
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;
}
对练习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.00
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++程序,利用循环和制表转义序列"\t"打印下列数据表:
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 <iostream.h>
int main()
int count = 1;
while ( count <= 10) {
cout << ( count % 2 ? "*****": "++++++++" )
<< endl;
++cout;
}
return O;
}
2.25下列程序打印什么结果?
#include <iosstream.h>
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下列程序有什么作用?
#include <iostream.h>
int 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.50修改图2.22的程序,使它计算班级平均成绩点,A为4点.B为3点等等。
2.51修改图2.21的程序,只用整数计算复利。提示:把所有货币值当作整数,然后用除法和求模运算将结果分为美元和美分,中间用圆点分开。
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%计算,看看复利有多大。