- •8.Совместимость и преобразование типов. Явное и неявное преобразование.
- •10. Оператор присвоения. Комбинированные операторы присвоения. Математические и логические операции, операции сравнения . Ограничения на применения операторов(несовместимость типов).
- •11.Условная инструкция. Условный оператор. Пример.
- •12. Оператор множественного выбора. Пример. Управление оператором множественного выбора с помощью оператора break.
- •Вопрос 19. Регулярные структурированные типы. Одномерные массивы. Примеры работы с одномерными массивами (инвертирование массива относительно центрального элемента, относительно к-го элемента)
- •Вопрос 20. Регулярные структурированные типы. Одномерные массивы. Примеры работы с одномерными массивами (сложение векторов, скалярное произведение векторов, проверка на равенство)
- •Вопрос 22-24 Сортировка массивов. Методы сортировки (простого выбора, простой вставки, простого обмена). На примере массива структур.
- •Функции
- •39. Текстовые файлы
- •Функции вывода в стандартный и файловые потоки
- •Int printf([строка формата],
- •Функции ввода из стандартного и файловых потоков
- •Int scanf([строка формата],
- •Int fscanf(file*f,[строка формата],
- •40. Бинарные файлы с
- •41. Пользовательские типы данных
- •42. Модульная организация программы
42. Модульная организация программы
Самый верхний уровень организации программы касается только достаточно больших проектов. Это разделение программы на более-менее независимые части (модули), их независимое проектирование и трансляция.
Иерархия
Любая сложная система не обходится без иерархии, без нее большая система превращается в нечто аморфное, необозримое и слабо управляемое.
Логическая иерархия отражает логических единиц программы, таких как функции, классы, библиотеки. Физическая иерархия касается физических единиц, на которые разбивается текст программы: файл (модуль), проект. Естественно, что между ними существует взаимосвязь, но не жесткая, синтаксическая, а технологическая, соблюдаемая программистом. Иерархия программных единиц имеет три уровня:
элементом самого нижнего уровня является функция (в объектно-ориентированном программировании – метод класса). Это автономная синтаксическая единица языка. В традиционной технологии структурного программирования (см. 3.5) под модульным программированием понимают именно это: представление программы в виде системы взаимодействующих функций;
несколько функций, объединенных общем описанием обрабатываемых ими структур данных, составляют библиотеку функций (эквивалент в ООП - класс). Все это – элементы логической иерархии. В физическом представлении им соответствует модуль (в интегрированных, закрытых системах) или файл исходного текста. Особенность модульного программирования в том и состоит, что отдельные модули могут разрабатываться, транслироваться и частично отлаживаться отдельно друг от друга. Но для этого им могут потребоваться описания интерфейсов взаимодействия (в Си – заголовочные файлы);
вся программа в целом образуют проект. В интегрированных системах проект и все его модули могут быть представлены одним файлом. В традиционных системах программирования (к ним относится и Си/Си++) проект состоит из файлов исходного текста – модулей (обычные текстовые файлы), файла проекта, содержащего список модулей, настройки транслятора и т.п., а также вспомогательных файлов. В этом случае под проект отводится отдельная папка.
Способы модульной организации программы и взаимодействия ее частей в значительной степени обусловлены особенностями трансляции программы, поэтому здесь необходимы минимальные знания о трансляции и связывании программы и ее элементов.
Модульное программирование, компоновка
При независимой трансляции модулей (файлов исходного текста) в результате трансляции получается объектный модуль - некоторый «полуфабрикат», содержащий оттранслированную часть программы во внутреннем представлении, а также информацию о некоторых элементах программы в исходном (символьном) виде:
программный код, использующий в своей работе только объекты языка (типы данных, переменные, функции), определенные в текущем модуле, полностью переводится во внутреннее (двоичное) представление;
если объект языка допускает внешний доступ из других модулей, то в объектом модуле создается точка входа, содержащая его имя и внутренний адрес в пространстве объектного модуля;
при трансляции обращения к внешнему объекту языка объявление, полученное из заголовочного файла позволяет сформировать программный код для обращения к нему. Но все равно неизвестным остается его адрес. Поэтому вместо адреса транслятор оставляет внешнюю ссылку, содержащую исходное (символическое) имя объекта.
Библиотека объектных модулей - это файл (библиотечный файл), содержащий набор объектных модулей и собственный внутренний каталог. Объектные модули библиотеки извлекаются из нее целиком при наличии в них требуемых внешних функций и переменных и используются в процессе компоновки программы.
Компоновка (редактирование связей) - это процесс сборки программы из объектных модулей и библиотек, который включает в себя:
объединение адресных пространств отдельных модулей (и их содержимого – внутреннего представления программы) в единое адресное пространство программного файла (компоновка);
«соединение» внешних ссылок и соответствующих им точек входа (редактирование связей);
при отсутствии необходимых точек входа для внешних ссылок их поиск производится в указанных библиотечных файлах. Если точка входа найдена в библиотеке объектных модулей, то весь объектный модуль, содержащий эту точку, компонуется в программу и для него повторяется описанный выше процесс.
В заключение отметим, что источником объектного модуля может быть не только Си-программа, но и программа, написанная на любом другом языке программирования, например, на Ассемблере. Но в этом случае необходимы дополнительные соглашения по поводу «стыковки» вызовов функций и обращений к данным в различных языках.
Компоновка нескольких файлов в одну программу
Программа – это, прежде всего, текст на языке Си++. С помощью компилятора текст преобразуется в исполняемыйфайл – форму, позволяющую компьютеру выполнять программу.
Если мы рассмотрим этот процесс чуть более подробно, то выяснится, что обработка исходных файлов происходит в три этапа. Сначала файл обрабатывается препроцессором, который выполняет директивы #include, #define и еще несколько других. После этого программа все еще представлена в виде текстового файла, хотя и измененного по сравнению с первоначальным. Затем, на втором этапе, компилятор создает так называемый объектный файл. Программа уже переведена в машинные инструкции, однако еще не полностью готова к выполнению. В объектном файле имеются ссылки на различные системные функции и на стандартные функции языка Си++. Например, выполнение операции new заключается в вызове определенной системной функции. Даже если в программе явно не упомянута ни одна функция, необходим, по крайней мере, один вызов системной функции – завершение программы и освобождение всех принадлежащих ей ресурсов.
На третьем этапе компиляции к объектному файлу подсоединяются все функции на которые он ссылается. Функции тоже должны быть скомпилированы, т.е. переведены на машинный язык в форму объектных файлов. Этот процесс называется компоновкой , и как раз его результат и есть исполняемый файл.
Системные функции и стандартные функции языка Си++ заранее откомпилированы и хранятся в виде библиотек. Библиотека – это некий архив объектных модулей, с которым удобно компоновать программу.
Основная цель многоэтапной компиляции программ – возможность компоновать программу из многих файлов. Каждый файл представляет собой законченный фрагмент программы, который может ссылаться на функции, переменные или классы, определенные в других файлах. Компоновкаобъединяет фрагменты в одну "самодостаточную" программу, которая содержит все необходимое для выполнения.
