Модульное программирование

Содержание

Слайд 2

Разбиение программы на модули (файлы) Самые простые программы могут состоять из

Разбиение программы на модули (файлы)

Самые простые программы могут состоять из одной

функции main
Чуть более сложные включают в себя другие функции
По мере возрастания сложности программы функций становится слишком много, в них становится тяжело ориентироваться
Выход – разбиение функций на отдельные модули по смысловому значению
Слайд 3

Проектирование «сверху вниз» «top-down design» Top-down design - последовательное понижение уровня

Проектирование «сверху вниз» «top-down design»

Top-down design - последовательное понижение уровня детализации

задачи

Задача. Найти медиану значений элементов массива

Медиана – полусумма срединных значений ранжированного ряда

возьмем ряд 23, 11, 21, 5, 17, 66, 34, 9 ..и ранжируем (упорядочим) его: 5, 9, 11, 17, 21, 23, 34, 66 Срединными (лежащими в середине) значениями являются числа 17 и 21. Их сумма: 17 + 21 = 38 Медиана данного ряда: 38 / 2 = 19

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

Слайд 4

Проектирование «сверху вниз» «top-down design» Задача, уровень 0 Подзадачи, уровень 1

Проектирование «сверху вниз» «top-down design»

Задача, уровень 0

Подзадачи, уровень 1

Подзадачи, уровень 2

Иерархия

модулей

(см. Example4, Project Median)

Слайд 5

Использование функций (см. Example4, Project MedianSecond, MedianThird)

Использование функций

(см. Example4, Project MedianSecond, MedianThird)

Слайд 6

Реализация функций в отдельном файле Compile-time error add.cpp(10) : error C3861: 'add': identifier not found

Реализация функций в отдельном файле

Compile-time error
add.cpp(10) : error C3861: 'add': identifier

not found
Слайд 7

Реализация функций в отдельном файле

Реализация функций в отдельном файле

Слайд 8

Как организуется модуль на языке C++? Модуль логически состоит из двух

Как организуется модуль на языке C++?

Модуль логически состоит из двух файлов

- файла с исходным кодом (source file) и заголовочного файла (header file)
файл с исходным кодом (module.cpp) включает в себя определения функций, а также определения глобальных переменных и констант (если они есть); в первой строке обычно подключается заголовочный файл того же модуля:
#include "module.h"
заголовочный файл (module.h) включает в себя прототипы функций, определения констант, объявления глобальных переменных - но только для тех элементов модуля, о которых должны знать другие модули
Слайд 9

Как организуется модуль на языке C++? Если какой-либо модуль использует данный,

Как организуется модуль на языке C++?

Если какой-либо модуль использует данный, необходимо

подключить его заголовочный файл (в двойных кавычках – это указывает на то, что заголовочный файл не системный, а собственный):
#include "module.h"
Главный модуль программы обычно содержит только функцию main и не имеет заголовочного файла (поскольку функция main не используется в других модулях)
Некоторые модули включают только заголовочный файл – например, содержащий определения глобальных констант
Слайд 10

Заголовочные файлы

Заголовочные файлы

Слайд 11

Как происходит сборка программы? Сборка (build) состоит из 3 основных этапов:

Как происходит сборка программы?

Сборка (build) состоит из 3 основных этапов:
на этапе

препроцессинга (preprocessing) директивы препроцессора (например, #include) заменяются содержимым указанного в них заголовочного файла, в результате файл с исходным кодом дополняется прототипами указанных там функций и объявлениями глобальных переменных – за счет этого в файле можно вызывать указанные функции (прототип впереди) и использовать глобальные переменные (объявление впереди). Препроцессор может создавать на диске временные файлы, которые, однако, удаляются после окончания сборки
Слайд 12

Как происходит сборка программы? Сборка (build) состоит из 3 основных этапов:

Как происходит сборка программы?

Сборка (build) состоит из 3 основных этапов:
на этапе

компиляции (compiling) для каждого исходного файла составляются таблицы определенных в нем функций и глобальных переменных, все определенные функции переводятся на машинный язык (при переводе на машинный язык могут выявляться ошибки компиляции). Результатом работы компилятора являются файлы module.obj (объектные файлы) для каждого использованного в программе модуля
Слайд 13

Как происходит сборка программы? Сборка (build) состоит из 3 основных этапов:

Как происходит сборка программы?

Сборка (build) состоит из 3 основных этапов:
на этапе

связывания (linking) происходит привязка всех используемых (вызванных) функций и глобальных переменных к той таблице, в которой они определены; если определения не обнаружены ни в одной таблице, происходит ошибка связывания (unresolved external symbol …). Результатом связывания является файл program.exe (для MVS имя совпадает с именем проекта) – исполняемый файл
Слайд 14

Что при сборке происходит с библиотечными функциями? Прототипы функций находятся в

Что при сборке происходит с библиотечными функциями?

Прототипы функций находятся в заголовочных

файлах (iostream, math.h, stdio.h, string.h и т.п.)
Объектные файлы с уже переведенными на машинный язык определениями функций заранее собраны в библиотеки (файлы с расширением lib или dll)
определения из статических библиотек (расширение lib) на этапе связывания добавляются в исполняемый файл программы
определения из динамических библиотек (расширение dll) в исполняемый файл не добавляются; вместо этого в ссылке на соответствующую функцию указывается, что она находится в динамической библиотеке, и при ее вызове происходит обращение к библиотеке
поэтому, статические библиотеки нужны только на этапе связывания, а динамические – и на этапе исполнения программы
Слайд 15

Заголовочные файлы

Заголовочные файлы

Слайд 16

Что такое #ifndef-#define- #endif? Это, как и #include, директивы препроцессора Директива

Что такое #ifndef-#define- #endif?

Это, как и #include, директивы препроцессора
Директива #define позволяет определить

переменную препроцессора (например, ADD_H)
Директива #ifndef позволяет выяснить, определена ли переменная препроцессора. Если она не определена, участок кода до директивы
#endif вставляется в программу, если же
определена – выбрасывается из нее
Нужны эти скобки для того, чтобы текст заголовочного файла не мог вставиться в исходный файл дважды
Слайд 17

Заголовочные файлы (см. Example4, UsingHeader)

Заголовочные файлы

(см. Example4, UsingHeader)

Слайд 18

Компиляция и компоновка

Компиляция и компоновка