c++primer学习 1.5.1 Sales_item类

我们通过定义一个类(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 的作用是结束此次循环,进行下一次循环;

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值