1.6 C++(www.cppentry.com)程序
现在我们已准备好解决最初的书店问题:我们需要读销售交易文件,并产生报告显示每本书的总销售收入、平均销售价格和销售册数。
假定给定ISBN的所有交易出现在一起。程序将把每个ISBN的数据组合至命名为total的Sales_item对象中。从标准输入中读取的每一笔交易将被存储到命名为trans的第二个Sales_item对象中。每读取一笔新的交易,就将它与total中的Sales_item对象相比较,如果对象含有相同的ISBN,就更新total。否则就输出total的值,并使用刚读入的交易重置total。
#include <iostream> #include "Sales_item.h" int main() { // declare variables to hold running sum and data for the next record Sales_item total, trans; // is there data to process if (std::cin >> total) { // if so, read the transaction records while (std::cin >> trans) if (total.same_isbn(trans)) // match: update the running total total = total + trans; else { // no match: print & assign to total std::cout << total << std::endl; total = trans; } // remember to print last record std::cout << total << std::endl; } else { // no input!, warn the user std::cout << "No data !" << std::endl; return -1; // indicate failure } return 0; }
|
这个程序是到目前我们见到的程序中最为复杂的一个,但它仅使用了我们已遇到过的工具。和平常一样,我们从包含所使用的头文件开始:标准库中的iostream和自定义的头文件Sales_item.h。
在main中我们定义了所需要的对象:total,用来计算给定的ISBN的交易的总数,trans用来存储读取的交易。我们首先将交易读入total并测试是否读取成功,如果读取失败,表示没有记录,程序进入最外层的else分支,输出信息警告用户没有输入。
假如我们成功读取了一个记录,则执行if分支里的代码。首先执行while语句,循环遍历剩余的所有记录。就像1.4.3小节的程序一样,while循环的条件从标准输入中读取值并测试实际读取的是否是合法数据。本例中,我们将一个Sales_item对象读至trans。只要读取成功,就执行while循环体。
while循环体只是一条if语句。我们测试ISBN是否相等。如果相等,我们将这两个对象相加并将结果存储到total中。否则,我们就输出存储在total中的值,并将trans赋值给total来重置total。执行完if语句之后,将返回到while语句中的条件,读入下一个交易,直到执行完所有记录。
一旦while完成,我们仍须写出与最后一个ISBN相关联的数据。当while语句结束时,total包含文件中最后一条ISBN数据,但是我们没有机会输出这条数据。我们在结束最外层if语句的语句块的最后一条语句中进行输出。
习题
习题1.25 使用源自网站上的Sales_item.h头文件,编译并执行本节给出的书店程序。
习题1.26 在书店程序中,我们使用了加法操作符而不是复合赋值操作符将trans加到total中,为什么我们不使用复合赋值操作符?< xml:namespace prefix = std />
【责任编辑:
董书 TEL:(010)68476606】