C++primer 书店程序文本输入输出

C++primer 书店程序文本输入输出,第1张

C++primer 书店程序文本输入输出

在C++primer第五版的8.2节中,要求是从一个文件中读取销售记录,生成每本书的销售报告,显示售出册数、总销售额和平均售价,但是文中给的是每个ISBN书号的所有销售记录在文件中是聚在一起保存的。也就是说,输入销售记录时,要求同一个书号的销售记录要连续一次性全部输入。但是动手 *** 作,就会发现如果给定的文件里面书号不是聚在一起的,那么该如何 *** 作
首先,先附上sales_data.h的代码块:

#ifndef SALES_DATA_H_
#define SALES_DATA_H_

#include 
using 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;
	}

}

输入文件:

程序运行结果显示:

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/zaji/5116204.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-11-17
下一篇 2022-11-17

发表评论

登录后才能评论

评论列表(0条)

保存