C ++ Primer练习1.23在2个条目后终止

时间:2017-12-10 19:36:21

标签: c++

C ++ Primer第5版的练习1.23要求您编写一个程序,使用包含在.isbn()内的Sales_item.h方法计算假想书店中某本书的条目数。类。我写了一个程序,应该使用数组,但由于某种原因,在两个条目后它总是终止。

#include <iostream>
#include "sales_Item.h"
using namespace std;

int main()
{
    Sales_item isbn[20], entryCheck[20], entry;
    int slot=0, count=0, previousCheck=0, entrySlot=0, countArr[20];
    while(cin>>entry)
    {
        if(previousCheck>0)
        {
            entryCheck[entrySlot]=entry;
            if(entryCheck[entrySlot].isbn()==entryCheck[entrySlot-1].isbn())
            {
                count++;
                entrySlot++;
            }
            else
            {
                isbn[slot]=entryCheck[entrySlot].isbn();
                countArr[slot]=count;
                count=0;
                slot++;
            }

        }
        else
        {
            entryCheck[entrySlot]=entry;
            previousCheck++;
            entrySlot++;
        }
    }
    for(int x=0; x<slot; x++)
    {
        cout<<"The book with the ID of: "<<isbn[x]<<" has had "<<countArr[x]<<" entries."<<endl;
    }

    return 0;
}

sales_Item.h是:

#ifndef SALESITEM_H

// we're here only if SALESITEM_H has not yet been defined

#define SALESITEM_H



// Definition of Sales_item class and related functions goes here

#include <iostream>

#include <string>



class Sales_item {

// these declarations are explained section 7.2.1, p. 270

// and in chapter 14, pages 557, 558, 561

friend std::istream& operator>>(std::istream&, Sales_item&);

friend std::ostream& operator<<(std::ostream&, const Sales_item&);

friend bool operator<(const Sales_item&, const Sales_item&);

friend bool

operator==(const Sales_item&, const Sales_item&);

public:

    // constructors are explained in section 7.1.4, pages 262 - 265

    // default constructor needed to initialize members of built-in type

    Sales_item() = default;

    Sales_item(const std::string &book): bookNo(book) { }

    Sales_item(std::istream &is) { is >> *this; }

public:

    // operations on Sales_item objects

    // member binary operator: left-hand operand bound to implicit this pointer

    Sales_item& operator+=(const Sales_item&);



    // operations on Sales_item objects

    std::string isbn() const { return bookNo; }

    double avg_price() const;

// private members as before

private:

    std::string bookNo;      // implicitly initialized to the empty string

    unsigned units_sold = 0; // explicitly initialized

    double revenue = 0.0;

};



// used in chapter 10

inline

bool compareIsbn(const Sales_item &lhs, const Sales_item &rhs)

{ return lhs.isbn() == rhs.isbn(); }



// nonmember binary operator: must declare a parameter for each operand

Sales_item operator+(const Sales_item&, const Sales_item&);



inline bool

operator==(const Sales_item &lhs, const Sales_item &rhs)

{

    // must be made a friend of Sales_item

    return lhs.units_sold == rhs.units_sold &&

           lhs.revenue == rhs.revenue &&

           lhs.isbn() == rhs.isbn();

}



inline bool

operator!=(const Sales_item &lhs, const Sales_item &rhs)

{

    return !(lhs == rhs); // != defined in terms of operator==

}



// assumes that both objects refer to the same ISBN

Sales_item& Sales_item::operator+=(const Sales_item& rhs)

{

    units_sold += rhs.units_sold;

    revenue += rhs.revenue;

    return *this;

}



// assumes that both objects refer to the same ISBN

Sales_item

operator+(const Sales_item& lhs, const Sales_item& rhs)

{

    Sales_item ret(lhs);  // copy (|lhs|) into a local object that we'll return

    ret += rhs;           // add in the contents of (|rhs|)

    return ret;           // return (|ret|) by value

}



std::istream&

operator>>(std::istream& in, Sales_item& s)

{

    double price;

    in >> s.bookNo >> s.units_sold >> price;

    // check that the inputs succeeded

    if (in)

        s.revenue = s.units_sold * price;

    else

        s = Sales_item();  // input failed: reset object to default state

    return in;

}



std::ostream&

operator<<(std::ostream& out, const Sales_item& s)

{

    out << s.isbn() << " " << s.units_sold << " "

        << s.revenue << " " << s.avg_price();

    return out;

}



double Sales_item::avg_price() const

{

    if (units_sold)

        return revenue/units_sold;

    else

        return 0;

}

#endif

0 个答案:

没有答案