forked from pezy/CppPrimer
-
Notifications
You must be signed in to change notification settings - Fork 0
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
- Loading branch information
Showing
7 changed files
with
221 additions
and
0 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,5 @@ | ||
0-201-78345-X 3 20 | ||
0-201-78345-X 2 25 | ||
0-201-78346-X 1 100 | ||
0-201-78346-X 2 99.9 | ||
0-201-78346-X 6 89.9 |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,26 @@ | ||
##Exercise 1.20 | ||
|
||
> http://www.informit.com/title/032174113 contains a copy of Sales_item.h in the Chapter 1 code directory. Copy that file to your working directory. Use it to write a program that reads a set of book sales transactions, writing each transaction to the standard output. | ||
How to test it? use the `book.txt` in `data` folder. And do it like this: | ||
|
||
![run](https://db.tt/fm8iHtkF) | ||
|
||
[Here](https://github.com/pezy/Cpp-Primer/blob/master/ex1_20.cpp) is the code. | ||
|
||
##Exercise 1.21 | ||
> Write a program that reads two Sales_item objects that have the same ISBN and produces their sum. | ||
I think you should confirm the ISBN of two objects. The sum is meaningful when they have the same ISBN. | ||
|
||
[Code](https://github.com/pezy/Cpp-Primer/blob/master/ex1_21.cpp) | ||
|
||
##Exercise 1.22 | ||
|
||
> Write a program that reads several transactions for the same ISBN. Write the sum of all the transactions that were read. | ||
Tips: review the example code in "1.4.4. The if Statement". | ||
|
||
[Here](https://github.com/pezy/Cpp-Primer/blob/master/ex1_22.cpp) is my code. | ||
|
||
![run](https://db.tt/UlkuvpAS) |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,11 @@ | ||
#include <iostream> | ||
#include "include/Sales_item.h" | ||
|
||
int main() | ||
{ | ||
Sales_item item; | ||
while (std::cin >> item) | ||
std::cout << item << std::endl; | ||
|
||
return 0; | ||
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,14 @@ | ||
#include <iostream> | ||
#include "include/Sales_item.h" | ||
|
||
int main() | ||
{ | ||
Sales_item item1, item2; | ||
std::cin >> item1 >> item2; | ||
if (item1.isbn() == item2.isbn()) | ||
std::cout << item1 + item2 << std::endl; | ||
else | ||
std::cout << "They have the different ISBN." << std::endl; | ||
|
||
return 0; | ||
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,22 @@ | ||
#include <iostream> | ||
#include "include/Sales_item.h" | ||
|
||
int main() | ||
{ | ||
Sales_item item, sum; | ||
while (std::cin >> item) | ||
{ | ||
if (item.isbn() != sum.isbn()) | ||
{ | ||
if (!sum.isbn().empty()) | ||
std::cout << sum << std::endl; | ||
sum = item; | ||
} | ||
else | ||
sum += item; | ||
} | ||
|
||
std::cout << sum << std::endl; | ||
|
||
return 0; | ||
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,142 @@ | ||
/* | ||
* This file contains code from "C++ Primer, Fifth Edition", by Stanley B. | ||
* Lippman, Josee Lajoie, and Barbara E. Moo, and is covered under the | ||
* copyright and warranty notices given in that book: | ||
* | ||
* "Copyright (c) 2013 by Objectwrite, Inc., Josee Lajoie, and Barbara E. Moo." | ||
* | ||
* | ||
* "The authors and publisher have taken care in the preparation of this book, | ||
* but make no expressed or implied warranty of any kind and assume no | ||
* responsibility for errors or omissions. No liability is assumed for | ||
* incidental or consequential damages in connection with or arising out of the | ||
* use of the information or programs contained herein." | ||
* | ||
* Permission is granted for this code to be used for educational purposes in | ||
* association with the book, given proper citation if and when posted or | ||
* reproduced.Any commercial use of this code requires the explicit written | ||
* permission of the publisher, Addison-Wesley Professional, a division of | ||
* Pearson Education, Inc. Send your request for permission, stating clearly | ||
* what code you would like to use, and in what specific way, to the following | ||
* address: | ||
* | ||
* Pearson Education, Inc. | ||
* Rights and Permissions Department | ||
* One Lake Street | ||
* Upper Saddle River, NJ 07458 | ||
* Fax: (201) 236-3290 | ||
*/ | ||
|
||
/* This file defines the Sales_item class used in chapter 1. | ||
* The code used in this file will be explained in | ||
* Chapter 7 (Classes) and Chapter 14 (Overloaded Operators) | ||
* Readers shouldn't try to understand the code in this file | ||
* until they have read those chapters. | ||
*/ | ||
|
||
#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 |