Циклические управляющие структуры

- оператор цикла с предусловием: while ( В ) S; где B – выражение, определяющее условие выполнения тела цикла; S – опера-

тор (тело цикла). Таким образом, тело цикла с предусловием может ни разу не выполнится, если выражение B сразу ложно. Выражение B и оператор S должны быть связаны так, чтобы когда-нибудь выражение стало ложным и, цикл завершился.

– оператор цикла с постусловием: do S while ( B ); где B – выражение, определяющее условие выполнения цикла; S – опера-

тор (тело цикла). Таким образом, тело оператора цикла с постусловием всегда, хотя бы один раз

выполнится. Выражение B и оператор S должны быть связаны так, чтобы когда-нибудь выражение стало ложным и, цикл завершился.

Циклические управляющие структуры - student2.ru

Реализуя приближенные вычисления, необходимо помнить, что в памяти ЭВМ действительные числа представляются приближенно и поэтому сравнение действительных значений необходимо производить, задавая уровень точности. Напри-

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

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

1. свести решение к циклу – выделить действия, сводящиеся к циклу

2. описать действия цикла

3. организовать повторение цикла.

Тело цикла – рекуррентное соотношение(определение понятия через это же понятие); обобщенная запись повторяемого действия – основное содержание.

19. ПОНЯТИЕ ПОДПРОГРАММЫ И МОДУЛЬНОГО ПРОГРАММИРОВАНИЯ. ЦЕЛИ МОДУЛЬНОГО ПРОГРАММИРОВАНИЯ. ВИДЫ ПОДПРОГРАММ: ФУНКЦИЯ, ПРОЦЕДУРА.

При нисходящей разработке проектирование программы ведется “сверху-вниз”. В решаемой задаче сначала выделяется небольшое число достаточно самостоятельных, более простых задач (подзадач), а в проектируемой программе намечается соответствующее число блоков (частей программы), каждый из которых предназначен для решения одной из подзадач. Определяется функциональное назначение каждого блока (модуля): что он должен делать, какие данные являются исходными для блока, какие – результатами. Если какие-то из подзадач оказываются достаточно сложными (алгоритмы их решения не являются очевидными), то к каждой из них применяется аналогичный процесс выделения подзадач.

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

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

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

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

Основные свойства подпрограмм:

1) подпрограмма должна иметь один вход и один выход;

2) подпрограмма должна решать самостоятельную задачу по принципу одна подпрограмма – одна функция. Например, ввод линейного массива, вычисление произведения матриц, поиск наибольшего элемента в одномерном массиве и т.д.;

3) подпрограмма должна возвращать управление в ту часть программы, которая ее вызвала;

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

5) подпрограмма должна настраиваться на входные данные вызывающей части и возвращать результат;

6) размер подпрограммы желательно ограничивать одной-двумя страницами исходного текста.

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

Схема взаимодействия вызывающей и вызываемой может быть следующей:

Подпрограммы

Синтаксически подпрограмма состоит из:

– определения подпрограммы,

– обращения к подпрограмме.

Определение подпрограммы:

<определение подпрограммы> ::= <заголовок подпрограммы>

<тело подпрограммы>

Тело подпрограммы является описанием того частичного алгоритма, который объявляется подпрограммой.

Заголовок подпрограммы задает ее имя и определяет данные, с которыми эта подпрограмма работает. Обращение к подпрограмме служит для ее активации. Большинство языков программирования допускает подпрограммы двух видов – подпрограммы-процедуры и подпрограммы-функции (или просто процедуры и функции). В отличие от процедуры функция реализует функциональную зависимость, у которой один результат. Кроме того, результат функции может быть, как правило, простого типа. Программа на языке Си это совокупность подпрограмм – функций (в дальнейшем просто функций), среди которых выделяется одна обязательная (главная) с именем main. Остальные функции вводятся в структуру программы для улучшения ее структурированности. Их выполнение инициируется прямо или косвенно вызовами из функции main. Таким образом, тело функции задается блоком (блок это последовательность описаний и операторов, заключенная в фигурные скобки) или составным оператором. В заголовке функции задается тип ее результата, если функция имеет возвращаемый результат, иначе тип void. Список формальных параметров, если он не опущен, содержит перечисленные

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

