您的位置:首页 > 编程语言 > C语言/C++

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

2016-11-29 17:07 176 查看



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的记录。
其实该程序还是又很多细节可以修改,等再学习深入之后再来修改吧!
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  c++作业