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头文件,编译并运行本节给出的书店程序。
补充文档链接 - 点击一下