Лекция 11. Структурное программирование. Нисходящее проектирование (часть2) (1152913)
Текст из файла
1Воробьева И.А. «Информатика. Язык Питон»Концепция структурного программирования. Нисходящий способпроектированияПринципы структурного подхода, критика «безусловных переходов».Нисходящий способ проектирования алгоритмов. Примеры. Методыструктурирования алгоритмов: объединение условий, дублирование кодов,метод Булевой переменной. Композиция методов при структурировании.Вспомогательные алгоритмы: общего типа и функции.7.
СТРУКТУРНОЕ ПРОГРАММИРОВАНИЕ И НИСХОДЯЩЕЕПРОЕКТИРОВАНИЕ7.4. Методы структурирования алгоритмовВ прошлой лекции мы определили цели и возможностиструктурного подхода в проектировании решений задач – созданиечитабельного, легко модифицируемого, доступного в сопровождении иудобного для тестирования алгоритма (следовательно, ипрограммного кода).Не всегда приходится иметь дело соструктурированными алгоритмами и программами по ряду причин: если мы столкнулись с алгоритмом (программой), написанным ещедо внедрения технологии структурного подхода или, например, написанным в другой парадигме программирования; если программа написана в хаотичной манере спагетти-кода, еефункционал не устарел и требует дальнейшее сопровождение смодификацией отдельных ее частей; иногда, первоначальный алгоритм для решения задачи мы самистроим эвристическим1 путем, в результате получая реализующийрешение, но не структурированный алгоритм.1Эристический алгоритм (эвристика) — алгоритм решения задачи, включающий практический метод, не являющийся гарантированно точным или оптимальным, но достаточный для решения поставленной задачи.2Воробьева И.А.
«Информатика. Язык Питон»Для исправления подобных ситуаций существуют специальные методы структурирования, которые мы и рассмотрим ниже.Явным образом увидеть нарушение правил структурного подходаможно в блок-схемах. Действительно, давайте посмотрим, к чему приводит основополагающий принцип:Использование базовых алгоритмических структур: следование,развилка, цикл → неиспользование операторов безусловногоперехода2.На языке блок-схем это будет означать, что всякая управляющаяструктура (ветвление, цикл) будет иметь только один вход и один выход, притом, что сами структуры могут располагаться либо в последовательном расположении, либо быть вложенными друг в друга.
Так какэтот базовый принцип должен соблюдаться на любом уровне вложенности алгоритма, включая «нулевой», то и правило «один вход – один выход3» нарушено нигде не будет.Следовательно, если мы видим два выхода из управляющей структуры цикл или ветвление, это явный признак неструктурированного алгоритма: в программном коде такую конструкцию, в рамках существующих управляющих синтаксических конструкций, можно будет реализовать только при помощи операторов безусловного перехода, что, как мыпомним, именно по этой причине, мягко говоря, и не приветствуется.2В прошлой лекции обсуждали, почему иногда мы пишем преимущественное использование базовых структур:операторы безусловных переходов (явных и неявных) в современной технологии программирования иногда допускаются.3Конструкции «ветвление», как полное, так и неполное тоже имеют один вход и один выход.3Воробьева И.А.
«Информатика. Язык Питон»Метод объединения условийрис 7.4. а)рис 7. 4. б)Структурирование здесь нарушено из-за Решениепроблемы очевидно:двух выходов из цикла: либо при объединение обоих условий в однунарушении условия У1, либо при проверку, что и программный коднарушении условия У2.сделает заведомо понятней:Пример ниже иллюстрирует, почемуиспользованиедажеразрешенныхоператоров break и continue не while u1 and u2:вызывает одобрения – это явноprint('Действие «Д»')неструктурированная логика:u1=False # обеспечим выход по u1while u1:u2=False # или по u2if u2:print('Это действие тоже выполнится')print('Действие «Д»')u1=False # обеспечим выход по u1else:break # обеспечим выход по u2print('Это действие никогда не выполнится')рис 7.4. в)рис 7.4.
г)4Воробьева И.А. «Информатика. Язык Питон»Если выход надо обеспечить при while u1 and not u2:нарушении условия У1 и выполненииprint('Действие «Д»')условия У2, все решается также простоu1=False # обеспечим выход по u1(см. рис. 7.4.г).u2=True # или по u2print('Это действие тоже выполнится')Метод дублирования кодов (пример)Для понимания этого метода проще всего рассмотреть решениепростой задачи: присвоить переменной максимальное из трех заданных чисел , или .рис 7.5. а)Полученная блок-схема задачу решает, но не структурирована, так как удвух управляющих структур if получился единый выход. В языке Python,в котором нет goto, а операторы break и continue применимы только вциклах, мы попросту не сможем такую блок-схему реализовать, пустьдаже и дурным способом.Здесь удобно просто продублировать код.5Воробьева И.А.
«Информатика. Язык Питон»рис 7.5. б)if A > B:if A > С:S=AСокращенный вариант, допустимый вPython. Здесь нет противоречий, просто«структура 0» в примере кода – этосинтаксическая конструкция с тремя, ане двумя ветвлениями и однимвыходом, как и положено.else:S = C # управляющая структура 1else:if B > С:S=Belse:S = C # управляющая структура2if A > B:if A > С:S=Aelse:S = C # управляющая структура 1elif B > С:S=Belse:S = C # управляющая структура 06Воробьева И.А. «Информатика.
Язык Питон»Метод дублирования кодов (в общем виде)Для выделения логики в изложении метода в общей форме, мы«упаковали» целые фрагменты алгоритма в прямоугольные блоки на рисунке ниже. При этом блок не означает подзадачу (тогда должен был быбыть изображен только один выход), а именно просто фрагмент алгоритма.
То, что на выходе блока мы видим два выхода, означает проверку какого-то условия в конце фрагмента алгоритма.Для такого алгоритма очень сложно составить все необходимые тесты.Структурировать его можно продублировав те блоки, где возникаетнарушение структурности: в блоках 5, 7 и 8. Почему, объяснено нарисунках ниже.нет проблемыесть проблема, так как есть проблема (аналог 7.5.б)внутрь управляющейконструкции (if)заходит ветвь извнешнего блока (этореализуется толькобезусловнымпереходом goto)7Воробьева И.А. «Информатика. Язык Питон»Этот алгоритм структурирован, но все равно воспринимается тяжело.
Насамом деле, если бы мы его строили изначально, то по методунисходящего проектирования, три уровня (два вложения). Покажем это..Верхний уровень обобщения (мы его называем головной модуль программы или нулевой уровень алгоритма). Раскроем подзадачи:1.11.28Воробьева И.А. «Информатика. Язык Питон»На самом нижнем уровне получим простые подзадачи. Количество тестов суммарно может и не уменьшится, зато составить их будет значительно проще, двигаясь в обратном направлении «снизу-вверх».2.12.23.13.2При структурировании нам пришлось продублировать дважды блок 5и трижды блоки 7 и 8.
Если под блоком понимать один два оператора,тогда мы получаем не слишком большое увеличение размера кода и затрат сил и времени. Если дублированию подвергается более существенный фрагмент кода, тогда переходят к выделению вспомогательных алгоритмов, так называемых подпрограмм. Каждая уникальная подзадачаоформляется в подпрограмму, и дублировать приходится вновь один дваоператора – вызов подпрограммы.Метод Булевой переменной (метод флажка)С этим методом мы уже сталкивались, когда рассматривали алгоритмы с досрочным выходом из просмотра (поиска) массивов. Методприменяется тогда, когда происходит нарушение структурности в циклах,например, два выхода из одного цикла.
Изложим суть метода еще раз:1. В алгоритм вводится дополнительная переменная-флажок (частологического типа, откуда и название, но в целом это не обязательнои определяется смыслом задачи). До начала цикла флажку присваивают начальное значение – условие продолжения цикла.2. Цикл повторяется до тех пор, пока флажок сохраняет свое значение.3. В точках, где необходимо завершить цикл, изменяют значениефлажка (не забывайте, что цикл завершится только при проверкеусловия завершения цикла, что при невнимательном кодированииможет привести к исполнению дополнительных нежелательныхоператоров).9Воробьева И.А. «Информатика.
Язык Питон»Метод может иметь различные модификации, например можно рассматривать один флажок с несколькими состояниями или несколькофлажков, внося необходимые комбинации состояний или флажков в условие завершения цикла.Пусть исходная блок-схема имеет вид:Как и в случае 7.4.
структурирование нарушено из-за двух выходовиз одного цикла, но метод объединения условий не подходит из-за выполнения по каждому выходу дополнительных действий – Д1 и Д2.Структурируем алгоритм по методу флажка:10Воробьева И.А. «Информатика. Язык Питон»Композиция методов структурированияЭту же исходную блок-схему можно структурировать, применяя композицию двухпервых методов: объединения условий и дублирования кодов.Заметим, что метод флажка логически проще, хоть иможет показаться более громоздким. Простая логикаобеспечивает надежность коде – никогда не забывайтеэто, если захотите «сэкономить» в количестве операторов, забывая о логике, потратите намного больше времени либо на отладке кода, либо на исправлении ошибок, вскрытых при тестировании.
Характеристики
Тип файла PDF
PDF-формат наиболее широко используется для просмотра любого типа файлов на любом устройстве. В него можно сохранить документ, таблицы, презентацию, текст, чертежи, вычисления, графики и всё остальное, что можно показать на экране любого устройства. Именно его лучше всего использовать для печати.
Например, если Вам нужно распечатать чертёж из автокада, Вы сохраните чертёж на флешку, но будет ли автокад в пункте печати? А если будет, то нужная версия с нужными библиотеками? Именно для этого и нужен формат PDF - в нём точно будет показано верно вне зависимости от того, в какой программе создали PDF-файл и есть ли нужная программа для его просмотра.