《C++primerplus》第7章练习题
1.用户不断输入两个数,计算调和平均数,直到其中一个数为0。
#include<iostream> using namespace std; double harm_mean(double x, double y) { double result; result = 2 * x*y / (x + y); return result; } int main() { double num1, num2; int flag = 1; while (flag) { cout << "Enter two numbers:\n"; cin >> num1; cin >> num2; if ((num1 == 0) || (num2 == 0)) flag = 0; else cout << "Harmonic mean:" << harm_mean(num1, num2) << endl; } cout << "done.\n"; system("pause"); }
2.要求用户输入最多10个高尔夫成绩,并将其存储在一个数组中。程序允许用户提早结束输入,并在一行上显示所有成绩,然后报告平均成绩。使用3个数组处理函数分别进行输入、显示和计算平均成绩。
#include<iostream> using namespace std; void score_in(int si[]); void score_out(int so[]); void score_mean(int sm[]); static int counts = 0; int main() { int score[10]; cout << "(enter any letter to stop input)\nEnter the score:\n"; score_in(score); score_out(score); score_mean(score); cout << "done.\n"; system("pause"); } void score_in(int si[]) { for (int i = 0; i < 10; i++) { if (cin >> si[i]) { counts++; } else { cout << "Input stopped." << endl; break; } } } void score_out(int so[]) { cout << "Score:"; for (int i = 0; i < counts; i++) { cout << so[i] << " "; } cout << "\n"; } void score_mean(int sm[]) { double sum = 0; for (int i = 0; i < counts; i++) { sum += sm[i]; } cout << "Average:" << sum / counts << endl; }
3.定义一个box结构,存储生产者,长高宽和体积的信息。编写两个函数,第一个按值传递box结构,显示所有成员的值。第二个传递box结构的地址,并将volume成员设置为其它三维长度的体积。将两个函数组成一个简单的程序。
#include<iostream> using namespace std; struct box { char maker[40]; float height; float width; float length; float volume; }; void set_box(box *sptr, float x, float y, float z); void v_box(box *vptr); int main() { box box1; float l, w, h; cout << "Enter the box's l,w and h:\n"; cin >> l >> w >> h; set_box(&box1, l, w, h); v_box(&box1); cout << "done.\n"; system("pause"); } void set_box(box *sptr, float x, float y, float z) { sptr->height = z; sptr->length = x; sptr->width = y; cout << "Length:" << sptr->length << endl; cout << "Width:" << sptr->width << endl; cout << "Height:" << sptr->height << endl; } void v_box(box *vptr) { vptr->volume = vptr->height*vptr->length*vptr->width; cout << "The volume of this box is:" << vptr->volume << endl; }
4.修改书中7.4的程序,域号码1~47,中奖条件增加一项从27个数中抽中号码。
#include<iostream> using namespace std; long double probability(unsigned numbers, unsigned picks) { long double result = 1.0; unsigned n; unsigned p; for (n = numbers, p = picks; p > 0; n--, p--) { result = result * n / p; } return result; } unsigned particular(unsigned pn) { return pn; } int main() { double total, choices; cout << "Enter the total number of choices on the game card and\n"; cout << "the number of picks allowed:\n"; while ((cin >> total >> choices) && (choices <= total )) { cout << "You have one chance in "; cout << probability(total, choices)*particular(27); cout << " of winning.\n"; cout << "Next two numbers(q to quit):"; } cout << "\ndone."; system("pause"); }
*这题没太看懂什么意思,结果再乘个27不就行了?跟着敲了一边代码。
5.定义一个递归函数算阶乘。
#include<iostream> using namespace std; long long fac(int n) { if (n > 0) return n * fac(n - 1); else if (n == 0) return 1; } int main() { int n; cout << "Enter a number:\n"; cin >> n; cout << "Its factorial:" << fac(n) << endl; cout << "done.\n"; system("pause"); }
6.编写三个处理double数组的函数,分别用于提示输入、显示数组内容和翻转数组中值的顺序。程序先填充数组,显示数组,再翻转数组,再显示数组。
#include<iostream> using namespace std; static int counts = 0; //输入数字计数 void fill_array(double fa[], int asize); void show_array(double sa[], int ssize); void reverse_array(double ra[], int rsize); int main() { double input[10]; fill_array(input, 10); show_array(input, 10); reverse_array(input, 10); show_array(input, 10); cout << "done.\n"; system("pause"); } void fill_array(double fa[], int asize) { cout << "Enter some numbers:\n"; for (int i = 0; i < asize; i++) { if (cin >> fa[i]) { counts++; if (counts == asize) { cout << "Input stopped.\n"; break; } else {}; } else { cout << "Input stopped.\n"; break; } } cout << counts << " numbers entered.\n"; } void show_array(double sa[], int ssize) { cout << "Input numbers:"; for (int i = 0; i < counts; i++) { cout << sa[i] << " "; } cout << "\n"; } void reverse_array(double ra[], int rsize) { double t; //如果要翻转除第一位和最后一位的数字,把i改成1 for (int i = 0; i <= counts / 2; i++) { t = ra[i]; ra[i] = ra[counts - i - 1]; ra[counts - i - 1] = t; } }
7.修改书中7.7的程序,使用两个指针参数来表示区间。fill_array()函数返回一个指向最后被填充的位置的指针,其它函数可以将它作为第二个参数标识结尾。
#include<iostream> using namespace std; const int Max = 5; double* fill_array(double ar[], int limit); void show_array(double *ptl, double *ptr); double add_array(double *ptl, double *ptr); int main() { double pro[Max]; cout << "5 numbers to show\n"; show_array(pro, fill_array(pro, Max)); cout << "Next 5 numbers to sum\n"; cout << "Sum:" << add_array(pro, fill_array(pro, Max)); cout << "\ndone."; system("pause"); } double* fill_array(double ar[], int limit) { double *ptr; int i = 0; for (i = 0; i < limit; i++) { cout << "Enter value #" << i + 1 << ":"; cin >> ar[i]; } ptr = &ar[i]; return ptr; } void show_array(double *ptl, double *ptr) { for (int i = 0; ptl[i] != *ptr; i++) { cout << "Property #" << i + 1 << ":" << ptl[i] << endl; } } double add_array(double *ptl, double *ptr) { double sum = 0; for (int i = 0; ptl[i] != *ptr; i++) { sum += ptl[i]; } return sum; }
8.修改程序7.15,编写不使用array类两个版本。
#include<iostream> //#include<array> //#include<string> using namespace std; /*原程序 const int seasons = 4; const array<string, seasons>Snames = { "Spring","Summer","Fall","Winter" }; void fill(array<double, seasons>*pa); void show(array<double, seasons>da); int main() { array<double, seasons>expenses; fill(&expenses); show(expenses); cout << "\ndone."; system("pause"); } void fill(array<double, seasons>*pa) { for (int i = 0; i < seasons; i++) { cout << "Enter " << Snames[i] << " expenses:"; cin >> (*pa)[i]; } } void show(array<double, seasons>da) { double total = 0.0; cout << "\nEXPENSES\n"; for (int i = 0; i < seasons; i++) { cout << Snames[i] << ":$" << da[i]<<"\t"; total += da[i]; } cout << "\nTotal Expenses:$" << total << endl; } */ const char Snames[4][10] = {"Spring","Summer","Fall","Winter"}; const int seasons = 4; void fill_exp(double fe[]); void show_exp(double se[]); struct Expenses { double expenses[seasons]; }; int main() { //double expenses[seasons]; 版本a Expenses exp; fill_exp(exp.expenses); show_exp(exp.expenses); //fill_exp(expenses); 版本a //show_exp(expenses); 版本a cout << "done.\n"; system("pause"); } void fill_exp(double fe[]) { for (int i = 0; i < seasons; i++) { cout << "Enter " << Snames[i] << " expenses:"; cin >> fe[i]; } } void show_exp(double se[]) { double total = 0; for (int i = 0; i < seasons; i++) { cout << Snames[i] << ":$" << se[i] << "\t"; total += se[i]; } cout << "\nTotal expenses:" << total << endl; }
9.把程序补充完整。getinfo函数用于输入学生结构的信息,三种display函数显示学生的信息,但使用三种不同的参数传递方式。
#include<iostream> using namespace std; const int SLEN = 30; struct student { char fullname[SLEN]; char hobby[SLEN]; int ooplevel; }; void getinfo(student pa[], int n); void display1(student st); void display2(const student *ps); void display3(const student pa[], int n); int main() { student students[3]; getinfo(students, 3); display1(students[0]); display2(&students[1]); display3(students, 3); cout << "done.\n"; system("pause"); } void getinfo(student pa[], int n) { int i = 0; for (i = 0; i < n; i++) { cout << "Input name of student " << i + 1 << ":\n"; cin.get(pa[i].fullname, SLEN); cin.get(); cout << "Input hobby of student " << i + 1 << ":\n"; cin.get(pa[i].hobby, SLEN); cout << "Input ooplevel of student " << i + 1 << ":\n"; cin >> pa->ooplevel; cin.get(); } } void display1(student st) { cout << "Student1's name:" << st.fullname << endl; } void display2(const student *ps) { cout << "Student2's hobby:" << ps->hobby << endl; } void display3(const student pa[], int n) { for (int i = 0; i < n; i++) { cout << pa[i].fullname << " "; } }
10.函数指针练习。编写一个calculate()函数,接受三项参数,两个double值和一个函数指针,指针指向计算两数之和(或其它功能)的函数。可尝试使用函数指针数组。
#include<iostream> using namespace std; double add(double x, double y) { return x + y; } double div(double x, double y) { return x / y; } double calculate(double x, double y, double (*ptf)(double,double)) { return ptf(x, y); } int main() { double x1, x2; double(*ptf[2])(double, double); ptf[0] = add; ptf[1] = div; cout << "Enter two number:"; while (cin >> x1 >> x2) { cout << "Add:" << calculate(x1, x2, ptf[0]) << endl; cout << "Div:" << calculate(x1, x2, ptf[1]) << endl; cout << "Enter two number:"; } cout << "done.\n"; system("pause"); }