3.2.4. Усеченный условный оператор и оператор безусловного перехода goto

 

        Возможно использование усеченного условного оператора

              if условие then оператор;

 

При этом, если условие не выполняется, то ветвь then игнорируется и управление передается оператору, следующему за условным оператором.

Кроме того, в программе иногда удобно использовать оператор exit, чтобы досрочно прекратить ее выполнение.

Часто можно пользоваться метками, которые отмечают некоторые нужные программисту операторы программы. Метки – это набор цифр или букв, отделяемые от помечаемых операторов двоеточием (см. программу ниже). В языке Паскаль принято перед использованием метки описывать, т.е. перечислять в блоке описания label через запятую. Можно организовать переход к метке с помощью оператора goto m, где m - метка. Рассматриваемую выше задачу теперь можно запрограммировать по-другому.

 

Program vetv2;

   label 1;                                { описание меток}

   var

      x, f, A: real;

begin

   write(‘Введите x ’);

   read(x);

   A:=sqr(x) – 3*x – 15;

   if A>0 then goto 1;

   writeln (‘при x=’,x:2:1,’ функция не определена’);

   exit;                                              {прекращение программы}

1: f:=1/sqrt(A);                      {метка}

   writeln(‘x=’,x:3:1,’  f=’,f:6:3);

end.

 

Однако такая программа считается хуже предыдущей, так как использует оператор goto. В настоящее время считается возможным программировать вообще без goto. Рассмотрим еще один пример.

Задача 3.2.2: Написать программу, которая рассчитывает работу 1 моля газа в течение одного из изопроцессов. Начальные температура, объем и давление известны. Программа запрашивает наименование процесса и недостающие параметры.

Решение.

Обычно рассматриваются три вида изопроцессов:

·        Изобарический (p-const). Работа газа ;

·        Изотермический (Т-const). Работа газа

·        Изохорический (V-const). Работа газа А = 0.

Приведенная ниже программа написана так, что пользователь сначала вводит с клавиатуры номер изопроцесса. Если процесс изохорический, то расчет производить не надо, программа сообщает результат (А=0) и заканчивает работу (по оператору exit). Если процесс не изохорический, то вводятся с клавиатуры начальный и конечный объемы газа, а затем, в зависимости от номера изопроцесса, запрашиваются дополнительные данные и производится расчет по соответствующей формуле. Использование логических операторов позволяет запрашивать только необходимые данные.

 

Program vetv3;

const R=8.31;

   var  

       i:integer;

       p,V1,V2,T, A: real;

begin

   write(‘Выберите изопроцесс: 1.p-const; 2.Т-const; 3.V-const ’);

   read(i);

   if i=3 then

      begin

         writeln(‘Изохорический процесс А=0’);

         exit;                     {оператор прекращает работу программы}

      end;

   write(‘Введите начальный и конечный объем ');

   read(V1,V2);

   if i=1 then

      begin

         writeln(‘Изобарический процесс ’);

         write(‘Введите давление   ');

         read(p);

         A:=p*(V2-V1);

      end

    else

      begin

         writeln(‘Изотермический процесс ’);

         write(‘Введите температуру   ');

         read(T);

         A:=R*T*ln(V2/V1);

      end;

   writeln (‘Работа газа А=’,А:6:1,’ Дж’);

end.

 

В отдельных случаях можно использовать вложенные условные операторы.

     if условие1 then

                               if условие2 then оператор1

                                               else оператор2

                        else оператор3;

 

     if условие1 then оператор1

                        else if условие2 then оператор2

                                               else оператор3;

 

Альтернатива else считается принадлежащей ближайшему оператору if , не имеющему else. Допускается также в таком случае, что каждый помещенный вовнутрь условный оператор может обрамляться в операторные скобки begin-end. Это может помочь избежать ошибок. Например, так:

if условие1 then

                          begin if условие2 then оператор1

                                 else оператор2

                          end

                  else оператор3;

 

Задача 3.2.3: Найти действительные корни квадратного уравнения ax2+bx+c=0.

Решение. Воспользуемся известной формулой. Переменные a,b,c, дискриминант и корни x1, x2 - вещественные.

 

program vetv4;

   var a,b,c, d, x1,x2: real;

begin

   writeln(‘Введите коэффициенты через пробел’);

   readln(a,b,c);

   D := b*b - 4*a*c;

   if D<0 then writeln('Корней нет')

               else if D=0 then

                                         begin

                                            x1 := -b/2/a;

                                           writeln('Корни совпадают: x1=x2=',x1:0:3);

                                         end

                                 else

                                       begin

                                         x1 := (-b-sqrt(D))/2/a;

                                         x2 := (-b+sqrt(D))/2/a;

                                         writeln('Корней два: x1=',x1:0:3,' x2=',x2:0:3);

                                       end;

end.