- •Введение Цели и задачи курса «Технология программирования»
- •Классификация программного обеспечения
- •Тема 1.Понятие программного изделия
- •1.1.Основные требования к программному изделию как к продукции производственно-технического назначения
- •1.2.Жизненный цикл программных изделий
- •1.3.Методическая, технологическая, инструментальная и организационная поддержка процесса проектирования программных изделий
- •1.4.Этапы проектирования сложных программных изделий
- •Тема 2.Внешнее проектирование программных изделий
- •2.1.Разработка требований и внешнее проектирование программных изделий
- •2.2.Обеспечение целей создания программных изделий Цели проекта с точки зрения пользователя
- •Цели проекта с точки зрения разработчика
- •2.3.Разработка внешних спецификаций проекта
- •Тема 3.Внутреннее проектирование программных изделий
- •3.1.Понятие модуля. Характеристики качества модулей
- •3.2.Методы проектирования программ
- •Иерархическая декомпозиция и абстрактные машины (метод нисходящей декомпозиции)
- •Программирование на основе принципа пошагового совершенствования
- •Структурное программирование по нисходящему принципу
- •Программирование с использованием пошаговой реорганизации
- •Способы описания программ. Язык проектирования программ
- •Тема 4.Структурированные программы
- •4.1.Блок-схемы и управляющие структуры
- •4.2.Теорема о структурировании
- •4.3.Рекурсивные структурированные программы
- •Тема 5.Методы Доказательства правильности программ
- •5.1.Математический аппарат доказательства Принцип простой индукции
- •Принцип модифицированной простой индукции
- •Принцип обобщенной индукции
- •5.2.Методы доказательства правильности программ Метод индуктивных утверждений
- •Пример доказательства правильности программы методом индуктивных утверждений
- •Тема 6.Рекурсивные программы. Методы доказательства их правильности
- •6.1.Понятие рекурсивных программ. Способы их описания Язык описания рекурсивных программ
- •Примеры рекурсивных программ
- •6.2.Рекурсивные программы работы со списками Списки и операции над ними
- •Примеры программ работы со списками
- •6.3.Примеры доказательства правильности рекурсивных программ
- •Тема 7.Отладка программ
- •7.1.Типичные ошибки в программных комплексах
- •7.2.Задачи отладки программ
- •7.3.Методы разработки тестов Метод эквивалентных разбиений
- •Методы тестирования программ путем покрытия логики
- •Метод функциональных диаграмм
- •Предположения об ошибках
- •7.4.Задачи комплексной отладки программ
- •Библиографический список
4.2.Теорема о структурировании
Теорема. Любая простая программа функционально эквивалентна программе, составленной из элементов базисного множества: последовательность, if then else, whilе do с использованием функций и предикатов исходной программы, а также присваиваний и тестов над дополнительным счетчиком.
Доказательство (конструктивное). Рассмотрим произвольную простую программу с произвольным числом функциональных предикатных узлов, пронумерованных от 1 до n. Номер 1 соответствует входной линии программы. Выходной линии программы присвоим номер 0. Дадим выходным линиям каждого функционального и предикатного узла номер следующего функционального или предикатного узла. Если выходная линия соответствует выходной линии программы, то ей присвоим номер 0.
Д алее для каждого функционального узла h, имеющего номер i и выходную линию j, составим в соответствие новую элементарную программу (последовательность) gi с номером входной линии i.
З десь в новом функциональном узле производится присваивание номера выходной линии переменной L, называемой программным счетчиком. Далее для каждого предикатного узла с номером i и выходными линиями j и k поставим в соответствие элементарную программу gi вида:
Т еперь построим программу типа «whilе do» следующего вида:
Т аким образом, какой бы ни была исходная простая программа, мы можем получить функционально эквивалентную ей структурированную программу. Такая программа называется помеченной структурированной программой.
П ример. Пусть требуется построить помеченную структурированную программу для следующей программы.
Элементарные программы gi для нее будут иметь вид:
П одставив g1 – g4 в схему, сконструированную в доказательстве теоремы, получим блок-схему структурированной программы.
4.3.Рекурсивные структурированные программы
Предыдущие способы получения структурированных программ могут быть недостаточно понятными и эффективными. Для их усовершенствования вводится другой способ, исключающий излишние установки и проверки счетчика L. Идея заключается в том, чтобы для каждого j>0 заменить все присваивания вида L:= j соответствующей программой gj.
Поскольку значение j тем самым никогда не будет присвоено счетчику L, проверка L=j может быть вынесена за пределы последовательности структур if then else. Допустим, имелась последовательность программ g1; g2;… gn. Один шаг, описанной выше замены, приводит к новой последовательности программ . Здесь при необходимости могут быть перенумерованы. Единственным препятствием продолжению этого процесса может быть рекурсивное обращение, когда некоторые будут содержать присваивание L=i.
Таким образом, процесс замещения можно продолжать до тех пор, пока:
1) все присваивания счетчику L, кроме L:=0, не будут замещены;
2) каждая оставшаяся программа будет содержать лишь присваивания L= i.
Если программа ациклическая, то на каждом пути появится присваивание L:=0. Следовательно, в этом случае счетчик L и цикл whilе L>0 do могут быть исключены.
Рассмотрим в качестве примера следующую структурированную программу с программным счетчиком:
На первом шаге присваивание L:=4 заменим программой, стоящей на пути L:=4 (последовательность h, L:=1). Поскольку после этого присваивание L:=4 нигде не будет встречаться, проверку L=4 можно будет исключить. В результате получим следующую программу:
Д алее производим замену узла L:=2 на последовательность е, L:=0, а узел L:=3 заменяем на программу, стоящую на пути L=3. В результате будем иметь:
Здесь можно заметить, что присваивание L:=1 и проверку L=1 можно также исключить, так как L становится равным 1 только на выходе из цикла. Поэтому программа будет выглядеть следующим образом: