日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程语言 > c/c++ >内容正文

c/c++

c++ primer 5th,练习11.19,编写代码验证

發布時間:2024/4/18 c/c++ 26 豆豆
生活随笔 收集整理的這篇文章主要介紹了 c++ primer 5th,练习11.19,编写代码验证 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

對于這個題,自己話費2個多小時編寫了代碼,親自驗證正確性,順便復習類的知識點,下面采用分離式編譯自己把代碼放在三個文件中main.cc,function,sales_data.h,大家應該根據文件名推斷各個文件的作用,main.cc主函數,function.cc是定義函數的地方,sales_data.h是放置類和函數聲明的地方。代碼可以運行,自己運行過。還有一個數據文件,data.txt是存放數據的。

文件:sales_data.h

//文件sales_data.h #ifndef SALES_DATA_INCLUDE #define SALES_DATA_INCLUDE #include <iostream> #include <string> using namespace std; class Sales_data{ public:Sales_data() = default; Sales_data(istream &is); Sales_data(const string &s); Sales_data(const string &s,unsigned n,double p); const string isbn()const; friend istream &read(istream &is,Sales_data & lhs); friend ostream &print(ostream &os,const Sales_data &rhs); friend Sales_data add(const Sales_data &lhs,const Sales_data &rhs); Sales_data & combine(const Sales_data &rhs); private: string bookno; unsigned sales_count; double revenue;};#endif

文件function.cc?

//文件 function.cc #include <string> #include <iostream> #include "sales_data.h" using namespace std; Sales_data::Sales_data(istream &is) { double price; is >> bookno >> sales_count >> price;revenue = price * sales_count; } Sales_data::Sales_data(const string &s):bookno(s),sales_count(0),revenue(0){} Sales_data::Sales_data(const string &s,unsigned n,double p):bookno(s),sales_count(n),revenue(n * p){} const string Sales_data::isbn()const{return bookno;} Sales_data & Sales_data::combine(const Sales_data &rhs){ revenue += rhs.revenue; sales_count += rhs.sales_count; return *this; } istream & read(istream &is,Sales_data &rhs) {double price;is >> rhs.bookno >> rhs.sales_count >> price;rhs.revenue = price * rhs.sales_count; return is; }ostream &print(ostream &os,const Sales_data &rhs) {os << "bookno:"<<rhs.bookno << endl;os << "\tbook sales-count:"<<rhs.sales_count << endl;os << "\tbook sales-revenue:"<<rhs.revenue << endl<<endl; return os; } Sales_data add(Sales_data &lhs,const Sales_data &rhs) {lhs.combine(rhs); return lhs; }

文件main.cc?

#include <iostream> #include <string> #include <fstream> #include <set> #include <iterator> #include "sales_data.h" using namespace std;bool compareIsbn(const Sales_data &,const Sales_data &);typedef bool (*pf)(const Sales_data &,const Sales_data &); void print(multiset<Sales_data,pf> m); int main(int argc,char **argv) { ifstream in(argv[1]); multiset<Sales_data,pf> bookstore(compareIsbn); Sales_data data; while(read(in,data)) {bookstore.insert(bookstore.begin(),data); } print(bookstore);return 0; }void print(multiset<Sales_data,pf> m) { multiset<Sales_data,pf>::iterator it; for(it = m.begin();it != m.end();++it){print(cout,*it);}} bool compareIsbn(const Sales_data &lhs,const Sales_data &rhs) { return (lhs.isbn() < rhs.isbn()); }

總結,非undered關聯容器類型,如果自定義排序函數,那么在定義這個關聯容器的時候,需要在類型中指定自定義比較函數(就是自己想用什么樣的排序規則,自己定義的那個返回bool的比較函數)指針類型,在變量中后面需要緊跟比較函數名稱。(例如main.cc的第16行),但是在定義這個類型的形參的時候,變量名后面卻不需要加函數名稱。加了就錯。這個是我在本題得出的一個簡單結論。

?

數據文件data.txt,如下:

"abcde" 10 1.2 "abcd" 5 1.2 "aaa" 10 2.5 "isbn-isbn-isbn-isbn-abcd-efhg" 100 2.4

自己在ubuntu20.04中編譯和執行,命令和結果如下:

r@r:~/c++index/11.3.1/5$ g++ function.cc main.cc -o result r@r:~/c++index/11.3.1/5$ ./result data.txt bookno:"aaa"book sales-count:10book sales-revenue:25bookno:"abcd"book sales-count:5book sales-revenue:6bookno:"abcde"book sales-count:10book sales-revenue:12bookno:"isbn-isbn-isbn-isbn-abcd-efhg"book sales-count:100book sales-revenue:240

由于時間關系,沒有驗證更多函數。

所以本題中答案其實很明顯了,pf的定義就是本題要的答案,pf(函數compareIsbn函數的指針類型)定義如下:

雖然說了一堆,但是本題答案其實主要是需要定義函數compareIsbn的指針,是一句不起眼的代碼,下面就是:

typedef bool (*pf)(const Sales_data &,const Sales_data &);

?

總結

以上是生活随笔為你收集整理的c++ primer 5th,练习11.19,编写代码验证的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。