C1 (повышенный уровень, время – 10 мин)
Тема:
Исправление ошибок в простой программе с условными операторами.
Что
нужно знать:
·
правила построения программы на Паскале, Бэйсике или Си
·
правила работы с переменными (объявление, ввод,
вывод, оператор присваивания)
·
ветвление
– это выбор одного из двух возможных
вариантов действий в зависимости от того, выполняется ли некоторое условие;
·
на блок-схеме алгоритма ветвление изображается в
виде блока-ромба с одним входом и двумя выходами:
·
если условие, записанное внутри ромба, истинно
(ответ «да» на вопрос «a=b?»), выполняются все команды,
входящие в блок-1 (ветка «да»), иначе (если условие ложно)
выполняются все команды в блоке-2 (ветка «нет»)
·
в неполной форме условного оператора блок-2
пустой (отсутствует); теоретически можно сделать наоборот – так, чтобы блок-1
оказался пустой, но это очень неграмотное решение, поскольку оно осложняет
понимание алгоритма, запутывает его
·
одна команда ветвления может находиться внутри
другой, например, так:
·
на этой схеме блок-10 выполняется,
когда a=b;
блок-11
– когда a=b=c,
блок-21
– когда a=b,
но a¹c и, наконец, блок-2
– когда a¹b
·
на этой схеме (Рисунок 3) одна команда ветвления
(с условием «a=c») вложена в другую (с условием «a=b»), каждая из них – это ветвление в полной
форме; если блок-12 будет пустой (отсутствует), внутреннее ветвление имеет
неполную форму; аналогично, если блок-2 пустой, то внешнее ветвление имеет
неполную форму
·
условный
оператор if–else служит для организации ветвления в
программе на языке Паскаль
·
условный оператор может иметь полную или
неполную форму; вот фрагменты программы, реализующие ветвления, показанные на
рисунках 1 и 2:
полная форма:
|
неполная форма:
|
if a = b then begin
{ блок-1 }
end
else begin
{ блок-2 }
end;
|
if a = b then begin
{ блок-1 }
end;
|
здесь
вместо комментариев в фигурных скобках (они выделены синим цветом) могут стоять
любые операторы языка программирования (в том числе операторы присваивания,
другие условные операторы, циклы, вызовы процедур и т.п.)
·
обычно при записи программы операторы,
находящиеся внутри обоих блоков, сдвигают вправо на 2-3 символа (запись
«лесенкой»), это позволяет сразу видеть начало и конец блока (конечно, если
«лесенка» сделана правильно)
·
после else не надо (нельзя!)
ставить какое-то условие, эта часть
выполняется тогда, когда условие после if неверно (частая ошибка – после else
пытаются написать условие, обратное тому, которое стоит после соответствующего
ему if)
·
в Паскале перед else не ставится точка с запятой, поскольку это ключевое слово
обозначает не начало нового оператора, а вторую часть условного оператора if–else
·
слова begin
и end (их называют также
«операторные скобки») ограничивают блок-1 и блок-2; если внутри
блока всего один оператор, эти «скобки» можно не писать, например, допустимы
такие операторы
if a = b then
c:=1
else c:=0;
|
if a = b then begin
c:=1;
end
else c:=0;
|
if a = b then c:=1;
|
·
а вот такие операторы недопустимы
if a = b then begin
c:=1
else c:=0;
|
if a = b then
c:=1;
end
else c:=0;
|
if a = b then
c:=1;
d:=1;
else x:=1;
|
o в
первом случае есть begin, но
забыли про соответствующий ему end;
o во
втором фрагменте наоборот, есть end,
а begin отсутствует;
if a = b then begin
c:=1;
d:=1;
end
else x:=1;
|
o третий
случай более сложный: судя по записи «лесенкой», здесь внутри блока-1 находятся
2 оператора, а
операторных скобок begin-end нет; в результате получилось, что оператор
c:=1 находится внутри
блока-1, он выполняется только при условии a=b;
оператор d:=1
выполняется всегда, после того, как условный оператор закончил работу; а else вообще «висит» непонятно как, тут
транслятор выдаст ошибку; исправить эту программу можно так, как показано
справа (добавив пару begin-end):
·
условный оператор может находиться внутри
другого условного оператора, как в блоке-1, так и в блоке-2; например, схема на
Рисунке 3 может быть записана на Паскале так
|