《C++ Primer Plus》第五章复习题和编程练习

一、复习题

1. 入口条件循环和出口条件循环之间的区别是什么?各种C++循环分别属于其中的哪一种?

答:入口条件循环先判断循环条件,结果为真则执行循环体中的语句,结果为假则跳过循环体执行下一条语句。而出口条件循环先执行循环体中的语句,再判断循环条件,循环体中的语句至少执行一次。在C++中,for循环和while循环属于入口条件循环,而do…while循环属于出口条件循环。

2. 如果下面代码片段是有效程序的组成部分,它将输出什么内容?

int i;
for (i = 0; i < 5; i++)
cout << i;
cout << endl;

答:for循环,循环变量i初值为0,循环条件i < 5,循环体只有一条语句显示当前i的值,i每次循环加1。所以该代码输出01234,然后换行。

3. 如果下面的代码片段是有效程序的组成部分,它将输出什么内容?

int j;
for (j = 0; j < 11; j += 3)
	cout << j;
cout << endl << j << endl;

答:for循环,循环变量j初值为0,循环条件j < 11,循环体只有一条语句显示当前j的值,j每次循环加3。该代码输出结果如下:
0369
12

4. 如果下面的代码片段是有效程序的组成部分,它将输出什么内容?

int j = 5;
while (++j < 9)
	cout << j++ << endl;

答:while循环,循环变量j初值为5,循环条件++j < 9,前置++先把j的值加1,再进行比较,循环体只有一条语句,后置++显示当前j的值然后把j加1,最后再换行。该代码输出结果如下:
6
8

5. 如果下面的代码片段是有效程序的组成部分,它将输出什么内容?

int K = 8;
do
	cout << " k = " << k << endl;
while (k++ < 5);

答:do…while循环,出口条件循环,循环变量k的初值为5,循环条件k++ < 5,后置++先比较再把k的值加1,循环体只有一条语句打印字符串" k = "和k的值,然后换行。该代码输出结果如下:
k = 8

6. 编写一个输出1、2、4、8、16、32、64的for循环,每轮循环都将计数变量的值乘以2。

答:每次输出的值是前一个值的两倍,中间用顿号隔开。使用for循环,循环变量i的初值为1,循环体一条语句打印i的值和顿号,循环变量i每次循环乘以2。代码如下:

for (int i = 1; i <= 64; i *= 2)
{
	cout << i << "、";
} 
cout << endl;

7. 如何在循环体中包括多条语句?

答:将多条语句放入一对花括号中组成一个语句块或者一条复合语句,C++编译器把它当作一条语句处理。

8. 下面的语句是否有效?如果无效,原因是什么?如果有效,它将完成什么工作?
1)int x = (1, 024);
2)int y;
y = 1, 024;

答:第一小问中由于圆括号的优先级比赋值运算符(=)高,所以先计算右侧圆括号内的值,这是一个逗号表达式,逗号表达式先计算逗号左侧表达式的值,再计算逗号右侧表达式的值,整个逗号表达式的值为右侧表达式的值,也就是八进制的024,转换为十进制为20,然后用十进制的20来初始化int类型的变量x。
而第二小问中的语句y = 1, 024不同,赋值运算符(=)的优先级比逗号运算符(,)更高,先执行赋值运算,而赋值运算的结果为左侧的值,也就是1,然后进行逗号运算,相当于表达式 1, 024; ,结果为024。逗号运算并未产生实际意义,该值在语句执行结束后丢弃,y的值仍为1。

9. 在查看输入方面,cin >> ch 与cin.get(ch) 和 ch = cin.get() 有什么不同?

答:三者都是读取输入流中的字符并存储在变量ch中,但cin >> ch会跳过前面的空白(空格、换行符和制表符),而cin.get(ch)和cin = cin.get()能读取所有ASCII字符并存储在变量ch中。

二、编程练习

1. 编写一个要求用户输入两个整数的程序。该程序将计算并输出这两个整数之间(包括这两个整数)所有整数的和。这里假设先输入较小的整数。例如,如果用户输入的是2和9,则程序将输出2-9的所有整数和,即44。

答:题目分析:创建三个变量,前两个变量存储输入的两个整数,最后一个变量存储最终的结果,通过循环遍历所有整数,然后计算输出。知道循环次数,宜用for循环。

int main()
{
	// 输入两个整数
	int small, big;
	cout << "请输入两个整数(小的在前): " << endl;
	cin >> small >> big;
	// 通过循环遍历之间的所有整数
	int sum = 0;  // 存储结果
	for (int i = small; i <= big; i++)
	{
		sum += i;  // 每个整数都加到sum中
	}
	// 输出
	cout << sum;

	return 0;
}

