学习C++Primer第五版,课后练习。


P21 练习1.24

输入表示多个ISBN的多条销售记录来测试上一个程序,每条ISBN的记录应该聚在一起。


下面为我做的时候的程序:

#include <iostream>
#include "Sales_item.h"
int main()
{
	Sales_item curbook, book;
	std::cout << "请输入书籍记录: " << std::endl;
	if (std::cin >> curbook)
	{
		while (std::cin >> book)
		{
			if (compareIsbn(book, curbook))
			{
				curbook += book;

			}
			else
			{
				std::cout << "该书本销售的总记录为: " << curbook << std::endl;
				curbook = book;//将isbn号不一样的书本付给当前书本
			}
		}
		std::cout << "该书本销售的总记录为: " << curbook << std::endl;		
	}
	else
	{
		std::cout << "无数据 " << std::endl;
		return -1;//返回错误
	}
	system("pause");
	return 0;
}

而得出的结果并不合适,比如1x 1 2 ,1x 2 3,2x 2 5 前两条记录可以相加并打印出来,而最后一条打印不出来,此时程序并为结束,而是要再次输入ctrl+z才可打印最后一条记录。如截图:















此时程序仍未结束,等待下一个输入,所以必须再次输入ctrl+z才可以结束并打印,并且如果此时再输入一条记录,仍会将两条相同的记录相加的。如下图




并且我找到了官方给出的答案是同一情况,有可能是没有考虑到这一点。

我也没有再去深思,等以后再去详细解决这个问题吧,先留个坑。嗨呀!



2016.12.4更新

前几天一直再忙考试就没有思考这个问题,今天又想了一下,并又仔细的看了书本的描述,问题得到了解决。

书本上实际是假设相同ISBN的书本记录是聚在一起来放置的,也就是说比如ISBN号为1x的记录有四个,那么这四条记录中就不会在插入其他的ISBN的记录了,也就是说 1x 12 21 1x 21 33 2x 22 22 就像这样放置的,所以第一个问题是这样的。

那么对于第二个问题,是这样的,

记录执行情况
1x 5 61x 6 72x 5 6
执行第一个if判断是否有记录,有就执行while查询
下一个ISBN记录,即book指向了1x 6 7这条记录
book指向了该记录,发现了和curbook的ISBN相等,
就令他们两个相加,然后又一次执行while,
这个时候book指向了下一条记录发现ISBN不相等,
所以就打印curbook的记录(此时curbook+=book),然后就再将book的值给curbook
值得注意的是此时,curbook就是指向的该数据,然后book就要指向下一条数据了,所以显示的是一直在等下一条数据输入,只有下一条数据是^Z是才可以结束并打印最后一条数据
 此时只打印除最后一个ISBN的记录之前的所有记录只有再输入^z之后才可以显示最后一个ISBN的记录。

其实该程序还是又很多细节可以修改,等再学习深入之后再来修改吧!

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值