Скачать презентацию Модульность Основы модульного программирования n Одной из Скачать презентацию Модульность Основы модульного программирования n Одной из

Презентация5.(лекция 7-8) Модульность.ppt

  • Количество слайдов: 45

Модульность Модульность

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

Требования к программе n программа должна разделяться на независимые части, называемые модулями; n модуль Требования к программе n программа должна разделяться на независимые части, называемые модулями; n модуль - это независимый блок, код (текст) которого физически и логически отделен от кода других модулей; n модуль выполняет только одну логическую функцию, иначе говоря, должен решать самостоятельную задачу своего уровня по принципу: один программный модуль - одна логическая функция;

Требования к модулю n работа программного модуля не должна зависеть: от входных данных; n Требования к модулю n работа программного модуля не должна зависеть: от входных данных; n от того, какому программному модулю предназначены его выходные данные; n от предыстории вызовов программного модуля n

Требования к модулю размер программного модуля желательно ограничивать одной - двумя страницами исходного листинга Требования к модулю размер программного модуля желательно ограничивать одной - двумя страницами исходного листинга (50 -100 строк исходного кода); n модуль должен иметь только одну входную и одну выходную точку; n взаимосвязи между модулями устанавливаются по иерархической структуре n

Требования к модулю n n Каждый модуль должен начинаться с комментария, объясняющего назначение, назначение Требования к модулю n n Каждый модуль должен начинаться с комментария, объясняющего назначение, назначение переменных, передаваемых в модуль и из него, модулей, которые его вызывают, и модулей, которые вызываются из него; оператор безусловного перехода или вообще не используется в модуле, или применяется в исключительных случаях только для перехода на выходную точку модуля;

Требования к модулю n n n в тексте модуля необходимо использовать комментарии, в особенности Требования к модулю n n n в тексте модуля необходимо использовать комментарии, в особенности в сложных местах алгоритма; идентификаторы переменных и модулей должны быть смысловыми, «говорящими» ; в одной строке стоит записывать не более одного оператора. Если для записи оператора требуется больше, чем одна строка, то все последующие операторы записываются с отступами

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

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

Использование подпрограмм избавляет от необходимости многократно повторять в тексте программы аналогичные фрагменты; n улучшает Использование подпрограмм избавляет от необходимости многократно повторять в тексте программы аналогичные фрагменты; n улучшает читабельность текста программы, позволяя легче выявить ее логическую структуру и скрывая подробности вычислений (то есть повышается степень абстрагирования) n

Использование подпрограмм повышают устойчивость к ошибкам программирования и непредвидимым последствиям при модификациях программы; n Использование подпрограмм повышают устойчивость к ошибкам программирования и непредвидимым последствиям при модификациях программы; n в общем случае уменьшает объем используемой памяти ЭВМ; n сокращает время отладки программы; n

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

Критерии создания подпрограммы если программа длинная: очевидно, что объем незначительно увеличится, но сама программа Критерии создания подпрограммы если программа длинная: очевидно, что объем незначительно увеличится, но сама программа станет более читабельной. (Это примерно похоже на деление программы дисциплины на темы). n если в программе используются сложные алгоритмы: можно отладить подпрограммы отдельно в небольших тестирующих программах. n

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

Свойства подпрограмм n Обмен данными между подпрограммами осуществляется чаще всего через так называемый механизм Свойства подпрограмм n Обмен данными между подпрограммами осуществляется чаще всего через так называемый механизм передачи параметров (аргументов). (Аналог аргументов математической функции) n Операторы, находящиеся внутри подпрограммы выполняется (начиная с первого) только, если это подпрограмма вызвана другой программы. из

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

Свойства подпрограмм n Главной называется программа (подпрограмма), которая вызывается операционной системой. n После выполнения Свойства подпрограмм n Главной называется программа (подпрограмма), которая вызывается операционной системой. n После выполнения операторов подпрограммы управление передается на оператор программы, вызвавшей данную подпрограмму, следующий за вызовом n В общем случае подпрограммы могут быть вложенными, в том смысле, что допускается вызов подпрограммы не только из главной программы, но и из любых других подпрограмм.

Виды подпрограмм n n n Подпрограммы бывают двух видов – процедуры и функции. Процедура Виды подпрограмм n n n Подпрограммы бывают двух видов – процедуры и функции. Процедура просто выполняет группу операторов (например, процедура вывода двухмерного массива). Функция, кроме того, вычисляет некоторое значение и передает его обратно в главную программу. Говорят, что функция возвращает значение. Это значение имеет определенный тип (говорят, что функция имеет определенный тип).

Функции в языке С В С понятия процедуры нет, существует только понятие функции. n Функции в языке С В С понятия процедуры нет, существует только понятие функции. n Если не требуется после выполнения последовательности операторов возвращать какое-либо значение, то функция имеет тип void. n Функции (кроме функций имеющих тип void), могут использоваться во всех случаях, что и переменные. n

