Метод последовательной детализации

Все

Все

Конец

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

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

На псевдокоде эта команда в общем виде записывается так:

если<условие>

то<действие 1>

иначе<действие 2>

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

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

если<условие>

то<действие >

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

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

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

пока<условие >

повторять<действие>

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

Запись команды повторения с предусловием на языке блок-схем выглядит так:

 
 

 

 



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

повторять

действие

доусловие

 

 

Под действием, как и прежде, понимается простая или составная команда.

Цикл с параметром (известным количеством повторений)

 

Дляпараметр := N1 доN2 делать

действие

 

N1, N2 – выражения, определяющие соответственно начальное и конечное значения параметра цикла, N3 –шаг изменения параметра цикла.

Если N1< N2, то N3 >0.

Если N1> N2, то N3 <0.

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

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

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

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

Иногда в литературе структурное программирование называют программированием без goto. Действительно, при таком подходе нет места безусловному переходу.

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

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

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

• вложенная конструкция записывается смещенной по строке на несколько позиций вправо относительно внешней для нее конструкции.

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

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

Алгоритмы решения таких подзадач называются вспомогательными алгоритмами. В связи с этим возможны два пути в построении алгоритма:

• "сверху вниз" – сначала строится основной алгоритм, затем вспомогательные алгоритмы;

• "снизу вверх" – сначала составляются вспомогательные алгоритмы, а затем основной.

Первый подход еще называют методом последовательной детализации, второй — сборочным методом.

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

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

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

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

 

 

Сначала анализируется исходная задача. В ней выделяются подзадачи. Строится иерархия таких подзадач.

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

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

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

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

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

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

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

Качественная программа ни в каком варианте не должна завершаться аварийно.

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

Успешное прохождение всех тестов есть необходимое условие правильности программы. Заметим, что при этом оно необязательно является достаточным. Чем сложнее программа, тем труднее построить исчерпывающий план тестирования. Опыт показывает, что даже в «фирменных» программах в процессе эксплуатации обнаруживаются ошибки. Поэтому проблема тестирования программы — очень важная и одновременно очень сложная проблема.