while (std::cin >> trans) {
// если все еще обрабатывается та же книга
if (total.isbn() == trans.isbn())
total += trans; // пополнение текущей суммы
else {
// отобразить результаты по предыдущей книге
std::cout << total << std::endl;
total = trans; // теперь total относится к следующей
// книге
}
}
std::cout << total << std::endl; // отобразить последнюю запись
} else {
// нет ввода! Предупредить пользователя
std::cerr << "No data?!" << std::endl;
return -1; // свидетельство отказа
}
return 0;
}
Это наиболее сложная программа из рассмотренных на настоящий момент, однако все ее элементы читателю уже знакомы.
Как обычно, код начинается с подключения используемых заголовков: iostream
(из библиотеки) и Sales_item.h
(собственного). В функции main()
определен объект по имени total
(для суммирования данных по текущему ISBN). Начнем с чтения первой транзакции в переменную total
и проверки успешности чтения. Если чтение терпит неудачу, то никаких записей нет и управление переходит к наиболее удаленному оператору else
, код которого отображает сообщение, предупреждающее пользователя об отсутствии данных.
Если запись введена успешно, управление переходит к блоку после наиболее удаленного оператора if
. Этот блок начинается с определения объекта trans
, предназначенного для хранения считываемых транзакций. Оператор while
читает все остальные записи. Как и в прежних программах, условие цикла while
читает значения со стандартного устройства ввода. В данном случае данные читаются в объект trans
класса Sales_item
. Пока чтение успешно, выполняется тело цикла while
.
Тело цикла while
представляет собой один оператор if
, который проверяет равенство ISBN. Если они равны, используется составной оператор присвоения для суммирования объектов trans
и total
. Если ISBN не равны, отображается значение, хранящееся в переменной total
, которой затем присваивается значение переменной trans
. После выполнения кода оператора if
управление возвращается к условию цикла while
, читающему следующую транзакцию, и так далее, до тех пор, пока записи не исчерпаются. После выхода из цикла while
переменная total
содержит данные для последнего ISBN в файле. В последнем операторе блока наиболее удаленного оператора if
отображаются данные последнего ISBN.
Упражнение 1.25. Используя загруженный с веб-сайта заголовок Sales_item.h
, откомпилируйте и запустите программу для книжного магазина, представленную в этом разделе.
Резюме
Эта глава содержит достаточно информации о языке С++, чтобы позволить писать, компилировать и запускать простые программы. Здесь было описано, как определить функцию main()
, которую вызывает операционная система при запуске программы. Также было продемонстрировано, как определить переменные, организовать ввод и вывод данных, использовать операторы if
, for
и while
. Глава завершается описанием наиболее фундаментального элемента языка С++ — класса. Здесь было продемонстрировано создание и применение объектов классов, которые были созданы кем-то другим. Определение собственных классов будет описано в следующих главах.
Термины
Аргумент (argument). Значение, передаваемое функции.
Библиотечный тип (library type). Тип, определенный в стандартной библиотеке (например, istream
).
Блок (block). Последовательность операторов, заключенных в фигурные скобки.
Буфер (buffer). Область памяти, используемая для хранения данных. Средства ввода (или вывода) зачастую хранят вводимые и выводимые данные в буфере, работа которого никак не зависит от действий программы. Буферы вывода могут быть сброшены явно, чтобы принудительно осуществить запись на диск. По умолчанию буфер объекта cin
сбрасывается при обращении к объекту cout
, а буфер объекта cout
сбрасывается на диск по завершении программы.