Выражение определяет возвращаемый результат, его тип описан в загОловке функции. Если функция не возвращает никакого значения (т.е. имеет тип void), оператор возврата опускается.

20. СИНТАКСИС И СЕМАНТИКА ФУНКЦИИ ЯЗЫКА С.

Следующим синтаксическим элементом в структуре программы за выражением и оператором идет функция. В отличие от предыдущих она является не только средством написания некоторой части программы, но и служит для оформления логически завершенного действия с собственным набором входных и выходных параметров. Термин функция, принятый в Си, имеет в других языках программирования родственные термины -процедура, модуль. Функция является основной программной единицей уже потому, что вся программа представляет собой множество вызывающих друг друга функций. Часть из них может быть получена “со стороны” -из библиотек или из программ, написанных в другое время, в другом месте, другими людьми и даже на другом языке программирования. То есть на уровне функций осуществляется “сборочный процесс” программы из отдельных составляющих.

Функция состоит из двух частей: ЗАГОЛОВКА ФУНКЦИИ, создающего “интерфейс” функции к внешнему миру, и ТЕЛА ФУНКЦИИ, реализующего заложенный и нее алгоритм с использованием внутренних локальных данных. Вместе заголовок и тело составляют ОПРЕДЕЛЕНИЕ ФУНКЦИИ.

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

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

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

Результат функции – это временная переменная, которая возвращается функцией и может быть использована как операнд в контексте (окружении) выражения, где был произведен её вызов.

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

Значение переменной-результатa устанавливается в операторе return, который производит это действие наряду с завершением выполнения функции и выходом из нее. Между ключевым словомreturn и ограничивающим символом ";" может стоять любое выражение, значение которого и становится результатом функции. Если вспомнить еще и о преобразованиях типов, то при таком "присваивании" результата таковое должно производиться от типа, соответствующего выражению к типу результата функции.

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

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

В “классическом” Си формальными параметрами и результатом функции могут быть только переменные, занимающие ограниченный объем памяти: базовые типы данных и указатели (в Си++ к этому перечню добавлены структурированные переменные (объекты)). Это сделано, исходя из общего положения о том, что транслятор не должен оказывать сильное влияние на эффективность программы путем включения каких-либо неявных операций. Использование же массивов и структур в этом качестве приведет к появлению таких операций копирования. Более подробно обсудить этот вопрос сейчас нам мешает отсутствие знаний о типах данных и способах передачи параметров.

Тело функции представляет собой уже известную нам синтаксическую конструкцию -блок. Это простая последовательность операторов, заключенная в фигурные скобки. После открывающейся скобки в блоке могут стоять определения переменных. Это ЛОКАЛЬНЫЕ ПЕРЕМЕННЫЕ блока (в данном случае тела функции). Они обладают следующими свойствами:

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

-локальные переменные могут использоваться только в том блоке, в котором они определены. Это значит, что за пределами блока они "не видны";

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

Локальные переменные в теле функции обозначаются в Си термином автоматические переменные.

21. СПОСОБЫ ПЕРЕДАЧИ ДАННЫХ В ПОДПРОГРАММУ.

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

1)используя для этого глобальные объекты,

2)используя формальные параметры.

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

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

Формальные параметры в Си задаются в списке формальных параметров перечислением через запятую спецификаций отдельных параметров. Спецификация каждого параметра имеет вид: <спецификация типа> <имя параметра>

22. ПОНЯТИЕ ФОРМАЛЬНОГО ПАРАМЕТРА. ИСПОЛЬЗОВАНИЕ ФОРМАЛЬНОГО ПАРАМЕТРА ДЛЯ ПЕРЕДАЧИ ДАННЫХ В ПОДПРОГРАММУ (ИСХОДНЫХ ДАННЫХ И РЕЗУЛЬТАТОВ).

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

В программе с многоуровневой структурой возникает проблема взаимодействия объектов, описанных в разных частях и модулях программы.

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

– локальные,

– формальные,

– глобальные.

