total += trans; //
else {
//
std::cout << total << std::endl;
total = trans; //
//
}
}
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
сбрасывается на диск по завершении программы.
Встроенный тип (built-in type). Тип данных, определенный в самом языке (например, int
).
Выражение (expression). Наименьшая единица вычислений. Выражение состоит из одного или нескольких операндов и оператора. Вычисление выражения определяет результат. Например, сложение целочисленных значений (i + j
) — это арифметическое выражение, результатом которого является сумма двух значений.
Директива#include
. Делает код в указанном заголовке доступным в программе.
Заголовок (header). Механизм, позволяющий сделать определения классов или других имен доступными в нескольких программах. Заголовок включается в код программы при помощи директивы #include
.
Заголовокiostream
. Заголовок, предоставляющий библиотечные типы для потокового ввода и вывода.