1.6 书店程序

1.6 书店程序

现在我们已经准备好完成书店程序了。我们需要从一个文件中读取销售记录,生成每本书的销售报告,显示售出册数、总销售额和平均售价。我们假定每个ISBN书号的所有记录在文件中是聚在一起保存的。
我们的程序会将每个ISBN的所有数据合并起来,存入名为total的变量。我们使用另一个名为trans的变量保存读取的每条销售记录。如果trans和total指向相同的ISBN,我们会更新total的值。否则,我们会打印total的值,并将其重置为刚刚读取的数据(trans):

#include <iostream>
#include "Sales_item.h"
int main()
{
	Sales_item total; // 保存下一条交易记录的变量
	// 读入第一条交易记录,并确保有数据可以处理
	if(std::cin>>total){
		Sales_item trans; // 保存和的变量
		// 读入并处理剩余交易记录
		while(std::cin>>trans){
			if(total.isbn()==trans.isbn())
				total+=trans; // 更新总销售额
			else{
				// 打印前一本书的结果
				std::cout<<total<<std::endl;
				total=trans; // total现在表示下一本书的销售额
			}
		}
		std::cout<<total<<std::endl; // 打印最后一本书的结果
	}else{
		// 没有输入!警告读者
		std::cerr<<"No data?!"<<std::endl;
		return -1; // 表示失败
	}
	return 0;
}

这是到目前为止我们看到的最复杂的程序了,但它所使用的都是我们已经见过的语言特性。
与往常一样,首先包含要使用的头文件:来自标准库的iostream和自己定义的Sales_item.h。在main中,我们定义了一个名为total的变量,用来保存一个给定的ISBN的数据之和。我们首先读取第一条销售记录,存入total中,并检测这次读取操作是否成功。如果读取失败,则意味着没有任何销售记录,于是直接跳到最外层的else分支,打印一条警告信息,告诉用户没有输入。
假定已经成功读取了一条销售记录,我们继续执行最外层if之后的语句块。这个语句块首先定义一个名为trans的对象,它保存读取的销售记录。接下来的while语句将读取剩下的所有销售记录。与我们之前的程序一样,while条件是一个从标准输入读取值的操作。在本例中,我们读取一个Sales_item对象,存入trans中。只要读取成功,就执行while循环体。
while的循环体是一个单个的if语句,它检查ISBN是否相等。如果相等,使用复合赋值运算符将trans加到total中。如果ISBN不等,我们打印保存在total中的值,并将其重置为trans的值。在执行完if语句后,返回到while循环条件,读取下一条销售记录,如此反复,直至所有销售记录都处理完。
当while语句终止时,total保存着文件中最后一个ISBN的数据。我们在语句块的最后一条语句中打印这最后一个ISBN的total值,至此最外层的if语句就结束了。

1.6节练习


练习1.25:借助补充文档中的Sales_item.h头文件,编译并运行本节给出的书店程序。
补充文档链接 - 点击一下

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值