На главную Наши проекты:
Журнал   ·   Discuz!ML   ·   Wiki   ·   DRKB   ·   Помощь проекту
ПРАВИЛА FAQ Помощь Участники Календарь Избранное RSS
msm.ru
! Друзья, соблюдайте, пожалуйста, правила форума и данного раздела:
Данный раздел не предназначен для вопросов и обсуждений, он содержит FAQ-заготовки для разных языков программирования. Любой желающий может разместить здесь свою статью. Вопросы же задавайте в тематических разделах!
• Если ваша статья может быть перенесена в FAQ соответствующего раздела, при условии, что она будет оформлена в соответствии с Требованиями к оформлению статей.
• Чтобы остальным было проще понять, указывайте в описании темы (подзаголовке) название языка в [квадратных скобках]!
Модераторы: Модераторы
  
> Ограничения использования оператора FOR , [Pascal]
    Ограничения использования оператора FOR

    Ограничения в использовании оператора цикла с параметром естественным образом вытекают из описания этого оператора. Рассмотрим еще раз по пунктам описание оператора For и вытекающие из этого следствия.

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

    ExpandedWrap disabled
      Error 97: Invalid FOR control variable

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

    2. Параметр должен быть описан в том же блоке, где находится сам оператор цикла.
    Нарушение этого требования может привести к серьезным ошибкам при использовании подпрограмм т.к. использование глобальных переменных в п/п не рекомендуется!

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

    3. Выражения, определяющие начальное и конечное значения параметра ("Выражение 1" и "Выражение 2"), должны быть ординального типа, совместимого с типом самого параметра цикла.
    Параметру цикла перед выполнением цикла присваивается значение выражения 1, в конце каждого цикла текущее значение параметра сравнивается со значением выражения 2, что и определяет требование совместимости типов параметра цикла и значений выражений 1 и 2. В случае нарушения данного требования при трансляции программы генерируется сообщение

    ExpandedWrap disabled
      Error 26: Type mismatсh

    (несоответствие типов).

    4. Шаг изменения параметра цикла равен +1 или -1.
    Если в программе шаг изменения параметра должен отличаться от значений +1 и -1, то нужно применить один из следующих способов:
    - вместо оператора For использовать операторы While или Repeat;
    - в цикле For задать соответствующий алгоритм изменения индексов.

    Пример 1. Для массива просуммировать отдельно элементы с четными и нечетными индексами.

    ExpandedWrap disabled
      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. Определить индекс первого отрицательного элемента в массиве .
    ExpandedWrap disabled
      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 в теле цикла никакого влияния на его работу не оказывает.
    Вариант предыдущего примера:

    ExpandedWrap disabled
      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 после завершения работы оператора

    ExpandedWrap disabled
      For i:=1 to n do
        S:=S+x[i];

    может иметь значение или n, или n+1. Поэтому использовать конечное значение параметра цикла при нормальном (не принудительном) его завершении не рекомендуется, поскольку это может привести к получению неправильных результатов.
    Пример некорректного использования параметра цикла:

    ExpandedWrap disabled
      For i:=1 to n do
        S:=S+x[i];
      k:=i+1;


    Создано по мотивам лекций Назаренко В.И.
    Сообщение отредактировано: Jin X -
      Это, конечно, хорошо. А как избежать этих ограничений?

      Добавлено
      вопрос за место чайников :P
      0 пользователей читают эту тему (0 гостей и 0 скрытых пользователей)
      0 пользователей:


      Рейтинг@Mail.ru
      [ Script execution time: 0,0557 ]   [ 16 queries used ]   [ Generated: 19.04.24, 03:52 GMT ]