Функции в языке С Любая программа на С состоит из функций. n Любая функция Функции в языке С Любая программа на С состоит из функций. n Любая функция должна быть объявлена и определена. n Объявление функции (прототип, заголовок, сигнатура) задает ее имя, тип возвращаемого значения и список передаваемых параметров. n Определение функции содержит кроме объявления, тело функции, представляющее собой последовательность операторов. n

Синтаксис определения функции в языке С [класс памяти] тип имя_функции ([список параметров]) [throw (исключения)] Синтаксис определения функции в языке С [класс памяти] тип имя_функции ([список параметров]) [throw (исключения)] {тело функции} Например, функция вывода void vivod (int); - объявление функции void vivod (int a) {printf(“%40 d”, a; )} определение функции vivod (50); - вызов функции int n=3; vivod (n*2); - вызов фукнции

Функции в языке С n n Объявление функции должно находится в тексте программы раньше Функции в языке С n n Объявление функции должно находится в тексте программы раньше ее вызова, а определение может находиться как до (в этом случае не делается отдельного объявления), так и после ее вызова. В языке С описание функции не может быть находится в теле какой-либо другой функции, то есть не может быть локальным. Однако, в других языках программирования, например, в Pascal, функции могут быть вложенными.

Схема № 1 описания функций в программе на языке C объявление функции f 1 Схема № 1 описания функций в программе на языке C объявление функции f 1 ……………. . объявление функции fn определение главной функции main определение функции f 1 …………… определение функции fn n Причем любая из функций fi может быть вызвана любой функцией fj и функцией main

Схема № 2 описания функций в программе на языке C определение функции f 1 Схема № 2 описания функций в программе на языке C определение функции f 1 …. . определение функции fn определение главной функции main n Причем любая из функций fi может быть вызвана функцией fj, где j>=i и функцией main

Класс памяти функции n n Класс памяти функции задает область действия функции. Для задания Класс памяти функции n n Класс памяти функции задает область действия функции. Для задания класса памяти допустимы только спецификаторы extern и static указывает на то, что область действия функции с момента объявления и до конца файла, где она объявлена, extern -указывает на то, что область действия функции во всех модулях, где она объявлена. По умолчанию – static.

