题: 编写一个程序,不断要求用户输入两个数,直到其中的一个为 0。对于每两个数,程序将使用一个函数来计算它们的调和平均数, 并将结果返回给 `main()``,而后者将报告结果。调和平均数指的是倒数平均值的倒数,计算公式如下:
调和平均数 = 2.0 * x * y / (x+y)
解:
#include <iostream>
int main() {
using namespace std;
double x = 0, y = 0;
double h_avg = 0;
cout << "Enter two numbers: ";
cin >> x >> y;
while (x != 0 && y != 0) {
h_avg = 2 * x * y / (x+y);
cout << "The harmonic mean of " << x << " and " << y << " is " << h_avg << endl;
cout << "Enter the next two numbers: ";
cin >> x >> y;
}
return 0;
}
题: 编写一个程序,要求用户输入最多10个高尔夫成绩,并将其存储在一个数组中。程序允许用户提早结束输入,并在一行上显示所有成绩, 然后报告平均成绩。请使用3个数组处理函数来分别进行输入、显示和计算平均成绩。
解:
#include <iostream>
int input(double data[], int max_num) {
int i = 0;
std::cout << "Enter up o 10 golf score (-1 to quit): " << std::endl;
while (std::cin >> data[i]) {
if (data[i] == -1) {
--i;
break;
}
++i;
if (i == max_num)
break;
}
return (i < max_num) ? i+1 : max_num;
}
double calculate_average(const double data[], int n) {
double sum = 0;
for (size_t i(0); i < n; ++i) {
sum += data[i];
}
return sum / n;
}
void output(const double data[], int n) {
std::cout << "The score are: " << std::endl;
for (size_t i(0); i < n; ++i) {
std::cout << data[i] << " ";
}
std::cout << std::endl;
}
int main() {
double glf_score[10];
int n = input(glf_score, 10);
double avg_score = calculate_average(glf_score, n);
output(glf_score, n);
std::cout << "The average is: " << avg_score << std::endl;
return 0;
}
题: 下面是一个结构体的声明:
struct box {
char maker[40];
float height;
float width;
float length;
float volume;
}
a. 编写一个函数,按值传递 box
结构体,并显示每个成员的值。
b. 编写一个函数,传递 box
结构体的地址,并将 volume 成员设置为其他三维长度的乘积。
c. 编写一个使用这两个函数的简单程序。
解:
#include <iostream>
typedef struct {
char maker[40];
float height;
float width;
float length;
float volume;
} Box;
void output(Box bx) {
std::cout << "Box maker: " << bx.maker << std::endl;
std::cout << "Box height: " << bx.height << std::endl;
std::cout << "Box width: " << bx.width << std::endl;
std::cout << "Box length: " << bx.length << std::endl;
std::cout << "Box volume: " << bx.volume << std::endl;
}
void calculate_volume(Box *p_bx) {
p_bx->volume = p_bx->height * p_bx->width * p_bx->length;
}
int main() {
Box bx = {"Jay", 0.49, 2.94, 0.49, 0.0};
output(bx);
calculate_volume(&bx);
std::cout << "\n--\n";
output(bx);
return 0;
}
题: 许多彩票发行机构都使用如程序清单7.4所示的简单彩票玩法的变体。在这些玩法中,玩家从一组被称为域号码(field number)
的号码中选择几个。例如,可以从域号码147中选择5个号码; 还可以从第二个区间(如127)选择一个号码(称为特选号码)。要赢得头奖,必
须正确猜中所有的号码。中头奖的几率是选中所有域号码的几率与选中特选号码几率的乘积。例如,在这个例子中,中头奖的几率是从47个号码
中正确选取5个号码的几率与从27个号码中正确选择1个号码的几率的乘积。请修改程序清单7.4,以计算中得这种彩票头奖的几率。
解:
#include <iostream>
long double probability(unsigned numbers, unsigned picks) {
long double result = 1.0;
long double n;
unsigned p;
for (n = numbers, p = picks; p > 0; n--, p--) {
result *= n/p;
}
return result;
}
int main() {
unsigned int field1 = 47;
unsigned int field2 = 27;
std::cout << "You have no chance in "
<< probability(field1, 5) * probability(field2, 1)
<< " of winning.\n" << std::endl;
return 0;
}
题: 定义一个递归函数,接受一个整数参数,并返回该参数的阶乘。
前面讲过,3的阶乘写作3!,等于32!,依此类推; 而
0!
被定义为1。通用的计算公式是,如果n大于零,则n!=n(n−1)!。 在程序中对该函数进行测试,程序使用循环让用户输入不同的值,程序将报告这些值的阶乘。
解:
#include <iostream>
long factorial(int n) {
if (n == 0) {
return 1;
}
return n * factorial(n-1);
}
int main() {
using namespace std;
int n;
cout << "Enter an integer number: ";
while (!(cin >> n)) {
cin.clear();
while (cin.get() != '\n') {
continue;
}
cout << "Please enter an integer number: ";
}
if (n < 0) {
cout << "Negative number don't have factorial." << endl;
exit(1);
}
long f = factorial(n);
cout << "The factorial of " << n << " is " << f << endl;
return 0;
}
题: 编写一个程序,它使用下列函数:
Fill_array()
将一个 double 数组的名称和长度作为参数。它提示用户输入 double 值,并将这些值存储到数组中。 当数组被填满或用户输入了非数字时,输入将停止,并返回实际输入了多少个数字;Show_array()
将一个 double 数组的名称和长度作为参数,并显示该数组的内容;Reverse-array()
将一个 double 数组的名称和长度作为参数,并将存储在数组中的值的顺序反转。
程序将使用这些函数来填充数组,然后显示数组;反转数组,然后显示数组;反转数组中除第一个和最后一个元素之外的所有元素,然后显示数组。
解:
#include <iostream>
int Fill_array(double data[], int max_num) {
std::cout << "Enter double numbers (non-digital to quit): " << std::endl;
int i = 0;
while ((i < max_num) && (std::cin >> data[i]))
++i;
// return the size of array
return i;
}
void Show_array(const double data[], int n) {
std::cout << "The size of array is: " << n << " and the data is: ";
for (size_t i(0); i < n; ++i) {
std::cout << data[i] << " ";
}
std::cout << "\n";
}
void Reverse_array(double data[], int n) {
for (size_t i(0); i < n/2; ++i) {
double t = data[i];
data[i] = data[n - 1 - i];
data[n - 1 - i] = t;
}
return;
}
int main() {
double data[10];
int n = Fill_array(data, 10);
Show_array(data, n);
Reverse_array(data, n);
Show_array(data, n);
return 0;
}