Name already in use
A tag already exists with the provided branch name. Many Git commands accept both tag and branch names, so creating this branch may cause unexpected behavior. Are you sure you want to create this branch?
Cancel Create
mipt_oop / week_1 / structured_programming.md
- Go to file T
- Go to line L
- Copy path
- Copy permalink
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
Latest commit ad3b261 May 20, 2019
1 contributor
Users who have contributed to this file
170 lines (118 sloc) 9.42 KB
- Open with Desktop
- View raw
- Copy raw contents Copy raw contents Copy raw contents
Copy raw contents
Понятие о структурном программировании
Структурное программирование — парадигма разработки программ с помощью представления их в виде иерархической структуры блоков. Сюда входит три пункта:
Структурированные продукты
- Любая программа состоит из трех типов конструкций: последовательное исполнение, ветвление, цикл.
- Логически целостные фрагменты программы оформляются в виде подпрограмм. В тексте основной программы вставляется инструкция вызова подпрограммы. После окончания подпрограммы исполнение продолжается с инструкции, следующей за командой вызова подпрограммы.
- Разработка программы ведется поэтапно методом «сверху вниз».
Первый пункт скорее важен не тем, что в нем есть, а тем, чего в нем нет: в нем нет оператора безусловного перехода goto. Именно это отличает структурное программирование от процедурного. Благодаря пункту два в языках высокого уровня появились новые синтаксические конструкции: функции и процедуры.
Пункт три самый важный и является сутью парадигмы структурного программирования.
Проектирование «сверху вниз»
Как было сказано выше, сама суть структурного программирования лежит в подходе к проектированию программы. Для понимания этого приведем процесс решения конкретной задачи во времени.
Условие. Пусть в некоторой стране зарплата сотрудника дорожной патрульной службы состоит из штрафов, накладываемых на водителей за превышение скорости в 60 км/ч, штраф напрямую зависит от номера автомобиля, а рабочий день заканчивается с приездом начальника, при этом начальника штрафовать нельзя. Требуется посчитать зарплату сотрудника за день.
Входные данные подаются построчно, в каждой строке — скорость (целое число) и номер автомобиля (6 символов — 1 буква, 3 цифры и еще 2 буквы).
Штраф для автомобильных номеров зависит от количества совпадающих цифр: три совпадают — 1000 у.е., две любые цифры совпадают — 500 у.е., все цифры разные — 100 у.е.
Примечание: все комментарии в примерах будут на русском языке, что нарушает PEP 8. Это сделано для простоты восприятия примера.
Шаг №1. Предположим, что все уже написано для нас:
def main(): salary = calculate_salary() print(salary) if __name__ == «__main__»: main()
Шаг №2. Но это не будет работать, так как функция calculate_salary отсутствует. Исправим это:
Что такое структурированные данные? | Структурированные данные для начинающих
def main(): salary = calculate_salary() print(salary) def calculate_salary(): «»» Функция считает зарплату сотрудника ДПС, считывая исходные данные с клавиатуры. :returns: Зарплата сотрудника .. todo:: Реализовать функцию «»» pass if __name__ == «__main__»: main()
Теперь код будет успешно выполняться, но сейчас функция ничего не делает. В документации к функции явно указано, что ее надо реализовать. Такая функция называется заглушкой и широко используется в практике программирования.
Шаг №3. Займемся реализацией функции. Предположим, что у нас написаны все необходимые функции, и напишем calculate_salary так:
def calculate_salary(): «»» Функция считает зарплату сотрудника ДПС, считывая исходные данные с клавиатуры. :returns: Зарплата сотрудника «»» sum_of_fines = 0 speed_of_car, number_of_car = read_data() while not detect_chief(number_of_car): if speed_of_car > 60: sum_of_fines += calculate_fine(number_of_car) speed_of_car, number_of_car = read_data() return sum_of_fines
Заметим, что в этом решении делегировано в отдельные функции всё, что только можно было делегировать. Разве что проверка превышения скорости осталась без собственной функции, но она уж и так слишком тривиальна.
Заметим, что в групповой разработке ПО старший программист на этом завершил бы свою работу. Ему осталось только сформулировать для каждой из функций её заглушку и документирующий комментарий, раздать работу по написанию мелких функций младшим программистам и идти пить чай.
Шаг №4. На данном этапе пропустим написание функций-заглушек и сразу приведём окончательное решение.
def main(): salary = calculate_salary() print(salary) def calculate_salary(): «»» Считает зарплату сотрудника ДПС, считывая исходные данные с клавиатуры. :returns: зарплата сотрудника «»» sum_of_fines = 0 speed_of_car, number_of_car = read_data() while not detect_chief(number_of_car): if speed_of_car > 60: sum_of_fines += calculate_fine(number_of_car) speed_of_car, number_of_car = read_data() return sum_of_fines def read_data(): «»» Считывает следущую строку данных.
:returns: tuple(int, str) — скорость, номер машины «»» data = input().split() return int(data[0]), data[1] def detect_chief(number_of_car): «»» Проверяет, принадлежит ли данный номер начальнику.
:param number_of_car: номер автомобиля :returns: True, если номер принадлежит начальнику, иначе False «»» return number_of_car == «A999AA» def calculate_fine(number_of_car): «»» Считает штраф для автомобиля с конкретным номером. :param number_of_car: номер автомобиля :returns: Целое число, размер штрафа «»» if is_super_number(number_of_car): return 1000 elif is_good_number(number_of_car): return 500 else: return 100 def is_super_number(number_of_car): «»» Проверяет, является ли номер «крутым» (совпадение трёх цифр) :param number_of_car: номер автомобиля :returns: True, если номер «крутой», иначе False «»» return number_of_car[1] == number_of_car[2] == number_of_car[3] def is_good_number(number_of_car): «»» Проверяет, является ли номер «хорошим» (совпадение двух цифр) :param number_of_car: номер автомобиля :returns: True, если номер «хороший», иначе False «»» return number_of_car[1] == number_of_car[2] or number_of_car[1] == number_of_car[3] or number_of_car[2] == number_of_car[3] if __name__ == «__main__»: main()
Обычно перед использованием функции сначала реализуют ее. Мы же сейчас делали все наоборот. Сначала использовали функцию, потом писали для нее заглушку и только вконце дописывали реализацию. В этом и заключается процесс проектирования «сверху вниз».
Источник: github.com
Тема 2.4.-2.5. Структурное программирование. Структурирование. Методы структурирования программ.
Один из методов улучшения программы является структурное программирование (СП). Оно предназначено для организации проектирования программ и процесса кодирования. Таким образом, чтобы предотвратить большинство логических ошибок и обнаружить те которые допущены.
Перечислим некоторые достоинства структурного программирования:
- Структурное программирование позволяет значительно сократить число вариантов построения программы по одной и той же спецификации, что приводит к значительно снижает сложность программы.
- В структурированных программах логически связанные операторы находятся визуально ближе, а слабо связанные дальше, что позволяет обходится без блок схем и других графических форм изображения алгоритмов.
- Сильно упрощается процесс тестирования и отладки структурированных программ.
- более высокую производительность работы за счет того, что действие каждой управляющей структуры хорошо известно и нет необходимости его обдумывать;
- ясность и читаемость программ;
- более высокую эффективность за счет глобальной оптимизации программы.
СП сосредотачивается на одном из наиболее подверженных ошибками факторов программирования – логики программы и включает три главные составляющие:
- проектирование сверху – вниз (нисходящее проектирование) – подобно написанию статьи сверху — вниз. Процесс написания статьи имеет иерархическую структуру и начинается с вершины иерархии, т.е. с краткого обзора. Разработку проекта обычно начинают с исследования целей и определения основных задач, ведущих к достижению этих целей. Если проект очень большой, то необходимо провести его разбиение. Вначале необходимо написать то, что вы хотите сделать на естественном языке. Этот шаг часто многое раскрывает. Нередко вы обнаружите, что не в состоянии записать задачу на естественном языке. В таком случае не надейтесь, что вам удастся составить программу. Следовательно важно формулировать задачу правильно на стадиях проектирования, чтобы не исправлять ее позднее на стадиях программирования и отладки. Метод проектирования сверху — вниз предусматривает вначале определения задачи, а затем постепенное уточнение структуры путем внесения более мелких деталей. Проектирование представляет собой последовательность шагов такого уточнения. На каждом шаге необходимо выявить функции, которые нужно воплотить, т.е. данная задача разбивается на ряд, каждому из них будет соответствовать один модуль. Именно такой традиционный и по существу иерархический подход применяется при создании сложных структур в других областях (в технике, в серийном производстве). Далее следует описать данные указывая их структуру и основные процессы обработки. Это описание должно включать тщательно отработанные примеры, убедительно демонстрирующие функции системы и их наиболее существенные варианты – такие примеры будут полезны позже на стадии тестирования. При описании модуля должны быть описаны его тестовые данные. Тестирование программы неизбежно, поэтому выявление требований к тестированию, заранее на стадиях проектирования, являются хорошей практикой. Логическая проверка фрагментов программы должна уменьшить необходимость тестирования конечной программы. Основное преимущество такого метода работы то, что он обеспечивает создание документации.
- модульное программирование. Чтобы преуспеть в структурном программировании программу следует представить в виде модулей. Модульное программирование – это процесс разделения программы на логические части, называемые модулями, и последовательное программирование каждой части. Когда большая единая задача делиться на подзадачи, то значительно проще прочесть и понять программу. Если проведено программирование всей задачи сверху – вниз, то она естественно разбивается на подзадачи для возможных модулей. При этом преследуется две цели:
- необходимость добиться того, чтобы программный модуль был правильным и не зависел от контекста в котором он будет использоваться
- следует стремиться к тому, чтобы из модулей можно было формировать большие программы без каких-либо предварительных значений о внутренней работе модуля.
Оптимальный размер модуля 60 строк. Независимость. Следует стремиться к независимости между модулями или программами. Для достижения этого требуется, чтобы модуль не зависел от: 1) источника входных данных; 2) местоназначения выходных данных; 3) от пред — истории. При разбиении программы на функциональные блоки, независимые модули можно обеспечивать некоторую самостоятельность последних. Хотя определенная зависимость все таки существует. Каждый модуль должен иметь свое назначение, отличающееся от назначения других модулей. Это должен быть замкнутый блок, вход и выход которого четко определены. Стремление к независимости хорошо тем, что менее вероятно, что изменения в одной подпрограмме влияет на оставшуюся часть программы. Воздействие изменения в одном модуле на другую часть программы называется волновым эффектом. Этот эффект можно уменьшить сведя к минимуму связь между модулями, т.е. сократить количество путей вдоль которых изменения или ошибки могут проникнуть в другие части. Постой путь уменьшения волнового эффекта – избегать использование глобальных перемен и делать модуль небольшим. Минимизация взаимосвязи между модулями – это модульное сцепление, которое происходит за счет усиления связей между элементами одного модуля (модульная прочность). Таким образом тесно связанные элементы надо стремиться поместить в один модуль. Использование модулей приводит к уменьшению сложностей, факторы сложности при этом включают три составляющие: 1) функциональная сложность – обусловлено тем, что один модуль выполняет слишком много функций; 2) распределенная сложность – это сложность идентификации общей функции распределенной между несколькими модулями за счет чего утрачивается возможность уменьшения сложности всей программы при модульном программировании; 3) сложность связи – определяется сложностью взаимодействия модулей, при использовании общих данных.
- структурное кодирование – это метод написания хорошо структурированных программ, который позволяет получать программы более удобные для тестирования, модификации и использования. Программы произвольных размеров и сложности могут быть написаны на основе ограниченного множества базисных структур. Этот принцип положен в основу проектирования схем, где любая логическая структура может быть создана из элементарных структур:
- структура последовательности – это формализация того, что операторы программы выполняются в порядке их появления в программе, пока что-то не изменит их последовательность.
- структура выбора – это выбор одного из двух действий исходя из выполненного некоторого условия.
- структура повторения – используется для повторного выполнения группы команд до тех пор, пока не выполниться некоторое условие. Получение правильной программы путем замены операторов программы на управляющие логические структуры называется вложением структур.
Структурирование. В основу структурирования положены следующие простые правила:
- программа должна составляться мелкими шагами, размер шага определяется количеством решений, применяемых программистом на этом шаге.
- сложная задача разбивается на простые легко воспринимаемые части, каждая из которых имеет только один вход и один выход.
- логика программы должна опираться на минимальное число простых базовых управляющих структур.
Фундаментом структурного программирования является теорема о структуризации. Эта теорема устанавливает, что как бы не была сложна задача, блок-схема программы может быть представлена с использованием весьма ограниченного числа элементарных управляющих структур. Эти элементарные структуры могут соединяться между собой, образуя более сложные структуры, при этом они могут представлять собой довольно сложные блок-схемы с одним входом и с одним выходом. Чтобы обойтись без произвольных передач управления в программе, там где это возможно, лучше не использовать операторы GOTO, RETURN. Характерной особенностью структурированной программы является не столько отсутствие этих операторов, а сколько наличие жесткой структуры ее организации. Если текст программы будет занимать несколько десятков страниц, то восприятие такой программы будет затрудненно, поэтому рекомендуется вести структурирование текста программы (например, программа состоит из 80 страниц исходного текста, необходимо этот исходный текст заменить на текст в котором отражаются наиболее важные, в функциональном смысле, фразы в виде сегментов). Если расписать весь программный комплекс крупными сегментами, то описание всего комплекса может занять всего одну страницу, а это наглядно и удобно. Графическое представление программных алгоритмов имеет широкое распространение благодаря наглядности. Граф-схема представляет собой граф, состоящий из вершин, соединенных направленными стрелками-дугами.
- в
ершина –
- функциональный оператор –
- у
словный или объединяющий операторы –
- останов – конечный оператор
- дуги, определяющие последовательность выполнения действий
Программа называется простой, если ее граф-схема удовлетворяет следующим условиям: 1) один вход и один выход, 2) через каждую ее вершину проходит хотя бы один путь от входа к выходу. Сложная программа обычно имеет больше, чем один вход или выход. Если комплекс программ большой и блок-схема программы большая необходимо выделить в ней подграфы, достаточно простые и понятные по структуре. Структурирование программных компонент. При иерархическом построении комплекса программ важное значение имеют объем, сложность компонент для каждого уровня иерархии. По принципам построения, языку описания, объему и другим характеристикам в структуре комплекса программ можно выделить следующие иерархические уровни:
- операторов и операндов программ, соответствующих компонентам текста программ на языке программирования;
- программных модулей, оформляемых, как законченные компоненты текста программ;
- функциональных групп программ или пакета ПП;
- комплекса программ, оформляемого как завершенное ПС определенного целевого назначения.
Восходящее и нисходящее проектирование. Многоуровневый иерархический подход позволяет проектировать сложные комплексы программ по принципу сверху – вниз с позиции назначения и наилучшего решения основной цели, задачи всей системы. Иногда основному проектированию сверху – вниз сопутствует разработка компонент снизу – вверх. Разработка начинается с модулей нижнего уровня, далее переходят к разработке модулей следующего уровня и т.д. Достоинством этого принципа является то, что при переходе к разработке модулей более высокого уровня иерархии, модули нижних уровней можно считать готовыми и подключать их к модулям верхнего уровня на стадии отладки. Общие правила структурного построения ПС. Если комплекс программ строится на основе модульно иерархической структуры, состоящей из программных и информационных модулей, то на начальных этапах разработки комплекса программ формируется его структура и общие правила взаимодействия компонент. Эти правила состоят в следующем:
- правило связи программных модулей по управлению. Передача управления вызываемому модулю всегда осуществляется через первый оператор или команду, а выход из вызываемому модуля всегда происходит через его естественное окончание, т.е. через последний оператор или команду. По окончании испытания вызываемого модуля управление передается в вызывающий модуль на оператор, следующий непосредственно за оператором вызова. Модули нижних уровней или одного уровня иерархии могут вызываться для исполнения только модулями высших уровней, т.е. модули нижних уровней не могут вызывать модули высших уровней, а модули одного уровня – вызывать друг друга.
- правило связи программных модулей по информации. Инф-ция зон глобальных переменных доступна для использования любыми модулями, входящих в комплекс программ или группу программ, в соответствии с областью действия зоны глобальных переменных , т.е. глобальные переменные могут быть доступны не для всего комплекса программ, а лишь для указанной в описании группы модулей. Локальные переменные доступны лишь в пределах того модуля, в котором они определены. Для взаимодействия вызываемых и вызывающих модулей создаются зоны обменных переменных, инф-ция из которых доступна лишь модулям непосредственно связанных по управлению. Запрещается использование для обмена информацией между модулями регистры и ячейки памяти, используемые как регистры, т.е. после окончания работы вызываемого модуля считается, что регистры не содержат инф-ции. Инф-ция находящаяся в регистрах вызывающего модуля при вызове должна быть сохранена на период выполнения вызываемого модуля и восстановлена при возврате в вызывающий модуль.
- типовая структура программного модуля. Под структурой программного модуля понимается совокупность смысловых частей, образующих модуль и используемых для различных целей при его разработке и использовании. Типовая структура модуля в общем случае включает: 1) заголовок; 2) описание переменных; 3) тело модуля; 4) точки входа и выхода.
Элементарные базовые структуры. Любую программу можно синтезировать на основе элементарных базовых конструкций трех типов:
- простая вычислительная последовательность, заключается в преобразовании или перемещении совокупности исходных переменных. Элементарные конструкции следуют друг за другом, причем конец предыдущего оператора замыкается на начало последующего.
- альтернатива состоит в проверке некоторого условия.
- итерация представляет собой структуру, в которой при каждом обращении один из нескольких операторов повторяется более одного раза. Для структурирования программ число итераций должно быть задано до входа в цикл, а не определяться вычислениями внутри цикла. В результате чего исключается возможная неопределенность функционирования программы.
Простота исходных конструкций структурного программирования предотвращает появление сложных информационных связей и запутанных передач управления. Структурированными считаются программы, которые не имеют циклов с несколькими выходами, не имеют переходов внутрь циклов или условных операторов и не имеют выходов из внутренней части циклов или условных операторов.
Источник: studfile.net
Структурированное программирование
В начале 80-х годов XX века, в недрах проблемной лаборатории электронных вычислительных машин Московского государственного университета им. М.В.Ломоносова началась работа над необычным, по нынешним меркам, языком, а вернее системы, или даже сказать идеологии программирования.
ДССП
Результатом стала ДССП — диалоговая система структурированного программирования.
ДССП была призвана уменьшить трудоемкость, повысить надежность и обеспечить широкую доступность программирования путем систематического внедрения дисциплины структурированного программирования в сочетании с диалоговым режимом и нетрадиционной архитектурой системы, базирующейся на стеках, словаре и процедурном коде.
Основу ДССП составляет эмулируемый на компьютерах стековый процессор с тщательно разработанными средствами конструирования структурированных программ (ДССП-процессор).
Прототипом этого процессора послужила созданная в ПНИЛ ЭВМ МГУ в конце 60-х годов экспериментальная троичная цифровая машина «Сетунь 70».
Диалоговое управление ДССП-процессором осуществлено на внешнем (символьном) языке при помощи словаря и компилятора по образцу системы FORTH, но с возможностью компиляции процедур в нисходящей последовательности и удаления излишних словарных входов.
РАЯ
- легкость освоения,
- значительное повышение производительности труда программиста и качества создаваемых программ, развиваемость,
- адаптивность,
- мобильность.
Примеры
F1 — вычисляет 3*X*X-4*X+2
: F1 [X] C [X,X] 3 * [X,3*X] 4 — [X,3*X-4] * [3*X*X-4*X] 2 + [3*X*X-4*X+2] ;
использование F1
* 25 F1 . D вк 1777
* -9 F1 . D вк 281
F2 — вычисляет A2*X*X-A1*X+A0
: F2 [A0,A1,A2,X] C E4 E3 [A0,X,A1,X,A2] * + [A0,X,A2*X+A1] * + [A2*X*X-A1*X+A0] ;
использование F2
* 1 2 3 4 F2 . D вк 57
* 1 2 -3 4 F2 . D вк -39
FG — факториал N, если N>0, иначе 0
: FG [N] C BR+ FCT T0 [N! или 0] ;
[FCT — факториал N]
: FCT [N] C 1- C DO P D [N!] ;
: P [F,K] E2 C2 [K,F,K] * E2 1- [F*K,K-1] ;
использование FG
* -5 FG . D вк 0
* 5 FG . D вк 120
НОД — наибольший общий делитель натуральных чисел M,N
: НОД [N,M] RP ЦД D [НОД] ;
[ЦД — от делимого и делителя к делителю и остатку]
: ЦД [делимое,делитель] E2 C2 / [делитель,частное,остаток] E2 D [делитель,остаток] C EX0 ;
использование НОД
* 48 72 НОД . D вк 24
* 225 650 НОД . D вк 25
ДИАЛОГ: вопрос — ответы — резюме
B8
: ДИАЛОГ [] ВОПРОС ОТВЕТЫ-РЕЗЮМЕ [] ;
: ВОПРОС [] CR .»Как Вы предполагаете использовать ДССП?
1. Для вычислений
2. Для управления
3. Для обработки текстов» [] ;
: ОТВЕТЫ-РЕЗЮМЕ [] RP AR [] ;
[AR — получение ответа и выдача резюме]
: AR [] CR .» Дайте номер ответа — » TIB BR #1 R1 #2 R2 #3 R3 ELSE R4 [] ;
: R1 [] CR .»ДССП не ориентирована на вычисления» EX [] ;
: R2 [] CR .»Вы на верном пути» EX [] ;
: R3 [] CR .»ДССП поможет Вам!» EX [] ;
: R4 [] CR .»Такой ответ не предусмотрен» [] ;
B10
использование ДИАЛОГ
* ДИАЛОГ
Как Вы предполагаете использовать ДССП?
1. Для вычислений
2. Для управления
3. Для обработки текстов
Дайте номер ответа — 7
Такой ответ не предусмотрен
Дайте номер ответа — 3
ДССП поможет Вам!
Реализации
- Компьютеры и платформы: Intel 80×86, MC68020, R3000, VAX, PDP-11, INTEL 8080, SparcSUN.
- Операционные системы: MSDOS, MSDOS-extenders, UNIX, RT-11, RSX, OS9, CPM
Вместо заключения
К сожалению, на данный момент разработка языка официально прекратилась, последние новости датируются 2002 годом.
- git clone git://github.com/ingeniarius/DSSP-32.git
- следуем инструкциям из INSTALL
Дополнительные материалы по ДССП
- http://trinary.ru/materials
- http://www.forth.org.ru/~dssp/
Источник: habr.com
Большая Энциклопедия Нефти и Газа
Структурированные программы следует писать таким образом, чтобы они легко читались и были понятны. На первый взгляд может показаться, что структурированную программу написать не намного труднее, чем неструктурированную. [2]
Структурированная программа сама по себе не является гарантией того, что разработка будет выполнена успешно. Структурное программирование только предоставляет возможность для успешного проектирования программ. В хорошем проекте заложено решение задачи, не более сложное, чем сама задача, которую следует решить.
Составление проекта базируется на нахождении достаточно простых решений, а отнюдь не на примитивном мышлении. Обычно хорош последний вариант разработки, но никак не первый. Известным примером чрезмерного усложнения задачи является попытка описать Солнечную систему как систему, вращающуюся вокруг Земли. Две тысячи лет человечество безуспешно пыталось решить эту неверно поставленную задачу, пока не догадалось поместить Солнце в центр системы. [3]
Структурированные программы , полученные в прочтете доказательства теоремы о структурировании, могут быть недостаточно гюнятиымч и эффективными. [4]
Алгебра структурированных программ является мощным средством для чтения, написания и доказательства правильности структурированных программ. Она позволяет программисту путем логического преобразования справляться со сложной логикой обработки данных. Точно так же школьник методически выполняет преобразование сложных для него арифметических выражений. Алгебра дает возможность программисту представить функционирование программы в целом, а не только ход ее выполнения для конкретных данных. [5]
Разработка структурированных программ представляет собой творческий созидательный процесс, для овладения которым необходимо наличие определенных знаний и практического опыта. [6]
В структурированной программе , состоящей из некоторого числа подпрограмм, должным образом скоординированных между собой для решения поставленной задачи, на различных эгапах исполнения приходится принимать решения о том, куда следует передать управление. Единственная информация, на основе которой могут быть приняты подобные решения — это содержимое регистров, ячеек памяти и состояние условных признаков. [7]
Критическое чтение структурированной программы с целью проверки ее правильности и возможности упрощения позволяет судить о качестве ее разработки. На начальной стадии разработки структурированной программы сущность последней может быть выражена посредством мысленного анализа либо интуитивно без облечения в структурированную форму. [8]
Преобразуйте результирующую структурированную программу путем расширения новых функциональных узлов. [9]
Язык текстового описания структурированной программы ( ТОСП) предназначен для исчерпывающего описания проекта программного модуля и служит единственным документом как для составления текста программы, так и в качестве отчетного материала по этапу проектирования. [10]
Таким образом, алгебра структурированных программ позволяет рассматривать структурированную программу любой сложности как составное программное выражение над меньшими структурированными программами, а любое сложное программное выражение — как одно выражение, если это, конечно, удобно. [11]
Любая простая программа функционально эквивалентна структурированной программе , составленной из элементов базисного множества последовательность, ifthenelse, whiledo с использованием функций и предикатов исходной программы, а также присваиваний и тестов над дополнительным счетчиком. [12]
Теорема правильности показывает, что все структурированные программы , выраженные через элементарные, содержащие не более одного предиката, могут быть верифицированы ( за исключением вопроса окончания программ) посредством применения методов рассуждения, требуемых для программ типа последовательность и ifthen-else. Проблемы доказательства правильности могут оказаться слишком трудоемкими, но теоретически они разрешимы. [13]
Поскольку нашей главной целью является разработка структурированных программ , возникает вопрос: какая стратегия мышления способствует вырабатыванию решений в структурированном виде. [14]
На рис. 4.18 показаны правила построения правильно структурированных программ . Правила подразумевают, что символ прямоугольника может означать в блок-схеме любое действие, включая операции ввода / вывода. [15]
Источник: www.ngpedia.ru