Лічильник
Сьогодні Разом
Відвідувань 340 5266040
Авторізацій 49 421854
Користувачів 40 2716
Статья

20. Индекс первого положительного элемента, но его может и не быть


Усложним задачу, убрав в условии гарантию того, что такой элемент обязательно существует. В этом случае, кроме проверки знака элемента, следует проверить и значение индекса элемента массива, сравнивая его с количеством всех элементов массива.

В этом случае поиск индекса первого положительного элемента может выглядеть так:
i := 1;
while (i <= n) and (a[i] <= 0) do
  i := i + 1;
Возникает вопрос: а имеет ли значение в каком порядке записывать простые условия, формируя составное? Что будет, если написать такой вариант решения задачи?
i := 1;                            // Внимание!
while (a[i] <= 0) and (i <= n) do  // Это плохой алгоритм,
  i := i + 1;                      // может привести к фатальной ошибке
Предположим, что положительного элемента в массиве не существует. В этом случае, наступит момент, когда значение переменной i станет равным n + 1, и при этом значении i будет попытка вычислить значение логического выражения оператором while: (a[i] <= 0) and (i <= n), что приведет к ошибке, так как i + 1 элемента массива не существует. Поэтому, правильно будет проверить первым условие (i <= n) на наличие самого элемента, и только в случае положительного результата такой проверки, проверить знак этого элемента.

Будем называть условие (i <= n) более сильным и поэтому ставим его на первое место. Это условие проверяет сам факт существования элемента. А проверка условия (a[i] <= 0) может быть сделана, только после того, как мы установили, что элемент существует.