Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Курс лекций.docx
Скачиваний:
1
Добавлен:
01.07.2025
Размер:
425.44 Кб
Скачать
  1. Лекция 14. Методы структурного программирования. Методы доказательства и отладки программ. Вопросы:

  1. Методы структурного программирования.

  2. Пошаговая детализация и понятие о псевдокоде.

  3. Пример пошагового составления программы.

  4. Методы доказательства свойств программ.

    1. Методы структурного программирования

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

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

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

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

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

« снизу вверх »: сначала составляются вспомогательные алгоритмы, затем основной:

« сверху вниз»: сначала строится основной алгоритм, затем вспомогательные алгоритмы;

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

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

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

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

Достаточно сложный алгоритм другим способом построить просто невозможно.

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

14.2. Пошаговая детализация и понятие о псевдокоде.

Структурное программирование дает рекомендации о том, каким должен быть текст модуля. Возникает вопрос, как должен действовать программист, чтобы построить такой текст. Иногда программирование модуля начинают с построения его блок-схемы, описывающей в общих чертах логику его работы. Однако современная технология программирования не рекомендует этого делать. Хотя блок-схемы позволяют весьма наглядно представить логику работы модуля, при их кодировании на языке программирования возникает весьма специфический источник ошибок: отображение существенно двумерных структур, какими являются блок-схемы, на линейный текст, представляющий модуль, содержит опасность искажения логики работы модуля, тем более, что психологически довольно трудно сохранить высокий уровень внимания при повторном ее рассмотрении. Исключением может быть случай, когда для построения блок-схем используется графический редактор и они формализованы настолько, что по ним автоматически генерируется текст на языке программирования (как например, это может делаться в Р-технологии).

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

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

Пошаговая детализация связана с использованием частично формализованного языка для представления указанных описаний, который получил название псевдокода [8.5, 8.8]. Этот язык позволяет использовать все конструкции структурного программирования, которые оформляются формализовано, вместе с неформальными фрагментами на естественном языке для представления обобщенных операторов и условий. В качестве обобщенных операторов и условий могут задаваться и соответствующие фрагменты на базовом языке программирования.

Головным описанием на псевдокоде можно считать внешнее оформление модуля на базовом языке программирования, которое должно содержать:

начало модуля на базовом языке, т.е. первое предложение или заголовок (спецификацию) этого модуля;

раздел (совокупность) описаний на базовом языке, причем вместо описаний процедур и функций - только их внешнее оформление;

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

последнее предложение (конец) модуля на базовом языке.

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

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

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

Следование:

обобщенный оператор

обобщенный оператор

Разветвление:

ЕСЛИ условие ТО

обобщенный_оператор

ИНАЧЕ

обобщенный_оператор

ВСЕ ЕСЛИ

Повторение:

ПОКА условие

ДЕЛАТЬ

обобщенный_оператор

ВСЕ ПОКА

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

Выход из повторения (цикла):

ВЫЙТИ

Выход из процедуры (функции):

ВЕРНУТЬСЯ

Переход на обработку исключительной ситуации:

ВОЗБУДИТЬ имя_исключения

Рис. 14.2. Частные случаи оператора перехода в качестве обобщенного оператора.

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

ИСКЛЮЧЕНИЕ имя_исключения

обобщенный_оператор

ВСЕ ИСКЛЮЧЕНИЕ

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

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