2. 使用array对象(而不是数组)和long double(而不是long long)重新编写程序清单5.4,并计算100!的值。

答:题目分析:创建array对象需包含头文件array,其格式为:array<类型,元素个数>名称,按照程序清单5.4的格式,类型为long double,元素个数为101,用符号常量ArSize表示。知道循环次数,宜用for循环。

// 头文件
#include <iostream>
#include <array>

// 标准名称空间std
using namespace std;

// 符号常量
const int ArSize = 101;

int main()
{
	// 创建array对象
	array<long double, ArSize> factorials;
	factorials[0] = factorials[1] = 1.0L;
	// 通过循环计算100的阶乘
	for (int i = 2; i < ArSize; i++)
	{
		factorials[i] = i * factorials[i - 1];
	}
	// 输出
	cout << "100! = " << factorials[100] << endl;

	return 0;
}

3. 编写一个要求用户输入数字的程序。每次输入后,程序都将报告到目前位置,所有输入的累计和。当用户输入0时,程序结束。

答:题目分析:创建两个变量,一个存储输入的数字,一个存储输入数字的总和。通过循环来输出每次输入到目前为止的数的总和,循环条件为输入不为0。不知道循环次数,宜用while循环。(至少输入一次,用do…while更好,大家可以尝试一下,作者喜欢用while,主要是写的时候没想到,嘿嘿)

int main()
{
	// 创建两个变量存储输入的数和输入的数的总和
	int input, sum = 0;
	// 循环
	cout << "Please enter a number: ";
	cin >> input;
	while (input != 0)  // 判断输入是否为0
	{
		// 计算当前的总和并显示
		sum += input;
		cout << "The total number now is:  " << sum << endl;
		// 输入下一个数
		cout << "Please enter the next number: ";
		cin >> input;
	}

	return 0;
}

4. Daphne以10%的单利投资了100美元。也就是说,每一年的利息都是投资额的10%。即每年10美元,利息计算公式如下…(太长了,懒得敲了,大家看自己的题目)

答:题目分析:创建两个变量,存储两人的总金额,Daphne每年增长10美元,而Cleo每年增长总金额的5%。通过循环来进行计算与判断,循环条件为Daphne的总金额大于等于Cleo的总金额。不知道循环次数,宜用while循环。

int main()
{
	// 创建两个变量存储两人的总金额
	double money_Daphne = 100, money_Cleo = 100;
	// 通过循环计算
	int i = 0;  // 标记年数
	while (money_Daphne >= money_Cleo)
	{
		++i;
		// 计算每年过后两人的总金额
		money_Daphne += 10;
		money_Cleo += money_Cleo * 0.05;
	}
	// 输出
	cout << "第" << i << "年后,Daphne的总金额超过了Cleo" << endl;
	cout << "此时他们的总金额分别为: " << endl;
	cout << "Daphne: " << money_Daphne << endl;
	cout << "Cleo: " << money_Cleo << endl;

	return 0;
}

5. 假设要销售《C++ For Fools》一书。请编写一个程序,输入全年中每个月的销售量…(大家看自己的题目哈)

答:题目分析:创建一个char*数组,指向12个月份的缩写字符串常量,指针需const前缀修饰。创建一个int数组,通过循环提示输入12个月分的销售额。最后计算并输出一年的总销售额。(可以使用一个循环一边输入一边计算总销售额,也可以使用两个循环,输入完成后再计算)