Формальные объекты – это объекты, описанные в заголовке определения подпрограммы. Область действия этих объектов – тело подпрограммы. Формальные параметры это также локальные объекты подпрограммы.

Область действия формальных параметров, описанных в прототипе функции – прототип функции.

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

Формальные параметры задают не какие-то конкретные данные программы, а лишь условно определяют объекты подпрограммы. Это позволяет применять подпрограммы к различным объектам программы, конкретизируя при каждом обращении ее данные в списке фактических параметров. В список формальных параметров необходимо вводить только те объекты, которые изменяются при вызове подпрограммы, т.е. входные и выходные данные.

Формальные параметры в Си задаются в списке формальных параметров перечислением через запятую спецификаций отдельных параметров.

Спецификация каждого параметра имеет вид:

<спецификация типа> <имя параметра>

23. ПОНЯТИЕ ФАКТИЧЕСКОГО ПАРАМЕТРА ПОДПРОГРАММЫ. ПРАВИЛА СВЯЗЫВАНИЯ ФОРМАЛЬНОГО И ФАКТИЧЕСКОГО ПАРАМЕТРОВ.

Фактические параметры – переменные, константы или выражения, значения которых при вызове присваиваются соответствующим по списку формальным параметрам.

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

Связь между фактическими и формальными параметрами может устанавливаться двумя способами:

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

– связь по адресу (ссылке) – фактический параметр заменяет в теле подпрограммы формальный и подпрограмма получает доступ к фактическому параметру. Если говорить более точно, то формальному параметру присваивается адрес (ссылка) фактического параметра. Значение такого формального параметра при его использовании в операциях рассматривается как адрес того объекта, над которым надо выполнить эту операцию. Такой способ используется как для передачи входных данных, так, и, прежде всего, для выходных данных (результатов). В Си связь между формальными и фактическими параметрами устанавливается по значению. Фактический параметр в этом случае – выражение того же типа, что и соответствующий ему формальный. В момент вызова функции вычисляется значение фактического параметра и присваивается формальному параметру. Такой способ позволяет передать в подпрограмму значения входных данных. Изменение формального параметра, получившего значение фактического, не приводит к изменению фактического параметра.

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

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

Так как имя массива – это константа указатель, значение которой есть адрес начала массива, то массив можно передавать, явно определяя тип формального параметра как указатель. В таком случае связь между формальным и фактическим параметрами устанавливается по значению.

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

<cпецификация типа результата функции> <имя функции> ( [ <cписок формальных параметров> ] )

| void <имя функции> ( [ <cписок формальных параметров> ] )

Основные отличия:

1) в конце прототипа ставится точка с запятой,

2) имена формальных параметров можно опускать.

24. ПОНЯТИЕ ГЛОБАЛЬНОГО (ВНЕШНЕГО) ОБЪЕКТА. ИСПОЛЬЗОВАНИЕ ГЛОБАЛЬНОГО ОБЪЕКТА ДЛЯ ПЕРЕДАЧИ ДАННЫХ В ПОДПРОГРАММУ.

Как известно, В подпрограмме могут действовать три вида объектов:

– локальные,

– формальные,

– глобальные.

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

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

25. МОДУЛЬНО - БЛОЧНАЯ СТРУКТУРА ПРОГРАММЫ И ПРАВИЛА ЛОКАЛИЗАЦИИ ОБЪЕКТОВ.

В основе модульного программирования лежит декомпозиция – разбиение на функциональные самостоятельные независимые подзадачи (модули), которые существенно более мелкие и более понимаемые, чем сама задача.

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

Понятие модуля:

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

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

Назначение– определяется неформально как правило на псевдо языке.

Интерфейс – определяется формально, складывается из спецификаций объектов двух типов

1.Тип – Экспорт модуля– те объекты (константы, переменные, функции) которые реализуются данным модулем и могут быть использованы вне этих модулей.

2.Тип – Импорт модуля – те объекты, которые требуются от других модулей системы

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

Кроме импортированных и экспортированных объектов могут быть и собственные локальные объекты. Они скрыты от других модулей.

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

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

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

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

