
- •Вопросы для подготовки к экзамену (1 семестp).
- •1972Г – Дейкстра – Книга о базисе и структурированном программировании.
- •Структурные уровни языка программирования. Уровни языка Паскаль. Особенности языка Паскаль.
- •_____________________________________________________________________________________Билет №26
- •1. Использовать процедуры с параметрами (чистые процедуры), за исключением явных случаев, когда параметры не нужны. Доводы в пользу использования чистых процедур:
- •2. Глобальные переменные в процедуре целесообразно использовать в след. Основных случаях:
- •1. Постановка задачи (спецификация задачи: в спецификации различают две существенно разные ее части: функциональную и эксплуатационную спецификацию.
_____________________________________________________________________________________Билет №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
Побочный эффект. Причины возникновения и правила предупреждения.
ПОБОЧНЫМ ЭФФЕКТОМ называется незапланированное (случайное) изменение глобальных переменных в процедуре или функции.
Он может возникать при использовании функций без параметров. Если учесть, что побочный эффект не обнаруживается даже при верификации программ, то использование чистых процедур (не содержащих глобальных объектов) можно считать одной из важных рекомендаций для получения корректных программ.
При разработке процедур надо следовать рекомендациям: