Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
ekz_informatika.docx
Скачиваний:
0
Добавлен:
01.07.2025
Размер:
106.8 Кб
Скачать

_____________________________________________________________________________________Билет №26

Основные стратегии проектирования алгоритмов, их сравнительная характеристика.

Существуют две основные стратегии проектирования алгоритмов: восходящее ("снизу-вверх") и нисходящее ("сверху-вниз") проектирование.

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

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

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

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

- Преимущества нисходящей стратегии:

1. Дает лучшее понимание объектов проектирования, так как на каждом шаге выделяются основные понятия, а детали "упрятываются".

2. Делает более простым процесс модификации программы и сокращает

время отладки.

3. Упрощает доказательство корректности программы.

- Трудности нисходящей стратегии.

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

2. Имеется специфика в отладке "сверху-вниз", когда приходится отлаживать программные модули, полностью не завершенные.

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

_____________________________________________________________________________________

Билет №27

Основные декомпозиционные структуры программ.

Сегменты-блоки и сегменты-процедуры, их спецификация.

В основе операции декомпозиции задачи на подзадачи лежит принцип рас­крытия абстракции.

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

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

Сегмент - это алгоритм, содержащий абстракции. Именно наличием абстракции объясняется свойство сегмента порождать другой сегмент.

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

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

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

1. Концентрируйте внимание прежде всего на самом существенном, отвле­каясь от мелочей.

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

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

4. Если на каком-либо шаге встретились непредвиденные проблемы, поста­райтесь еще раз пересмотреть решения, принятые на предыдущих шагах, и, если требуется, заменить их на другие варианты.

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

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

При раскрытии абстракции используются две формы сегмента: форму блока (сегмент - блок) и форму процедуры (сегмент - процедура).

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

Сегмент описывается в виде процедуры, если он реализует типовой алго­ритм, который может носить универсальный характер. На языке Паскаль он реа­лизуется в виде процедуры с параметрами.

_____________________________________________________________________________________

_____________________________________________________________________________________

Билет №28

Рабочий проект программы. Top-down граф.

_____________________________________________________________________________________

Билет №29

Правила получения окончательной программы.

Документация проекта.

_____________________________________________________________________________________

Билет №30

Начальные шаги проектирования программы. Связь с внешней спецификацией.

Основные варианты абстракций верхних уровней.

_____________________________________________________________________________________

Билет №31

Процедуры языка Паскаль. Типы процедур. Правила выбора, описания и использования процедур.

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

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

Аппарат процедур в языках программирования состоит из двух частей: опи­сание процедуры и вызов процедуры.

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

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

Формальные параметры описывают входные и выходные данные процеду­ры.

В языке Паскаль существует два вида процедур: процедуры общего вида и функции.

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

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

Вызов процедуры общего вида производится оператором процедуры.

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

Параметры, передаваемые процедуре при вызове, называются фактиче­скими параметрами.

Процедуры общего вида:

Описание процедуры помещается в конце раздела описаний и имеет следующую структуру:

{<Раскрываемая абстракция>}

<Заголовок>

<Тело процедуры>

<Раскрываемая абстракция> является комментарием, в котором кратко оп­ределена цель процедуры.

<Тело процедуры> описывает алгоритм.

<Заголовок процедуры> имеет вид:

procedure <имя процедуры> (<список описаний формальных параметров>)

Список параметров может отсутствовать, и тогда процедура является про­цедурой без параметров.

Вызов процедуры осуществляется с помощью оператора процедуры:

<оператор процедуры>::=<имя процедуры>(<список фактических пара­метров>);

Вызов процедуры включает следующие шаги:

- среди описаний процедур ищется процедура с именем <имя процедуры>;

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

- выполняется модифицированное тело процедуры;

- управление возвращается из процедуры к оператору, следующему за операто­ром процедуры.

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

_____________________________________________________________________________________

_____________________________________________________________________________________

Билет №32

Функции.

Правила описания и использования.

С точки зрения использования процедур функцию можно рассматривать как частный случай процедур общего вида, когда требуется вычислить только одно значение. Но если рассматривать функцию как структурную единицу в программе, то роль у нее иная: ФУНКЦИЯ является операцией в выражении в то время как процедура является самостоятельным действием. В Паскале существуют специальные средства для работы с функцикями.

Функцияция описывается в след. виде:

{<Раскрываемая абстракция>}

function <имя функции>(<список описаний аргументов>):<тип>

<тело функции>

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

<имя функции>:=<выражение>

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

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

Проектирование функций и процедур: процедура-действие, функция-операция.

Пример:

function Summa(x,eps:real):real;

repeat

s:=s+a;

until (abs(a)<eps);

summa:=s (Имя ф-ции находится только в левой части. Его нельзя использовать как простую переменную.

Так, в теле функции использование ее имени в правой части оператора присваивания Sum:=Sum+a было бы воспринято системой как ошибочная попытка вызова этой функции без параметра).

_____________________________________________________________________________________

Билет №33

Чистые процедуры. Правила и способы подстановки параметров. Механизм подстановки.

ЧИСТАЯ ПРОЦЕДУРА - процедура с параметрами, не содержащая глобальных переменных. Использование чистых процедур можно считать одной из важнейших рекомендаций для получения корректных программ, в противном случае высока вероятность возникновения побочного эффекта.

ПОДСТАНОВКА ПАРАМЕТРОВ:

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

