struct Foo { /* пусто */ } //
int main() {
return 0;
}
Упражнение 2.40. Напишите собственную версию класса Sales_data
.
Sales_data
В отличие от класса Sales_item
, класс Sales_data
не поддерживает операций. Пользователи класса Sales_data
должны сами писать все операции, в которых они нуждаются. В качестве примера напишем новую версию программы из раздела 1.5.2, которая выводила сумму двух транзакций. Программа будет получать на входе такие транзакции:
0-201-78345-X 3 20.00
0-201-78345-X 2 25.00
Каждая транзакция содержит ISBN, количество проданных книг и цену, по которой была продана каждая книга.
Sales_data
Поскольку класс Sales_data
не предоставляет операций, придется написать собственный код, осуществляющий ввод, вывод и сложение. Будем подразумевать, что класс Sales_data
определен в заголовке Sales_data.h
. Определение заголовка рассмотрим в разделе 2.6.3.
Так как эта программа будет длиннее любой, написанной до сих пор, рассмотрим ее по частям. В целом у программы будет следующая структура:
#include
#include
#include "Sales_data.h"
int main() {
Sales_data data1, data2;
//
//
//
}
Как и первоначальная программа, эта начинается с включения заголовков, необходимых для определения переменных, содержащих ввод. Обратите внимание, что, в отличие от версии Sales_item
, новая программа включает заголовок string
. Он необходим потому, что код должен манипулировать переменной-членом bookNo
типа string
.
Sales_data
Хотя до глав 3 и 10 мы не будем описывать библиотечный тип string
подробно, упомянем пока лишь то, что необходимо знать для определения и использования члена класса, содержащего ISBN. Тип string
содержит последовательность символов. Он имеет операторы >>
, <<
и ==
для чтения, записи и сравнения строк соответственно. Этих знаний достаточно для написания кода чтения первой транзакции.
double price = 0; //
//
//
//
std::cin >> data1.bookNo >> data1.units_sold >> price;
//
data1.revenue = data1.units_sold * price;
Транзакции содержат цену, по которой была продана каждая книга, но структура данных хранит общий доход. Данные транзакции будем читать в переменную price
(цена) типа double
, исходя из которой и вычислим член revenue
(доход).
std::cin >> data1.bookNo >> data1.units_sold >> price;
Для чтения значений членов bookNo
и units_sold
(продано экземпляров) объекта по имени data1
оператор ввода использует точечный оператор (см. раздел 1.5.2).
Последний оператор присваивает произведение data1.units_sold
и price переменной-члену revenue объекта data1
.
Затем программа повторяет тот же код для чтения данных в объект data2
.
//
std::cin >> data2.bookNo >> data2.units_sold >> price;
data2.revenue = data2.units_sold * price;
Sales_data
Следующая задача — проверить наличие у транзакций одинакового ISBN. Если это так, вывести их сумму, в противном случае отобразить сообщение об ошибке.
if (data1.bookNo == data2.bookNo) {
unsigned totalCnt = data1.units_sold + data2.units_sold;
double totalRevenue = data1.revenue + data2.revenue;
//
//
std::cout << data1.bookNo << " " << totalCnt
<< " " << totalRevenue << " ";
if (totalCnt != 0)