summaryrefslogtreecommitdiff
path: root/7p49.cpp
diff options
context:
space:
mode:
Diffstat (limited to '7p49.cpp')
-rw-r--r--7p49.cpp103
1 files changed, 103 insertions, 0 deletions
diff --git a/7p49.cpp b/7p49.cpp
new file mode 100644
index 0000000..3cf1c09
--- /dev/null
+++ b/7p49.cpp
@@ -0,0 +1,103 @@
+#include <iostream>
+
+/*
+ *
+ * 7.49
+ *
+ *
+ */
+
+struct SalesData;
+SalesData add(const SalesData&, const SalesData&);
+std::ostream &print(std::ostream&, const SalesData&);
+std::istream &read(std::istream&, SalesData&);
+struct SalesData {
+ SalesData() = default;
+ SalesData(const std::string &s): BookNo(s) { } //constructor, bookNo only
+ SalesData(const std::string &s, unsigned n, double p): // constructor, both bookno, UnitsSold and Revenue
+ BookNo(s), UnitsSold(n), Revenue(p*n) { }
+ SalesData(std::istream &sdcin) { read(sdcin, *this); }; // Constructor, but read from istream
+ std::string isbn() const { return BookNo; } // member function
+
+ //-------
+ SalesData &combine(SalesData);
+ //SalesData &combine(SalesData&);
+ //SalesData &combine(const SalesData&) const; Does not compile
+ //-------
+
+ inline double avg_price() const; // member function, defined elsewhere
+ std::string BookNo; // data member
+ unsigned int UnitsSold = 0; // data member
+ double Revenue = 0.0; // data member
+};
+
+inline double SalesData::avg_price() const {
+
+ if (UnitsSold)
+ return Revenue / UnitsSold;
+ else
+ return 0;
+}
+
+SalesData& SalesData::combine(SalesData rhs) {
+
+ UnitsSold += rhs.UnitsSold;
+ Revenue += rhs.Revenue;
+ return *this;
+}
+
+/*
+SalesData& SalesData::combine(SalesData &rhs) {
+
+ UnitsSold += rhs.UnitsSold;
+ Revenue += rhs.Revenue;
+ return *this;
+}
+*/
+/*
+SalesData& SalesData::combine(const SalesData &rhs) const {
+
+ UnitsSold += rhs.UnitsSold;
+ Revenue += rhs.Revenue;
+ return *this;
+}
+*/
+
+std::istream &read(std::istream &is, SalesData &item) { // Not member function
+
+ double price = 0;
+ is >> item.BookNo >> item.UnitsSold >> price;
+ item.Revenue = price * item.UnitsSold;
+ return is;
+}
+
+std::ostream &print(std::ostream &os, const SalesData &item) { // Not member function
+
+ os << item.isbn() << " " << item.UnitsSold << " "
+ << item.Revenue << " " << item.avg_price();
+ return os;
+}
+
+SalesData add(const SalesData sd1, const SalesData sd2) { // Not member function
+
+ SalesData sdsum = sd1;
+ sdsum.combine(sd2);
+ return sdsum;
+}
+
+int main () {
+
+ /*
+ For each of the three following declarations of combine, explain what
+ happens if we call i.combine(s), where i is a Sales_data and s is a string:
+
+ (a) SalesData &combine(Sales_data); It does not combine as expected, i'm not sure.
+ (b) Sales_data &combine(Sales_data&); // does not compile
+ (c) Sales_data &combine(const Sales_data&) const; // does not compile
+ */
+ std::string s = "7.49";
+ SalesData i("",0,0);
+ i.combine(SalesData(s));
+ print(std::cout, i);
+ return 0;
+}