Существуют три способа подстановки параметров: по значению, по типу и по имени. Рассмотрим два из них.

1) Подстановка параметра-значения.

При подстановке по значению фактический параметр вычисляется и полу­ченное значение подставляется вместо формального параметра.

В общем случае фактический параметр может быть выражением.

Правило описания:

<формальный параметр-значение>::=<список имен>:<имя типа>.

Пример. Использование параметра-значения:

{х - параметр-значение}

program Value (Output);

var a:airay[1..2] of byte;

procedure P (x:byte);

begin x:=x+2 end;

begin {Главная программа}

a[1]:=10; a[2]:=20;

P(a[1]);

P(a[l]+a[2]);

write(a[1],a[2]);

end.

Механизм подстановки параметра-значения включает следующие этапы:

1. В памяти выделяется место для формального параметра (х);

2. Вычисляется значение фактического параметра (а[1], а[1] + а[2]) и при­сваивается переменной х.

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

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

2) Подстановка параметра-переменной(по имени).

При подстановке по переменной формальный параметр ссылается на имя фактического параметра. Фактический параметр может быть только именем про­стой или структурной переменной.

Правило описания:

<формальный параметр-переменная>::=vаг<список имен>:<имя типа>.

Пример. Использование параметра-переменной.

{х - параметр-переменная }

program Name (Output);

var a:array[1..2]of byte;

procedure P(var x:byte);

begin х:=х+2 end;

begin {Главная программа}

а[1]:=10; а[2]:=20;

P(a[1]);

P(a[2]);

write(a[1],a[2]);

end.

Meханизм подстановки параметра-переменной включает следующие этапы:

1. В памяти не выделяется место для формального параметра (х), а исполь­зуется то место, где размещается фактический параметр (ссылка на фактический параметр а[1],а[2]).

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

Результат выполнения процедуры должен быть описан как параметр-переменная.

Сравнивая способы подстановки, можно так оценить эффективность их ис­пользования:

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

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

_____________________________________________________________________________________

Билет №34

Структура программы. Локализация объектов.

Программа на языке Паскаль имеет блочную структуру:

<программа>::=<заголовок><блок> (не пугать с сегмент-блоком!)

<описание процедуры>::=<заголовок><блок>

<блок>::=<раздел описаний ><составной оператор>

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

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

Если объект используется вне того блока, где он описан, то он называется нелокальным.

Нелокальный объект называется стандартным, если он определен в самом языке. Например, константы Pi, Maxint, функции Ео? Sin - стандартные.

Если нелокальный объект описан в программе, то он называется глобаль­ным.

ПРИМЕР.

program R;

var a,i:real;

procedure P1;

var b:real;

procedure P2;

var x,i:real;

begin

i:=2

begin

end{P2};

i:=99; P2;

writeln(i); {99}

end{P1};

function F:real;

var Z:real;

begin

i:=0; F:=i;

end{F};

begin

P1; writeln(i); {99}

writeln(i+F); {99+0=0(?)}

writeln(F+i); {0+0=0}

end{R}.

Переменные a, i - локализованы в программе R; b - локализована в процедуре Р1; х - локализована в процедуре Р2 и т.д.

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

Переменная b - локальна в процедуре Р1 и глобальна по отношению к про­цедуре Р2, поэтому в этих процедурах она может быть использована. Переменную b нельзя использовать функцией F и в программе R, так как она теряет свое зна­чение при выходе из процедуры Р1.

Переменная z можег быть использована только функцией F, где она описа­на.

Если некоторая переменная (i) описана и во внешнем блоке (R) и во внут­реннем (Р2), то во внутреннем блоке действует описание его локальной перемен­ной i. Значение глобальной переменной i при входе в процедуру Р2 автоматиче­ски сохраняется, а при выходе из этой процедуры - восстанавливается.

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

Процедура Р1 и функция F описаны в программе R, поэтому они могут вызываться из программы R. Проце­дура Р2 описана (а значит и локализована) в процедуре Р1, следовательно она может вызываться из процедуры Р1 и может вызывать Р1 как глобальную.

В то же время, невозможно обратиться из программы R и из функции F к процедуре Р2, так как Р2 является локальным объектом процедуры Р1.

При взаимодействии Р1 и F действует следующее правило языка Паскаль: описание объекта должно предшествовать его вызову. Поэтому F может вы­зывать Р1, а Р1 не может вызывать F, так как процедура Р1 описана раньше, чем функция F, Чтобы установить равноправие P1 и F, следует перед описанием про­цедуры Р1 добавить опережающее описание функции F:

function F:real;forward;

ЛОКАЛИЗАЦИЯ ПЕРЕМЕННЫХ:

1) R вызывает:

P1 - доступно, P2 - недоступно, F - доступно;

2) P1 вызывает:

Р1 - рекурсия, Р2 - доступно, F - недоступно;

3) Р2 вызывает:

Р1 - доступно, Р2 - рекурсия, F - недоступно;

4) F вызывает:

Р1 - доступно, Р2 - недоступно, F - рекурсия.

_____________________________________________________________________________________

Билет №35

Побочный эффект. Причины возникновения и правила предупреждения.

ПОБОЧНЫМ ЭФФЕКТОМ называется незапланированное (случайное) изменение глобальных переменных в процедуре или функции.

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

При разработке процедур надо следовать рекомендациям:

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]