Урок 6. Цикл Паук. Упрощённый цикл Паук


#1

Цикл Паук (Spider). Модифицированный цикл Дейкстры с явными условиями выхода.

Цикл Дейкстры не содержит явного условия продолжения или выхода. Поэтому была предложена усложнённая конструкция цикла Дейкстры, получившая название "цикл-паук".

В нотации Дейкстры она выглядит следующим образом:

 do
    P1→S1,
      …
    Pn→Sn
  out
    Q1→T1,
      …
    Qn→Tn
  else
    E
 od

где:

  • do — маркер начала конструкции цикла,

  • od — маркер завершения конструкции цикла,

  • Pii-тое охраняющее условие (логическое выражение, которое может иметь значение «истинно» или «ложно»),

  • Sii-я охраняемая команда.

  • После маркера out добавлены ветви завершения, состоящие из условий выхода Qi и команд завершения Ti.

  • Кроме того, добавлена ветвь альтернативного завершения else с командой E.

    Цикл-'паук' выполняется так:

  1. Вычисляются охраняющие условия.
  2. Если существует истинное охраняющее условие, выполняется соответствующая охраняемая команда.
  3. Вычисляются условия выхода.
  4. Если существует истинное условие выхода, выполняется соответствующая команда завершения, после чего выполнение цикла заканчивается.
  5. Если все условия выхода ложны, начинается следующая итерация, но только в том случае, если в текущей итерации было истинным хотя бы одно из охраняющих условий.
  6. Если в данной итерации оказались ложными и все охраняющие условия, и все условия выхода, выполняется команда альтернативного завершения E, после чего выполнение цикла прерывается.

Пример реализации цикла Паука:

static void Main()
{
    char character = '\0';
    
    bool flag = default(bool);

    for (; ; )
    {
    Start:
        flag = false;
        character = Console.ReadKey().KeyChar;

        switch (character)
        {
            case 'l': // 'l' - охраняющее условие 1.
                {
                    Console.WriteLine("Go left"); flag = true; break; // охраняемая команда.
                }
            case 'r': // 'r' - охраняющее условие 2.
                {
                    Console.WriteLine("Go right"); flag = true; break; // охраняемая команда.
                }
        }

        switch (character)
        {
            case 'x': // 'x' - условие выхода 1.
                {
                    Console.WriteLine("Exit"); goto End; // команда завершения.
                }
            case 'q': // 'q' - условие выхода 2.
                {
                    Console.WriteLine("Quit"); goto End; // команда завершения.
                }
        }

        // Ветвь альтернативного завершения.
        if (flag)
        {
            goto Start;
        }

        Console.WriteLine("Alternative exit");

    End:
        break;  // Прерывание цикла.
    }

    // Delay.
    Console.ReadKey();
}

Его работа:

12 13 14

Упрощённый цикл Паук состоит в том, что альтернативный выход помещается в блок default переключателя отвечающего за прекращение выполнения цикла, что помогает избежать использования оператора безусловного перехода goto и использования дополнительной переменной флага:
char character = '\0';

for (; ; )
{
      character = Console.ReadKey().KeyChar;

     switch (character)
     {
          case 'l': // 'l' - охраняющее условие 1.
          {
               Console.WriteLine("Go left"); continue; // охраняемая команда.
          }
           case 'r': // 'r' - охраняющее условие 2.
          {
               Console.WriteLine("Go right"); continue; // охраняемая команда.
          }
     }

     switch (character)
     {
           case 'x': // 'x' - условие выхода 1.
          {
               Console.WriteLine("Exit"); break; // команда завершения.
           }
           case 'q': // 'q' - условие выхода 2.
          {
               Console.WriteLine("Quit"); break; // команда завершения.
          }
          default: // Ветвь альтернативного завершения.
          {
               Console.WriteLine("Alternative exit"); break;
          }
     }
                       
     break;  // Прерывание цикла.
}

Источник: видеоурок Александра Шевчука "ВИДЕОУРОК №6. ЦИКЛИЧЕСКИЕ КОНСТРУКЦИИ".

%D1%81%D1%82%D1%80%D0%B5%D0%BB%D0%BA%D0%B0%20%D0%B2%D0%BB%D0%B5%D0%B2%D0%BE%202 предыдущая статья | следующая статья %D1%81%D1%82%D1%80%D0%B5%D0%BB%D0%BA%D0%B0%20%D0%B2%D0%BF%D1%80%D0%B0%D0%B2%D0%BE%202


Урок 6. Алгоритм Дейкстры (Цикл Дейкстры)
Содержание справочника С# Starter