在C++primer第五版的8.2节中,要求是从一个文件中读取销售记录,生成每本书的销售报告,显示售出册数、总销售额和平均售价,但是文中给的是每个ISBN书号的所有销售记录在文件中是聚在一起保存的。也就是说,输入销售记录时,要求同一个书号的销售记录要连续一次性全部输入。但是动手 *** 作,就会发现如果给定的文件里面书号不是聚在一起的,那么该如何 *** 作
首先,先附上sales_data.h的代码块:
#ifndef SALES_DATA_H_ #define SALES_DATA_H_ #includeusing namespace std; struct Sales_data; std::istream& read(std::istream& is, Sales_data& item); std::ostream& print(std::ostream& os, const Sales_data& item); Sales_data add(const Sales_data& lhs, const Sales_data& rhs); struct Sales_data { friend std::istream& read(std::istream& is, Sales_data& item); friend std::ostream& print(std::ostream& os, const Sales_data& item); friend Sales_data add(const Sales_data& lhs, const Sales_data& rhs); public: Sales_data() = default; Sales_data(const std::string& s) : bookNo(s) {} Sales_data(const std::string& s, unsigned n, double p) : bookNo(s), units_sold(n), revenue(p* n) {} Sales_data(std::istream& is) { read(is, *this); } std::string isbn() const { return bookNo; } Sales_data& combine(const Sales_data&); inline double avg_price() const; std::string bookNo; unsigned units_sold = 0; double price = 0.0; double revenue = 0.0; }; Sales_data& Sales_data::combine(const Sales_data& rhs) { units_sold += rhs.units_sold; revenue += rhs.revenue; return *this; } inline double Sales_data::avg_price() const { if (units_sold) return revenue / units_sold; else return 0; } std::istream& read(std::istream& is, Sales_data& item) { //double price = 0; is >> item.bookNo >> item.units_sold >>item.price; item.revenue = item.price * item.units_sold; return is; } std::ostream& print(std::ostream& os, const Sales_data& item) { os << item.isbn() << " " << item.units_sold << " " << item.revenue << " " << item.avg_price(); return os; } Sales_data add(const Sales_data& lhs, const Sales_data& rhs) { Sales_data sum = lhs; sum.combine(rhs); return sum; } #endif
接下来,附上主函数
#include#include #include #include "Sales_data.h" #define MAX 100 int main() { ifstream input("101.txt");//自己随便写的txt文件,放入项目路径下 ofstream ouput("202.txt"); Sales_data item[MAX]; //创建一个数组存放不同书 int j = 1; //计数变量 Sales_data total; //读取第一条数据 if (read(input, total)) { item[0] = total; //第一本书放item[0] //Sales_data trans; //读取下一条数据变量 while (read(input, total)) { for (int i = 0; i < j; i++) { if (total.isbn() == item[i].isbn())//新读入的书是否前面出现过 { //combin 叠加 item[i].combine(total);//更新同一本书的销售总额 break; } else { //遍历完数组,还没找到,便该添加了 if (i == j - 1) { item[i] = total;//新添加一本 j++; break; } } } } } else { cerr << "No Data?" << endl; } //遍历数组元素、输出 for (int i = 0; i < j; i++) { print(ouput, item[i]) << endl; } }
输入文件:
程序运行结果显示:
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)