Что такое цикл с постусловием? Каковы его отличия от цикла с предусловием?

Цикл с постусловием — это цикл, в котором условие проверяется после выполнения тела цикла. Это означает, что тело такого цикла всегда выполняется хотя бы один раз.

Классический пример — конструкция do...while.

let count = 1;

do {
  console.log(count);
  count++;
} while (count <= 5);
let count = 1;

do {
  console.log(count);
  count++;
} while (count <= 5);
package main
import "fmt"
func main() {
  count := 1

  for {
    fmt.Println(count)
    count++

    if count > 5 {
      break
    }
  }
}
public class Example {
  public static void main(String[] args) {
    var count = 1;

    do {
      System.out.println(count);
      count++;
    } while (count <= 5);
  }
}
count = 1

while True:
  print(count)
  count += 1
if not (count <= 5):
  break

Этот код выведет числа от 1 до 5.

Главная особенность

В цикле с постусловием сначала выполняется действие, а только потом проверяется условие продолжения или завершения.

Например:

let value = 10;

do {
  console.log(value);
} while (value < 5);
let value = 10;

do {
  console.log(value);
} while (value < 5);
package main
import "fmt"
func main() {
  value := 10

  for {
    fmt.Println(value)

    if value >= 5 {
      break
    }
  }
}
public class Example {
  public static void main(String[] args) {
    var value = 10;

    do {
      System.out.println(value);
    } while (value < 5);
  }
}
value = 10

while True:
  print(value)
if not (value < 5):
  break

Хотя условие value < 5 ложно, тело цикла все равно выполнится один раз.

Отличие от цикла с предусловием

Цикл с предусловием:

while (condition) {
  // тело цикла
}
while (condition) {
  // тело цикла
}
package main
func main() {
  for condition {
    // тело цикла
  }
}
public class Example {
  public static void main(String[] args) {
    while (condition) {
      // тело цикла
    }
  }
}
while condition:
  # тело цикла
  pass

Сначала проверяет условие, потом выполняет тело.

Цикл с постусловием:

do {
  // тело цикла
} while (condition);
do {
  // тело цикла
} while (condition);
package main
func main() {
  condition := false

  for {
    // тело цикла

    if !condition {
      break
    }
  }
}
public class Example {
  public static void main(String[] args) {
    do {
      // тело цикла
    } while (condition);
  }
}
while True:
  # тело цикла
  if not condition:
    break

Сначала выполняет тело, потом проверяет условие.

Сравнение

ПризнакЦикл с предусловиемЦикл с постусловием
Когда проверяется условиеДо тела циклаПосле тела цикла
Минимальное число выполнений01
Типичный операторwhiledo...while
Когда удобенКогда действие может быть вообще не нужноКогда действие нужно выполнить хотя бы один раз

Когда используется цикл с постусловием?

Он полезен, когда действие обязательно должно быть выполнено хотя бы один раз.

Например:

Пример с меню:

let command;

do {  command = 'exit';
  // условно: пользователь ввел команду
  console.log(`Команда: ${command}`);
} while (command !== 'exit');
let command: string;

do {  command = 'exit';
  // условно: пользователь ввел команду
  console.log(`Команда: ${command}`);
} while (command !== 'exit');
package main
import "fmt"
func main() {
  command := ""

  for {
    command = "exit"
    // условно: пользователь ввел команду
    fmt.Printf("Команда: %s
", command)

    if command == "exit" {
      break
    }
  }
}
public class Example {
  public static void main(String[] args) {
    String command;

    do {
      command = "exit";
      // условно: пользователь ввел команду
      System.out.println("Команда: " + command);
    } while (!command.equals("exit"));
  }
}
command = ''

while True:
  command = 'exit'
  # условно: пользователь ввел команду
  print(f'Команда: {command}')

  if command == 'exit':
    break

Вывод

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

Источники

  • Горбатов В.А., Горбатов А.В., Горбатова М.В. Дискретная математика: Учебник для студентов втузов. - М.: АСТ, 2014. - 448 с.
  • Горбатов В.А., Горбатов А.В., Горбатова М.В. Теория автоматов: учебник для втузов. - М.: АСТ, 2008. - 559 с.
  • Кузнецов О. П. Дискретная математика для инженера. - Санкт-Петербург [и др.]: Лань, 2009.
  • Содержание курса лекций «Языки программирования». Кафедра алгоритмических языков ВМК МГУ, 2018.
  • Босова Л.Л. Информатика. Базовый курс: учебник для 10-11 классов. - М.: БИНОМ. Лаборатория знаний, 2021.
  • Гладкий Ю.Н. Информатика и информационные технологии: учеб. пособие. - М.: КноРус, 2020.