Root /ArchiveAbout
()

Условный оператор

Условный оператор

На предыдущей странице мы разобрались, что такое оператор присваивания – он используется для придания переменным конкретных значений. Следующим по важности использования можно назвать условный оператор. Но в чем его суть?

Условный оператор в Pascal

Помните, как в старой доброй сказке витязь стоял перед вещим камнем и читал надпись не нем: «Направо пойдёшь – коня потеряешь, себя спасёшь; налево пойдёшь – себя потеряешь, коня спасёшь; прямо пойдёшь – и себя и коня потеряешь»? Чего ждал он, о чем размышлял? Естественно, о проблеме выбора, ведь у него стояла не лёгкая задача – в любом случае витязь что-то терял. Благо, что нам нечего терять, но выбирать придется.

Представим себе классическую задачу решения квадратного уравнения: если дискриминант положительный – тогда уравнение имеет два разных решения, если он равен нулю – то одно, а при отрицательном дискриминанте вещественных решений нет вообще. Идея здесь одна – решение квадратного уравнения зависит от дискриминанта, а точнее – от его знака. Или ещё задача: определить количество дней в году. Естественно, что количество дней зависит от того, является год високосным или нет.

А вот пример геометрической задачи подобного рода: выяснить, будут ли три числа a, b и c сторонами треугольника. Мы знаем, что три числа будут сторонами некоего треугольника тогда и только тогда, когда сумма любых двух сторон этого треугольника больше третьей стороны. Здесь тоже, как мы видим, решение задачи зависит от некоторых условий (трех неравенств).

Эти три задачи объединяет одно: здесь нельзя просто так составить программу на Паскале, чтобы задача решалась «одним махом» – из-за наличия определенных условий. Поэтому в таких случаях на помощь приходит условный оператор, который распределяет выполнение операторов в зависимости от условий. Записывается следующим образом:

..................

if <условие> then <оператор1>
else <оператор2>;

..................

Эта конструкция работает по такому принципу. Сначала проверяется условие (после if); если оно истинно, то выполняется оператор1 (после then), в противном случае – оператор2 (после else). И ещё: if означает «если», then – «тогда», else – «иначе». Все это зарезервированные слова в Pascal, всегда выделяются жирным шрифтом. Ещё одно важное замечание: перед else никогда не ставится точка с запятой, поскольку оно составляет единое целое с if и then. Поясним, как используется условный оператор на простом примере:

var
  t: real; { Температура воздуха }

begin
  writeln('Введите температуру воздуха:');
  readln(t); 
  if t > 0 then writeln('вода не замерзла')
  else writeln('вода замерзла');
  readln
end.

**type** real;: Представляет число двойной точности с плавающей запятой.Размер: 8 байт Количество значащих цифр: 15 - 16 Диапазон значений: -1.8∙10308 .. 1.8∙10308 Перепишите этот небольшой код в среду PascalABC.Net и запустите (кнопка F9 на клавиатуре). Посмотрите, как программа работает. Здесь идет проверка температуры t воздуха – если она больше 0 (условие t > 0 после if), то выполняется оператор после then и мы увидим ответ: «вода не замерзла»; в противном случае (то есть при температуре от 0 и ниже: t ≤ 0 - это условие противоположное по отношению к предыдущему t > 0) выполнится оператор после else и ответ будет другим: «вода замерзла» (без кавычек). Это пример простейшей задачи на использование условного оператора. Другие задачи такого типа вы можете посмотреть в материале Сравнение чисел.

В этой задаче, правда, мы не учли температуру кипения воды (при нормальном атмосферном давлении - 100°С). Поэтому перепишем предыдущую программу немного по-другому:

var
  t: real;

begin
  writeln('Введите температуру воздуха:');
  readln(t);
  if t <= 0 then writeln('вода замерзла')
  else
    if t < 100 then writeln('вода нагревается')
    else writeln('вода закипела');
  readln
end.

**type** real;: Представляет число двойной точности с плавающей запятой.Размер: 8 байт Количество значащих цифр: 15 - 16 Диапазон значений: -1.8∙10308 .. 1.8∙10308 Здесь надо сделать некоторые пояснения. Сначала мы проверяем отрицательную или нулевую температуру (t≤0): если это действительно так, то выполняется оператор вывода write('вода замерзла')– это и есть оператор1. В противном случае (то есть, если температура положительная) должен быть выполнен оператор2, стоящий после else. Но мы видим, что там находится ещё одна конструкция условного оператора со своими if, then и else.

Тогда постает вопрос: что именно считать оператором2? А как раз эта вся конструкция и будет оператором2, поскольку программой она воспринимается как один оператор (условный оператор - единственный оператор, состоящий из трех частей: if - then - else). Таким образом, здесь мы будем проверять положительные температуры: если температура меньше 100 (t<100), то выполнится оператор вывода write('вода нагревается'), иначе (от 100 и выше градусов) вступит в действие write('вода закипела'). Все это будет относиться к первому else.

Перепишите программу в PascalABC.Net и запустите. Вводите разные значения, помня, что при температуре от 0° и ниже вода замерзает, от 100° и выше – закипает, а во всех остальных случаях не замерзает и не закипает. Если результаты совпадают, значит программа работает.

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

...................

if <условие> then
 begin
   <оператор1.1>;
   <оператор1.2>;
   . . . . . . .
   <оператор1.N>;
 end
else
 begin
   <оператор2.1>;
   <оператор2.2>;
   . . . . . . .
   <оператор2.M>;
 end;

..................

Как видно, при истинности условия выполняется одна группа из N операторов, а при ложности – другой набор из M операторов. Условие (между if и then) тоже может состоять из нескольких частей. Для примера решим задачу о существовании треугольника по его сторонам:

Задача. Дано три числа: a, b и c. Определить, существует ли треугольник со сторонами, равными этим числам.

Как упоминалось выше, треугольник будет существовать при выполнении трех условий: a+b>c, b+c>a, c+a>b. Поскольку все три неравенства должны выполняться одновременно, то мы их объединим оператором and (логическое «и»). В итоге получим:

program treugolnik;
var
  a, b, c: real;

begin
  writeln('Введиде три положительные числа:');
  readln(a, b, c);
  write('Треугольник со сторонами ', a, ', ', b, ' и ', c);
  { Проверяем условие существования треугольника: }
  if (a+b>c)and(b+c>a)and(c+a>b) then writeln(' существует')
  else writeln(' не существует');
  readln
end.

**type** real;: Представляет число двойной точности с плавающей запятой.Размер: 8 байт Количество значащих цифр: 15 - 16 Диапазон значений: -1.8∙10308 .. 1.8∙10308 Как видно из программы, после if идет объединение сразу трех логических выражений, которые должны выполняться в одном условии. Обычно в таких случаях все три выражения берут в скобки, но здесь этого делать не обязательно. Для проверки работоспособности написанной нами программы перепишите её в PascalABC.Net и запустите (кнопка F9 на клавиатуре). Помните, что числа вводятся через пробел. Посмотрите, как работает программа. Всегда старайтесь именно переписывать, а не копировать код со страницы – в этом случае процесс осмысления материала идет намного быстрее.