Разработка машинно-ориентированного алгоритма.

Под машинно-ориентированным понимается алгоритм, удобный для решения данной задачи на ЭВМ. Это очень важный этап, так как алгоритм определяет логическую структуру программы. Алгоритм может быть описан словесно или графом (называемым блок-схемой), что строже и нагляднее. Словесное описание применяется обычно для разрешения затруднений при построении графа. Граф состоит из вершин (блоков), объединенных ребрами. Типы блоков представлены в таблице 0.0.1.

Разработка машинно-ориентированного алгоритма. - student2.ru

К вершинам типа 1 и 3 подходят два ребра (одно входящее и одно выходящее). К вершинам типа 4 и 5 - лишь одно ребро (либо входящее, либо выходящее). В таблице для типа 4 представлен вариант блока "Начало". К вершинам типа 2 подходят три ребра (одно входящее и два выходящих – для "да" и "нет"), причем одно из выходящих может начинаться из нижнего угла ромба. Таким образом, вершине типа 2, в зависимости от расположения выходящих ребер и сопоставленных им "да" и "нет", соответствует 6 вариантов. Вершины типа 1 – 3 в блок-схеме обычно нумеруются. Движение по графу подразумевается сверху – вниз. При соблюдении этого правила стрелки не используются, а иное направление указывается ребром со стрелкой.

В соответствии с основной теоремой структурного программирования, доказанной Э.Дейкстрой, алгоритм любой сложности можно реализовать, используя только три конструкции: следование (оператор за оператором), повторение (цикл), выбор (альтернатива). Первой конструкции соответствует линейная программа (пример алгоритма которой приведен на рисунке слева), второй – циклическая (на рисунке справа), третьей – с разветвлениями (в середине).

           
  Разработка машинно-ориентированного алгоритма. - student2.ru   Разработка машинно-ориентированного алгоритма. - student2.ru
      Разработка машинно-ориентированного алгоритма. - student2.ru
 
 

В укрупненном виде алгоритм состоит из:

а) ввода входных данных

б) собственно алгоритма программы, представляющего собой необходимую комбинацию из трех конструкций

в) вывода результата

Ввод входных данных и вывод результата тоже могут иметь сложную структуру.

Разработка машинно-ориентированного алгоритма. - student2.ru Рассмотрим для примера построение алгоритма программы нахождения произведения всех нечетных чисел из заданной последовательности.

После блока 1, реализующего ввод размерности (длины) последовательности, организуем цикл из блоков 2-7 для ввода элементов последовательности,

Разработка машинно-ориентированного алгоритма. - student2.ru

причем сначала рисуется тело цикла - блоки 3-5, которые затем обрамляются блоками 2, 6, 7, обеспечивающими выполнение цикла. Блок 3 задает выбор: ввод элементов последовательности с помощью генератора случайных чисел (блок 4) или с клавиатуры (блок 5). Блок 2 определяет начальное значение счетчика цикла, блок 6 – конечное, реализуя при этом условие окончания цикла, а блок 7 увеличивает значение счетчика цикла. Аналогично организуется цикл из блоков 8-14, тело которого составляют блоки

10-12. Блоки 10-11 обеспечивают проверку на четность, а блок 12 – вычисление произведения нечетных чисел последовательности. Блок 8 задает начальное значение для вычисления произведения P1 = 1. Блок 15 служит для вывода результата на экран.

Хорошо составленный алгоритм позволяет проверять правильность работы программы без компьютера. Для этого необходимо добросовестно пройтись по блокам алгоритма. Например:

Бл.1: вводим n = 4. Начинается цикл по вводу. Бл.2: i = 1.

Шаг 1: Бл.3: по "нет" выбираем ввод с клавиатуры. Бл.5: вводим a(1) = 5. Бл.6: проверка (i = 1) < (n = 4), по "да". Бл.7: i = 1+1=2.

Шаг 2: Бл3: по "нет". Бл.5: вводим a(2) = 4. Бл.6: (i = 2) < (n = 4), по "да". Бл.7: i = 2 + 1 = 3.

Шаг 3: Бл.3: по "нет". Бл.5: вводим a(3) = 2. Бл.6: (i = 3) < (n = 4), по "да". Бл.7: i = 3 + 1 = 4.

Шаг 4: Бл.3: по "нет". Бл.5: a(4) = 7. Бл.6: (i = 4) = (n = 4), по "нет". Завершен цикл по вводу, начинается цикл по вычислению произведения. Бл.8: Р1 = 1. Бл.9: j = 1

Шаг 1: Бл.10: деление (a(1) = 5) / 2 = 2.5. Бл.11: деление не нацело, по "нет". Бл.12: Р1 = 1 * a(1) = 1*5 = 5. Бл.13: проверка (j = 1) <

< (n = 4), по "да". Бл.14: j = 1 + 1 = 2.

Шаг 2: Бл.10: (a(2) = 4) / 2 = 2. Бл.11: деление нацело, по "да". Бл.13: (j = 2) < (n = 4), по "да". Бл.14: j = 2 + 1 = 3

Шаг 3: Бл.10: (a(3) = 2) / 2 = 1. Бл.11: деление нацело, по "да". Бл.13: (j = 3) < (n = 4), по "да". Бл.14: j = 3 + 1 = 4

Шаг 4: Бл.10: (a(4) = 7) / 2 = 3.5. Бл.11: деление не нацело, по "нет". Бл.12: Р1 = 5*а(4) = 5*7 = 35. Бл.13: (j = 4) = (n = 4), по "нет".

Завершен цикл. Бл.15: вывод на экран Р1 = 35.

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



Наши рекомендации