>#include
>#include
>#include "Sales_data.h"
>int main() {
> Sales_data data1, data2;
> // код чтения данных в data1 и data2
> // код проверки наличия у data1 и data2 одинакового ISBN
> // если это так, то вывести сумму data1 и data2
>}
Как и первоначальная программа, эта начинается с включения заголовков, необходимых для определения переменных, содержащих ввод. Обратите внимание, что, в отличие от версии >Sales_item
, новая программа включает заголовок >string
. Он необходим потому, что код должен манипулировать переменной-членом >bookNo
типа >string
.
>Sales_data
Хотя до глав 3 и 10 мы не будем описывать библиотечный тип >string
подробно, упомянем пока лишь то, что необходимо знать для определения и использования члена класса, содержащего ISBN. Тип >string
содержит последовательность символов. Он имеет операторы >>>
, ><<
и >==
для чтения, записи и сравнения строк соответственно. Этих знаний достаточно для написания кода чтения первой транзакции.
>double price = 0; // цена за книгу, используемая для вычисления
> // общей выручки
>// читать первую транзакцию:
>// ISBN, количество проданных книг, цена книги
>std::cin >> data1.bookNo >> data1.units_sold >> price;
>// вычислить общий доход из price и units_sold
>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;
> // вывести: ISBN, общее количество проданных экземпляров,
> // общий доход, среднюю цену за книгу
> std::cout << data1.bookNo << " " << totalCnt
> << " " << totalRevenue << " ";
> if (totalCnt != 0)
> std::cout << totalRevenue/totalCnt << std::endl;
> else
> std::cout << "(no sales)" << std::endl;
> return 0; // означает успех
>} else { // транзакции не для того же ISBN
> std::cerr << "Data must refer to the same ISBN"
> << std::endl;
> return -1; // означает неудачу
>}
Первый оператор >if
сравнивает члены >bookNo
объектов >data1
и >data2
. Если эти члены содержат одинаковый ISBN, выполняется код в фигурных скобках, суммирующий компоненты двух переменных. Поскольку необходимо вывести среднюю цену, сначала вычислим общее количество проданных экземпляров и общий доход, а затем сохраним их в переменных