我们通过定义一个类(class)来定义自己的数据结构。
Sales_item类
- 调用一个名为isbn的函数从一个Sales_item对象中提取ISBN书名号
- 用输入输出运算符>><<读写对象
- 用赋值运算符将一个对象赋值给另外一个对象
- 用加法运算符将两个对象相加,两个对象必须表示同一本书,加法结果是一个新的对象,其ISBN与两个运算对象相同,而其总销售额和售出册数是两个运算对象之和
- 使用复合运算符+=将一个对象加到另一个对象上。
1.5.1例题
从标准输入读入数据,存入一个Sales_item对象中,然后将Sales_item的内容写回到标准输出。
#include <iostream>
#include "Sales_item.h"
int main()
{
Sales_item book;
//读入ISBN号,售出的册数,销售价格
std::cin >> book;
//写入ISBN号,售出的册数,总销售额,平均价格
std::cout << book << std::endl;
return 0;
}
#include指令中,标准库头文件用< >包围头文件名,对于不属于标准库的头文件(自定义头文件),用" "包围。
将两个Sales_item对象相加
#include <iostream>
#include "Sales_item.h"
int main()
{
Sales_item item1,item2;
std::cin >> item1>>item2;//读取一对交易记录
std::cout << item1+item2 << std::endl;//打印它们的和
return 0;
}
文件重定向
这种机制允许我们将标准输入和标准输出与命名文件关联起来
$ addItems<infile>outfile
假定 $ 是系统操作提示符,我们的加法程序已经编译为名为 addItems.exe 的可执行文件(在UNIX中是addItems),则上述命令会从一个名为 infile 的文件读取销售记录,并将输出结果写入到一个名为 outfile 的文件中,两个文件都位于当前目录中。
练习1.20
用Sales_item编写一个程序,读取一组书籍销售记录,将每条记录打印到标准输出上。
答:读取数量不定的输入数据。while(std::cin>>book) 从标准输出中读取下一个数,保存在book中。
#include <iostream>
#include "Sales_item.h"
int main()
{
Sales_item book;
std::cout << "请输入销售记录" << std::endl;
while (std::cin >> book)
{
std::cout <<"售出的册数,总销售额,平均价格"<< book << std::endl;
std::cout << "\t请输入销售记录"<<std::endl;
}
return 0;
}
练习1.21
编写程序,读取两个ISBN相同的Sales_item对象,输出它们的和。
答:考虑多种情况
#include <iostream>
#include "Sales_item.h"
int main()
{
Sales_item book1,book2;
std::cout << "请输入两条ISBN相同销售记录" << std::endl;
while (std::cin >> book1 >> book2)
{
if (book1 == book2)
std::cout << "售出的册数,总销售额,平均价格" << book1 + book2 << std::endl;
else
std::cout << "输入的ISBN不相同,请重新输入" << std::endl;
}
return 0;
}
练习1.22
编写程序,读取多个具有相同ISBN的销售记录,输出所有记录的和。
答:先输入两个相同ISBN,之后再次输入的数据进行判断,循环
#include <iostream>
#include "Sales_item.h"
int main()
{
Sales_item total,trans;
std::cout << "请输入ISBN相同销售记录" << std::endl;
if (std::cin>>total)
{
while (std::cin >> trans)
if (total.isbn == trans.isbn)//ISBN相同
{
total = total + trans;
std::cout << " 售出的册数,总销售额,平均价格 " << total + trans << std::endl;
}
else
{
std::cout << "输入的ISBN不相同,请重新输入" << std::endl;
return -1;
}
std::cout << "ISBN 售出本数 销售额" << total << std::endl;
}
else
{
std::cout << "没有数据" << std::endl;
return -1;
}
return 0;
}
遇见问题
问题一:答案中存在(应该是调用compareIsbn函数进行isbn是否相同的判断)
if(compareIsbn(total,trans))//ISBN相同
Sales_item中有(使isbn相同)
bool same_isbn(const Sales_item& rhs)const
{
return isbn == rhs.isbn;
}
都是判断ISBN是否相同的,名字不一样。调试过程中将自定义头文件改为如下,仍然运行不了。
bool compareIsbn(const Sales_item& lhs, const Sales_item& rhs)
{
return isbn == rhs.isbn;
return isbn== lhs.isbn;
}
//vs对语法要求更严,高版本vs不能直接或临近比较
if中compareIsbn报错未定义标识符,明明包含了头文件引用函数,查询资料调试后无果。
最后选择恒等,也能运行。
问题二:
调试过程第一个else出现“应输入一个语句”,查阅发现代码不规范导致。
if后面如果不加大括号,那么if后面的第一条语句属于if的,多余的一条语句就是其他的了,就会导致后面else不知道和那个if匹配了。
因此建议在if后面的多条语句用大括号括起来,这样后面的else才能找到和其配对的
如下
if()
{
}
else
{
}
问题三:
while内部的return 作用是退出循环体所在的函数,相当于结束该方法。 break 的作用是结束循环,跳出循环体,执行后面的程序。 continue 的作用是结束此次循环,进行下一次循环;