Принято различать следующие модули:

1.Головной – модуль управляющий запуском программного продукта.

2.Управляющий – обеспечивает вызов других модулей как правило в программе он один но допускается и другое количество.

3.Рабочий – модуль выполняющий функции обработки данных. Таких модулей может быть множество.

4.Сервисный– модуль обеспечивает обслуживание функции.

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

Модуль – текст, который хранится в отдельном файле, поэтому файл – синоним понятия модуль. Поэтому многомодульная программа – программа, состоящая из многих файлов.

В качестве сервисных модулей принято использовать заголовочные модули. Если в модуле присутствует .h , то это заголовочный сервисный модуль. В нем принято хранить или поставлять константы, глобальные объекты, прототипы подпрограмм.

Рабочие модули в Си имеют расширение .cpp , в которых хранятся объектные коды - .exe

Модули также могут быть стандартными и пользовательскими. Для того чтобы показать предпроцессору, что выполняется стандартный модуль: #include <имя файла>, если пользовательский: #include “имя файла”. Программист должен задать место расположения файла – полное имя: С:\кат\кат\...\имя файла , либо через настройку.

Взаимодействие объектов в программе:

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

Местом или областью локализации может быть:

1.Блок

2.Функция(то есть ее определение)

3.Модуль (файл)

4.Прототип функции

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

- Класс памяти

- Область действия имени

- Видимость имени

- Продолжительность существования объекта

- Тип связывания, тип компоновки

Знание этих характеристик позволяет определять, уточнять взаимодействие объектов. Тип отделен от атрибутов, остальные связаны. Некоторые из них указываются явно, а другие нет – по умолчанию, контексту, т.е. по месту определения объекта.

Класс памяти определяет размещение объекта в ОП, его продолжительность существования и тип связывания.

Основные классы памяти:

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

2.Статическая память (static) –объекту этого класса память выделяется в начале выполнения программы и освобождается при ее завершении.Эта память выделяется в сегменте данных. Этот класс приписан объектам явно и задает статическую продолжительность существования и внутренний тип связывания. Он может быть приписан функциям и может переменным. Глобальные переменные располагаются в памяти класса static, как и функции.

3.Внешняя память (extern) –как и классу static, память выделяется в начале выполнения программы и освобождается при ее завершении. Память выделяется в сегменте программы данных. Задает статическую продолжительность существования и внешний способ связывания. Функции и глобальные объекты имеют класс extern. Единственной принципиальное отличие от static – тип связывания: класс static сущ-ет в программах, состоящих из 1 модуля, extern используется для программ, состоящих из нескольких модулей.

С помощью класса static, extern создается общее для всех поле данных, т.е. в них определяются глобальные объекты, переменные и функции.

Класс static может быть предписан и объектам класса auto.

Классы:

Для переменных класс приписывается явно. При определении объекта ему приписывается не только тип но и класс памяти, продолжительность существования, тип связывания, область действия имени и т.д.

Явно задается только класс памяти.

Общее определение объекта:

[класс памяти][модификатор] тип имя [инициализатор] ([] – говорит о том что то что внутри может быть опущено).

При определении объекта переменной или константы класс extern не используется. Этот класс используется при описании объектов. По определению ему задается имя, и другие атрибуты, тип, выделение памяти.

Описание – информация для транслятора об объекте.

Описание: [класс памяти][модификатор] тип имя, но без инициализатора так как это информация только для транслятора.

Область действия имени(ОДИ)– часть программы в которой существует связь между некоторым именем объекта. По средствам имени обеспечивается обращение к объекту. Область действия имени начинается с точки где определен объект и заканчивается концом той области в которой он локализован (конец блока, модуля, файла). ОДИ зависит от то того, где и как определены объекты и описаны имена. Это опять же блок, функция, прототип функции, файл, класс памяти.

С ОДИ связано понятие пространства имен.

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

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

Имена переменных, функций, типов введенных пользователем (type def) должны быть уникальны в области их определения, т.е. локальные уникальны среди локальных, глобальные среди глобальных.

