Выбор и итерация
| English | Русский |
|---|---|
| selection/sɪˈlekʃn/ | выбор |
| iteration/ˌɪtəˈreɪʃn/ | итерации |
| trace table/treɪs ˈteɪbl/ | трассировочная таблица |
| nested/ˈnestɪd/ | вложенный |
| logic error/ˈlɒdʒɪk ˈerə/ | логическая ошибка |
| count-controlled loop/kaʊnt kənˈtrəʊld luːp/ | цикл с числовым управлением |
| array/əˈreɪ/ | массив (array) |
| pre-condition loop/priː kənˈdɪʃn luːp/ | цикл с предварительным условием |
| post-condition loop/pəʊst kənˈdɪʃn luːp/ | цикл с последующим условием |
| dry run/draɪ rʌn/ | сухой прогон |
Одна лишняя строка
- В 2014 году Apple выпустила обновление безопасности из-за одной повторяющейся строки. Глубоко внутри кода, проверяющего сертификат веб-сайта,
goto fail;出现了 дважды подряд. - Вторая копия находилась вне своего
IF, поэтому она выполнялась каждый раз, а проверка ниже нее никогда не срабатывала. Месяцами любой злоумышленник мог притвориться любым веб-сайтом. - Выбор (Selection) и итерация (Iteration) — это конструкции,决定ющие, что выполнять и сколько раз. Допустите одну ошибку в них, и программа все еще будет работать, но неправильно.
- Этот урок посвящен IF, CASE и трем циклам, а также таблице отслеживания (trace table), которая ловит ошибку перед экзаменом.
Выбор
IF возраст >= 18 THEN … ELSE … ENDIF
ELSEявляется необязательным, аENDIF— нет. КаждаяIFдолжна быть закрыта.- Условие — любое логическое выражение: сравнение или несколько сравнений, соединенных через
AND,ORиNOT.

*Конструкция IF … ELSE проверяется один раз, после чего выполняется ровно одна ветвь
Вложенные IF и границы
- Вложенный IF — это IF внутри ветви другого IF, и каждая такая конструкция требует собственного
ENDIF. - Потери баллов происходят из-за границ. Утверждение «Оценка 50 или выше — это успех» является
Mark >= 50, а неMark > 50. - Неправильное сравнение — это логическая ошибка: программа запускается и выдает неверный результат для некоторых входных данных. Трассировка с граничным значением, самим числом 50, помогает ее обнаружить.
"Оценка 50 или выше проходит" записывается как IF Mark ____ 50 THEN.
"Или больше" включает само значение 50, поэтому используется сравнение «больше или равно». > не passed бы студента ровно на 50.
СЛУЧАЙ
CASE OF Grade … ENDCASEпроверяет одно значение на соответствие нескольким вариантам и выглядит чище, чем цепочка вложенных IF.- Охранительным условием может быть одно значение
"A":, список значений1, 2, 3:или диапазон1 TO 5:. Последняя ветвь для «любого другого случая» — этоOTHERWISE, никогда не условие вроде> 200. - Охранительные условия проверяются по порядку. При наличии
1 TO 50:перед40 TO 60:значение 45 попадет в первую ветку, поэтому присваивание во второй может не выполниться вообще. Если предыдущие ветки покрывают все возможные значения, то иOTHERWISEтакже не выполнится.

CASE выполняет первую ветку, чей охранитель совпадает со значением
Конструкция CASE чище, чем вложенные IF, когда вы:
CASE сопоставляет одно значение со многими возможностями; глубокие вложенные IF становятся трудными для чтения.
Какие из этих условий являются допустимыми стражами в конструкции CASE Cambridge? Выберите все подходящие варианты.
Одно значение, список значений, диапазон и OTHERWISE. Сравнение, например, > 200, не является стражем; все, что не покрыто, попадает в OTHERWISE.
Разобранный пример: переписать CASE без использования CASE
CASE OF MySwitchс1: ThisChar ← 'a',2: ThisChar ← 'y',3: ThisChar ← '7',OTHERWISE: ThisChar ← '*'.- Каждое значение становится отдельной веткой цепочки IF, а
OTHERWISEпревращается в финальныйELSE.
IF MySwitch = 1 THEN
ThisChar <- 'a'
ELSE
IF MySwitch = 2 THEN
ThisChar <- 'y'
ELSE
IF MySwitch = 3 THEN
ThisChar <- '7'
ELSE
ThisChar <- '*'
ENDIF
ENDIF
ENDIF
- Три IF и три ENDIF. В обратном направлении: два оператора CASE, присваивающих одинаковое значение, объединяются в один охранитель со списком значений,
1, 2:.
Три цикла
- Итерация повторяет блок, а три цикла различаются тем, где именно проверяется условие.
- Цикл с управляющим счетчиком,
FOR i ← 1 TO 10 … NEXT i, выполняется известное количество раз;STEP -1отсчитывает вниз. Применяйте его для фиксированного количества итераций или для каждого элемента массива. - Цикл с предварительным условием,
WHILE … DO … ENDWHILE, проверяет до каждой итерации, поэтому может не выполниться ни разу. Цикл с постусловием,REPEAT … UNTIL, проверяет после каждой итерации, поэтому выполняется как минимум один раз.

