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

Оператор (инструкцию) if можно записать двумя способами:

• Вариант 1.

if Условие

then

begin

{ Эти инструкции выполняются, если Условие истинно }

end

else

begin

{ Эти инструкции выполняются, если Условие ложно }

end;

• Вариант 2.

if Условие

then

begin

{ Эти инструкции выполняются, если Условие истинно}

end;

В последнем случае говорят о сокращенной форме условного оператора.

Ключевые слова if, then, else обозначают "если", "то", "иначе" соответственно. Выполнение условного оператора начинается с вычисления условия. Если оно истинно (true, "да", 1), то выполняется оператор, стоящий после служебного слова then. Если условие ложно (false, "нет", 0), то выполняется оператор, стоящий после служебного слова е1sе. Часть оператора, стоящая после служебного слова е1sе, может отсутствовать. В этом случае при ложности проверяемого условия просто выполняется следующая по порядку за оператором условия инструкция.

Действие условного оператора можно пояснить с помощью блок-схем (рис. 3.1, а, б).

Рис. 3.1. Условные обозначения на схемах алгоритмов: а - ветвления и б - обхода

Например:

If а>b then writeln (' а больше b')

else writeln ('а меньше или равно b');

Или:

If (а>=0) аnd (а<10) then writeln ('однозначное число');

Один оператор if может входить в состав другого оператора if. В этом случае говорят о вложенности операторов.

• Вариант 1.

IF условие 1 THEN

IF условие 2 THEN оператор 1

ELSE оператор 2

ELSE оператор 3;

• Вариант 2.

IF условие 1 THEN оператор 1

ELSE IF условие 2 THEN оператор 2

ELSE оператор 3;

• Вариант 3.

IF условие 1 THEN

IF условие 2 THEN оператор 1

ELSE оператор 2;

Если проверяемые Условие1, Условие2... не влияют друг на друга, т. е. последовательность их вычисления безразлична, в тексте программы их рекомендуется располагать в определенном порядке. Условие, с наибольшей вероятностью принимающее значение true, должно стоять на первом месте, с меньшей вероятностью — на втором и т. д. Это ускорит выполнение программы.

Следует знать:

• при вложенности операторов каждое е1sе соответствует тому then, которое непосредственно ему предшествует (обратите внимание на пример в варианте 3);

• конструкций со степенью вложенности более 2—3 необходимо избегать из-за сложности их анализа при отладке программы;

• в условных операторах часто используют составной оператор begin … end. Если между begin и end находится только одна инструкция, слова begin и end лучше не писать;

• в условных операторах точка с запятой не ставится после then и перед else;

• самое простое логическое выражение — одна переменная логического типа, которая играет роль целого выражения;

• сложные логические выражения могут содержать несколько отношений и/или логических переменных, связанных операциями and, оr, nod (не забывайте заключать каждое отношение в скобки);

• с целью предупреждения ошибок (см. разд. 1.4) выполнения инструкцию if удобно использовать для соответствующей проверки (см. листинги 3.5, 3.10).

Листинг 3.4 содержит программу, которая проводит тест по таблице умножения. Формируются два случайных сомножителя, затем подсчитывается их произведение и сравнивается с тем значением, который ввел ученик.

Листинг 3.4. Тест по таблице умножения (вариант 1)

var
    s1,s2: integer; { сомножители }
    otvet: integer; { ответ ученика }
begin
    randomize; { инициализация датчика случайных чисел }
    { s1, s2 — случайные числа в диапазоне от 2 до 19 включительно }
    s1:=random(18)+2;
    s2:=random(18)+2;
    write('Сколько будет ',s1,'*',s2,'?: ');
    readln(otvet);
    if otvet=s1*s2 then writeln('Правильно!')
        else writeln('Неверно...');
end.

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

Листинг 3.5. Вычисление частного двух целых чисел

var
    a,b: integer; { операнды — целые числа }
    result: real; ( результат — вещественное число }