Функции в языке С Тип функции может быть любым кроме массива и функции (но Функции в языке С Тип функции может быть любым кроме массива и функции (но может быть указателем на массив или функцию), может быть void. n Список параметров определяет величины, которые требуется передать в функцию при ее вызове. Элементы списка параметров разделяются запятыми. n

Параметры функции n n Для каждого параметра указывается тип и имя (в объявлении имя Параметры функции n n Для каждого параметра указывается тип и имя (в объявлении имя не обязательно). int k (int a, int b, int c) – верно int k (int a, b, c) - неверно Параметры, перечисляемые в заголовке функции называются формальными void vivod (int a); Параметры, записанные в операторе вызова функции, называются фактическими. vivod (51); В объявлении и определении одной функции типы и порядок следования параметров должны совпадать

Глобальные переменные n Обмен данными между функциями осуществляется с помощью глобальных переменных, через параметры Глобальные переменные n Обмен данными между функциями осуществляется с помощью глобальных переменных, через параметры и через возвращаемое функцией значение. n Использование глобальных переменных в функциях следует ограничивать, так как это затрудняет отладку и препятствует помещению функции в библиотеку общего пользования.

Возвращаемое значение Функция возвращает значение с помощью оператора return выражение; или return; . n Возвращаемое значение Функция возвращает значение с помощью оператора return выражение; или return; . n Выражение в операторе return должно иметь тот же тип что и тип функции. Если функция имеет тип void, то этот оператор можно опустить n Например, int sum (int a, int b){return a+b; } n

Возвращаемое значение В функции может быть несколько операторов return n Например, функция возводящее x Возвращаемое значение В функции может быть несколько операторов return n Например, функция возводящее x в степень y float pow (int, int); void main () { printf("%f", pow(2, -2)); } n float pow (int x, int y) { if (!y) return 1; if (y>0) { int p=1; for (int i=1; i<=y; i++) p*=x; return p; } float p=1; for (int i=1; i<=(-y); i++) p/=x; return p; }

Локальность Все величины, описанные внутри функции, и ее параметры являются локальными. n Чтобы значение Локальность Все величины, описанные внутри функции, и ее параметры являются локальными. n Чтобы значение переменных, описанных в функции, сохранялось и после ее выполнения, то их надо описывать с классом памяти static. n

Механизм работы функций n n n При вызове функции в первую очередь вычисляются выражения, Механизм работы функций n n n При вызове функции в первую очередь вычисляются выражения, стоящие на месте фактических параметров. В стеке выделяется память под формальные параметры функции в соответствии с их типом. Каждому формальному параметру присваивается значение соответствующего фактического параметра (т. е функции всегда работает с копиями фактических параметров).

Механизм работы функций n n n В стеке также сохраняется адрес команды, вызвавший функцию. Механизм работы функций n n n В стеке также сохраняется адрес команды, вызвавший функцию. (Именно его и извлекает из стека оператор return. Если в функции, тип которой не void, оператор return отсутствует, то возврат в место вызова не произойдет. В этом случае будут выполняться все команды из памяти подряд, что потенциально приводит к аварийному завершению программы. ) Управление передается на первый оператор тела функции Оператор return извлекает из стека сохраненный адрес и передает на него управление вместе с возвращаемым функцией значением.

Соответствие параметров n n Последовательность фактических параметров в вызове функции и их тип должны Соответствие параметров n n Последовательность фактических параметров в вызове функции и их тип должны точно совпадать с формальными параметрами этой функции Например, функция оптимальность соотношения роста и веса человека: bool F (int r, int w); F(178, 65); синтаксически и семантически верно F(65, 178); синтаксически верно, но семантически не верно int *a=NULL; F(a, 178); - синтаксически не верно

Изменение параметров Любая функция работает с копиями фактических параметров, а следовательно она не может Изменение параметров Любая функция работает с копиями фактических параметров, а следовательно она не может изменить сами фактические параметры. n Например, int f (int a) {a++; return a; }; void main () { int n=10; printf("%d%d%d", n, f(n), n); //10 11 10 } n

Особенности функций в С В описании функции возможно указать некоторое значение параметра, которое он Особенности функций в С В описании функции возможно указать некоторое значение параметра, которое он будет принимать по умолчанию, то есть, если при вызове функции не будет указан соответствующий фактический параметр. n Причем, если некоторый параметр имеет начальное значение, то все параметры, описанные после него тоже должны иметь умалчиваемое значение. n

Значение параметров по умолчанию Например, int sum (int a=1, int b=2) {return a+b; } Значение параметров по умолчанию Например, int sum (int a=1, int b=2) {return a+b; } sum(); //3 sum(10)//12 sum(10, 5)//15

Переменное количество параметров Допустимы функции, количество параметров у которых при компиляции определения функции не Переменное количество параметров Допустимы функции, количество параметров у которых при компиляции определения функции не определено, в этом случае в определении функции в конце списка параметров после запятой ставится многоточие. n Например, int f (int, …) n

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

Перегрузка функций. Пример n Функция возвращающая максимум из двух целых чисел int max (int Перегрузка функций. Пример n Функция возвращающая максимум из двух целых чисел int max (int a, int b) {if (a>=b) return a; else return b; } n Функция, возвращающая строку с максимальной длиной Char *max (char * a, char *b) {if (strlen(a)>=strlen(b)) return a; else return b; } n Вызовы функций cout<

Рекурсивные функции n n n Рекурсивные функции делят на собственно рекурсивные и косвенно рекурсивные. Рекурсивные функции n n n Рекурсивные функции делят на собственно рекурсивные и косвенно рекурсивные. Функция называется косвенно рекурсивной в том случае, если она содержит обращение к другой функции, содержащий вызов данной функции. Например, функции A и B являются косвенно рекурсивными: void A(int ); void B (int b) {… A(…); …} void A (int a) {… B(…); …}

Рекурсивные функции n Если же в теле функции имеется вызов самой этой функции, то Рекурсивные функции n Если же в теле функции имеется вызов самой этой функции, то речь идет о прямой рекурсии, а такую функцию называет рекурсивной. n Например, функция А является рекурсивной: void A (int a) {… A(…); …}

Рекурсивные функции Рекурсивные алгоритмы эффективны в тех задачах, где рекурсия используется в определении данных Рекурсивные функции Рекурсивные алгоритмы эффективны в тех задачах, где рекурсия используется в определении данных n Если у задачи есть очевидное итерационное решение, то рекурсии следует избегать. Поэтому серьезное изучение рекурсивных методов нужно проводить, вводя динамические структуры данных. n Любая рекурсивная функция должна иметь хотя бы один нерекурсивный выход. n

Вычисление факториала long factorial (int k) { if (k<0) return 0; // нерекурсивный выход Вычисление факториала long factorial (int k) { if (k<0) return 0; // нерекурсивный выход if (k==0) return 1; // нерекурсивный выход return k*factorial(k-1); }

Подключение заголовочных файлов n n При наличии прототипов вызываемые функции не обязаны размещаться в Подключение заголовочных файлов n n При наличии прототипов вызываемые функции не обязаны размещаться в одном файле с взывающей функцией и могут оформляться в виде отдельных модулей, либо могут находиться уже в оттранслированном виде в библиотеке объектных модулей. Прототипы функций и описания внешних объектов помещают в отдельный заголовочный файл, который препроцессорной командой # include “имя файла” включают в начало каждого из модулей программы.