Липпман - C++ для начинающих

Шрифт
Фон

Содержание:

  • 1. Начинаем 1

  • 2. Краткий обзор С++ 5

  • Часть II - Основы языка 17

  • 3. Типы данных С++ 17

  • 4. Выражения 33

  • 5. Инструкции 45

  • 6. Абстрактные контейнерные типы 59

  • Процедурно-ориентированное программирование 77

  • 7. Функции 77

  • 8. Область видимости и время жизни 90

  • 9. Перегруженные функции 105

  • 10. Шаблоны функций 116

  • 11. Обработка исключений 132

  • 12. Обобщенные алгоритмы 138

  • Часть IV Объектное программирование 148

  • 13. Классы 149

  • 15. Перегруженные операторы и определенные пользователем преобразования 179

  • 16. Шаблоны классов 197

  • V. Объектно-ориентированное программирование 212

  • 17. Наследование и подтипизация классов 213

  • 18. Множественное и виртуальное наследование 234

  • 19. Применение наследования в C++ 247

  • 20. Библиотека iostream 258

  • 21. Обобщенные алгоритмы в алфавитном порядке 272

C++ для начинающих1. Начинаем

В этой главе представлены основные элементы языка: встроенные типы данных, определения именованных объектов, выражений и операторов, определение и использование именованных функций. Мы посмотрим на минимальную законченную С++ программу, вкратце коснемся процесса компиляции этой программы, узнаем, что такое препроцессор, и бросим самый первый взгляд на поддержку ввода и вывода. Мы увидим также ряд простых, но законченных С++ программ.

1.1. Решение задачи

Программы обычно пишутся для того, чтобы решить какую-то конкретную задачу. Например, книжный магазин ведет запись проданных книг. Регистрируется название книги и издательство, причем запись идет в том порядке, в каком книги продаются. Каждые две недели владелец магазина вручную подсчитывает количество проданных книг с одинаковым названием и количество проданных книг от каждого издателя. Этот список сортируется по издателям и используется для составления последующего заказа книг. Нас попросили написать программу для автоматизации этой деятельности.

Один из методов решения большой задачи состоит в разбиении ее на ряд задач поменьше. В идеале, с маленькими задачами легче справиться, а вместе они помогают одолеть большую. Если подзадачи все еще слишком сложны, мы, в свою очередь, разобьем их на еще меньшие, пока каждая из подзадач не будет решена. Такую стратегию называют пошаговой детализацией или принципом "разделяй и властвуй". Задача книжного магазина делится на четыре подзадачи:

Прочитать файл с записями о продажах.

Подсчитать количество продаж по названиям и по издателям.

Отсортировать записи по издателям.

Вывести результаты.

Решения для подзадач 1, 2 и 4 известны, их не нужно делить на более мелкие подзадачи. А вот третья подзадача все еще слишком сложна. Будем дробить ее дальше.

3a. Отсортировать записи по издателям.

3b. Для каждого издателя отсортировать записи по названиям.

3c. Сравнить соседние записи в группе каждого издателя. Для каждой одинаковой пары увеличить счетчик для первой записи и удалить вторую.

Эти подзадачи решаются легко. Теперь мы знаем, как решить исходную, большую задачу. Более того, мы видим, что первоначальный список подзадач был не совсем правильным. Правильная последовательность действий такова:

Прочитать файл с записями о продажах.

Отсортировать этот файл: сначала по издателям, внутри каждого издателя - по названиям.

Удалить повторяющиеся названия, наращивая счетчик.

Вывести результат в новый файл.

Результирующая последовательность действий называется алгоритмом. Следующий шаг - перевести наш алгоритм на некоторый язык программирования, в нашем случае - на С++.

1.2. Программа на языке C++

В С++ действие называется выражением, а выражение, заканчивающееся точкой с запятой, - инструкцией. Инструкция - это атомарная часть С++ программы, которой в программе на С++ соответствует предложение естественного языка. Вот примеры инструкций С++:

int book_count = 0;

book_count = books_on_shelf + books_on_order;

cout "значение переменной book_count: " book_count;

Первая из приведенных инструкций является инструкцией объявления. book_count можно назвать идентификатором, символической переменной (или просто переменной) или объектом. Переменной соответствует область в памяти компьютера, соотнесенная с определенным именем (в данном случае book_count), в которой хранится значение типа (в нашем случае целого). 0 - это константа. Переменная book_count инициализирована значением 0.

Вторая инструкция - присваивание. Она помещает в область памяти, отведенную переменной book_count, результат сложения двух других переменных - books_on_shelf и books_on_order. Предполагается, что эти две целочисленные переменные определены где-то ранее в программе и им присвоены некоторые значения.

Третья инструкция является инструкцией вывода. cout - это выходной поток, направленный на терминал, - оператор вывода. Эта инструкция выводит в cout - то есть на терминал - сначала символьную константу, заключенную в двойные кавычки ("значение переменной book_count: "), затем значение, содержащееся в области памяти, отведенном под переменную book_count. В результате выполнения данной инструкции мы получим на терминале сообщение:

значение переменной book_count: 11273

если значение book_count равно 11273 в данной точке выполнения программы.

Инструкции часто объединяются в именованные группы, называемые функциями. Так, группа инструкций, необходимых для чтения исходного файла, объединена в функцию readIn(). Аналогичным образом инструкции для выполнения оставшихся подзадач сгруппированы в функции sort(), compact() и print().

В каждой С++ программе должна быть ровно одна функция с именем main(). Вот как может выглядеть эта функция для нашего алгоритма:

int main()

{

readIn();

sort();

compact();

print();

return 0;

}

Исполнение программы начинается с выполнения первой инструкции функции main(), в нашем случае - вызовом функции readIn(). Затем одна за другой исполняются все дальнейшие инструкции, и, выполнив последнюю инструкцию функции main(), программа заканчивает работу.

Функция состоит их четырех частей: типа возвращаемого значения, имени, списка параметров и тела функции. Первые три части составляют прототип функции.

Список параметров заключается в круглые скобки и может содержать ноль или более параметров, разделенных запятыми. Тело функции содержит последовательность исполняемых инструкций и ограничено фигурными скобками.

В нашем примере тело функции main() содержит вызовы функций readIn(), sort(), compact() и print(). Последней выполняется инструкция

return 0;

Инструкция return обеспечивает механизм завершения работы функции. Если оператор return сопровождается некоторым значением (в данном примере 0), это значение становится возвращаемым значением функции. В нашем примере возвращаемое значение 0 говорит об успешном выполнении функции main(). (Стандарт С++ предусматривает, что функция main() возвращает 0 по умолчанию, если оператор return не использован явно.)

Давайте закончим нашу программу, чтобы ее можно было откомпилировать и выполнить. Во-первых, мы должны определить функции readIn(), sort(), compact() и print(). Для начала вполне подойдут заглушки:

void readIn() { cout "readIn()\n"; }

void sort() { cout "sort()\n"; }

void compact() { cout "compact()\n"; }

void print() { cout "print ()\n"; }

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

Пошаговый метод написания программ позволяет справляться с неизбежными ошибками. Попытаться заставить работать сразу всю программу - слишком сложное занятие.

Ваша оценка очень важна

0
Шрифт
Фон

Помогите Вашим друзьям узнать о библиотеке