begin
    write('Введите значение делимого а: '); read(a);
    write('Введите значение делителя Ь: '); read(b);
    if b=0 { контроль ввода }
    { условие выполнено }
    then writeln('Неверные исходные данные: делитель — ноль')
    { условие не выполнено }
    else
    { составной оператор нужен для объединения двух команд в единое целое }
        begin { начало составного оператора }
            result:=a/b;
            writeln('Частное чисел ',а,' и ',Ь,' = ', result:7:3);
        end; { конец составного оператора }
end.

Листинг 3.6 содержит программу, которая проверяет на четность введенное число.

Листинг 3.6. Проверка числа на четность

var n: integer;
begin
    write{'Введите целое число: '); readln(п);
    write('Число ',п,' — ');
    if n mod 2=0 then writeln('четное') else writeln('нечетное');
end.

Листинг 3.7 содержит программу, которая сравнивает возраст брата и сестры и выводит соответствующее сообщение.

Листинг 3.7. Сравнение возрастов (вариант 1)

var age1,age2: integer;
begin
    write('Введите возраст брата: '); readln(age1);
    write('Введите возраст сестры: ');readln(age2);
    if age1>age2 then writeln('Брат старше.')
      else if age2>age1 then writeln('Сестра старше.')
            else writeln('Они близнецы.');
end.

Запись вложенных условных операторов — непростая задача и часто вызывает затруднения у начинающих программистов. В этом случае лучше составлять программу таким образом, чтобы она не содержала вложенных условных операторов. Например, изменим текст предыдущей программы так, чтобы он содержал сокращенные условные операторы, не вложенные один в другой (листинг 3.8).

Листинг 3.8. Сравнение возрастов (вариант № 2)

var age1,age2: integer;
begin
    write('Введите возраст брата: '); readln(age1);
    write('Введите возраст сестры: ');readln(age2);
    if age1>age2 then writeln('Брат старше.');
    if age2>age1 then writeln('Сестра старше.');
    if age1=age2 then writeln('Oни близнецы.');
end.

Тем не менее, во многих случаях применение вложенных условных операторов позволяет избежать сложных условий с использованием логических функций.

Листинг 3.9 содержит программу, которая проверяет, может ли существовать треугольник с заданными сторонами. Из геометрии известно, что сумма двух любых сторон должна быть больше третьей. Эта программа иллюстрирует использование сложного условия.

Листинг 3.9. Проверка существования треугольника с заданными сторонами

var a,b,c: real;
begin
    write('Введите три действительных числа: '); readln(a,b,с);
    if (a+b>c) and (a+c>b) and (b+c>a) then
      writeln('Треугольник с такими сторонами существует!')
    else
      writeln('Треугольник с такими сторонами не существует...');
end.

Листинг 3.10 содержит программу решения квадратного уравнения с использованием сложных условий. Это пример, который иллюстрирует применение инструкции goto.

Листинг 3.10. Решение квадратного уравнения (вариант 1)

label lab1O1;
var
    a,b,с: real; { коэффициенты уравнения }
    x1,x2: real; { корни уравнения }
d: real; { дискриминант }
begin
    writeln('введите в одной строке значения коэффициентов а, Ь, с'); readln (a,b, с) ;
    if (a=0)and(b=0)and(c=0) then
      begin
           writeln('корень — любое число1); goto lab1O1;
      end;
    if (a=0)and(b=0)and(c<>0) then
      begin
            writeln('корней нет'); goto lab1O1;
      end;
    if (a=0)and(b<>0)and(c<>0) then
      begin
            x1:=-c/b;
            writeln('единственный корень:',x1:7:3); goto lab1O1;
      end;
    d:=b*b-4*a*c; { вычисление дискриминанта }
    if d>=0 then
      begin
            x1:=-b+sqrt(d)/(2*a); x2:=-b-sqrt(d)/(2*a);
            writeln('корни уравнения:');
            writeln('x1=',x1:7:3); writeln('x2=',x2:7:3);
      end
        else writeln('вещественных корней нет');
   lab1O1: { пустой оператор помечен меткой }
end.

 предыдущая         меню        вверх         следующая

Hosted by uCoz