pascal Как НЕ НАДО форматировать код. Разбор ошибочных ситуаций с пояснениями
Primary tabs
[О том как надо читайте тут]
Рассмотрим ошибочные примеры, поясним почему они неправильны и приведем правильные варианты.
Пример №1
Исходный код (см. оригинал):
begin readln(b); if(a>b)then writeln(12); readln();
Разберем недочеты и исправим по шагам:
- Строка 2 - все правильно, главные операторные скобки порождают основной блок программы, всё в его теле должно быть сдвинуто вправо.
- Строка 3 - if отформатирован неправильно, он находится в том же блоке что и readln, а именно в основном теле программы, а потому должен быть на том же уровне, что и предыдущее действие (в данном случае readln) ,исправляем эту проблему в 3 строке и получаем:
begin readln(b); if(a>b)then writeln(12); readln();
- Строка 4 -- тоже неправильно, на деле if как раз порождает новый вложенный блок для ветки then, в нашем случае это значит, что помимо отступа в теле программы мы должны прибавить ещё один такой же отступ, так чтобы в итоге он стал двойным (так как у действия в 4-ой строке глубина вложенности = 2, оно не только вложено как и все в тело программы, которое ограничено главными операторными скобками, но ещё и вложено в ветку then, $1 + 1 = 2$ -- отсюда и двойная вложенность), исправляем проблему:
begin readln(b); if(a>b)then writeln(12); readln();
- Строка 5 -- как мы помним из урока по if, в случае если ветка оператора ветвления не ограничена операторными скобками, к этой ветке относится только одно действие (в данном случае, то что в 4ой строке), а то что дальше - не относится.
А если не относится - значит мы вышли из блока двойной вложенности и вложенность снова стала $n-1$, то есть на 1 меньше в сравнении с той, чтобы была для ветки оператора ветвления if.
В нашем случае $2 - 1 = 1$, а значит readln просто нужно отформатировать на уровне тела программы, т.е. с одинарным отступом, исправляем:begin readln(b); if(a>b)then writeln(12); readln();
- Log in to post comments
- 2918 reads