Главная Случайная страница Категории: ДомЗдоровьеЗоологияРнформатикаРскусствоРскусствоКомпьютерыКулинарияМаркетингМатематикаМедицинаМенеджментОбразованиеПедагогикаПитомцыПрограммированиеПроизводствоПромышленностьПсихологияРазноеРелигияСоциологияСпортСтатистикаТранспортФизикаФилософияФинансыХимияХоббиРкологияРРєРѕРЅРѕРјРёРєР°Рлектроника |
Технология разработки алгоритмовОпыт практической алгоритмизации и программирования привел к формированию неких общих принципов и методов проектирования, разработки и оформления алгоритмов. Какими качествами должен обладать хороший алгоритм? Прежде всего, от алгоритма требуется, чтобы он правильно решал поставленную задачу. Но не менее важно, какой ценой это достигается. Речь идет о разумности затрат на его создание. С этой точки зрения алгоритм должен быть легким для понимания, простым для доказательства правильности и удобным для модификации. В рамках такой идеологии и сформировался так называемый структурный подход к конструированию и оформлению алгоритмов, позволяющий уменьшить количество ошибок в алгоритмах, упрощающий их контроль и модификацию. По своей сути структурный подход есть отказ от беспорядочного стиля в алгоритмизации и программировании (в частности, отказ от оператора goto) и определение ограниченного числа стандартных приемов построения легко читаемых алгоритмов и программ с ясно выраженной структурой. Теоретическим фундаментом этого подхода является теорема о структурировании, из которой следует, что алгоритм решения любой практически вычислимой задачи может быть представлен с использованием трех элементарных базисных управляющих структур: а) структуры следования или последовательности; б) структуры ветвления; в) структуры цикла с предусловием (рис. 9.7, соответственно а, б, в, где P – условие, S – оператор). Рис. 9.7. Базисные управляющие структуры Базисный набор управляющих структур является функционально полным, то есть с его помощью можно создать любой сколь угодно сложный алгоритм. Однако с целью создания более компактных и наглядных алгоритмов дополнительно используются следующие управляющие структуры: а) структура сокращенного ветвления; б) структура выбора; в) структура цикла с параметром; г) структура цикла с постусловием (рис. 9.8, соответственно а, б, в, г). В разных языках программирования реализация базовых управляющих структур может быть различной. В языке Паскаль реализованы все рассмотренные структуры. Рис. 9.8. Дополнительные управляющие структуры Любой алгоритм может быть построен посредством композиции базисных и дополнительных структур: - их последовательным соединением - образованием последовательных конструкций; - их вложением друг в друга - образованием вложенных конструкций. Например, алгоритм Евклида, описанный ранее, представляет собой комбинацию из трех управляющих структур: последовательности, цикла и ветвления (рис. 9.9). Рис. 9.9. Алгоритм Евклида как композиция базисных структур Каждая из структур может рассматриваться как один блок с одним входом и одним выходом. Таким образом, мы можем ввести преобразование любой структуры в функциональный блок. Тогда всякий алгоритм, составленный из стандартных структур, поддается последовательному преобразованию к единственному функциональному блоку и эта последовательность преобразований может быть использована как средство понимания алгоритма и доказательства его правильности. Обратная последовательность преобразований может быть использована в процессе проектирования алгоритма по нисходящей схеме с постепенным раскрытием единственного функционального блока в сложную структуру основных элементов. В области автоматизированной обработки данных такой подход называют нисходящим проектированием или проектированием «сверху вниз». Разработка алгоритма по нисходящей схеме начинается с разбиения сложной исходной задачи на отдельные более простые подзадачи, решение которых может быть представлено в общей структуре алгоритма функционально независимыми блоками. Разработку логической структуры каждого такого блока и ее модификацию можно осуществлять независимо от остальных блоков. На первом этапе проекта раскрываются наиболее важные и существенные связи в исследуемой задаче, составляется укрупненная схема алгоритма, определяется функциональное назначение каждого блока, его входные и выходные данные. На последующих этапах проектирования уточняется логическая структура отдельных функциональных блоков общей схемы, строятся схемы алгоритмов выделенных ранее подзадач. Разработка алгоритма каждой подзадачи также может осуществляться в несколько этапов детализации. На каждом этапе проекта выполняются многократные проверки и исправления алгоритма. Подобный подход является рациональным, позволяет значительно ускорить процесс разработки сложных алгоритмов, и в значительной мере избежать ошибочных решений. В качестве примера рассмотрим задачу табулирования функции одной переменной, то есть вычисление значений функции у = f(x) для всех значений х, изменяющихся от х0 до хn с шагом hx, сокращенно: Пусть где a, b, x0, hx, xn – исходные данные. Процесс проектирования алгоритма табулирования функции у = f(x) показан на рис. 9.10, а. На первом уровне детализации схема отражает процесс табулирования функции в общем виде (блоки 1.1-1.5). Далее осуществляется детализация блока 1.4 в виде последовательности блоков 2.1-2.3 второго уровня. Функция z = z(x), входящая в определение исходной функции, представлена разветвляющейся структурой третьего уровня детализации (блоки 3.1-3.5).
Рис. 9.10. Нисходящая схема проектирования Подставляя вместо функциональных блоков, подвергнутых дальнейшей детализации, соответствующие структуры, получим окончательную схему алгоритма, изображенную на рис. 9.10, б.
Р РёСЃ. 9.10. Окончание. Алгоритм вычисления сложной функции Структуры алгоритмов Алгоритмы линейной структуры Реализуют линейные вычислительные процессы, РІ которых отдельные этапы вычислений должны выполняться последовательно РґСЂСѓРі Р·Р° РґСЂСѓРіРѕРј. Линейные алгоритмы содержат только команды обработки данных. РџСЂРё исполнении алгоритма команды выполняются РІ РїРѕСЂСЏРґРєРµ РёС… записи. Линейный алгоритм вычисления коэффициентов приведенного квадратного уравнения рассмотрен РІ предыдущем разделе (СЂРёСЃ. 9.2). Для построения таких алгоритмов используется структура следования. Ветвления Вычислительные процессы, РІ которых РІ зависимости РѕС‚ тех или иных условий должны выполняться различные этапы вычислений, называются разветвляющимися. Для построения алгоритмов, реализующих такие вычислительные процессы, необходимы специальные команды (управляющие структуры), позволяющие управлять С…РѕРґРѕРј выполнения алгоритма, Р° менно, осуществлять выбор РѕРґРЅРѕРіРѕ РёР· нескольких возможных действий. РћСЃРЅРѕРІРЅРѕР№ такой конструкцией является структура простого ветвления, реализующая принятие двоичного, или дихотомического, решения. Примером алгоритма СЃ простыми ветвлениями является рассмотренный ранее алгоритм выбора максимального числа. Рассмотрим алгоритмы СЃ более сложными ветвлениями. Пример 9.5. Вычислить значение функции, график которой изображен РЅР° СЂРёСЃ. 9.11. Р РёСЃ. 9.11. График функции Область определения функции разбивается РЅР° 4 участка, РЅР° каждом РёР· которых значение функции определяется РїРѕ различным формулам: Для построения схемы алгоритма решения данной задачи используем вложенную конструкцию структур ветвления (СЂРёСЃ. 9.12). Проверяем заданные условия последовательно. Первым проверим условие x £ 0 Рё, если РѕРЅРѕ выполняется, то вычислим y:= –x. Если первое условие РЅРµ выполняется, то, следовательно, x > 0, Рё надо проверить следующее условие, x £ 3. Часть второго условия 0 < x можно РЅРµ проверять, так как, если дело дошло РґРѕ проверки этого условия, то заведомо 0 < x. Если условие x £ 3 выполняется, то вычислим y:= 0, иначе 3 < x, Рё проверяется условие x £ 5, проверка 3 < x исключается. Если действительно x £ 5, то вычисляем y:= x–3, Р° иначе 5 < x Рё вычисляем y:= 2, исключая проверку этого последнего условия. □ Р РёСЃ. 9.12. Алгоритм вычисления значения функции Пример 9.6. Вычислить РєРѕСЂРЅРё квадратного уравнения ax2 + bx + c = 0, a ¹ 0, РІ области действительных чисел. Р’ зависимости РѕС‚ значения дискриминанта D = b2 - 4ac возможны три случая: 1) квадратное уравнение РЅРµ имеет действительных корней, если D < 0; 2) квадратное уравнение имеет РґРІР° действительных равных РєРѕСЂРЅСЏ, если D = 0: x1 = x2 = -b/2a; 3) квадратное уравнение имеет РґРІР° действительных различных РєРѕСЂРЅСЏ, если D > 0: Схема алгоритма приведена РЅР° СЂРёСЃ. 9.13. Алгоритм содержит сложное ветвление, являющееся композицией РґРІСѓС… простых ветвлений. Р РёСЃ. 9.13. Алгоритм решения квадратного уравнения Рљ операндам вещественного типа РЅРµ следует применять операцию отношения В«=В» (равно), условие может РЅРµ выполняться РёР·-Р·Р° неточного представления вещественных чисел РІ памяти РР’Рњ Рё неизбежных ошибок округления РїСЂРё вычислениях. Р’ алгоритме отношение D = 0 заменено отношением |D| < e, РіРґРµ e – допустимая погрешность округления. □ Пример 9.7. Даны три числа Р°, b, СЃ. Определить, имеется ли среди РЅРёС… хотя Р±С‹ РѕРґРЅР° пара взаимно-обратных чисел. Числа Р±СѓРґСѓС‚ взаимно-обратными, если РёС… произведение равно единице. Р’ алгоритме производятся попарные проверки данных чисел. Если искомая пара найдена, выдается ответ «Да». Если же РЅРё РѕРґРЅР° проверка РЅРµ выявит пары взаимно-обратных чисел, выдается ответ «Нет». Алгоритм изображен РЅР° СЂРёСЃ. 9.14, Р°. Ртот алгоритм верно решает задачу, РЅРѕ РЅРµ является структурным. Алгоритм легко преобразовать Рє структурному РІРёРґСѓ, если продублировать блок печати «Да» Рё вывести РїСЂРё этом найденные числа (СЂРёСЃ. 9.14, Р±). Дублирование блоков – распространенный прием приведения алгоритмов СЃ ветвлениями Рє структурному РІРёРґСѓ. Можно применить РґСЂСѓРіРѕР№ СЃРїРѕСЃРѕР± - введение сложных условий (СЂРёСЃ. 9.14, РІ). □ Р РёСЃ. 9.14. Алгоритм РїРѕРёСЃРєР° взаимно-обратных чисел Циклы Вычислительные процессы СЃ многократным повторением однотипных вычислений/действий для различных значений входящих величин/данных называются циклическими, повторяемые участки вычислений – циклами, изменяющиеся РІ цикле величины – переменными цикла. Для организации циклов РІ алгоритмах необходимо предусмотреть (СЂРёСЃ. 9.15): - подготовку цикла – задание начальных значений переменным цикла перед первым его выполнением; - тело цикла – вычислении/действия, повторяемые РІ цикле для различных значений переменных цикла; - модификацию/изменение значений переменных цикла перед каждым новым его повторением; - управление циклом – проверку условия продолжения/окончания цикла Рё переход РЅР° повторение цикла или его окончание. Р РёСЃ. 9.15. Общие схемы циклического алгоритма Р’ зависимости РѕС‚ того, РіРґРµ осуществляется проверка условия продолжения или окончания цикла, последний относят Рє РІРёРґСѓ: - цикла СЃ предусловием, РєРѕРіРґР° цикл начинается СЃ проверки условия продолжения цикла (СЂРёСЃ. 9.15, Р°); - цикла СЃ постусловием, РєРѕРіРґР° условие проверяется после выполнения тела цикла (СЂРёСЃ. 9.15, Р±). Наиболее наглядным примером циклического вычислительного процесса является задача табулирования функции: вычисления значений функции y = f(x) для значений аргумента x, изменяющихся РѕС‚ начального x0 РґРѕ конечного xn СЃ постоянным шагом hx (СЂРёСЃ. 9.16). Здесь многократно повторяемые действия (тело цикла) – это вычисление значения функции f(x) для очередного значения аргумента x Рё вывод полученного результата РЅР° печать; переменная цикла – переменная x. Цикл выполняется для значений x, равных x0, x0 + hx, x0 + 2hx, ..., xn. Для модификации переменной x РІ цикле её значение надо увеличивать РЅР° значение шага: x := x + hx. Для управления циклом можно использовать структуру цикла как СЃ предусловием, РіРґРµ x <= xn – условие продолжения цикла (СЂРёСЃ. 9.16, Р°), так Рё СЃ постусловием, РіРґРµ x > xn – условие окончания цикла (СЂРёСЃ. 9.16, Р±). Р РёСЃ. 9.16. Общие схемы алгоритма табулирования функции Алгоритмы табулирования функции СЃ пред- Рё постусловием дают, вообще РіРѕРІРѕСЂСЏ, одинаковый результат. РќРѕ тело цикла СЃ предусловием РІ определенной ситуации может РЅРµ выполниться РЅРё разу, Р° тело цикла СЃ постусловием обязательно выполняется хотя Р±С‹ РѕРґРёРЅ раз. Рассмотрим случай, РєРѕРіРґР° нижняя граница x0 переменной x превышает верхнюю xn. Р’ этой ситуации цикл РЅРµ должен выполняться РЅРё разу. Поэтому РІ задаче табулирования функции лучше использовать цикл СЃ предусловием, цикл же СЃ постусловием может дать неверный результат. Приведем пример целесообразного использования цикла СЃ постусловием. Пример 9.8. Составим алгоритм вычисления СЃСѓРјРјС‹ всех целых чисел, вводимых СЃ терминала РґРѕ тех РїРѕСЂ, РїРѕРєР° РЅРµ будет введен нуль. Накопление СЃСѓРјРјС‹ S будем осуществлять РІ цикле путем прибавления очередного введенного числа k Рє СЃСѓРјРјРµ всех предыдущих: S := S + k. Перед началом цикла значение переменной S обнулим: S := 0. Проверка условия окончания цикла возможна лишь после РІРІРѕРґР° хотя Р±С‹ РѕРґРЅРѕРіРѕ числа, поэтому лучше использовать цикл СЃ постусловием. Алгоритм вычисления РёСЃРєРѕРјРѕР№ СЃСѓРјРјС‹ представлен РЅР° СЂРёСЃ. 9.17. □ Р РёСЃ. 9.17. Алгоритм вычисления СЃСѓРјРјС‹ вводимых чисел РџРѕРјРёРјРѕ циклов СЃ пред- Рё постусловием принято различать циклы СЃ заранее неизвестным Рё известным числом повторений. Примером цикла первого типа РјРѕРіСѓС‚ служить алгоритм вычисления СЃСѓРјРјС‹ (пример 9.8) Рё алгоритм Евклида. Примером цикла второго типа – алгоритм табулирования функции, РіРґРµ число повторений цикла Nx определяется как Nx = [(xn – x0)/hx] + 1, РіРґРµ квадратные СЃРєРѕР±РєРё [ ] означают целую часть числа. Р’ циклах СЃ известным числом повторений всегда можно выделить переменную, определяющую число повторений цикла, значение которой изменяется РїРѕ заданному закону, например, РѕС‚ начального РґРѕ конечного СЃ постоянным шагом. Такая переменная используется для управления циклом: РІ условии окончания цикла осуществляется сравнение текущего значения переменной СЃ заданным РїРѕСЂРѕРіРѕРј. Рту переменную именуют параметром цикла, Р° сам цикл - циклом СЃ параметром. Для схемного представления цикла СЃ параметром используют специальную управ ляющую структуру СЃ блоком модификации (СЂРёСЃ. 9.18), РіРґРµ указывают закон изменения параметра цикла. Например, РІ задаче табулирования функции y = f(x) параметром цикла является переменная x, закон изменения которой можно представить РІ РІРёРґРµ x = x0 (hx) xn. Схема цикла СЃ параметром для табулирования функции РѕРґРЅРѕР№ переменной приведена РЅР° СЂРёСЃ. 9.18. РќР° схеме РІС…РѕРґ 1 РІ блок i – первоначальный РІС…РѕРґ РІ цикл, РІС…РѕРґ 2 – очередное повторение цикла, выход 3 – окончание цикла. Р РёСЃ. 9.18. Схема цикла СЃ параметром Блок модификации включает РІ себя подготовку цикла (x := x0), изменение параметра цикла РїСЂРё его очередном повторении (x := x + hx), управление циклом – проверку условия его продолжения (x < xn) Рё переход РЅР° продолжение или окончание цикла. РџСЂРё этом СЏРІРЅРѕ выделено тело цикла. Проверка условия x < xn проводится перед каждым, РІ том числе первым, выполнением цикла, как РІ цикле СЃ предусловием. Ресли начальное значение параметра цикла больше конечного, то цикл РЅРµ выполняется РЅРё разу. Для записи цикла СЃ параметром РІ языках программирования существует специальный оператор – оператор цикла СЃ параметром. Пример 9.9. Составим алгоритм табулирования сложной функции, приведенный РЅР° СЂРёСЃ. 9.10, используя структуру цикла СЃ параметром. Алгоритм представлен РЅР° СЂРёСЃ. 9.19. Тело цикла РІ этом алгоритме представляет СЃРѕР±РѕР№ композицию РґРІСѓС… вложенных структур ветвления Рё структуры следования. Р’ схеме алгоритма РІ качестве параметра цикла может выступать переменная любого типа. РџСЂРё реализации этой структуры РІ различных языках программирования синтаксис оператора цикла СЃ параметром может РЅРµ допускать использование параметра цикла вещественного типа, как, например, РІ языке Паскаль. РўРѕРіРґР° необходимо введение дополнительной переменной целого типа, определяющей количество значений x, y Рё используемой РІ качестве параметра цикла. □ Р РёСЃ. 9.19. Алгоритм табулирования сложной функции Пример 9.10. Вычислить степень Y = an действительного числа a СЃ натуральным показателем n. Воспользоваться для вычислений следующей формулой: an = a × a × вЂ¦× a – n раз. Компактно произведение может быть записано РІ РІРёРґРµ Для вычисления Y организуем цикл СЃ параметром i, РІ котором будем накапливать РёСЃРєРѕРјРѕРµ произведение РїРѕ следующему правилу: РґРѕ начала цикла положим Y = 1, Р° РІ цикле будем домножать n раз накопленное ранее произведение РЅР° a, то есть Y := YВ·a. Алгоритм представлен РЅР° СЂРёСЃ. 9.20. □ Пример 9.11. Вычислим СЃСѓРјРјСѓ квадратов всех целых чисел РёР· заданного интервала [m, n]. Р’ компактной форме записи:
Для вычисления указанной СЃСѓРјРјС‹ организуем цикл СЃ параметром, РІ котором будем n раз вычислять значение очередного слагаемого y := i2 Рё накапливать РёСЃРєРѕРјСѓСЋ СЃСѓРјРјСѓ S := S + y. До начала цикла положим S := 0. Алгоритм приведен РЅР° СЂРёСЃ. 9.21. □
Пример 9.12. Определим, какое количество точек (x, y) РёР· заданного множества x = x0 + ihx; y = y0 + ihy; i = 0, 1, ..., 20, находится РІ каждой РёР· заштрихованных областей D1 Рё D2, включая РёС… границы (СЂРёСЃ. 9.22). Пример иллюстрирует цикл СЃ несколькими переменными цикла. Число анализируемых точек определяется количеством значений переменной i. Организуем цикл СЃ параметром i, РІ котором будем изменять значения переменных x, y Рё для каждой очередной пары (x, y) проверять условия её принадлежности Рє РѕРґРЅРѕР№ РёР· заданных областей. Р РёСЃ. 9.22. Области определения Условие попадания точки (x, y) РІ область D1 – окружность радиусом 2 СЃ центром РІ точке (5, 4): (x - 5)2 + (y - 4)2 £ 4. Условие попадания точки (x, y) РІ область D2 – окружность радиусом 3 СЃ центром РІ точке (-5, -4): (x + 5)2 + (y + 4)2 £ 9. Для проверки условий Рё подсчета количества KolD1, KolD2 точек, попавших РІ каждую РёР· областей, используем структуры сокращенного ветвления. Перед циклом надо задать переменным РёС… начальные значения (СЂРёСЃ. 9.23). □ Ртерационные циклы Среди циклов СЃ неизвестным числом повторений большое место занимают циклы, РІ которых РІ процессе повторения тела цикла образуется последовательность значений a1, a2, ..., an, ..., сходящаяся Рє некоторому пределу a: Каждое РЅРѕРІРѕРµ значение an РІ такой последовательности является более точным приближением Рє РёСЃРєРѕРјРѕРјСѓ результату a. Циклы, реализующие такую последовательность приближений/итераций, называют итерационными. Р’ итерационных циклах условие окончания цикла основывается РЅР° свойстве безграничного приближения значений an Рє РёСЃРєРѕРјРѕРјСѓ пределу СЃ увеличением n. Ртерационный цикл заканчивают, если для некоторого значения n выполняется условие |an – an–1| £ e, РіРґРµ e – допустимая погрешность вычислений. РџСЂРё этом результат отождествляют СЃРѕ значением an, то есть считают, что an = a. Р РёСЃ. 9.23. Алгоритм подсчета числа точек, Пример 9.13. Составим алгоритм вычисления СЃ заданной погрешностью e, используя следующее рекуррентное соотношение: yn = yn-1 - (x/yn-1 - yn-1)/2; y1 = x/2. Условием окончания данного итерационного цикла будет условие |yn – yn–1| £ e. Для его проверки необходимо иметь РґРІР° приближения: текущее yn Рё предыдущее yn-1. Алгоритм можно упростить, если ввести вспомогательную переменную d = yn - yn-1 = (x/yn-1 - yn-1)/2 Рё использовать ее РІ условии окончания цикла: | d | £ e. Для проверки такого условия достаточно иметь лишь РѕРґРЅРѕ приближение, которое обозначим через y. Алгоритм вычисления квадратного РєРѕСЂРЅСЏ представлен РЅР° СЂРёСЃ. 9.23. Для организации итерационного процесса использована структура цикла СЃ постусловием. □ Р РёСЃ. 9.23. Алгоритм вычисления квадратного РєРѕСЂРЅСЏ Вложенные циклы Р’ практике алгоритмизации часто встречаются задачи, РїСЂРё решении которых необходимо проектировать алгоритмы СЃ несколькими циклами. Если РІ теле цикла содержится РѕРґРёРЅ или несколько РґСЂСѓРіРёС… циклов, то такие циклы называют вложенными. Цикл, содержащий РІ себе РґСЂСѓРіРѕР№ цикл, называют внешним. Цикл, содержащийся РІ теле РґСЂСѓРіРѕРіРѕ цикла, называют внутренним. Выполняются вложенные циклы следующим образом. Сначала РїСЂРё фиксированных начальных значениях переменных внешнего цикла полностью выполнится внутренний цикл Рё его переменные «пробегут» РІСЃРµ СЃРІРѕРё значения. Затем переменные внешнего цикла РїСЂРёРјСѓС‚ следующие значения Рё, если условие окончания внешнего цикла РЅРµ будет достигнуто, СЃРЅРѕРІР° полностью выполнится внутренний цикл Рё его переменные опять «пробегут» РІСЃРµ СЃРІРѕРё значения Рё С‚. Рґ. РґРѕ тех РїРѕСЂ, РїРѕРєР° РЅРµ выполнится условие окончания внешнего цикла. Пример 9.14. Составим алгоритм табулирования сложной функции РґРІСѓС… переменных: для x = x0(hx) xn Рё y = y0(hy) yn. Вычисление значений функции z для всех различных пар (x, y) необходимо организовать следующим образом. Вначале РїСЂРё фиксированном значении РѕРґРЅРѕРіРѕ РёР· аргументов, например, РїСЂРё x = x0, вычислить значения z для всех заданных y: y0, y0 + hy, y0 + 2hy, ..., yn. Затем, изменив значение x РЅР° x0 + hx, РІРЅРѕРІСЊ перейти Рє полному циклу изменения переменной y. Данные действия повторить для всех x: x0, x0 + hx, x0 + 2hx, ..., xn. Для записи алгоритма необходима структура вложенных циклов, например, СЃ параметром: внешнего – СЃ параметром x Рё внутреннего – СЃ параметром y. Р’ данной задаче внешний Рё внутренний циклы можно поменять местами, РїСЂРё этом изменится только РїРѕСЂСЏРґРѕРє изменения аргументов. Общее количество значений z равно Nz = NxּNy, РіРґРµ Nx = [(xn – x0)/hx] + 1, Ny = [(yn – y0)/hy] + 1. Алгоритм табулирования функции, выполненный РїРѕ технологии нисходящего проектирования, представлен РЅР° СЂРёСЃ. 9.25. Р РёСЃ. 9.25. Алгоритм табулирования функции РґРІСѓС… переменных РќР° первом этапе составлена укрупненная схема решения задачи СЃ выделением операции РІРІРѕРґР° исходных данных Рё структуры вложенных циклов. РќР° втором этапе раскрывается тело внутреннего цикла как композиция структур ветвления. □ Пример 9.15. Найти совершенное число РІ интервале [2, n]. Совершенное число равно СЃСѓРјРјРµ всех СЃРІРѕРёС… делителей, включая единицу. Например, 28 – совершенное число, так как 28 = 1 + 2 + 4 + 7 + 14. Р’ алгоритме для каждого целого k РёР· заданного интервала будем определять СЃСѓРјРјСѓ S всех его делителей Рё сравнивать значения S Рё k. Если РѕРЅРё равны, то анализируемое k есть РёСЃРєРѕРјРѕРµ совершенное число, надо его вывести Рё закончить РїРѕРёСЃРє, РІ противном случае, перейти Рє следующему целому числу РёР· заданного интервала. Для реализации такого алгоритма необходима структура вложенных циклов: внешнего, для просмотра заданного интервала, Рё внутреннего, для вычисления СЃСѓРјРјС‹ (СЂРёСЃ. 9.26, Р°). Построенный алгоритм РЅРµ является структурированным. Рассмотрим РѕРґРёРЅ РёР· СЃРїРѕСЃРѕР±РѕРІ приведения циклического алгоритма Рє структурному РІРёРґСѓ. Внешний цикл имеет РґРІР° условия окончания: исчерпание всех целых чисел РёР· заданного интервала Рё выполнение равенства k = S. Р’ зависимости РѕС‚ того, какое условие привело Рє окончанию цикла, необходимо предпринять различные действия. Объединим РѕР±Р° условия окончания цикла РІ РѕРґРЅРѕ: k > n или k = S. Для принятия окончательного решения после завершения цикла проверим, какое же условие привело Рє его окончанию (СЂРёСЃ. 9.26, Р±). Р РёСЃ. 9.26. Алгоритм РїРѕРёСЃРєР° совершенного числа Можно структурировать алгоритм иначе: РІ цикле СЃ параметром k ввести дополнительную переменную Pr, установив РґРѕ цикла Pr = 0. Как только совершенное число будет найдено, присвоить Pr значение этого числа. Окончательное решение РІ этом случае принимается уже РЅР° основании анализа признака Pr. Структура внутреннего цикла для вычисления СЃСѓРјРјС‹ S раскрывается РЅР° втором этапе детализации алгоритма. Поскольку РІСЃРµ числа делятся РЅР° единицу, то сначала устанавливается S = 1. Р’ цикле СЃ параметром i, изменяющимся РѕС‚ 2 РґРѕ [k/2], суммируются РІСЃРµ делители числа k. Р’ интервале РѕС‚ [k/2]+1 РґРѕ k–1 РЅРµ может быть делителей числа k. □ Вспомогательные алгоритмы РџСЂРё нисходящем проектировании алгоритма решения сложной задачи РёСЃС…РѕРґРЅСѓСЋ задачу разбивают РЅР° более простые подзадачи. Каждой такой подзадаче соответствует функционально законченная часть алгоритма. Если оформить эту часть алгоритма РІ РІРёРґРµ самостоятельной алгоритмической единицы СЃРѕ СЃРІРѕРёРјРё входными Рё выходными данными Рё, таким образом, что Рє ней Р±СѓРґСѓС‚ возможны многократные обращения (ссылки) РёР· РѕСЃРЅРѕРІРЅРѕРіРѕ алгоритма, то такую алгоритмическую единицу можно назвать вспомогательным или подчиненным алгоритмом (РІ программировании – подпрограмма). Если для какой-то подзадачи уже известен алгоритм ее решения, то РѕРЅ может быть включен РІ состав РІРЅРѕРІСЊ разрабатываемого алгоритма РІ качестве вспомогательного. Если РІ алгоритме или РІ разных алгоритмах встречаются фрагменты, одинаковые РїРѕ выполняемым действиям Рё различающиеся только значениями обрабатываемых данных, то такого СЂРѕРґР° фрагменты РјРѕРіСѓС‚ быть оформлены РІ РІРёРґРµ отдельного алгоритма. Р’ соответствующих местах РѕСЃРЅРѕРІРЅРѕРіРѕ алгоритма Р±СѓРґСѓС‚ осуществляться лишь обращения Рє РЅРёРј. Рто позволяет сократить объем Рё улучшить структуру всего алгоритма РІ целом. РџСЂРё использовании вспомогательных алгоритмов возникают РІРѕРїСЂРѕСЃС‹ РёС… оформления (таким образом, чтобы РІ дальнейшем можно было ссылаться РЅР° РЅРёС… РёР· РґСЂСѓРіРёС… алгоритмов) Рё техники включения РІ основные алгоритмы РІ процессе исполнения последних. Р’ схемах алгоритмов полная формализация РІ оформлении подчиненных алгоритмов РЅРµ производится. Однако установлены некоторые общие правила РёС… оформления. Для подчиненного алгоритма определяется его РёРјСЏ, входные Рё выходные данные. Р’ блок-схеме РІ блоке начала указывается РёРјСЏ алгоритма Рё имена его входных величин – исходных данных, Р° РІ блоке конца указываются имена выходных величин – результатов. Переменные, перечисленные РІ блоках начала Рё конца, называются формальными параметрами. РС… введение необходимо для того, чтобы РїСЂРё многократных вызовах подчиненного алгоритма можно было задавать различные значения исходных данных, Р° после его исполнения воспользоваться полученными результатами. Р’ качестве примера рассмотрим алгоритм вычисления степени y := an СЃ натуральным показателем n (СЃРј. СЂРёСЃ. 9.20). Оформим его как вспомогательный алгоритм. РќР° СЂРёСЃ. 9.27 приведена схема вспомогательного алгоритма, его РёРјСЏ – Step, его входные параметры – n, a, выходной параметр – y. Р РёСЃ. 9.27. Вспомогательный алгоритм вычисления степени Вызов вспомогательного алгоритма (ссылка РёР· РѕСЃРЅРѕРІРЅРѕРіРѕ алгоритма) осуществляется СЃ помощью специального блока (СЃРј. табл. 9.2). Р’ блоке вызова вспомогательного алгоритма указываются его РёРјСЏ Рё СЃРїРёСЃРѕРє фактических параметров: конкретных значений Рё имен исходных данных Рё имен вычисляемых результатов, которые должны быть подставлены вместо формальных параметров РїСЂРё исполнении вспомогательного алгоритма. Количество Рё РїРѕСЂСЏРґРѕРє формальных Рё фактических параметров должны совпадать. Далее рассмотрим алгоритм вычисления степени z = xk, x ¹ 0, СЃ целым показателем k, пользуясь следующим определением: Алгоритм вычисления z = xk построим, используя вспомогательный алгоритм Step вычисления степени СЃ натуральным показателем. Схема алгоритма приведена РЅР° СЂРёСЃ. 9.28. Ссылка РЅР° вспомогательный алгоритм Step производится дважды: СЃ фактическими параметрами k, x, z РїСЂРё k > 0 Рё СЃ фактическими параметрами -k, 1/x, z РїСЂРё k < 0. Рсполняется вспомогательный алгоритм Step РѕРґРёРЅ раз РІ зависимости РѕС‚ введенного РІ РѕСЃРЅРѕРІРЅРѕР№ программе значения k. После выполнения совокупности действий, предусмотренных РІ Step, осуществляется возврат РІ РѕСЃРЅРѕРІРЅРѕР№ алгоритм Рє блоку вывода, следующему Р·Р° блоком обращения Рє вспомогательному алгоритму. Р РёСЃ. 9.28. Алгоритм вычисления степени СЃ целым показателем Очень важно понимать суть Рё механизм замены формальных параметров фактическими. Формальные параметры – это переменные, формально присутствующие РІРѕ вспомогательном алгоритме Рё определяющие тип Рё место подстановки фактических параметров. Фактические параметры – это реальные величины РѕСЃРЅРѕРІРЅРѕРіРѕ алгоритма (константы, переменные, выражения), заменяющие РїСЂРё вызове вспомогательного алгоритма его формальные параметры. Над этими величинами Рё производятся действия, предусмотренные командами вспомогательного алгоритма. Замена формальных параметров фактическими осуществляется РїРѕ РїРѕСЂСЏРґРєСѓ РёС… следования, число Рё тип формальных Рё фактических параметров должны совпадать. |
|||||||
Последнее изменение этой страницы: 2016-07-23 lectmania.ru. Все права принадлежат авторам данных материалов. В случае нарушения авторского права напишите нам сюда... |