- •Введение Цели и задачи курса «Технология программирования»
- •Классификация программного обеспечения
- •Тема 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 только на выходе из цикла. Поэтому программа будет выглядеть следующим образом:
