使用我的sales_data类编写一个简单的程序

时间:2014-08-09 16:10:40

标签: c++

我从一本书中完成了以下练习:

  

使用您的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。

1 个答案:

答案 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<

阅读后,遍历容器,打印项目及其出现次数。