- •Списки §1. Общие сведения о списках
- •§2. Создание списка
- •§3. Просмотр и анализ списка
- •3.1. Просмотр и анализ списка целых чисел.
- •3.2. Просмотр и анализ списка одномерных массивов.
- •§6. Сравнительный анализ списков.
- •§1. Порядок работы с файлом
- •1.1. Потоки и файлы
- •1.2. Объявление файла
- •1.3. Открытие файла.
- •1.4. Закрытие файла.
- •§2. Работа с текстовым файлом
- •2.1. Посимвольная работа с текстовым файлом
- •Int fputc(int ch, file *stream)
- •2.2. Построчная работа с текстовым файлом
- •§3. Функции блокового ввода/вывода
- •3.1. Экономические задачи с использованием файлов
- •3.2. Математические задачи с использованием файлов
- •§4. Прямой (произвольный) доступ к файлу
- •4.1. Функция fseek()
- •4.2. Замена записи. Функции ftell, fgetpos, fsetpos, rewind.
- •Пример. В файл записать координаты точек плоскости. Найти две (любые) точки с наибольшим расстоянием между ними. Массив для хранения координат всех точек не использовать.
- •Упражнения, тесты.
- •Функции (дополнительные возможности)
- •§1. Функции с переменным количеством параметров.
- •§2. Указатели на функции.
- •§3. Массив указателей на функции.
- •§4. Введение в рекурсивные функции.
- •Упражнения, тесты.
- •Void Fun1 (float); void Fun2(float); void Fun3(float);
- •Лабораторная работа № 12.
- •Команды препроцессора (директивы компиляции)
- •§1. Директива define (замены в тексте)
- •Простое макроопределение (макрос)
- •Макрос с аргументами.
- •Директива #undef.
- •§2. Директива #include (включение файлов).
- •§3. Директивы условной компиляции.
- •Директива #if.
- •Директивы #ifdef и #ifndef.
- •Упражнения, тесты
- •История развития технологий программирования
- •§1. Программирование в машинных кодах и на языках символического кодирования
- •§2. Языки высокого уровня. Структурное и модульное программирование
- •§3. Интегрированные системы программирования.
- •§4. История и идеи объектно-ориентированного программирования.
- •§5. Программирование для Windows. Визуальное программирование.
- •Литература
- •Оглавление Предисловие………………………………………………………….…………………3
- •Г л а в а 4. Структуры и другие типы, определяемые пользователем.84
- •Г л а в а 6. Файлы ………………………………………………………..154
- •Г л а в а 7. Функции (дополнительные возможности) ………………190
- •Г л а в а 9. История развития технологий программирования ……220
§3. Интегрированные системы программирования.
Важным этапом на пути автоматизации программирования было появление персональных компьютеров, разработка и внедрение в практику так называемых интегрированных систем программирования(ИС), которые используются и по настоящее время. Они включают в себя следующее:
редактор для подготовки и редактирования текстов программ;
компилятор для преобразования программы, написанной по правилам языка, в машинный код. При этом выполняется анализ программы на наличие относительно простых синтаксических ошибок;
компоновщик для сборки всех подпрограмм, стандартных и “своих”, в единый программный модуль;
отладчик для выполнения программы, поиска так называемых логических ошибок.
Из часто используемых на практике возможностей редактора необходимо отметить следующие:
удобную работу с буфером памяти (команды cut, copy, paste и др. раздела меню Edit),
поиск и замену фрагментов исходного текста программы (команды find, replace и др. раздела меню Search).
Отладчик позволяет:
выполнять программу в пошаговом режиме (команды Step Over, Trace Into, Run to Cursor и др. из раздела меню Run);
следить за значениями переменных во время пошагового выполнения программы, изменять их (команды Add Watch, Evalute/Modify из раздела меню Run);
работать с точками останова (команда Add Breakpoint из того же раздела меню Run).
Во всех современных ИС имеются также удобные единообразные возможности работы с файлами (команды New, Save As…, Save, Save All, Open, Close, Print… и др. раздела меню File).
Замечание. Команды приведены на примере системы С++Builder.
С появлением персональных компьютеров широкое распространение получили также и другие специализированные системы, предназначенные не только и не столько для разработки программ, сколько для других целей. Среди них необходимо отметить электронные таблицы (Excel и др.), системы компьютерной математики (Reduce, Mathcad, Maple, Mathematica и др.), системы управления базами данных, сокращённо СУБД (Paradox, Microsoft Access, FoxPro, Oracle и др.) и другие системы. С их помощью можно также разрабатывать качественные программы. Более того, некоторые их возможности по программированию по отдельным параметрам иногда превосходят широко распространённые системы программирования.
§4. История и идеи объектно-ориентированного программирования.
Ни языки высокого уровня и используемое в них структурное и модульное программирование, ни широко используемые библиотеки стандартных программ, ни мощные интегрированные системы программирования не спасли программистов от проблем, связанных с всё возрастающим объёмом и сложностью программных продуктов. Для решения такого рода проблем было изобретено объектно-ориентированное программирование (ООП). ООП использует лучшие идеи структурного программирования и сочетает их с мощными новыми концепциями, которые позволяют оптимально организовать большие программы, разложив её на отдельные составные взаимодействующие между собой части. Каждая составляющая становится самостоятельной программой (объектом), содержащей свои собственные коды и данные.
Первым языком, поддерживающим эту технологию, был язык Simula, разработанный в 60-х годах. Позже появились объектные языки Smalltalk, Ada, CLOS, предшественником которого является язык Lisp, и свыше 80 других объектных языков. Компания Apple в 1986 году разработала объектный Паскаль (Object Pascal). Язык С++ разработан Бьярном Страуструпом (Bjarne Stroustrup), сотрудником Bell laboratories штата Нью-Джерси в начале 80-х годов. Непосредственными предшественниками этого языка были С и С с классами. В 1983 году последнее название было заменено на С++. С момента своего возникновения С++ несколько раз подвергался серьёзным ревизиям и в настоящее время существует Standard C++. Эта версия создана совместно с комитетом по стандартизации ANSI/ISO (Американский национальный институт стандартов и Международная организация по стандартам). Последняя версия должна быть реализована во всех современных компиляторах С++.
Все языки ООР, включая и С++, основаны на следующих принципах: инкапсуляция (см. первый семестр), наследование и полиморфизм, которые изучаются на втором курсе. Инкапсуляцию иногда называют пакетирование.
Согласно наследованию, объект одного класса может приобретать поля и методы объекта другого класса и добавлять к ним черты, характерные только для него. Благодаря этому свойству поддерживается иерархия классов, которая позволяет легче управлять большими потоками информации. Наследование позволяет также использовать ранее разработанные библиотеки классов и расширять их в конкретном проекте. Например, можно сначала описать общие поля и поведение (методы) для базового (родительского) класса, характеризующего произвольного гражданина страны. При описании специальных групп населения (студентов, работающих, пенсионеров и т.д.) в соответствующие производные классы добавляем поля и методы, характерные только для данной категории. А общая информация по определённым правилам передаётся из того первого, родительского класса. Уровень такой иерархии может быть большим. Например, всех работающих в свою очередь можно разделить на отдельные группы и для каждой из них описать свой класс и т. д.
Полиморфизм (от греческого polymorphos) — это свойство, которое позволяет использовать одни и те же имена для решения нескольких схожих, но технически разных задач. Выполнение каждого конкретного действия будет зависеть от типов данных. Перегрузка функций относится к этому свойству (см. п. 6 главы 2). Аналогично по определённым правилам с помощью ключевого слова operator можно перегружать и операции для других, заданных нами, типов данных, для классов. Например, в классе матриц можно определить операцию “+”, которая будет выполнять то, что мы запрограммируем в соответствующем методе, например, поэлементное сложение двух матриц. Затем для созданных двух объектов мы можем по обычным естественным правилам записать выражение, использующее эту операцию, так, как мы это делали для переменных простых типов: M3=M1+M2; где M1, M2, M3 — объекты данного класса.
Перегрузка функций и операций относятся к полиморфизму этапа компиляции. Ещё одним видом является полиморфизм на этапе выполнения, который использует наследование, указатели на объекты и так называемые виртуальные функции. Техническая реализация перегрузки операций и полиморфизм этапа выполнения рассматривается в третьем семестре.