Тема 1. Модульность. Основы модульного программирования Одной из распространенных методик создания программной продукции в настоящее время является структурное.

Презентация:



Advertisements
Похожие презентации
Практическое занятие 6. Функции. Большинство языков программирования используют понятия функции и процедуры. C++ формально не поддерживает понятие процедуры,
Advertisements

Функции Функция – именованная последовательность описаний и операторов, выполняющая некоторое действие. Может иметь параметры и возвращать значение. Функция.
ПРОЦЕДУРЫ И ФУНКЦИИ CPascal Подпрограмма – группа операторов реализующая законченный алгоритм и оформленная как самостоятельная синтаксическая единица.
Процедуры и функции в Паскале. Рекурсия. Подпрограммы Часто в задаче требуется повторить определенную последовательность операторов в разных частях программы.
Подпрограммы 1.Принцип модульности 2.Область действия переменных 3.Параметры подпрограмм 4.Модули.
Подпрограммы: процедуры и функции Информатика. 1. Подпрограммы При решении различных задач часто возникает необходимость проводить вычисления по одним.
Понятие подпрограммы Стандартные процедуры и функции.
Подпрограммы Лекция 7. Ломаско Павел Сергеевич16 декабря 2013 г.
Языки и методы программирования Преподаватель – доцент каф. ИТиМПИ Кузнецова Е.М. Лекция 5.
Обработка исключительных ситуаций Исключительная ситуация (исключение) – это ошибка, возникающая во время выполнения программы. Например, ошибка работы.
Основы информатики Классы Заикин Олег Сергеевич zaikin.all24.org
Основы информатики Лекция. Функции Заикин Олег Сергеевич
Лекция 6 Функции. Объявления и определения Объявление функции – указание имени функции, а также входных и выходных параметров Определение функции – указание.
Процедуры и функции Вербицкая Ольга Владимировна, Заозерная школа 16.
Процедуры и функции Процедуры пользователя. Общие сведения Если в программе возникает необходимость частого обращения к некоторой группе операторов, выполняющих.
Объектно-ориентированный язык программирования. Переменная - эта поименованная ячейка памяти, хранящая какое-либо одно значение (одно число, один фрагмент.
Подпрограммы. Субкомпетенции: 1. Обработка данных с помощью стандартных подпрограмм и подпрограмм, определённых пользователем. 2. Организация передачи.
Лекция 6 Функции. Объявления и определения Объявление функции – указание имени функции, а также входных и выходных параметров Определение функции – указание.
Лекция 4 Программирование на Паскале. Элементы языка Турбо Паскаль 7.0. Типы данных. Управляющие конструкции.
Транксрипт:

Тема 1. Модульность

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

Синтаксис определения функции в языке С++ [класс памяти] тип имя_функции ([список параметров]) [throw (исключения)] {тело функции} Например, функция вывода void vivod (int); - объявление функции void vivod (int a) {cout<<setw(40)<<a;} - определение функции vivod (50); - вызов функции

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

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

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

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

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

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

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

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

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

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

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

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

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

Функция, вычисляющая x в степени y. int pow (int, int); void main () {cout<<pow(3,3); getch(); } int pow (int x, int y) { if (!y) return 1; if (y>0) { int p=x; for (int i=1; i<y; i++) p*=x; return p; } int p=1/x; for (int i=1; i<y; i++) p/=x; return p; }

Передача параметров в функцию При передаче по адресу в стек заносится копии адресов параметров, а следовательно функция может изменить содержимое участок памяти с этими адресами. При передаче по адресу в стек заносится копии адресов параметров, а следовательно функция может изменить содержимое участок памяти с этими адресами. Например, функция вычисляющая сумму элементов массива Например, функция вычисляющая сумму элементов массива int Sum(int *mas, int n) { int summ=0; for (int i=0; i<n; i++) summ+=mas[i]; return summ; }

Передача параметров в функцию void main() {const int n=3; int r[n]; randomize(); for (int i=0; i<n; i++) {r[i]=random(6); cout<<" "<<r[i]; } cout<<"\nSum = "<<Sum(r, n); getch();}

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

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

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

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

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

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

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

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

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