[C + + Primer Plus] answers to programming exercises – Chapter 7

Time:2021-10-27
1 double ch7_1_harmonicaverage(double a, double b) {
  2     return 2 / (1 / a + 1 / b);
  3 }
  4 
  5 void ch7_1() {
  6     using namespace std;
  7     double a{0}, b{0};
  8     while (true) {
  9         cout << "a: ";
 10         cin >> a;
 11         cout << "b: ";
 12         cin >> b;
 13         if (!(a&&b))
 14             break;
 15         cout << "harmonic average: " << ch7_1_harmonicaverage(a, b) << endl;
 16     }
 17 }
 18 
 19 void ch7_2_in(double * arr, int & len, int max) {
 20     using namespace std;
 21     for (int i = 0; i < max; ++ i)
 22         if (!(cin >> arr[i])) {
 23             len = i;
 24             break;
 25         }
 26     len = max;
 27 }
 28 
 29 void ch7_2_show(const double * arr, int len) {
 30     using namespace std;
 31     for (int i = 0; i < len; ++ i)
 32         cout << arr[i] << " ";
 33     cout << endl;
 34 }
 35 
 36 double ch7_2_mean(const double * arr, int len) {
 37     double sum{0};
 38     for (int i = 0; i < len; ++ i)
 39         sum += arr[i];
 40     return sum / len;
 41 }
 42 
 43 void ch7_2() {
 44     using namespace std;
 45     const int ArSize = 10;
 46     double scores[ArSize]{0};
 47     int len{0};
 48     cout << "enter scores (max 10, nan to quit)" << endl;
 49     ch7_2_in(scores, len, ArSize);
 50     cout << "scores: ";
 51     ch7_2_show(scores, len);
 52     cout << "mean: " << ch7_2_mean(scores, len) << endl;
 53 }
 54 
 55 void ch7_3_show(box b) {
 56     using namespace std;
 57     cout << "box: maker: " << b.maker << " height: " << b.height
 58         << " width: " << b.width << " length: " << b.length
 59         << " volume: " << b.volume << endl;
 60 }
 61 
 62 void ch7_3_setvolume(box * b) {
 63     using namespace std;
 64     b -> volume = b -> height * b -> width * b -> length;
 65     cout << "box volume seted" << endl;
 66 }
 67 
 68 void ch7_3() {
 69     using namespace std;
 70     box b{"xushun", 2, 3, 4};
 71     ch7_3_show(b);
 72     ch7_3_setvolume(&b);
 73     ch7_3_show(b);
 74 }
 75 
 76 long double ch7_4_probability(unsigned int numbers, unsigned int picks) {
 77     long double result = 1.0;
 78     for (int i = numbers, j = picks; j; -- i, -- j)
 79         result = result * i /j;
 80     return 1 / result;
 81 }
 82 
 83 void ch7_4() {
 84     using namespace std;
 85     long double r = ch7_4_probability(47, 5) * ch7_4_probability(27, 1);
 86     cout << "r = " << r << endl;
 87 }
 88 
 89 unsigned long long ch7_5_factorial(unsigned long long num) {
 90     if (num == 0)
 91         return 1;
 92     else
 93         return num * ch7_5_factorial(num - 1);
 94 }
 95 
 96 void ch7_5() {
 97     using namespace std;
 98     unsigned long long num{0};
 99     cout << "enter num to get factorial (nan to quit)" << endl;
100     while (true) {
101         cout << "num: ";
102         if (!(cin >> num))
103             break;
104         cout << "factorial: " << ch7_5_factorial(num) << endl;
105     }
106 }
107 
108 unsigned int ch7_6_fillarray(double * arr, unsigned int max) {
109     using namespace std;
110     int i{0};
111     for (i = 0; i < max; ++ i) {
112         cout << "#" << i << ": ";
113         if (!(cin >> arr[i]))
114             break;
115     }
116     return i;
117 }
118 
119 void ch7_6_showarray(const double * arr, unsigned int len) {
120     using namespace std;
121     cout << "array: ";
122     for (int i = 0; i < len; ++ i)
123         cout << arr[i] << " ";
124     cout << endl;
125 }
126 
127 void ch7_6_reversearray(double * arr, unsigned int len) {
128     double temp{0};
129     for (int i = 0; i < len / 2; ++ i) {
130         temp = arr[i];
131         arr[i] = arr[len - i - 1];
132         arr[len - i - 1] = temp;
133     }
134 }
135 
136 void ch7_6() {
137     using namespace std;
138     const unsigned int max = 100;
139     double arr[max]{0};
140     unsigned int len{0};
141     cout << "enter array (nan to quit)" << endl;
142     len = ch7_6_fillarray(arr, max);
143     cout << "array" << endl;
144     ch7_6_showarray(arr, len);
145     cout << "reverse array" << endl;
146     ch7_6_reversearray(arr, len);
147     ch7_6_showarray(arr, len);
148     cout << "reverse array except 1 and len" << endl;
149     ch7_6_reversearray(arr + 1, len - 2);
150     ch7_6_showarray(arr, len);
151 }
152 
153 double * ch7_7_fillarray(double * arr, unsigned int max) {
154     using namespace std;
155     for (int i = 0; i < max; ++ i) {
156         cout << "#" << i << ": ";
157         if (!(cin >> arr[i]))
158             return arr + i;
159     }
160     return arr + max - 1;
161 }
162 
163 void ch7_7_showarray(const double * arr, double * end) {
164     using namespace std;
165     cout << "array: ";
166     while (arr != end) {
167         cout << *arr << " ";
168         ++ arr;
169     }
170     cout << endl;
171 }
172 
173 void ch7_7_revalue(double * arr, double * end, double factor) {
174     while (arr != end) {
175         *arr *= factor;
176         ++ arr;
177     }
178 }
179 
180 void ch7_7() {
181     using namespace std;
182     const unsigned int max = 100;
183     double arr[100]{0};
184     double * end = arr;
185     double factor{1};
186     cout << "enter array (nan to quit)" << endl;
187     end = ch7_7_fillarray(arr, max);
188     cout << "array" << endl;
189     ch7_7_showarray(arr, end);
190     cout << "enter factor: ";
191     cin.clear();cin.get();
192     while (!(cin >> factor)) {
193         cin.clear();
194         while (cin.get() != '\n')
195             continue;
196         cout << "factor must be a number: ";
197     }
198     ch7_7_revalue(arr, end ,factor);
199     ch7_7_showarray(arr, end);
200 }
201 
202 void ch7_8_fill(double * arr, unsigned int n) {
203     using namespace std;
204     cout << "enter expenses for 4 seasons" << endl;
205     for (int i = 0; i < n; ++ i) {
206         while (!(cin >> arr[i])) {
207             cin.clear();
208             while (cin.get() != '\n')
209                 continue;
210             cout << "must number: ";
211         }
212     }
213 }
214 
215 void ch7_8_show(const double * arr, unsigned int n) {
216     using namespace std;
217     for (int i = 0; i < n; ++ i)
218         cout << arr[i] << " ";
219     cout << endl;
220 }
221 
222 void ch7_8() {
223     using namespace std;
224     const unsigned int snum = 4;
225     const char * SEASONSNAME[] = {"Spring", "Summer", "Fall", "Winter"};
226     double expenses[snum]{0};
227     ch7_8_fill(expenses, snum);
228     ch7_8_show(expenses, snum);
229 }
230 
231 void ch7_9() {
232     using namespace std;
233 // the title is too long. Don't read o.o
234 }
235 
236 double ch7_10_calculate(double x, double y, double (* pf)(double, double)) {
237     return pf(x, y);
238 }
239 
240 double ch7_10_add(double x, double y) {
241     return x + y;
242 }
243 
244 double ch7_10_mul(double x, double y) {
245     return x * y;
246 }
247 
248 void ch7_10() {
249     using namespace std;
250     double x{0}, y{0};
251     cout << "enter two double" << endl;
252     cout << "x: ";
253     while (!(cin >> x)) {
254         cin.clear();
255         while (cin.get() != '\n')
256             continue;
257         cout << "must a double: ";
258     }
259     cout << "y: ";
260     while (!(cin >> y)) {
261         cin.clear();
262         while (cin.get() != '\n')
263             continue;
264         cout << "must a double: ";
265     }
266     cout << "x + y == " << ch7_10_calculate(x, y, ch7_10_add) << endl;
267     cout << "x * y == " << ch7_10_calculate(x, y, ch7_10_mul) << endl;
268 }