Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Turbo Pascal / Stud_1_1 / LecRus / MainPart.doc
Скачиваний:
116
Добавлен:
03.03.2016
Размер:
5.03 Mб
Скачать

1. Параметр цикла должен быть ординального типа.

Параметр цикла определяет в конечном счете порядковый номер повторения данного цикла; следовательно, он имеет дискретный характер и должен быть описан одним из ординальных типов. Если в программе описать параметр цикла как вещественную переменную, то при трансляции будет выдано сообщение

Error 97: Invalid FOR control variable

(неправильный параметр цикла FOR).

2. Параметр должен быть описан в том же блоке, где находится сам оператор цикла.

Нарушение этого требования может привести к серьезным ошибкам при использовании подпрограмм и будет рассмотрено при изучении процедур и функций.

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 после окончания работы цикла.

Вариант 1 наиболее универсален в том смысле, что пригоден при любом шаге перебора элементов массива. Если же шаг равен 2, то для данной задачи наиболее эффективным является вариант 3.

Вариант 3:

S1:=0; S2:=0;

For i:=1 to n do

If odd(i) then

S1:=S1+x[i]

Else

S2:=S2+x[i];

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 вместо оператора Goto. Результат - зацикливание программы.

Соседние файлы в папке LecRus