Условия и выбор

Условия - очень важное понятие в программировании. В каждой хорошей программе есть пара десятков условных операторов, циклически проверяющихся на истинность.

Возьмём, к примеру, восточную игру Го. Смысл её состоит в том, чтобы окружать фишки (шарики, камешки) противника, удаляя их таким образом с поля. Программа, имитирующая игру в Го, после каждого хода проверяет, оркужены ли фишки одного игрока фишками другого. При обнаружении такого случая программа убирает окружённых с поля.

Перейдём к делу. В Паскале, как, впрочем, и во многих других языках, условный оператор начинается со слова if (если). Далее идёт само условие, например, I=1 . Затем идёт слово then и (лучше на следующей строчке) оператор, выполняющийся в случае истинности условия, причём только один. Можно (необязательно) предусмотреть реакцию программы на ложность условия, написав после всего этого слово else (иначе) и соответствующий оператор. Например:

program UgadayChislo;
var
  I, J: Integer;
begin
  I:=25; {Задуманное число}
  Write('Я загадал число. Сможешь угадать? ');
  ReadLn(J);
  if J = I then {Если число угадано}
    WriteLn('Угадал!!! Откуда ты его знаешь?')
  {Перед else точку с запятой не ставить!}
  else
    WriteLn('Ха-ха! Не угадал!');
  WriteLn('Нажми Enter'); {Этот и все последующие операторы не имеют никакого отношения к вышеописанному условию}
  ReadLn;
end.

Предусматриваются также знаки сравнения и сравнение выражений.

program Temperature;
var
  Temp: Integer; {Имя переменной может состоять из нескольких букв}
begin
  Write('Введите температуру: ');
  ReadLn(Temp);
  Write('Температура ', Abs(Temp),' градусов ');
  {Abs - функция, возвращающая в место вызова модуль данного числа, в данном случае значения переменной Temp}
  if Temp > 0 then
    Write('выше нуля')
  else
    if Temp < 0 then
    {В данном случае мы записываем ещё один условный оператор, потому что возможен третий случай, при котором Temp = 0}
      Write('ниже нуля');
  WriteLn; {Переход на новую строку}
  Write('Нажмите Enter');
  ReadLn;
end.

То, что оператор один, однако, нисколько не мешает делать несколько действий при одном условии. Конечно, можно подумать, что перед каждым действием нужно писать одно и то же условие. Например:

if I = 10 then
  I:=I + 1;
if I = 10 then
  WriteLn('Число увеличено. Вот оно: ', I);

Здесь приведён такой пример, который доказывает, что данный способ неэффективен. Ведь при выполнении первого условия значение I меняется, и в результате вывод текста не осуществится.

Есть другой, более верный способ: заключить оба этих действия в составной оператор. Составной оператор - это оператор, объединяющий несколько операторов в один. Записывается он также, как основной блок программы:

begin
  ...
end;

За исключением того, что после слова end ставится точка с запятой. Таким образом, предыдущий фрагмент можно исправить так:

if I = 10 then
begin
  I:=I + 1;
  WriteLn('Число увеличено. Вот оно: ', I);
end;

Можно для одной группы действий проверять несколько условий, объединяя их логическими операциями. Две наиболее часто используемые логические операции - and и or, означающие и и или соответственно. При объединении условий они заключаются в скобки. Вот пример программы, использующей обе операции.

program DvaChisla;
var
  I, J, K, L: integer;
begin
  I:=11; {Задуманные}
  J:=45;    {числа}
  Write('Я загадал два числа. Попробуй-ка их отгадать! ');
  ReadLn(K, L); {Числа вводить, разделяя их пробелом}
  if ((K = I) and (L = J)) {Если первое введенное число равно первому задуманному числу, и второе введенное равно второму задуманному}
  or ((K = J) and (L = I)) then {Альтернативнй вариант для случая, если числа введены в обратном порядке}
    WriteLn('С ума сойти! Ты экстрасенс?')
  else
    WriteLn('Я знал, что с двумя числами не справишься!');
  WriteLn('Нажми Enter');
  ReadLn;
end.

Бывают такие случаи, когда нужно выполнять те или иные действия при разных значениях одной переменной. В таких ситуациях неудобно использовать оператор if:

if I = 1 then
  ...
else
  if I = 2 then
    ...
  else
    if I = 3 then
      ...

Специально для таких случаев существует оператор выбора. Давайте разберём его строение.

  1  2  3
case I of
  4 5        6           7
  1 : WriteLn('Маловато');
              8
  2 : WriteLn('Нормально');
              9
  3 : WriteLn('Достаточно');
 10
else
         11
  WriteLn('Что?');
 12
end;

1 - слово, обозначающее начало оператора выбора;
2 - переменная, в зависимости от значения которой выполняется то или иное действие;
3 - за этим словом идёт основная часть оператора выбора;
4 - одно или несколько значений, при котором/ых выполняется указанное далее действие; несколько значений указывается через запятую: 1, 2, 3 , или промежутком: 1..11 (от 1 до 11);
5 - разделитель значений 4 и оператора 6;
6 - оператор, выполняющийся в случае принадлежности значения переменной 2 величинам, указанным в пункте 4; можно использовать составной оператор;
7 - конец оператора;
8 - очередной вариант; как и первый, состоит из пунктов 4, 5, 6, 7;
9 - очередной вариант;
10 - за этим словом идёт оператор, выполняемый в любом другом случае; и слово, и оператор можно не писать;
11 - собственно оператор;
12 - конец оператора выбора.

Конечно, оператор выбора сложен, особенно на первый взгляд, но зато очень удобен: в нём всё "разложено по полочкам".

Часто такой вид оператора используют для создания меню. В зависимости от введённого числа выполняется та или иная команда. Например:

program Razvilka; {Программа "Развилка"}
var
  I: Integer;
begin
  WriteLn('1. Прямо');
  WriteLn('2. Налево'); {Меню}
  WriteLn('3. Направо');
  ReadLn(I); {Выбор предоставляется пользователю}
  case I of
    1: Write('Убиту');  {Разный текст}
    2: Write('Женату'); {в зависимости}
    3: Write('Богату'); {от введённого числа}
  else {Если любое другое число}
    Write('Непоняту'); {Такого нет}
  end;
  Write(' быть'); {Окончание фразы}
  ReadLn;
end.

Ну вот, наконец-то, и всё. Этих знаний вполне хватает для создания разветвляющихся программ.

Оглавление
Hosted by uCoz