int main()
{
	// 创建char*数组
	const char* Month[12] = { "Jan", "Feb", "Mar", "Apr", "May", "Jun",
		"Jul", "Aug", "Sep", "Oct", "Nov", "Dec" };  // 指向字符串常量需要前缀const修饰
	// 创建int数组,通过循环提示并输入每月的销售额,同时计算一年的总销售额
	int sale_month[12] = { 0 };
	int sum = 0;
	for (int i = 0; i < 12; i++)
	{
		// 提示输入
		cout << "Enter the sale amount of " << Month[i] << ": ";
		cin >> sale_month[i];
		// 计算一年总销售额
		sum += sale_month[i];
	}
	// 输出
	cout << "The sale amout of a year: " << sum << endl;

	return 0;

6. 重新做编程练习5,但这一次使用一个二维数组来存储三年中每个月的销售量。程序将报告每年的销售量以及三年的总销售额。

答:题目分析:和上一题没有太大变化,就是存储的数据增多了。创建一个int二维数组通过嵌套循环输入三年中每月的销售额,然后创建一个int数组计算每年的总销售额。最后创建一个int变量计算3年总销售额。

int main()
{
	// 创建二维数组
	int sale_month[3][12];  // 每月的销售额
	// 通过嵌套循环输入
	int sale_year[3] = { 0 };  // 每年的销售额
	int sale_3year = 0;  // 三年销售总额
	for (int i = 0; i < 3; i++)
	{
		for (int j = 0; j < 12; j++)
		{
			// 输入每月的销售额
			cout << "请输入第" << i + 1 << "年" << "第" << j + 1 << "月的销售额: ";
			cin >> sale_month[i][j];
			// 计算每年的销售额
			sale_year[i] += sale_month[i][j];
		}
		// 计算三年销售总额
		sale_3year += sale_year[i];
	}
	// 输出
	cout << endl;  // 输入输出分割
	for (int i = 0; i < 3; i++)
	{
		cout << "第" << i << "年的销售总额为: " << sale_year[i] << endl;
	}
	cout << "三年销售总额为: " << sale_3year;

	return 0;
}

7. 设计一个名为car的结构,用它存储有关汽车的信息——生产商(存储在字符数组或string对象中的字符串)、生产年份(整数)。编写一个程序…

答:题目分析:首先声明car结构,输入汽车数量,然后在堆中创建对应的动态car结构数组,最后输入每辆车的信息。

// car结构声明
struct Car
{
	char _producer[20];
	int _year_product;
};

int main()
{
	// 输入汽车数量
	int num_car;
	cout << "How many cars do you wish to catalog? ";
	cin >> num_car;
	// 创建对应car结构动态数组
	Car* pcars = new Car[num_car];
	// 输入汽车信息
	for (int i = 0; i < num_car; i++)
	{
		cin.get();  // 丢弃换行符

		cout << "Car #" << i + 1 << ": " << endl;
		cout << "Please enter the maker: ";
		cin.getline(pcars[i]._producer, 19);  // 多个单词输入
		cout << "Please enter the year made: ";
		cin >> pcars[i]._year_product;
	}
	// 按格式输出
	cout << "Here is your collection: " << endl;
	for (int i = 0; i < num_car; i++)
	{
		cout << pcars[i]._year_product << " " << pcars[i]._producer
			<< endl;
	}

	return 0;
}

8. 编写一个程序,它使用一个char数组和循环来每次读取一个单词,直到用户输入done位置。随后输出用户输入了多少单词(done不包括在内)。下面是该程序的运行情况…

答:题目分析:每次输入一个单词,直到输入done,统计除了done以外的单词个数。

// 头文件
#include <iostream>
#include <cstring>

// 标准名称空间std
using namespace std;

int main()
{
	int num_word = 0;  // 统计单词个数
	char word[20];  // 存储输入的单词
	// 输入
	cout << "Enter words (to stop, type the word done):" << endl;
	cin >> word;
	while (strcmp(word, "done") != 0)  // 判断当前单词是否为done
	{
		num_word++;
		cin >> word;  // 下一个单词,cin会跳过前面的空白
	}
	// 输出
	cout << "You entered a total of 7 words." << endl;
}

9. 重做编程练习8,但是用string对象而不是字符数组。请在程序中包含头文件string,并使用关系运算符来进行比较。

答:题目分析:和上一题的差别就在比较方式,string对象可以使用关系运算符不等于(!=)等。

// 头文件
#include <iostream>
#include <string>

// 标准名称空间
using namespace std;

int main()
{
	int num_word;  // 统计单词个数
	string word;  // 存储输入的单词
	// 输入
	cout << "Enter words(to stop,type the word done): " << endl;
	cin >> word;
	while (word != "done")  // 通过关系运算符比较
	{
		num_word++;
		cin >> word;  // 下一个单词
	}


	return 0;
}

10. 编写一个嵌套循环,要求用户输入一个值,指定要显示的行数。然后,程序显示相应行数的星号,其中第1行包括一个星号,第2行包括两个星号,依次类推。每一行包含的字符数等于当前行数,在星号不够的情况下,在星号前面加上句点.。…*

答:题目分析:两层循环,外层循环是每行,内层循环一个打印句点,一个打印星号。很容易得出规律,第i行5-i个句点,i个星号。

int main()
{
	// 输入行数
	int row;
	cout << "Enter the number of rows: ";
	cin >> row;
	// 输出
	for (int i = 0; i < row; i++)  // 外层循环——行
	{
		// 打印句点
		int points = row - i - 1;
		while (points--)
			cout << ".";
		// 打印星号
		int starts = i + 1;
		while (starts--)
			cout << "*";
		// 下一行
		cout << endl;
	}

	return 0;
}
  • 14
    点赞
  • 20
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值