×
Traktatov.net » Язык программирования C++. Пятое издание » Читать онлайн
Страница 63 из 714 Настройки

>#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, выполняется код в фигурных скобках, суммирующий компоненты двух переменных. Поскольку необходимо вывести среднюю цену, сначала вычислим общее количество проданных экземпляров и общий доход, а затем сохраним их в переменных