Упражнение 1.21. Напишите программу, которая читает два объекта класса Sales_item с одинаковыми ISBN и вычисляет их сумму.

Упражнение 1.22. Напишите программу, читающую несколько транзакций с одинаковым ISBN и отображающую сумму всех прочитанных транзакций.

<p>1.5.2. Первый взгляд на функции-члены</p>

Программа суммирования объектов класса Sales_item должна проверять наличие у этих объектов одинаковых ISBN. Сделаем это так:

#include

#include "Sales_item.h"

int main() {

 Sales_item item1, item2;

 std::cin >> item1 >> item2;

 // сначала проверить, представляют ли объекты item1 и item2

 // одну и ту же книгу

 if (item1.isbn() == item2.isbn()) {

  std::cout << item1 + item2 << std::endl;

  return 0; // свидетельство успеха

 } else {

  std::cerr << "Data must refer to same ISBN"

            << std::endl;

  return -1; // свидетельство отказа

 }

}

Различие между этой программой и предыдущей версией в операторе if и его ветви else. Даже не понимая смысла условия оператора if, вполне можно понять, что делает эта программа. Если условие истинно, вывод будет, как прежде, и возвратится значение 0, означающее успех. Если условие ложно, выполняется блок ветви else, который выводит сообщение об ошибке и возвращает значение -1.

Что такое функция-член?

Условие оператора if вызывает функцию-член (member function) isbn().

item1.isbn() == item2.isbn()

Функция-член — это функция, определенная в составе класса. Функции-члены называют также методами (method) класса.

Вызов функции-члена обычно происходит от имени объекта класса. Например, первый, левый, операнд оператора равенства использует оператор точка (dot operator) (оператор .) для указания на то, что имеется в виду "член isbn() объекта по имени item1".

item1.isbn

Точечный оператор применим только к объектам типа класса. Левый операнд должен быть объектом типа класса, а правый операнд — именем члена этого класса. Результатом точечного оператора является член класса, заданный правым операндом.

Точечный оператор обычно используется для доступа к функциям-членам при их вызове. Для вызова функции используется оператор вызова (call operator) (оператор ()). Оператор обращения — это пара круглых скобок, заключающих список аргументов (argument), который может быть пуст. Функция- член isbn() не получает аргументов.

item1.isbn()

Таким образом, это вызов функции isbn(), являющейся членом объекта item1 класса Sales_item. Эта функция возвращает ISBN, хранящийся в объекте item1.

Правый операнд оператора равенства выполняется тем же способом: он возвращает ISBN, хранящийся в объекте item2. Если ISBN совпадают, условие истинно, а в противном случае оно ложно.

Упражнения раздела 1.5.2

Упражнение 1.23. Напишите программу, которая читает несколько транзакций и подсчитывает количество транзакций для каждого ISBN.

Упражнение 1.24. Проверьте предыдущую программу, введя несколько транзакций, представляющих несколько ISBN. Записи для каждого ISBN должны быть сгруппированы.

<p>1.6. Программа для книжного магазина</p>

Теперь все готово для решения проблемы книжного магазина: следует прочитать файл транзакций и создать отчет, где для каждой книги будет подсчитана общая выручка, средняя цена и количество проданных экземпляров. При этом подразумевается, что все транзакции для каждого ISBN вводятся группами.

Программа объединяет данные по каждому ISBN в переменной total (всего). Каждая прочитанная транзакция будем сохранена во второй переменной, trans. В противном случае значение объекта total выводится на экран, а затем заменяется только что считанной транзакцией.

#include

#include "Sales_item.h"

int main() {

 Sales_item total; // переменная для хранения данных следующей

                   // транзакции

 // прочитать первую транзакцию и удостовериться в наличии данных

 // для обработки

 if (std::cin >> total) {

  Sales_item trans; // переменная для хранения текущей транзакции

  // читать и обработать остальные транзакции

  while (std::cin >> trans) {

   // если все еще обрабатывается та же книга

   if (total.isbn() == trans.isbn())

Перейти на страницу:

Похожие книги