Выявленные возможные проблемы нужно учесть при разработке алгоритма.
Можно записать математическую формулировку задачи данной части:
где: k – количество нужных (четных по номеру, ненулевых) элементов во второй половине массива R;
- произведение нужных элементов.
Для определения наименьшего элемента сначала выделим элементы второй трети массива: номер первого элемента второй трети [n/3] + 1 = [17/3]+1 = [5,66] + 1 = 5 + 1 = 6, номер последнего [2*n/3] = [2*17/3] = [34/3] = [11,33] =11.
Запишем элементы второй трети массива:
x6 x7 x8 x9 x10 x11
-343 2 0 0
Выделим подчёркиванием нужные элементы: не принадлежащие отрезку [a/2,b/2] для a = -3, b = 4. Нужных элементов 3, наименьшее по модулю значение равно 3, такое значение имеют два элемента: x6 = -3 и x8 =3.
При решении данной задачи могут быть следующие ситуации:
- Не будет нужных элементов;
- Будет единственный элемент с наименьшим значением;
- Будет множество элементов с наименьшим значением (в пределе все нужные элементы в рассматриваемой части имеют одинаковое значение).
При выборочном упорядочивании элементов массива сначала выделим нужную часть массива. Первый элемент третьей четверти массива имеет номер [n/2] + 1 = [17/2] +1 = [8,5] +1 = 8 + 1 = 9, последний элемент имеет номер [3*n/4] = [3*17/4] = [51/4] = [12,75] = 12.
Запишем элементы третьей четверти
Элементы x9 x10 x11 x12
Значения элементов 2 0 0 4
Обратные значения 0,5 ∞ ∞ 0,25
Упорядоченные элементы 0 0 2 4
Все элементы неотрицательны – равны 0 или больше 0, поэтому все элементы второй трети меняют своё положение в массиве.
При разработке алгоритма возникает проблема вычисления обратного значения для элементов равных нулю – деление на ноль недопустимо. Для решения этой проблемы нужно математическую ∞ заменить очень большим положительным числом – «машинной бесконечностью», например 1036. Для этого в алгоритме условие вида нужно заменить на
Тогда при вычислении обратного значения деления на ноль не будет, а на сравнение значений, отличных от нуля такое слагаемое не повлияет.
Алгоритм решения задачи
При разработке алгоритме будем использовать метод декомпозиции: решение задачи сначала опишем в виде основного алгоритма, использующего вспомогательные алгоритмы решения задач частей задания. Затем опишем вспомогательные алгоритмы – модули решения задач каждой части. При разработке и описании алгоритмов используются элементарные структуры алгоритмов, составляющие основу структурного программирования.
Основной алгоритм.
При разработке основного алгоритма нужно учесть обязательные требования, сформулированные в постановке задачи и рекомендации по разработке сложных программ:
1. Необходимо задачу решать в общем виде, для любых допустимых значений исходных данных.
2. Предусмотреть возможность выполнения 3 вариантов расчёта.
Введём вспомогательную переменную Vr для управления вариантом расчёта: если Vr =0 – тестовый расчёт, Vr = 1 – без Randomize, любое другое значение Vr – расчёт с Randomize.
3. Модули должны быть относительно независимы: обязательно иметь имя, свои входные, выходные и промежуточные данные, не использовать глобальные переменные, ввод и вывод данных в модуле может быть только в случае необходимости.
4. Действия алгоритма поясняются на естественном языке, в обозначениях постановки задачи, не используются конструкции языка программирования
Основной алгоритм