【C++ Primer Plus】编程练习答案——第16章

 1 // chapter16.h
 2 
 3 
 4 #ifndef LEARN_CPP_CHAPTER16_H
 5 #define LEARN_CPP_CHAPTER16_H
 6 
 7 #include <iostream>
 8 #include <string>
 9 #include <cctype>
10 #include <vector>
11 #include <ctime>
12 #include <cstdlib>
13 #include <fstream>
14 #include <algorithm>
15 #include <queue>
16 #include <list>
17 #include <memory>
18 
19 void ch16_1();
20 void ch16_2();
21 void ch16_3();
22 int reduce(long * ar, int n);
23 void ch16_4();
24 template<class T>
25 int reduce2(T * ar, int n);
26 void ch16_5();
27 bool newcustomer(double x);
28 void ch16_6();
29 std::vector<int> lotto(int n, int select);
30 void ch16_7();
31 void ch16_8();
32 void ch16_9();
33 
34 struct Review {
35     std::string title;
36     int rating;
37 };
38 bool operator<(const Review & r1, const Review & r2);
39 bool worseThan(const Review & r1, const Review & r2);
40 bool FillReview(Review & rr);
41 void ShowReview(const std::shared_ptr <Review> & rr);
42 void ch16_10();
43 
44 #endif //LEARN_CPP_CHAPTER16_H
  1 // chapter16.cpp
  2 
  3 
  4 #include "chapter16.h"
  5 
  6 void ch16_1() {
  7     using namespace std;
  8     string str;
  9     cout << "input a string: ";
 10     getline(cin, str);
 11     bool flag = true;
 12     for (int i = 0; i < str.size() / 2; ++ i)
 13         if (str[i] != str[str.size() - 1 - i]) {
 14             flag = false; break;
 15         }
 16     cout << (flag ? "yes!" : "no!") << endl;
 17 }
 18 
 19 void ch16_2() {
 20     using namespace std;
 21     string str;
 22     cout << "input a string: ";
 23     getline(cin, str);
 24     bool flag = true;
 25     for (int i = 0, j = str.size() - 1; i < j; ++ i, -- j) {
 26         if (!isalpha(str[i]))
 27             ++i;
 28         if (!isalpha(str[j]))
 29             --j;
 30         if (i < j) {
 31             str[i] = tolower(str[i]);
 32             str[j] = tolower(str[j]);
 33             if (str[i] != str[j]) {
 34                 cout << str[i] << " " << str[j] << endl;
 35                 flag = false;
 36                 break;
 37             }
 38         }
 39     }
 40     cout << (flag ? "yes!" : "no!") << endl;
 41 }
 42 
 43 void ch16_3() {
 44     using namespace std;
 45     const string FILENAME = "../C++PrimerPlus/testfiles/hangman.txt";
 46     ifstream InFile;
 47     InFile.open(FILENAME);
 48     if (!InFile.is_open()) {
 49         cout << "file not found" << endl;
 50         return;
 51     }
 52     vector<string> wordlist;
 53     string t;
 54     while (InFile >> t) {
 55         wordlist.push_back(t);
 56         t = "";
 57     }
 58     InFile.close();
 59     srand(time(0));
 60     char play;
 61     cout << "Will you play a word game? <y/n> ";
 62     cin >> play;
 63     play = tolower(play);
 64     while (play == 'y') {
 65         string target = wordlist[rand() % wordlist.size()];
 66         int length = target.length();
 67         string attempt(length, '-');
 68         string badchars;
 69         int guesses = 6;
 70         cout << "Guess my secret word. It has " << length
 71             << " letters, and you guess\n"
 72             << "one letter at a time. You get " << guesses
 73             << " wrong guesses." << endl;
 74         cout << "Your word: " << attempt << endl;
 75         while (guesses > 0 && attempt != target) {
 76             char letter;
 77             cout << "Guess a letter: ";
 78             cin >> letter;
 79             if (badchars.find(letter) != string::npos || attempt.find(letter) != string::npos) {
 80                 cout << "You already guessed that. Try again." << endl;
 81                 continue;
 82             }
 83             int loc = target.find(letter);
 84             if (loc == string::npos) {
 85                 cout << "Oh, bad guess!" << endl;
 86                 -- guesses;
 87                 badchars += letter;
 88             }
 89             else {
 90                 cout << "Good guess!" << endl;
 91                 attempt[loc] = letter;
 92                 loc = target.find(letter, loc + 1);
 93                 while (loc != string::npos) {
 94                     attempt[loc] = letter;
 95                     loc = target.find(letter, loc + 1);
 96                 }
 97             }
 98             cout << "Your word: " << attempt << endl;
 99             if (attempt != target) {
100                 if (badchars.length() > 0)
101                     cout << "Bad choices: " << badchars << endl;
102                 cout << guesses << " bad guesses left" << endl;
103             }
104         }
105         if (guesses > 0)
106             cout << "That's right!" << endl;
107         else
108             cout << "Sorry, the word is " << target << "." << endl;
109         cout << "Will you play another? <y/n> ";
110         cin >> play;
111         play = tolower(play);
112     }
113     cout << "Bye! " << endl;
114 }
115 
116 int reduce(long * ar, int n) {
117     std::sort(ar, ar + n);
118     long * end = std::unique(ar, ar + n);
119     return int(end - ar);
120 }
121 
122 void ch16_4() {
123     using namespace std;
124     long arr[5] = {3, 9, 0, 1, 1};
125     for (auto x : arr)
126         cout << x << "\t";
127     cout << endl;
128     int l = reduce(arr, 5);
129     for (int i = 0; i < l; ++ i)
130         cout << arr[i] << "\t";
131     cout << endl;
132 }
133 
134 template<class T>
135 int reduce2(T * ar, int n) {
136     std::sort(ar, ar + n);
137     T * end = std::unique(ar, ar + n);
138     return int(end - ar);
139 }
140 
141 void ch16_5() {
142     using namespace std;
143     long arr[5] = {3, 9, 0, 1, 1};
144     for (auto x : arr)
145         cout << x << "\t";
146     cout << endl;
147     int l = reduce2(arr, 5);
148     for (int i = 0; i < l; ++ i)
149         cout << arr[i] << "\t";
150     cout << endl;
151     string arr2[5] = {"bb", "aa", "cc", "cc", "cc"};
152     for (auto x : arr2)
153         cout << x << "\t";
154     cout << endl;
155     int l2 = reduce2(arr2, 5);
156     for (int i = 0; i < l2; ++ i)
157         cout << arr2[i] << "\t";
158     cout << endl;
159 }
160 
161 const int MIN_PER_HR = 60;
162 
163 bool newcustomer(double x) {
164     return (std::rand() * x / RAND_MAX < 1);
165 }
166 
167 void ch16_6() {
168     // 懒得打字了,很简单。。
169 }
170 
171 std::vector<int> lotto(int n, int select) {
172     std::vector<int> arr(n);
173     for (int i = 1; i <= n; ++ i)
174         arr[i - 1] = i;
175     std::vector<int> winner;
176     srand(unsigned(time(0)));
177     for (int i = 0; i < select; ++ i) {
178         std::random_shuffle(arr.begin() + i, arr.end());
179         winner.push_back(arr[i]);
180     }
181     return winner;
182 }
183 
184 void ch16_7() {
185     using namespace std;
186     int n, select;
187     cout << "game!" << endl;
188     cout << "input num: "; cin >> n;
189     cout << "input select num: "; cin >> select;
190     cout << "result: " << endl;
191     for (auto x : lotto(n, select))
192         cout << x << "\t";
193     cout << endl;
194 }
195 
196 void ch16_8() {
197     using namespace std;
198     vector<string> mat, pat;
199     string t;
200     cout << "Hey Mat, who do you want to invite <end to quit>:" << endl;
201     while (getline(cin, t)) {
202         if (t == "end")
203             break;
204         mat.push_back(t);
205         t = "";
206         //cin.get();
207     }
208     cout << "Hey Pat, who do you want to invite <end to quit>:" << endl;
209     while (getline(cin, t)) {
210         if (t == "end")
211             break;
212         pat.push_back(t);
213         t = "";
214         //cin.get();
215     }
216     sort(mat.begin(), mat.end());
217     sort(pat.begin(), pat.end());
218     cout << "Mat's guests: ";
219     for (auto x : mat)
220         cout << x << "  ";
221     cout << endl << "Pat's guests: ";
222     for (auto x : pat)
223         cout << x << "  ";
224     vector<string> mer(mat.size() + pat.size());
225     merge(mat.begin(), mat.end(), pat.begin(), pat.end(), mer.begin());
226     cout << endl << "All guests: ";
227     for (auto x : mer)
228         cout << x << "  ";
229     cout << endl;
230 }
231 
232 void ch16_9() {
233     using namespace std;
234     vector<int> vi0(10000000);
235     vector<int> vi(10000000);
236     list<int> li(10000000);
237     srand(unsigned(time(0)));
238     for (auto x : vi0)
239         x = rand();
240     copy(vi0.begin(), vi0.end(), vi.begin());
241     copy(vi0.begin(), vi0.end(), li.begin());
242     clock_t vit, lit, lit2, start, end;
243 
244     start = clock();
245     sort(vi.begin(), vi.end());
246     end = clock();
247     vit = end - start;
248 
249     start = clock();
250     li.sort();
251     end = clock();
252     lit = end - start;
253 
254     copy(vi0.begin(), vi0.end(), li.begin());
255     start = clock();
256     copy(li.begin(), li.end(), vi.begin());
257     sort(vi.begin(), vi.end());
258     copy(vi.begin(), vi.end(), li.begin());
259     end = clock();
260     lit2 = end - start;
261 
262     cout << "<10000000 int nums for sort>" << endl;
263     cout << "vector sort time: " << double(vit) / CLOCKS_PER_SEC << " secs" << endl;
264     cout << "list sort time: " << double(lit) / CLOCKS_PER_SEC << " secs" << endl;
265     cout << "list -> vector, vector sort, vector -> list time: " << double(lit2) / CLOCKS_PER_SEC << " secs" << endl;
266 }
267 
268 bool operator<(const Review & r1, const Review & r2) {
269     if (r1.title < r2.title)
270         return true;
271     else if (r1.title == r2.title && r1.rating < r2.rating)
272         return true;
273     else
274         return false;
275 }
276 
277 bool worseThan(const Review & r1, const Review & r2) {
278     if (r1.rating < r2.rating)
279         return true;
280     else
281         return false;
282 }
283 
284 bool FillReview(Review & rr) {
285     std::cout << "Enter book title (quit to quit): ";
286     std::getline(std::cin, rr.title);
287     if (rr.title == "quit")
288         return false;
289     std::cout << "Enter book rating: ";
290     std::cin >> rr.rating;
291     if (!std::cin)
292         return false;
293     while (std::cin.get() != '\n')
294         continue;
295     return true;
296 }
297 
298 void ShowReview(const std::shared_ptr <Review> & rr) {
299     std::cout << rr -> rating << "\t" << rr -> title << std::endl;
300 }
301 
302 void ch16_10() {
303     using namespace std;
304     vector<shared_ptr<Review>> books;
305     shared_ptr<Review> t;
306     Review temp;
307     while (FillReview(temp))
308         books.push_back(static_cast<shared_ptr <Review>>(new Review(temp)));
309     if (books.size() > 0) {
310         cout << "Thank you. You entered the following "
311             << books.size() << " ratings:" << endl
312             << "Rating\tBook\n";
313         for_each(books.begin(), books.end(), ShowReview);
314 
315         sort(books.begin(), books.end());
316         cout << "Sorted by title:\nRating\tBook\n";
317         for_each(books.begin(), books.end(), ShowReview);
318 
319         random_shuffle(books.begin(), books.end());
320         cout << "After shuffling:\nRating\tBook\n";
321         for_each(books.begin(), books.end(), ShowReview);
322     }
323     else
324         cout << "No entries. ";
325     cout << "Bye!" << endl;
326 }

 字数字数字数字数字数字数字数字数字数字数字数字数字数字数字数字数字数字数字数字数字数字数字数字数字数字数字数字数字数字数字数字数字数字数字数字数字数字数字数字数字数字数字数字数字数字数字数字数字数字数字数字数字数字数字数字数字数字数字数字数字数字数字数字数字数字数字数字数字数字数字数字数字数字数字数字数字数字数字数字数字数字数字数字数字数字数字数字数字数字数字数字数字数字数字数字数字数字数字数字数字数字数字数字数字数字数字数字数字数字数字数字数字数字数字数字数字数字数字数字数字数字数字数字数字数字数字数字数字数字数字数字数字数字数字数字数字数字数字数字数字数字数字数字数字数字数字数字数字数字数字数字数字数字数字数字数字数字数字数字数字数字数字数字数字数字数字数字数

posted @ 2021-11-08 15:30  开心果壳好硬  阅读(212)  评论(0编辑  收藏  举报