Расположение условия определяет, сколько раз может выполниться тело цикла
Соотнесите каждый цикл с моментом, когда его следует использовать.
FOR = управление счетчиком; WHILE = условие проверяется до (0+ проходов); REPEAT = условие проверяется после (1+ проходов).
REPEAT...UNTIL проверяет свое условие ПОСЛЕ тела, поэтому тело всегда выполняется хотя бы один раз.
Это тест послусловия отличает его от WHILE, который может выполниться ноль раз.
Выбор цикла: ответ на два балла
- Один балл за название, один за причину, сформулированные словами схемы оценивания.
- Управляемый счетчиком, так как количество итераций известно до начала цикла. С постусловием, так как тело цикла должно выполниться хотя бы один раз. С предварительным условием, так как цикл может вообще не потребоваться.
- Обход четырех элементов массива, написанный с помощью
WHILEи счетчика, считается «не самым подходящим»; наиболее подходящим является FOR, поскольку количество известно.
Вопрос просит вас «выбрать более подходящий цикл и обосновать свой выбор» за 2 балла. За что получают эти два балла?
Один балл за цикл, один за причину: счетчик известен, тело должно выполниться хотя бы один раз, или цикл может вообще не выполниться.
Разобранный пример: какой цикл подходит для каждой задачи?
- Вывести таблицу умножения на 12: количество известно заранее, поэтому используется цикл FOR.
- Продолжайте считывать числа, пока пользователь не введёт 0: количество неизвестно, а первый ввод может уже быть 0, поэтому проверка должна предшествовать телу цикла: цикл WHILE.
- Запрашивать пароль, пока он не будет введен верно: пользователя нужно спросить хотя бы один раз, поэтому используется цикл REPEAT … UNTIL.
- Задать два вопроса: сколько раз, и должно ли тело выполняться до первой проверки?
"Продолжайте запрашивать пароль, пока он не будет правильным, но всегда спрашивайте хотя бы один раз." Какой цикл подходит?
Вы должны спросить хотя бы один раз, поэтому естественным выбором является REPEAT...UNTIL с послусловием.
Таблицы трассировки
- Таблица трассировки фиксирует значение каждой переменной при ручном прогоне алгоритма. Это способ тестирования цикла на бумаге и типичный вопрос на шесть баллов в большинстве Papers 2.
- Один столбец на переменную плюс столбец для любого вывода. Записывайте новую строку только тогда, когда значение меняется, и оценивайте условие цикла в момент достижения им этой точки.
- Продолжайте до тех пор, пока условие не завершит цикл, затем запишите финальный вывод.
Отследите цикл, проход за проходом
Таблица трассировки фиксирует каждую переменную после каждого прохода цикла. Следите за тем, как счетчик i растет, пока накапливается текущая сумма — именно это требуется заполнить в вопросе по трассировке на экзамене.
После total = 0; FOR i = 1 TO 5: total = total + i каково значение total?
Сложение 1+2+3+4+5 = 15 — именно так таблица трассировки накапливает результат проход за проходом.
Разобранный пример: заполненная таблица трассировки
Count <- 1
Total <- 0
WHILE Total < 10 DO
Total <- Total + Count
Count <- Count + 1
ENDWHILE
OUTPUT Count
- Строки (Count, Total): (1, 0) → (2, 1) → (3, 3) → (4, 6) → (5, 10).
- При Total = 10 условие
Total < 10ложно, цикл заканчивается, и вывод составляет 5. - Последняя строка — самая частая причина ошибок: проверьте условие еще раз перед записью вывода.
В разобранной трассировке цикл заканчивается со значением Total = 10 и Count = 5, поэтому вывод равен 5.
После четвертого прохода Total достигает 10, условие Total < 10 становится ложным, а Count увеличивается до 5.
Потерянные баллы
>=и>— разные ответы. Проверьте граничное значение в уме перед написанием сравнения.OTHERWISE— это ключевое слово, а не условие. А каждыйIF,CASE,WHILEиFORзавершаетсяENDIF,ENDCASE,ENDWHILEилиNEXT.WHILEможет не выполниться ни разу;REPEAT— нет. Выбирайте исходя из того, должно ли тело выполниться один раз до первой проверки.- В таблице трассировки неизменное значение не перезаписывается, а вывод записывается только тогда, когда выполняется строка
OUTPUT.
Вы поняли
- IF … ELSE … ENDIF для выбора; вложенные IF каждый закрывается отдельно; CASE для одного значения против множества охранителей, проверяемых по порядку,
OTHERWISE— последний - FOR — счетчик известен · WHILE — проверка до, может не выполниться · REPEAT … UNTIL — проверка после, выполняется хотя бы один раз
- Обосновать цикл его названием и причиной: известный счетчик, может не выполниться, должен выполниться один раз
- таблица трассировки вручную прогоняет алгоритм по одной строке на изменение; проверьте условие еще раз перед финальным выводом