Видимость объекта – этот атрибут характеризует взаимодействие объектов с одинаковыми именами но с разной локализацией. Если в области внутренней по отношению к другой области определен объект с таким же именем как и объект вне внутренней области то во внутренней области виден объект определенный в ней самой (данное правило однозначно позволяет использовать под одним именем только один объект).

Продолжительность существования объекта– определяет период времени в течении которого любому имени соответствует конкретный объект расположенный в области памяти. продолжительность может быть:

1.Локальной –локальную продолжительность имеют объекты класса auto, т.е. объекты, определенные в блоке. Такие объекты создаются при входе в блок и не доступны при выходе из него.

2.Статической – статическую продолжительность имеют объекты класса static и extern. Статическая продолжительность определяет период существования объекта начиная с его определения и заканчивая концом программы то есть перестает существовать когда программа завершает работу (все функции, модули, глобальные переменные имеют статическую продолжительность). Локальному объекту (объекту класса auto) может быть приписана статическая продолжительность существования только явно. Объекты со статической продолжительностью существования инициализируется нулевым значением по умолчанию. Память статическим объектам выделяется в начале выполнения программы когда эти объекты определяются и до конца существования программы.

3. Динамическая -Объекты с динамической продолжительностью существования создаются и уничтожаются в процессе выполнения программы по явным запросам о создании и удалении объекта.

Таки запросы могут быть созданы спец. объектом:

new, malloc –на создание объекта.

delete, free -для удаления объекта.

Тип связывания, компоновки:

Этот атрибут возник для программ с модульной структурой.

Определение соответствующего имени объекта (переменной, константе, функции) в программе состоящей из нескольких модулей. Внутри модуля способ связывания – внутренний, задается неявно, по умолчанию. Выделение памяти и связь с именем происходит на этапе трансляции. Для объектов определенных в программе с модульной структурой (>1 модуль) может быть определено внешнее связывание – это связывание определяется в тех случаях когда объект определенный в одном модуле должен быть использован в другом. Для функций по умолчанию установлено внешнее связывание поэтому функция определенная в одном модуле может быть определена в другом. Для переменных внешнее связывание задается только явно.

26. ПОНЯТИЕ РЕКУРСИИ. ГЛУБИНА РЕКУРСИИ. МЕХАНИЗМ РЕАЛИЗАЦИИ РЕКУРСИЙ В ЯЗЫКАХ ПРОГРАММИРОВАНИЯ.

ДОСТОИНТСВА И НЕДОСТАТКИ РЕКУРСИВНОГО РЕШЕНИЯ ЗАДАЧИ ПО СРВНЕНИЮ С ИТЕРАТИВНЫМ.

Под рекурсивным понимают способ описания понятий процессов функции через самих себя. Рекурсивное решение предполагает разбиение(разложение) на совокупность подзадач, таким образом, что любые 2 подзадачи либо не пересекались, либо одна из них является подзадачей другой. Среди этих подзадач должна быть хотя бы одна подзадача, которая определяет тривиальный случай –случай, когда задача решается непосредственно, - хотя бы одна подзадача определяет непосредственное решение, и должна быть хотя бы одна подзадача, которая определяет общий случай решения задачи. При этом общий случай решения задачи является способом сведения общей задачи к решению одной или нескольких простых (тривиальных) задач. Общий способ решения задач – это, как правило, способ, при котором происходит снижение размерности задачи. Процесс, сведения общей задачи к простой, называют разворачиванием рекурсий. После того, как рекурсия развернута, т.е. сведена к простой задаче, которая может быть решена непосредственно, выполняется процесс сворачивания рекурсии. На этом этапе происходит обобщение простого решения и переход, таким образом, к решению сложной задачи. Глубина рекурсии – количество шагов для сведения общей задачи к частной. Используя рекурсивное решение задачи идет оценка глубины рекурсии. Поэтому, прибегать к рекурсивному решению задачи необходимо, когда сама природа задачи является рекурсивной. Это проявляется если:

1. обрабатываемые данные имеют рекурсивную природу

2. нет для задачи итеративного способа решения – в этом случае применяют метод полного или частичного перебора возможных вариантов решения задачи.

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

Наши рекомендации