Наши проекты:
Журнал · Discuz!ML · Wiki · DRKB · Помощь проекту |
||
ПРАВИЛА | FAQ | Помощь | Поиск | Участники | Календарь | Избранное | RSS |
[3.146.255.127] |
|
Сообщ.
#1
,
|
|
|
Ограничения использования оператора FOR
Ограничения в использовании оператора цикла с параметром естественным образом вытекают из описания этого оператора. Рассмотрим еще раз по пунктам описание оператора For и вытекающие из этого следствия. 1. Параметр цикла должен быть ординального типа. Параметр цикла определяет в конечном счете порядковый номер повторения данного цикла; следовательно, он имеет дискретный характер и должен быть описан одним из ординальных типов. Если в программе описать параметр цикла как вещественную переменную, то при трансляции будет выдано сообщение Error 97: Invalid FOR control variable (неправильный параметр цикла FOR). 2. Параметр должен быть описан в том же блоке, где находится сам оператор цикла. Нарушение этого требования может привести к серьезным ошибкам при использовании подпрограмм т.к. использование глобальных переменных в п/п не рекомендуется! V. Использование переменных, описанных снаружи блока с циклом FOR может быть оправдано в нескольких относительно редких случаях, где необходимо обработать часть элементов массива по отличающемуся алгоритму, но в общем это неправильный стиль программирования. 3. Выражения, определяющие начальное и конечное значения параметра ("Выражение 1" и "Выражение 2"), должны быть ординального типа, совместимого с типом самого параметра цикла. Параметру цикла перед выполнением цикла присваивается значение выражения 1, в конце каждого цикла текущее значение параметра сравнивается со значением выражения 2, что и определяет требование совместимости типов параметра цикла и значений выражений 1 и 2. В случае нарушения данного требования при трансляции программы генерируется сообщение Error 26: Type mismatсh (несоответствие типов). 4. Шаг изменения параметра цикла равен +1 или -1. Если в программе шаг изменения параметра должен отличаться от значений +1 и -1, то нужно применить один из следующих способов: - вместо оператора For использовать операторы While или Repeat; - в цикле For задать соответствующий алгоритм изменения индексов. Пример 1. Для массива просуммировать отдельно элементы с четными и нечетными индексами. Type Ar = array[1..100] of real; Var i,n : byte; S1,S2 : real; X : Ar; Begin Ввод n, X Вариант 1: S1:=0; S2:=0; i:=2; While i<=n do Begin S1:=S1+x[i-1]; S2:=S2+x[i]; Inc(i,2); End; If odd(n) then S1:=S1+x[n]; Вариант 2: S1:=0; S2:=0; For i:=1 to n div 2 do Begin S1:=S1+x[2*i-1]; S2:=S2+x[2*i]; End; If odd(n) then S1:=S1+x[n]; В каждом цикле обрабатываются два элемента массива Х. Если их количество n нечетное, то последний элемент x[n] добавляется в сумму S1 после окончания работы цикла. 5. В теле цикла параметр не должен изменяться. Изменение параметра при каждом выполнении цикла непосредственно производят машинные команды, реализующие оператор For. Попытка изменения параметра в теле цикла зачастую приводит к получению неправильных результатов, в ряде случаев - к зацикливанию программы. Пример 2. Определить индекс первого отрицательного элемента в массиве . Type Ar = array[1..100] of real; Var i,k,n : byte; X : Ar; Begin Ввод n, X k:=0; For i:=1 to n do If x[i]<0 then Begin k:=i; i:=n+1 End; Writeln('k=',k); В данном случае для принудительного завершения цикла использован оператор i:=n+1 вместо оператора Break. Результат - зацикливание программы. V. В оригинале стояло "..оператора Exit", что, возможно, применимо в процедуре, но неверно для основной программы. 6. Начальное и конечное значения параметра цикла вычисляются только один раз, до начала цикла. Следовательно, изменение выражений 1 или 2 в теле цикла никакого влияния на его работу не оказывает. Вариант предыдущего примера: Type Ar = array[1..100] of real; Var i,k,n : byte; X : Ar; Begin Ввод n, X k:=0; For i:=1 to n do If x[i]<0 then Begin k:=i; n:=0 End; Writeln('k=',k); Здесь будет найден не первый, а последний отрицательный элемент. 7. При нормальном завершении цикла значение его параметра считается неопределенным. Способ реализации оператора For зависит от системы машинных команд конкретного типа ЭВМ. В зависимости от способа реализации параметр цикла i после завершения работы оператора For i:=1 to n do S:=S+x[i]; может иметь значение или n, или n+1. Поэтому использовать конечное значение параметра цикла при нормальном (не принудительном) его завершении не рекомендуется, поскольку это может привести к получению неправильных результатов. Пример некорректного использования параметра цикла: For i:=1 to n do S:=S+x[i]; k:=i+1; Создано по мотивам лекций Назаренко В.И. |
Сообщ.
#2
,
|
|
|
Это, конечно, хорошо. А как избежать этих ограничений?
Добавлено вопрос за место чайников |