Программирование вообще можно определить как проектирование, кодирование и тестирование программы.
Структурное программирование это проектирование, написание и тестирование программы в соответствии с заранее определенной дисциплиной.
Раньше хорошими программистами считали тех, кто писал весьма хитроумные программы, которые занимали минимум основной памяти и выполнялись за кратчайшее время. Это было естественно, потому что в старое доброе время основная память была более дорогой, машины были намного медленнее, чем сегодня.
Результатом хитроумного кодирования оказывались программы, которые трудно было (если не совершенно невозможно) понять другим лицам. Программисты зачастую сами признавали, что свою собственную программу они с трудом понимают уже через полгода, а то и через месяц. Фактически каждая написанная программа впоследствии модифицируется при изменении внешних требований или для ликвидации ошибок. Изменения, вносимые в запутанную программу, еще больше усложняют ее понимание впоследствии. Подобные программы получили название BS-программ (Bowl of Spaghetti блюдо спагетти), так как при попытке разобраться в них необходимо нарисовать нечто напоминающее блюдо спагетти.
Основные алгоритмические конструкции | Информатика 8 класс #20 | Инфоурок
На некотором этапе развития программного обеспечения выяснилось, что разработка сложных алгоритмов и соответствующих им программ становится практически неуправляемой. Резко ухудшилась читаемость программ, снизилась эффективность программ и их надежность, усложнилось тестирование программ, и в итоге, увеличилось время разработки и стоимость программного продукта.
Исходя из этих проблем, лучшие программисты 70-х годов Э.Дейкстра и Н.Вирт разработали строгие правила разработки программ, которые получили название “Методология структурного программирования”. Они рассматривают программу (алгоритм) как совокупность иерархических модулей, которые позволяют четко структурировать программу, что улучшает ее понимание программистами, позволяет выполнять математическое доказательство ее корректности и тем самым повысить надежность функционирования программ и сократить срок их разработки.
Основные стандарты структурного программирования:
1. Алгоритм (программ) должна разделяться на независимые части, называемые модулями.
2. Модуль имеет одну входящую и одну выходящую точку.
3. Модуль – это независимый блок, который физически и логически отделен от других модулей.
4. Каждый модуль начинается с комментария, объясняющего его назначение, назначение переменных, передаваемых в модуль и из него, модулей, которые его вызывают, и модулей, которые вызываются из него.
5. В модуле используются только базовые управляющие конструкции (ветвление, повторение, следование, вход, выход).
6. Вложенность операторов IF не должна быть более трех.
В 1966 году Бом и Якопини доказали следующую теорему: любую блок-схему с одним входом и одним выходом можно построить, используя базисное множество базовых структур (следование, ветвление, цикл-пока).
Информатика 8 класс (Урок№8 — Объекты алгоритмов. Алгоритмическая конструкция «следование»)
Блок-схема называется структурированной, если она построена на основе базисного множества базовых структур.
Для построения структурированных блок-схем была разработана специальная технология, которая называется пошаговой детализацией. Пошаговая детализация представляет собой процесс дробления задачи на модули, т.е. исходя из общей задачи, вычленяются подзадачи, устанавливаются логические связи между ними. После этого переходят к уточнению выделенных подзадач. Этот процесс детализации продолжается до уровня позволяющего достаточно легко реализовать подзадачу на выбранном языке программирования.
При пошаговой детализации используется принцип замещения, который состоит в замене любого функционального блока (прямоугольника) блок-схемы некоторой базовой структурой (следование, ветвление, повторение) из исходного базисного множества. Достоинство пошаговой детализации состоит в том, что она позволяет разработчику алгоритма упорядочить свои рассуждения.
Пример. Построить структурированную блок-схему алгоритма для вычисления функции
На первом шаге задачу представим в виде одного блока, в котором запишем кратко условие задачи.
На втором шаге функциональный блок преобразуем в развилку, где выделено вычисление Y при x
На последнем шаге функциональный блок предыдущей схемы заменяем развилкой.
В итоге выполнения нескольких шагов мы получили структурированную блок-схему алгоритма решения задачи.
Нисходящая и восходящая разработка алгоритмов. Первое важное правило состоит в том, чтобы сначала продумать задачу, которую необходимо решить. Как только мы хорошо поймем задачу и способ решения задачи будет нами будет полностью и во всех деталях продуман, само проектирование окажется быстрым и легким.
Распространенной ошибкой являются попытки начать писать программу до того, как будет уяснена полная постановка задачи. Основная причина, по которой следует воздержаться от преждевременного начала программирования, состоит в том, что обдумывание задачи и поиск метода ее решения должны проводиться в терминах, наиболее адекватных самой этой задаче. Эти термины чаще всего далеки от синтаксиса применяемого языка программирования и могут быть утверждениями на естественном языке и схемами.
Исходная формулировка способа решения задачи должна быть в конечном итоге преобразована в алгоритм и программу, но этот процесс преобразований млжет оказаться нелегким.
Нисходящая разработка алгоритма. Суть нисходящей разработки (нисходящего проектирования, проектирования сверху вниз) состоит в пошаговой декомпозиции (разложении) задачи на точно определенные подзадачи.
Формальных критериев декомпозиции не существует, поэтому процесс, особенно для нестандартных задач, является в большой степени творческим и требует навыка и опыта. Парадоксальным на первый взгляд, но наиболее конструктивным критерием выделения подзадач является такой: каждая подзадача должна быть сформулирована кратко, точно и емко («Найти сумму..», «Проверить наличие элементов …» и т.д.).
Процесс разработки является иерархическим. На каждом уровне проектирования полагаем, что каждая выделенная подзадача реализуема, и, не интересуясь деталями этой реализации, рассматриваем ее как единое обобщенное действие, называемое абстракцией. Подзадача некоторого уровня раскрывается на следующем, также путем разложения на подзадачи – и т.д., до получения подзадач, алгоритм решения которых можно непосредственно записать на языке программирования.
Ниже приведена общая схема нисходящего проектирования.
На любом уровне проектирования одни элементы алгоритма уже доведены до исполнительного уровня и могут быть закодированы, другие же представлены в виде абстракций. Нисходящая отладка представляет собой постепенный процесс отладки такого незавершенного кода программы на каждом уровне.
В основе ее лежит тот факт, что любая подзадача связана с остальными только своим интерфейсом, т.е. совокупностью получаемых ею входных данных и передаваемых дальше выходных данных. Можно взять некоторый тест и вместо операций по решению подзадачи вставить операции, формирующие соответствующие тесту выходные значения. Совокупность таких операций называется заглушкой (или имитатором).
Заглушка должна только получить входные данные подзадачи и напрямую сформировать результаты согласно тесту, поэтому тексты заглушек должны быть максимально простыми. Подставив вместо подзадач заглушки, мы будем иметь, с одной стороны, законченную с точки зрения компьютера программу; с другой стороны, ее результаты работы на рассматриваемом тесте не будут отличаться от результатов итоговой программы.
Такой процесс отладки дает на каждом уровне два важных результата:
— возможность отладки уже готовых частей программы;
— возможность отладки взаимодействия подзадач, т.е. логики передачи данных между ними.
При этом то, что уже отлажено, далее меняться не должно, и все усилия можно сосредоточить на раскрытии еще не решенных подзадач.
Восходящая разработка алгоритма («снизу-вверх»).. Восходящее программирование — методика разработки программ, при которой крупные блоки собираются из ранее созданных мелких блоков. Восходящее программирование начинается с разработки ключевых процедур и подпрограмм, которые затем постоянно модифицируются.
«Восходящая» разработка характеризует так называемое исследовательское программирование, когда система строится вокруг ключевых компонентов и программ, которые создаются на ранних стадиях проекта, а затем постоянно модифицируются. Отсутствие четкого плана, минимальное управление проектом, большое число сторонних территориально удаленных разработчиков, свободный обмен идеями и кодами — все это атрибуты нового программирования. Об особенностях исследовательского программирования написано немало статей. Так, швейцарские профессора А.Киральф, К.Чен и Й.Нивергельт выделили следующие важные моменты:
- разработчик ясно представляет направление поиска, но не знает заранее, как далеко он сможет продвинуться к цели;
- нет возможности предвидеть объем ресурсов для достижения того или иного результата;
- разработка не поддается детальному планированию, она ведется методом проб и ошибок;
- такие работы связаны с конкретными исполнителями и отражают их личностные качества.
Дата добавления: 2020-12-12 ; просмотров: 736 ; Мы поможем в написании вашей работы!
Источник: studopedia.net
18. Понятие структурного программирования.
Структурное программирование – это такой подход (метод) составления программ, который способствует построению надежных, корректных и хорошо понимаемых программ. Такие программы имеют ясную логику, их легко читать сверху вниз, в них можно гораздо быстрее отыскать ошибки, внести изменения и исправления.
Принцип структурного программирования состоит в том, что программа составляется из небольшого набора структурных конструкций управления вычислениями. При этом каждая структурная конструкция имеет один выход и один вход. Программа написания с помощью таких структур (`регулярных` способов) называется структурированием. И таких структур 3: следования (последовательности), ветвления и цикла.
Структура «следование» задает определенный порядок следования действий. Действия выполняются в порядке их написания. Структура может задаваться явно(когда используются какие-то средства для выделения структуры) или неявно(один оператор следует за другим).
Структура «ветвления» задает выбор одного действия из нескольких возможностей.
Структура «цикл» используется для того, чтобы задать действия, которые должны быть многократно повторить.
19. Понятие подпрограммы и модульного программирования. Цели модульного программирования. Виды подпрограмм: функция, процедура.
При нисходящей разработке проектирование программы ведется “сверху-вниз”. В решаемой задаче сначала выделяется небольшое число достаточно самостоятельных, более простых задач (подзадач), а в проектируемой программе намечается соответствующее число блоков (частей программы), каждый из которых предназначен для решения одной из подзадач. Определяется функциональное назначение каждого блока (модуля): что он должен делать, какие данные являются исходными для блока, какие – результатами. Если какие-то из подзадач оказываются достаточно сложными (алгоритмы их решения не являются очевидными), то к каждой из них применяется аналогичный процесс выделения подзадач.
Этот процесс пошаговой детализации продолжается до тех пор, пока каждый из выделенных блоков программы не окажется таким, что его реализация (кодирование) на выбранном языке программирования уже не вызовет трудностей. Таким образом, программа может иметь многоуровневую структуру:
Если на каждом шаге детализации будут использоваться принципы структурного программирования, то это обеспечит хорошую структурированность и программы в целом.
В языках программирования одним из средств реализации модульной структуры программы является метод подпрограмм.
Подпрограмма – это самостоятельная программная единица, которая позволяет выделить из программы частичный алгоритм и записать его только один раз, но использовать столько раз, сколько это необходимо.
Основные свойства подпрограмм:
1) подпрограмма должна иметь один вход и один выход;
2) подпрограмма должна решать самостоятельную задачу по принципу одна подпрограмма – одна функция. Например, ввод линейного массива, вычисление произведения матриц, поиск наибольшего элемента в одномерном массиве и т.д.;
3) подпрограмма должна возвращать управление в ту часть программы, которая ее вызвала;
4) подпрограмма может вызывать другую подпрограмму, в том числе и саму себя, в последнем случае мы имеем дело с рекурсивной подпрограммой;
5) подпрограмма должна настраиваться на входные данные вызывающей части и возвращать результат;
6) размер подпрограммы желательно ограничивать одной-двумя страницами исходного текста.
Каждой подпрограмме дается имя, которое используется для активации действий, описанных в подпрограмме (вызова подпрограммы) в тех местах программы, где необходимо их выполнить. В точке вызова подпрограммы управление передается ее первой команде. Выполнение подпрограммы завершается действиями по возвращению управления в точку вызова – т.е. команде, непосредственно следующей за точкой вызова, называемой точкой возврата. Таким образом, в структурированной программе между программными единицами устанавливается отношение вызываемая–вызывающая.
Схема взаимодействия вызывающей и вызываемой может быть следующей:
Источник: studfile.net
Структурный подход
С появлением массовых ЭВМ 3-го поколения устаревшая технология программирования оказалась основным фактором, сдерживающим развитие и распространение компьютерных (информационных) технологий, что подтолкнуло ведущие в этой сфере деятельности фирмы, в первую очередь IBM, к разработке новых методологий программирования. Появившийся в начале 1970-х годов новый подход к разработке алгоритмов получил название структурного.
Следование — самая важная из структур. Она означает, что действия могут быть выполнены друг за другом, рис. 1.19:
Рис. 1.19. Структура «следование»
Эти прямоугольники могут представлять как одну единственную команду, так и множество операторов, необходимых для выполнения сложной обработки данных.
Ветвление — это структура, обеспечивающая выбор между двумя альтернативами. Выполняется проверка, а затем выбирается один из путей (рис. 1.20).
Эта структура называется также «ЕСЛИ — ТО — ИНАЧЕ», или «развилка». Каждый из путей (ТО или ИНАЧЕ) ведет к общей точке слияния, так что выполнение программы продолжается независимо от того, какой путь был выбран.
Рис. 1.20. Структура «ветвление»
Может оказаться, что для одного из результатов проверки ничего предпринимать не надо. В этом случае можно применять только один обрабатывающий блок, рис.1.21:
Рис. 1.21. Структура «неполное ветвление»
Цикл (или повторение) предусматривает повторное выполнение некоторого Набора команд программы. Если бы циклы не существовали, вряд ли занятие программированием было бы оправданным: циклы позволяют записать длинные последовательности операций обработки данных с помощью небольшого числа повторяющихся команд. Разновидности цикла изображены на рис. 1.22 и рис. 1.23.
Цикл начинается с проверки логического выражения. Если оно истинно, то выполняется «a», затем все повторяется снова, пока логическое выражение сохраняет значение «истина». Как только оно становится ложным, выполнение операций «а» прекращается и управление передается по программе дальше.
Рис. 1.22. Структура цикла «пока»
Рис. 1.23. Структура цикла «до»
Рис. 1.24. Нахождение суммы трех чисел
Рис. 1.25. Нахождение наибольшего из трех чисел
Эти структуры можно комбинировать одну с другой — как путем организации их следований, так и путем создания суперпозиций (вложений одной структуры в другую) — сколь угодно разнообразно для выражения логики алгоритма решения любой задачи. Используя описанные структуры, можно полностью исключить использование каких-либо еще операторов условного и безусловного перехода, что является важным признаком структурного программирования. Направление выполнения команд часто изображают сверху вниз. На рис. 1.24 — 1.26 приведены простейшие примеры структурной реализации алгоритмов работы с величинами.
Рис. 1.26. Нахождение суммы 100 чисел
Умение образовывать из базовых структур их суперпозиции в соответствии с условиями конкретной задачи — одно из важнейших в программировании. Допустим, надо ввести в память компьютера 100 чисел и по дороге отсуммировать те из них, которые положительны. Ясно, что ввод — операция циклическая, а внутри этого цикла находится развилка, в которой проверяется знак числа и производится суммирование. Схематически соответствующая суперпозиция изображена на рис. 1.27.
Так как выражение, управляющее циклом, проверяется в самом начале, то в случае, если условие сразу окажется ложным, операторы циклической части «a» могут вообще не выполняться. Операторы циклической части «а» должны изменять переменную (или переменные), влияющие на значение логического выражения, иначе программа «зациклится» — будет выполняться бесконечно. Рассмотренная циклическая конструкция называется также цикл «пока», или «цикл с предусловием».
Существует и иная конструкция цикла, которая предусматривает проверку условия, по которому, наоборот, выполнение команд циклической части прекращается, после команд циклической части (см. рис. 1.23).
Рис 1.27 Алгоритм типа развилка, вложенная в цикл,
для нахождения суммы положительных чисел из 100 возможных
Схематические изображения нескольких суперпозиций базовых алгоритмических структур представлены ниже на рис. 1.28-1.31.
Еще одним важным компонентом структурного подхода к разработке алгоритмов является модульность. Модуль — это последовательность логически связанных операций, оформленных как отдельная часть программы. Использование модулей имеет следующие преимущества:
1) возможность создания программы несколькими программистами;
2) простота проектирования и последующих модификаций программы;
3) упрощение отладки программы — поиска и устранения в ней ошибок;
4) возможность использования готовых библиотек наиболее употребительных модулей.
Но, пожалуй, самым важным достижением структурного подхода к разработке алгоритмов является нисходящее проектирование программ, основанное на идее уровней абстракции, которые становятся уровнями модулей в разрабатываемой программе. На этапе проектирования строится схема иерархии, изображающая эти уровни. Схема иерархии позволяет программисту сначала сконцентрировать внимание на определении того, что надо сделать в программе, а лишь затем решать, как это надо делать. При нисходящем проектировании исходная, подлежащая решению задача разбивается на ряд подзадач, подчиненных по своему содержанию главной задаче. Такое разбиение называется детализацией или декомпозицией.
![]() |
![]() |
Рис. 1.28. Алгоритм типа «цикл, вложенный в неполную развилку» | Рис. 1.29. Алгоритм типа «цикл в цикле» |
![]() |
![]() |
Рис. 1.30. Алгоритм типа «развилка в развилке» | Рис. 1.31. Иллюстрация трехкратного вложения одной базовой структуры в другую |
На следующем этапе эти задачи, в свою очередь, разбиваются на более мелкие подчиненные подзадачи и так далее, до уровня относительно небольших подзадач, вторые требуют для решения небольших модулей в 3 — 5 строк. Такой метод роектирования программ позволяет преодолевать проблему сложности разработки программы (и ее последующей отладки и сопровождения).
Воспользуйтесь поиском по сайту:
Источник: studopedia.org