跳转至

1.5 类简介

练习 1.20

在网站http://www.informit.com/title/0321714113上,第1章的代码目录中包含了头文件Sales_item.h。将它拷贝到你自己的工作目录中。用它编写一个程序,读取一组书籍销售记录,将每条记录打印到标准输出上。

#include <iostream>
#include "Sales_item.h"

int main()
{

    const static int MAX_LOOP_TIMES = 2;
    Sales_item item[MAX_LOOP_TIMES];

    for (int i = 0; i < MAX_LOOP_TIMES; ++i)
    {
        std::cin >> item[i];    
    }

    for (int i = 0; i < MAX_LOOP_TIMES; ++i)    
        std::cout << item[i] << std::endl;

    return 0;
}

练习 1.21

编写程序,读取两个ISBN相同的Sales_item对象,输出它们的和。

#include <iostream>
#include "Sales_item.h"

int main()
{
    Sales_item item1;
    Sales_item item2;

    std::cin >> item1 >> item2;

    if (item1.isbn() == item2.isbn())
    {
        item1 += item2;
    }

    std::cout << item1 << std::endl;

    return 0;
}

练习 1.22

编写程序,读取多个具有相同ISBN的销售记录,输出所有记录的和。

#include <iostream>
#include "Sales_item.h"
#include <vector>

int main()
{
    int is_continue = 0;        // 0 stop loop

    std::vector<Sales_item> item_vec;

    int count = 0;
    do 
    {
        std::cout << "Enter 1 to enter item info or enter 0 print and quit:";

        std::cin >> is_continue;

        if (is_continue != 0)
        {
            Sales_item item;
            std::cout << "Enter the " << count + 1 << "book info: (tip:bookno sale_count sale_price):";
            std::cin >> item;

            item_vec.push_back(item);
            ++count;        
        } 
    }
    while (is_continue != 0);


    Sales_item ret;                     // result

    std::cout << "bookno count price" << std::endl;
    for (int i = 0; i < item_vec.size(); ++i)
    {
        if (ret.isbn() != item_vec[i].isbn())
        {
            ret.reset();
            ret.setBookNo(item_vec[i].isbn());  // only print the same book
        }
        ret = ret + item_vec[i];
        std::cout << "the "<< i + 1 << "book info: " << item_vec[i] << std::endl;       
    }
    std::cout << "the result: " << ret << std::endl;

    return 0;
}

练习 1.23

编写程序,读取多条销售记录,并统计每个ISBN(每本书)有几条销售记录。

#include <iostream>
#include "Sales_item.h"
#include <map>


int main()
{
    std::map<std::string, int> count_map;

    int is_loop = 0; 


    do
    {
        std::cout << "Enter 1 to enter item info or enter 0 print and quit:";
        std::cin >> is_loop;

        if (is_loop != 0)
        {
            Sales_item item;
            std::cout << "Enter the book info: (tip:bookno sale_count sale_price):";
            std::cin >> item;

            // 查找并统计次数
            auto map_it = count_map.begin();
            for (map_it; map_it != count_map.end(); ++map_it)
            {
                if (map_it->first == item.isbn())
                {
                    map_it->second++;
                    break;
                }
            }
            if (map_it == count_map.end())
            {
                count_map[item.isbn()] = 1;
            }
        }
    }
    while(is_loop != 0);


    for (const auto &map_it : count_map)
    {
        std::cout << "book " << map_it.first << " count: " << map_it.second << std::endl;
    }
}

练习 1.24

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

#include <iostream>
#include "Sales_item.h"
#include <map>


int main()
{
    std::map<std::string, int> count_map;

    int is_loop = 0; 


    do
    {
        std::cout << "Enter 1 to enter item info or enter 0 print and quit:";
        std::cin >> is_loop;

        if (is_loop != 0)
        {
            Sales_item item;
            std::cout << "Enter the book info: (tip:bookno sale_count sale_price):";
            std::cin >> item;

            // 查找并统计次数
            auto map_it = count_map.begin();
            for (map_it; map_it != count_map.end(); ++map_it)
            {
                if (map_it->first == item.isbn())
                {
                    map_it->second++;
                    break;
                }
            }
            if (map_it == count_map.end())
            {
                count_map[item.isbn()] = 1;
            }
        }
    }
    while(is_loop != 0);


    for (const auto &map_it : count_map)
    {
        std::cout << "book " << map_it.first << " count: " << map_it.second << std::endl;
    }
}