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 6 | 1x 6 7 | 2x 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的记录。 |
其实该程序还是又很多细节可以修改,等再学习深入之后再来修改吧!