C++primer 第1章 快速入门
[引子]:某书店以文件形式保存每一笔交易。每笔交易记录某本书的销售情况,含ISBN,销售册数和销售单价。每一笔交易形如:
0-201-70353-x 4 24.99
第一个元素是ISBN,第二个元素是销售的册数,最后是销售单价。店主定期查看这个文件,统计每本书的销售册数,总销售收入以及平均售价。我们编程来进行计算:
【需要实现下面几点:】
- 定义变量
- 实现输入和输出
- 定义数据结构来保存处理的数据
- 测试是否两条记录具有相同的ISBN
- 编写循环,处理交易文件中的每一条记录
1 #include< iostream>; 2 #include"Sales_item.h"; 3 int main() 4 { 5 Sales_item total, trans; 6 //程序将每一个ISBN的数据组合至命名为total的Sales_item对象中。 7 /*从标准输入中读取的每一笔交易将被存储在命名为trans的第二个Sales_item对象中。 8 * 每读取一笔新的交易,就将它与total中的Sales_item对象相比较,如果含有相同的ISBN,就更新total;否则就输出total的值,并使用刚读入的交易重置total;*/ 9 if(std::cin>>total) 10 { 11 while(std::cin>>total) 12 { 13 while(std::cin>>trans) 14 if(total.same_isbn(trans)) 15 total+=trans; 16 else 17 { 18 std::cout< 19 total=trans; 20 } 21 std::cout< 22 }else{ 23 std::cout<<"No data!"< 24 return -1; 25 } 26 return 0; 27 }
【解释这段代码的知识点:】
1. 每一个C++程序都包含一个或多个函数,但必须有一个主函数main(),且main函数是唯一被操作系统显式调用的函数;
2. C++并没有直接定义进行输入输出(IO)的任何语句,这种功能由标准库提供的;标准库定义了4个IO对象;
- 处理输入时使用 cin(读:see-in)的istream类型对象,这个对象也叫做标准输入。
- 处理输出时使用cout(读:see-out)的ostream类型对象,这个对象也叫做标准输出。
- cerr(读:see-err),cerr对象又叫做标准错误,通常用来输出警告和错误信息给程序使用者;
- clog(读:see-log),clog对象用于产生程序执行的一般信息;
3. std::表明cin,cout和endl是定义在命名空间(namespace)std中的。【使用命名空间,程序元可以避免由于无意使用了与库中所定义名字相同的名字而引致冲突】,::作用域操作符(scope operator,::操作符)
4. endl 是一个特殊值,称为操纵符,将它写入输出流时,有换行效果,并刷新与设备相关联的缓冲区。通过刷新缓冲区,用户可立即看到写入到流中的输出。
5. 注释:单行注释以双斜线(//)开头,多行注释以“/*”开头,以“*”结尾;
6. 一些语句while语句,for语句,if语句都不再解释;
7. 读入未知数目的输入:while(std::cin>>trans) 它具有从标准输入读取一个数并且将读入的值保存在trans中的效果。
- 输入操作符(>>)返回左操作数,while 条件测试输入操作符的返回结果,即测试std::cin;
- 当我们使用istream对象作为条件,结果是测试流的状态,如果流逝有效的(也就是说读入下一个输入是可能的)那么测试成功;如果遇到文件结束符(end-of-file)或遇到无效输入时,如读取了一个不是整数的值,则istream对象是无效的。处于无效状态的istream对象将导致条件失败;
- Windows系统下通过键入Ctrl+z,来输入文件结束符;Unix系统中,包括Mac OS-X机器,通常用control+d;
8. Sales_item类的目的是存储ISBN并保存该书的销售册数,销售收入和平均售价。
- 每个类定义一种类型,类型名和类名相同。因此用Sales_item类定义了total和trans :Sales_item total, trans;
- 类Sales_item的创建者定义该类对象可以执行的所有操作(+[将两个Sales_item对象相加],>>[来读取一个Sales_item对象],<<[来输出一个Sales_item对象],=[讲一个Sales_item对象赋值给另一个Sales_item对象],same_isbn函数[确定两个Sales_item是否指同一本书])
9. if(total.same_isbn(trans)){
- 调用命名为item1的Sales_item对象的成员函数【成员函数是由类定义的函数,有时称为类方法(method)】
- 点操作符“.” 通过它的左操作数取得有操作数。左操作数必须是类类型的对象,右操作数必须是指定该类型的成员的名字,而不是对象或值;
- 调用操作符(),
参考书籍
[1]C++primer 中文第四版