С.Б. Липпман, Ж. Лажойе - Язык программирования С++ Вводный курс (1114944), страница 4
Текст из файла (страница 4)
Alien, Jr., and S. Pruess, Fundamentals of NumericalComputing, John Wiley & Sons, Inc., New York, NY (1997) ISBN 0-471-16363-5.[STROUSTRUP94] Stroustrup, Bjarne, The Design and Evolution of C++, Addison WesleyLongman, Inc., Reading, MA (1994) ISBN 0-201-54330-3.[STROUSTRUP97] Stroustrup, Bjarne, The C++ Programming Language, 3rd Edition, AddisonWesley Longman, Inc., Reading, MA (1997) ISBN 0-201-88954-4.[UPSTILL90] Upstill, Steve, The RenderMan Companion, Addison Wesley Longman, Inc., Reading,MA (1990) ISBN 0-201-50868-0.[WERNECKE94] Wernecke, Josie, The Inventor Mentor, Addison Wesley Longman, Inc., Reading,MA (1994) ISBN 0-201-62495-8.[YOUNG95] Young, Douglas A., Object-Oriented Programming with C++ and OSF/ Motif, 2ndEdition, Prentice-Hall, Englewood Cliffs, NJ (1995) ISBN 0-132-09255-7.С++ для начинающих12Часть IКраткий обзор языка C++Программы, которые мы пишем, имеют два основных аспекта:набор алгоритмов;набор данных, которыми оперируют.Эти два аспекта оставались неизменными за всю недолгую историю программирования,зато отношения между ними (парадигма программирования) менялись.
.В процедурной парадигме программирования задача непосредственно моделируетсянабором алгоритмов. Возьмем, к примеру, систему выдачи книг в библиотеке. В нейреализуются две главные процедуры: процедура выдачи книг и процедура приема книг.Данные хранятся отдельно и передаются этим процедурам как параметры. К наиболееизвестным процедурным языкам программирования относятся FORTRAN, C и Pascal.С++ также поддерживает процедурное программирование.
Отдельные процедуры носят вэтом языке название функций. В части III рассматривается поддержка, предоставляемая вС++ процедурной парадигме программирования: функции, шаблоны функций,обобщенные алгоритмы.В 70-е годы процедурную парадигму стала вытеснять парадигма абстрактных типовданных (теперь чаще называемая объектным подходом). В рамках этой парадигмы задачамоделируется набором абстракций данных. В С++ эти абстракции получили названиеклассов. Наша библиотечная система могла бы быть представлена как взаимоотношенияобъектов различных классов, представляющих книги, читателей, даты возврата и т.п.Алгоритмы, реализуемые каждым классом, называются открытым интерфейсом класса.Данные “скрыты” внутри объектов класса. Парадигму абстрактных типов данныхподдерживают такие языки, как CLU, Ada и Modula-2. В части IV обсуждаются вопросыподдержки этой парадигмы языком С++.Объектно-ориентированное программирование расширяет парадигму абстрактных типовданных механизмом наследования (повторного использования существующих объектов) идинамического связывания (повторного использования существующих интерфейсов).Вводятся отношения тип-подтип.
Книга, видеокассета, компакт-диск – все они хранятся вбиблиотеке, и поэтому могут быть названы подтипами (или подклассами) одногородительского типа, представляющего то, что может храниться в библиотеке. Хотякаждый из классов способен реализовывать свой собственный алгоритм выдачи ивозврата, открытый интерфейс для них одинаков. Три наиболее известных языка,поддерживающие объектно-ориентированный подход, – это Simula, Smalltalk и Java. Вчасти V рассматриваются вопросы поддержки парадигмы объектно-ориентированногопрограммирования в С++.Хотя мы и считаем С++ в основном объектно-ориентированным языком, онподдерживает и процедурную, и объектную парадигму.
Преимущество такого подхода втом, что для каждого конкретного случая можно выбрать наилучшее решение. Однакоесть и обратная сторона медали: С++ является достаточно громоздким и сложнымязыком.В части I мы “пробежимся” по всем основным аспектам С++. Одна из причин такогократкого обзора – желание дать читателю представление об основных возможностяхязыка, чтобы затем приводить достаточно содержательные примеры. Скажем, мы небудем рассматривать в деталях понятие класса вплоть до главы 13, однако безупоминания о нем наши примеры оказались бы неинтересными и надуманными.С++ для начинающих13Другая причина такого поверхностного, но широкого обзора – эстетическая. Если вы ещене оценили красоту и сложность сонаты Бетховена или живость регтайма Джоплина, вамбудет безумно скучно разбираться в отдельных деталях вроде диезов, бемолей, октав иаккордов.
Однако, не овладев ими, вы не научитесь музыке. Во многом это справедливо идля программирования. Разбираться в путанице приоритетов операций или правилприведения типов скучно, но совершенно необходимо для овладения С++.В главе 1 представлены базовые элементы языка: встроенные типы данных, переменные,выражения, инструкции (statements) и функции. Мы увидим минимальную законченнуюС++ программу, обсудим вопросы компиляции, коснемся препроцессора и поддержкиввода/вывода.В главе 2 мы реализуем абстракцию массива – процедурно, объектно, и объектноориентированно. Мы сравним нашу реализацию с реализацией, предоставляемойстандартной библиотекой С++, и познакомимся с набором обобщенных алгоритмовстандартной библиотеки.
Мы коснемся и таких вещей, как шаблоны, исключения ипространства имен. Фактически, мы представим все особенности языка С++, хотяобсуждение деталей отложим до следующих глав.Возможно, некоторые читатели сочтут главу 2 трудной для понимания. Материалпредставляется без подробного объяснения, даются ссылки на последующие разделы. Мырекомендуем таким читателям не углубляться в эту главу, пропустить ее вовсе илипрочитать по диагонали. В главе 3 материал излагается в более традиционной манере.После этого можно будет вернуться к главе 2.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 – это константа.