《C++ Primer》的書店程序有一個缺點(diǎn)昼捍,就是相同isbn的數(shù)據(jù)必須連續(xù)輸入识虚。本程序?qū)ale_data類結(jié)合vector,實(shí)現(xiàn)了不用連續(xù)輸入妒茬。說明在注釋里担锤。
Sale_data.h
#include<iostream>
#include<vector>
#include<string>
#include<algorithm>
using namespace::std;
/*Sale_data類功能:
/1 使用get_isbn()獲取isbn
/2 使用read(或add(),功能相同乍钻,只是為了練習(xí)代碼)肛循,print來input铭腕,output一個Sale_data
/3 使用display合并相同數(shù)據(jù),并展示
/4 使用assign賦值
/5 使用superposition(或combine()多糠,功能相同)累加Sale_data
*/
class Sales_data{
friend istream & read(istream &, Sales_data &);
friend ostream & print(ostream &, const Sales_data &);
string isbn;
int book_num;
double unit_price, discount, revenue;
bool able;
public:
Sales_data() = default;
//Sale_data類有6個成員變量累舷,前四個由用戶輸入,第五個(revenue)計算得到夹孔,第六個表示一個性能參數(shù)被盈,與用戶無關(guān),默認(rèn)為1(True)搭伤,當(dāng)賦值為0(False)時表示禁用只怎,在后面程序用到時詳細(xì)說明
Sales_data(string a, int b, double c, double d):isbn(a),book_num(b),unit_price(c),discount(d),revenue(book_num*unit_price*discount),able(1){}
~Sales_data(){};
void get_isbn();
void add();
void assign(Sales_data book);
void superposition(Sales_data book);
void display(vector<Sales_data> &gather);
Sales_data& combine(const Sales_data &book);
};
void Sales_data::get_isbn(){
cout<<isbn;
}
void Sales_data::add(){
cin>>isbn>>book_num>>unit_price>>discount;
revenue = book_num*unit_price*discount;
}
void Sales_data::assign(Sales_data book){
isbn = book.isbn;
book_num = book.book_num;
unit_price = book.unit_price;
discount = book.discount;
revenue = book_num*unit_price*discount;
}
void Sales_data::superposition(Sales_data book){
if(isbn==book.isbn){
//累加相同Sale_data
revenue = revenue + book.revenue;
unit_price = (book_num*unit_price*discount+book.book_num*book.unit_price*book.discount)/(book_num+book.book_num);
discount = discount*(((double)book_num/(book_num+book.book_num)))+book.discount*(((double)book.book_num/(book_num+book.book_num)));
book_num += book.book_num;
}
else
cout<<"Can't superposition"<<endl;
}
void Sales_data::display(vector<Sales_data> &gather){
//設(shè)置able類成員變量,當(dāng)遍歷整個vector時闷畸,先以第一個Sale_data為基準(zhǔn)尝盼,找到所有isbn相同的Sale_data,累加佑菩。再將第一個Sale_data與其余Sale_data的able屬性設(shè)置為0盾沫,即禁用這些Sale_data
if(!gather.empty()){
cout<<"display:"<<endl;
auto itit = gather.begin();
for(vector<Sales_data>::iterator it = gather.begin();it != gather.end();++it){
//
if(it->able==1){
for(auto it2 = gather.begin()+(it-itit+1);it2 != gather.end();++it2){
//這兩個if(itx->able==1)實(shí)現(xiàn)了只有able為1的Sale_data進(jìn)行運(yùn)算
if(it2->able==1){
if((it->isbn)==(it2->isbn)){
(*it).superposition(*it2);
it2->able = 0;
}
}
}
cout<<"\nisbn:"<<it->isbn<<"\nbook_num:"<<it->book_num<<"\nunit_price:"<<it->unit_price<<"\ndiscount:"<<it->discount<<"\nrevenue:"<<it->revenue<<endl;
}
}
}
else
cerr<<"No data?!"<<endl;
}
Sales_data& Sales_data::combine(const Sales_data &book){
if(isbn==book.isbn){
revenue = revenue + book.revenue;
unit_price = (book_num*unit_price*discount+book.book_num*book.unit_price*book.discount)/(book_num+book.book_num);
discount = discount*(((double)book_num/(book_num+book.book_num)))+book.discount*(((double)book.book_num/(book_num+book.book_num)));
book_num += book.book_num;
}
else
cout<<"Can't superposition"<<endl;
return *this;
}
ostream &print(ostream &os, const Sales_data &book){
os<<"\nisbn:"<<book.isbn<<"\nbook_num:"<<book.book_num<<"\nunit_price:"<<book.unit_price<<"\ndiscount:"<<book.discount<<"\nrevenue:"<<book.revenue;
return os;
}
istream &read(istream &is, Sales_data &book){
is>>book.isbn>>book.book_num>>book.unit_price>>book.discount;
book.revenue = book.book_num*book.unit_price*book.discount;
return is;
}
bookstore.cpp
#include<iostream>
#include<vector>
#include"Sales_item2.h"
#include<string>
using namespace::std;
int main(){
//定義一個vector儲存多個Sale_data
static vector<Sales_data> gather;
cout<<"Please input your data:"<<endl;
cout<<"isbn:\t"<<"book_num:\t"<<"unit_price:\t"<<"discount:\t"<<endl;
char if_quit;//進(jìn)行循環(huán)控制,選擇不同功能殿漠,由于一開始的想法是控制退出赴精,所以命名用的是if_quit
//類的實(shí)例化中booklast用于push_back進(jìn)容器,不對其做函數(shù)操作
//而其余(比如book)的則用于函數(shù)操作
//沒有使用do-while循環(huán)绞幌,是因為while循環(huán)有分支,先輸入一個Sale_data便于后續(xù)操作(比如“n”)
Sales_data booklast("299999", 999, 999, 999);
read(cin, booklast);
gather.push_back(booklast);
//將最后一個booklast暫存蕾哟,以便于“?”操作,以下同此功能
static Sales_data book("299999", 999, 999, 999);
book.assign(booklast);
//if_quit根據(jù)用戶輸入實(shí)現(xiàn)五種功能
cout<<"Enter \"q\" to quit"<<endl;
cout<<"Enter \"n\" to make a same data"<<endl;
cout<<"Enter \"?\" to inqurey the last book"<<endl;
cout<<"Enter \"+\" to make a combine and display them(one is the last data and one is you will input next)"<<endl;
cout<<"Enter any another to continue"<<endl;
cout<<"Your enter:";
cin>>if_quit;
while((if_quit != 'q')){
//當(dāng)不進(jìn)行特殊操作時莲蜘,繼續(xù)輸入
if((if_quit!='n')&&(if_quit!='?')&&(if_quit!='+')){
Sales_data booklast("299999", 999, 999, 999);
booklast.add();
gather.push_back(booklast);
book.assign(booklast);
}
if(if_quit=='n'){
Sales_data booklast("299999", 999, 999, 999);
booklast.assign(book);
gather.push_back(booklast);
}
if(if_quit=='?'){
cout<<"<";
book.get_isbn();
cout<<">";
print(cout, book)<<endl;
}
if(if_quit=='+'){
Sales_data booklast("299999", 999, 999, 999);
read(cin, booklast);
gather.push_back(booklast);
book.combine(booklast);
print(cout, book)<<endl;
book.assign(booklast);
}
cout<<"Enter \"q\" to quit"<<endl;
cout<<"Enter \"n\" to make a same data"<<endl;
cout<<"Enter \"?\" to inqurey the last book"<<endl;
cout<<"Enter \"+\" to make a combine and display them(one is the last data and one is you will input next)"<<endl;
cout<<"Enter any another to continue"<<endl;
cout<<"Your enter:";
cin>>if_quit;
}
cout<<"The all data:"<<endl;
Sales_data bookx;
bookx.display(gather);
return 0;
}
運(yùn)行結(jié)果
Last login: Mon Jul 16 20:02:38 on console
Please input your data:
isbn: book_num: unit_price: discount:
201701 5 100 1
Enter "q" to quit
Enter "n" to make a same data
Enter "?" to inqurey the last book
Enter "+" to make a combine and display them(one is the last data and one is you will input next)
Enter any another to continue
Your enter:a
201701 10 100 0.9
Enter "q" to quit
Enter "n" to make a same data
Enter "?" to inqurey the last book
Enter "+" to make a combine and display them(one is the last data and one is you will input next)
Enter any another to continue
Your enter:+
201701 20 100 0.85
isbn:201701
book_num:30
unit_price:86.6667
discount:0.866667
revenue:2600
Enter "q" to quit
Enter "n" to make a same data
Enter "?" to inqurey the last book
Enter "+" to make a combine and display them(one is the last data and one is you will input next)
Enter any another to continue
Your enter:?
<201701>
isbn:201701
book_num:20
unit_price:100
discount:0.85
revenue:1700
Enter "q" to quit
Enter "n" to make a same data
Enter "?" to inqurey the last book
Enter "+" to make a combine and display them(one is the last data and one is you will input next)
Enter any another to continue
Your enter:a
201702 1 50 1
Enter "q" to quit
Enter "n" to make a same data
Enter "?" to inqurey the last book
Enter "+" to make a combine and display them(one is the last data and one is you will input next)
Enter any another to continue
Your enter:n
Enter "q" to quit
Enter "n" to make a same data
Enter "?" to inqurey the last book
Enter "+" to make a combine and display them(one is the last data and one is you will input next)
Enter any another to continue
Your enter:q
The all data:
display:
isbn:201701
book_num:35
unit_price:85.9048
discount:0.885714
revenue:3100
isbn:201702
book_num:2
unit_price:50
discount:1
revenue:100
real 2m29.718s
user 0m0.003s
sys 0m0.003s
Press ENTER or type command to continue
??附件下載:bookstore.cpp
????????Sale_data.h