C++ primer plus中文编程练习答案第16章.docx
C+ primer plus中文编程练习答案第16章1、 /Reverse.cpp #include <iostream> #include <string> using namespace std; boolisReverse(const string &s1, const string &s2); int main string words; cout<< "Enter a string (quit to quit): n" while (cin>> words&&words != "quit") stringrwords(words.rbegin, words.rend); cout<< "words: " << words <<endl; if (isReverse(rwords, words) cout<< words << " is reverse words.n" else cout<< words << " is not reverse words.n" cout<< "Enter a next words (quit to quit): n" system("pause"); return 0; boolisReverse(const string &s1, const string &s2) if (pare(s2) return false; else return true; 2、 /Reverse.cpp #include <iostream> #include <string> #include <cctype> using namespace std; boolisReverse(const string &s1, const string &s2); voidToLower(string &s1); int main string words; cout<< "Enter a string (quit to quit): n" getline(cin, words); while (words != "quit") ToLower(words); stringrwords(words.rbegin, words.rend); cout<< "words: " << words <<endl; if (isReverse(rwords, words) cout<< words << " is reverse words.n" else cout<< words << " is not reverse words.n" cout<< "Enter a next words (quit to quit): n" getline(cin, words); system("pause"); return 0; boolisReverse(const string &s1, const string &s2) if (pare(s2) return false; else return true; voidToLower(string &s1) unsignedinti = 0; while (i< s1.length) if (isalpha(s1i) s1i = tolower(s1i); i+; else s1.replace(i, s1.size, s1, i + 1, s1.size); 3、 /hangman.cpp #include <iostream> #include <string> #include <cstdlib> #include <ctime> #include <cctype> #include <fstream> #include <vector> using namespace std; vector<string> wordlist; voidFillWord; int main srand(time(0); char play; cout<< "Will you play a word game? <y/n> " cin>> play; play = tolower(play); FillWord; while (play = 'y') string target = wordlistrand % wordlist.size; int length = target.length; string attempt(length, '-'); stringbadchars; int guesses = 6; cout<< "Guess my secret word. It has " << length << " letters, and you guessn" << "one letter at a time. You get " << guesses <<" wrong guesses.n" cout<< "Your word: " << attempt <<endl; while (guesses > 0 && attempt != target) char letter; cout<< "Guess a letter: " cin>> letter; if (badchars.find(letter) != string:npos | attempt.find(letter) != string:npos) cout<< "You already guessed that. Try again.n" continue; intloc = target.find(letter); if (loc = string:npos) cout<< "Oh,bad guess!n" -guesses; badchars += letter; else cout<< "Good guess!n" attemptloc = letter; loc - target.find(letter, loc + 1); while (loc != string:npos) attemptloc = letter; loc = target.find(letter, loc + 1); cout<< "Your word: " << attempt <<endl; if (attempt != target) if (badchars.length > 0) cout<< "Bad choices: " <<badchars<<endl; cout<< guesses << " bad guesses leftn" if (guesses > 0) cout<< "That's right!n" else cout<< "Sorry, the word is " << target << ".n" cout<< "Will you play another? <y/n> " cin>> play; play = tolower(play); cout<< "Byen" system("pause"); return 0; voidFillWord ifstream fin; string letter; fin.open("letters.txt"); if (fin.is_open = false) cerr<< "Can't open file. Bye.n" exit(EXIT_FAILURE); while (fin) fin>> letter; wordlist.push_back(letter); fin.close; /letters.txt apiary beetle cereal danger ensign florid garage health insult jackal keeper loaner manage nonce onset plaid quilt remote stolid train useful valid whence xenon yearn zippy 4、 /Reduce.cpp #include <iostream> #include <list> #include <algorithm> using namespace std; int reduce(long ar, int n); voidoutlong(int n) cout<< n << " " int main long a10 = 1, 3, 2, 4, 7, 6, 3, 4, 8, 10 ; intnums = reduce(a, 10); cout<< "Numbers after reduce: " <<nums<<endl; system("pause"); return 0; int reduce(long ar, int n) list<long>arr; arr.insert(arr.begin, ar, ar + n); arr.sort; arr.unique; for_each(arr.begin, arr.end, outlong); cout<<endl; returnarr.size; 5、 /Reduce.cpp #include <iostream> #include <list> #include <algorithm> #include <string> using namespace std; template<class T> int reduce(T ar, int n); template<class T> voidoutlong(T n) cout<< n << " " int main long a10 = 1, 3, 2, 4, 7, 6, 3, 4, 8, 10 ; int nums1 = reduce(a, 10); cout<< "Numbers after reduce: " << nums1 <<endl; string b10 = "qwe", "qwe", "ret", "tyu", "dfg", "jkl", "iok", "kjl", "ads", "def" ; int nums2 = reduce(b, 10); cout<< "Numbers after reduce: " << nums2 <<endl; system("pause"); return 0; template<class T> int reduce(T ar, int n) list<T>arr; arr.insert(arr.begin, ar, ar + n); arr.sort; arr.unique; for_each(arr.begin, arr.end, outlong<T>); cout<<endl; returnarr.size; 6、 /bank.cpp #include <iostream> #include <cstdlib> #include <queue> #include <ctime> using namespace std; class Customer private: long arrive; intprocesstime; public: Customer arrive = processtime = 0; void set(long when) processtime = rand % 3 + 1; arrive = when; long whenconst return arrive; intptimeconst return processtime; ; typedef Customer Item; constint MIN_PER_HR = 60; boolnewcustomer(double x); int main srand(time(0); cout<< "Case Study: Bank of Heather Automatic Tellern" cout<< "Enter maximum size of queue: " intqs; cin>>qs; queue<Item> line; cout<< "Enter the number of simulation hours: " int hours; cin>> hours; longcyclelimit = MIN_PER_HR*hours; cout<< "Enter the average number of customers per hour: " doubleperhour; cin>>perhour; doublemin_per_cust; min_per_cust = MIN_PER_HR / perhour; Item temp; longturnaways = 0; long customers = 0; long served = 0; longsum_line = 0; intwait_time = 0; longline_wait = 0; for (int cycle = 0; cycle <cyclelimit; cycle+) if (newcustomer(min_per_cust) if (line.size = qs) turnaways+; else customers+; temp.set(cycle); line.push(temp); if (wait_time<= 0 && !line.empty) line.pop; wait_time = temp.ptime; line_wait += cycle - temp.when; served+; if (wait_time> 0) wait_time-; sum_line += line.size; if (customers > 0) cout<< "customers accepted: " << customers <<endl; cout<< " customers served: " << served <<endl; cout<< " turnaways: " <<turnaways<<endl; cout<< "average queue size: " cout.precision(2); cout.setf(ios_base:fixed, ios_base:floatfield); cout<< (double)sum_line / cyclelimit<<endl; cout<< " average wait time: " << (double)line_wait / served << " minutesn" else cout<< "No customers!n" cout<< "Done!n" system("pause"); return 0; boolnewcustomer(double x) return (rand*x / RAND_MAX < 1); 7、 /Lotto.cpp #include <vector> #include <iostream> #include <iterator> #include <algorithm> #include <ctime> using namespace std; vector<int> Lotto(int l1, int l2); void Show(int n); int main vector<int> winners; winners = Lotto(51, 6); for_each(winners.begin, winners.end, Show); system("pause"); return 0; vector<int> Lotto(int l1, int l2) vector<int>nums; vector<int> nums2; srand(time(0); for (inti = 0; i< l1; i+) nums.push_back(i); random_shuffle(nums.begin, nums.end); for (inti = 0; i< l2; i+) nums2.push_back(numsrand % l1 + 1); return nums2; void Show(int n) cout<< "The winner is " << n <<endl; 8、 /name.cpp #include <iostream> #include <string> #include <set> #include <algorithm> #include <iterator> int main using namespace std; ostream_iterator<string, char>out(cout, " "); string fname1; set<string> A; cout<< "Enter Mat's friends(quit to quit): n" getline(cin, fname1); while (fname1 != "quit") A.insert(fname1); getline(cin, fname1); cout<< "Mat's friends: n" copy(A.begin, A.end, out); cout<<endl; string fname2; set<string> B; cout<< "Enter Pat's friends(quit to quit): n" getline(cin, fname1); while (fname1 != "quit") B.insert(fname1); getline(cin, fname1); cout<< "Pat's friends: n" copy(B.begin, B.end, out); cout<<endl; cout<< "Union of Mat and Pat's friends: " set_union(A.begin, A.end, B.begin, B.end, out); cout<<endl; system("pause"); return 0; 9、 /sorttime.cpp #include <iostream> #include <vector> #include <list> #include <ctime> #include <iterator> #include <algorithm> using namespace std; constint Size = 10000; int main clock_t start, end; vector<int> vi0(Size); list<int> li(Size); srand(time(0); for (inti = 0; i< Size; i+) vi0i = rand % Size; copy(vi0.begin, vi0.end, back_inserter(li); vector<int> vi(vi0); start = clock; sort(vi.begin, vi.end); end = clock; cout<< "Time of Sort Vector:" << (double)(end - start) / CLOCKS_PER_SEC <<endl; start = clock; li.sort; end = clock; cout<< "Time of Sort List:" << (double)(end - start) / CLOCKS_PER_SEC <<endl; copy(vi0.begin, vi0.end, back_inserter(li); start = clock; copy(li.begin, li.end, back_inserter(vi); sort(vi.begin, vi.end); copy(vi.begin, vi.end, back_inserter(li); end = clock; cout<< "Time of Sort List2:" << (double)(end - start) / CLOCKS_PER_SEC <<endl; system("pause"); return 0; 10、 /vect.cpp #include <iostream> #include <string> #include <vector> #include <algorithm> #include <memory> #include <cstdlib> using namespace std; struct Review string title; int rating; double price; ; bool operator<(constshared_ptr<Review>&r1, constshared_ptr<Review>&r2); boolworseThan(constshared_ptr<Review>&r1, constshared_ptr<Review>&r2); boolbetterThan(constshared_ptr<Review>&r1, constshared_ptr<Review>&r2); boolworseThanP(constshared_ptr<Review>&r1, constshared_ptr<Review>&r2); boolbetterThanP(constshared_ptr<Review>&r1, constshared_ptr<Review>&r2); boolFillReview(shared_ptr<Review>&rr); shared_ptr<Review>make_Review; voidShowReview(shared_ptr<Review>&rr); int main vector<shared_ptr<Review>> books; shared_ptr<Review>temp(new Review); while (FillReview(temp) books.push_back(temp); temp = make_Review; if (books.size > 0) vector<shared_ptr<Review>>sbook(books); cout<< "Thank you. You entered the following:n" <<books.size << " ratings:n" << "RatingtBooktPricen" for_each(books.begin, books.end, ShowReview); charch; cout<< "Enter measures of sort:no to old" cout<< "t to title, r to down rating,nR to up rating" "p to down price,P to up price, f(F) to shuffle,nq to quit:" cin>>ch; while (tolower(ch) != 'q') switch (ch) case'o': cout<< "Not Sort:nRatingtBooktPricen" for_each(books.begin, books.end, ShowReview); break; case't': sort(sbook.begin, sbook.end); cout<< "Sorted by title:nRatingtBooktPricen" for_each(sbook.begin, sbook.end, ShowReview); break; case'r': sort(sbook.begin, sbook.end, worseThan); cout<< "Sorted by down rating:nRatingtBooktPricen" for_each(sbook.begin, sbook.end, ShowReview); break; case'R': sort(sbook.begin, sbook.end, betterThan); cout<< "Sorted by up rating:nRatingtBooktPricen" for_each(sbook.begin, sbook.end, ShowReview); break; case'p': sort(sbook.begin, sbook.end, worseThanP); cout<< "Sorted by down price:nRatingtBooktPricen" for_each(sbook.begin, sbook.end, ShowReview); break; case'P': sort(sbook.begin, sbook.end, betterThanP); cout<< "Sorted by up price:nRatingtBooktPricen" for_each(sbook.begin, sbook.end, ShowReview); break; case'F': case'f': random_shuffle(sbook.begin, sbook.end); cout<< "After shuffling:nRatingtBookn" for_each(sbook.begin, sbook.end, ShowReview); break; default: cout<< "Error input!Input again!" break; cout<< "Enter the next measures:no to old" cout<< "t to title, r to down rating,nR to up rating" "p to down price,P to up price, q to quit:" cin>>ch; else cout<< "No entries. " cout<< "Bye.n" system("pause"); return 0; bool operator<(constshared_ptr<Review>&r1, constshared_ptr<Review>&r2) if (r1->title < r2->title) return true; else if (r1->title = r2->title&&r1->rating < r2->rating) return true; else return false; boolworseThan(constshared_ptr<Review>&r1, constshared_ptr<Review>&r2) if (r1->rating < r2->rating) return true; else return false; boolbetterThan(constshared_ptr<Review>&r1, constshared_ptr<Review>&r2) if (r1->rating > r2->rating) return true; else return false; boolworseThanP(constshared_ptr<Review>&r1, constshared_ptr<Review>&r2) if (r1->price < r2->price) return true; else return false; boolbetterThanP(constshared_ptr<Review>&r1, constshared_ptr<Review>&r2) if (r1->price > r2->price) return true; else return false; shared_ptr<Review>make_Review returnshared_ptr<Review>(new Review); boolFillReview(shared_ptr<Review>&rr) cout<< "Enter book title (quit to quit): " getline(cin, rr->title); if (rr->title = "quit") return false; cout<< "Enter book rating: " cin>>rr->rating; cout<< "Enter book price: " cin>>rr->price; if (!cin) return false; while (cin.get != 'n') continue; return true; voidShowReview(shared_ptr<Review>&rr) cout<<rr->rating << "t" <<rr->title << "t" <<rr->price <<endl;