我从一本书中完成了以下练习:
使用您的
sales_data
类编写一个读取多个程序的程序 相同isbn的交易,并计算每个isbn的次数 发生
我已经编写过这样的程序,我必须输入一个数字列表,然后打印出每个数字出现的次数。
本书为我提供了完成此任务的课程定义:
#ifndef SALES_DATA_H
#define SALES_DATA_H
#include <string>
struct Sales_data {
std::string bookNo;
unsigned units_sold = 0;
double revenue = 0;
};
#endif
这是程序应该收到的输入:
0-201-78345 1-x 19.99 (ISBN, units_sold, price to book)
0-201-78345 1-x 19.99 (same ISBN)
2-201-78345-z 2 26.99
输出应为:
0-201-78345 x-1 OCCURS 2 times
2-201-78345-z OCCURS 1 times
我的程序,而不是阅读所有的ISBN并打印计数器,只有在isbns不同时才打印计数器。
这是我的代码:
#include <iostream>
#include "Sales_data.h"
#include <string>
int main()
{
Sales_data currVal,val;
double price = 0;
if (std::cin >> currVal.bookNo >> currVal.units_sold >> price) {
int cnt = 1;
while (std::cin >> val.bookNo >> val.units_sold >> price) {
if (currVal.bookNo == val.bookNo)
++cnt;
else {
std::cout << currVal.bookNo << " occurs" << cnt << " times" << std::endl;
currVal = val;
cnt = 1;
}//end of else
}//end of while
std::cout << currVal.bookNo << " occurs" << cnt << " times" << std::endl;
}// end of outhermost if
system("pause");
}
另外,如果您没有插入文件结尾序列,我的程序不会打印最后一个ISBN。
答案 0 :(得分:0)
尝试使用std::map
:
typedef std::map<Sales_Data, unsigned int> Container_Type;
Container_Time inventory;
//...
Sales_Data item;
// Assume Sales_Data has overloaded operator>>.
while (std::cin >> item)
{
Container_Type::iterator iter = inventory.find(item);
if (iter != inventory.end())
{
iter->second++; // Increment the occurances.
}
else
{
// New item, add to container.
inventory[item] = 1;
}
}
上述代码还假设Sales_Data
重载operator==
和operator<
。
阅读后,遍历容器,打印项目及其出现次数。