一、复习题
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;
}