Разветвляющиеся процессы обработки данных, страница 4

        p:= (a + b + c)/2;

        s:= SQRT(p*(p - a)*(p - b)*(p - c));

        writeln(Rus('Стороны треугольника: '),'a = ',a:6:2,'b = ',b:6:2,'c = ',c:6:2);

        writeln(Rus('Площадь треугольника: '),'s = ',s:6:2);

      end

    else begin

      if not poz then//отрицательные или равные нулю длины сторон

        begin

          if a <= 0 then mes:= mes + 'a <= 0; ';

          if b <= 0 then mes:= mes + 'b <= 0; ';

          if c <= 0 then mes:= mes + 'c <= 0; ';

        end

      else//одна сторона меньше двух других

        begin

          if a >= (c + b) then mes:= mes + 'a >= (c + b); ';

          if b >= (c + a) then mes:= mes + 'b >= (c + a); ';

          if c >= (a + b) then mes:= mes + 'c >= (a + b); ';

      end;

      writeln(Rus(mes));

    end;

  readln;

end.

Оператор варианта case

Оператор варианта (case) строится в соответствии со следующим правилом (см. также синтаксическую диаграмму):

case I of
    
C1 : S1;
    
C2 : S2;
...
     Cn: Sn;
   else
S
end

здесь I - выражение, которое называется селектором; C1,...,Cn- списки констант выбора; S,S1,...,Sn операторы варианта; case, of, else и end – зарезервированные слова.

Оператор case состоит из выражения (селектора) и списка операторов, каждому из которых предшествует одна или более констант (они называются константами выбора) или ключевое слово else. Селектор должен иметь порядковый тип размера байт или  слово. Таким образом, строковый тип и тип LongInt являются недопустимыми типами селектора.

Все константы выбора должны быть уникальными и иметь порядковый тип, совместимый с типом селектора.

Оператор case осуществляет выбор для выполнения одного оператора из множества (S1,S2,...,Sn). Выбирается оператор, которому предшествует константа выбора, равная значению селектора или диапазону выбора, в котором находится значение селектора. Если такой константы выбора или такого диапазона выбора не существует, то выполняется оператор S, следующий за ключевым словом  else. Если ветвь else отсутствует, то выполняется пустой оператор.

Управляющая структура оператора case - это структура типа «case», в которой case-тест соответствует селектору I, case списки - спискам констант выбора C1, C2,..., Cn, а case-части - операторам варианта.

Пример оператора варианта case

type

   Operator = (Plus, Minus, Times);

var

   O: Operator; X, Y: Real; I: Integer;

begin

     X:= 5; Y:= 10; O:= Minus;

     case O of

        Plus : X := X + Y;

        Minus: X := X - Y;

        Times: X := X * Y;

     end;{ После выполнения оператора будет X = -5}

     I:= 7;

     case I of

        0, 2, 4, 6, 8: Writeln('Even digit');

        1, 3, 5, 7, 9: Writeln('Odd digit');

        10..100      : Writeln('Between 10 and 100');

     else

       Writeln('Negative or greater than 100');

     end; { После выполнения оператора будет выведено 'Odd digit'}

Структура case

Ниже представлена управляющая структура «case», которая в зависимости от значения Case-теста обеспечивает выполнение одной из n последовательностей действий, поименованных как Case-часть 1, Case-часть 2,… Case-часть n, или Else-часть.

Здесь case-тест  - выражение порядкового или строкового типа, задающее условие ветвления процесса обработки данных по одному из указанных направлений.

Case-часть i - описание процесса обработки данных, который будет выполнен, если case-тест примет значение, попадающее в case-список i.

Else-часть - описание процесса обработки данных, который будет выполнен, если значение case-теста не попадёт ни в один из case-списков.

Case- сисок i - список констант такого же типа, как и тип case-теста. Case-списки не должны содержать совпадающих элементов.

На Object Pascal она может быть частично реализована (для case-теста в виде выражения порядкового типа) посредством применения условного оператора case.

Е – схема выполнения для структуры case.

На рисунке ниже приведена Е-схемы программа с управляющей структурой «case». Как видно из Е-схемы программа имеет n + 1 путей выполнения. При выполнении программы по первому пути (Case-тест принимает значение, попадающее в Case-список 1) выполняются действия по обработке данных поименованные как «Case-часть 1». При выполнении программы по второму пути (Case-тест принимает значение, попадающее в Case-список 2) выполняются действия по обработке данных поименованные как «Case-часть 2». При выполнении программы по n-ому пути (Case-тест принимает значение, попадающее в Case-список n) выполняются действия по обработке данных поименованные как «Case-часть n». При выполнении программы по n + 1-ому пути (Case-тест принимает значение, не попадающее ни в один из Case-списков) выполняются действия по обработке данных поименованные как «Else-часть 2».

Синтаксическая диаграмма оператора варианта case

Примеры приложений под Windows, реализующие разветвляющиеся процессы обработки данных, использующих операторы case, if.

Пример 1. Приложение под Windows для вычисления площади треугольника

//-----------------------------------------------------

program PGeron;

uses

  Forms,

  UGeron in 'UGeron.pas' {Form1};

{$R *.res}

begin

  Application.Initialize;

  Application.CreateForm(TForm1, Form1);

  Application.Run;

end.

//-----------------------------------------------------

unit UGeron;

interface

uses

  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,

  Dialogs, StdCtrls;

type

  TForm1 = class(TForm)

    Edit1: TEdit;//сторона треугольника a

    Label1: TLabel;

    Edit2: TEdit;//сторона треугольника b

    Label2: TLabel;

    Label3: TLabel;

    Edit3: TEdit;//сторона треугольника c

    Label4: TLabel;

    Edit4: TEdit;//площадь треугольника s

    Button1: TButton;//оператор if

    Button2: TButton;//оператор case

    procedure Button1Click(Sender: TObject);

    procedure Edit1Exit(Sender: TObject);

    procedure Edit2Exit(Sender: TObject);

    procedure Edit3Exit(Sender: TObject);

    procedure Button2Click(Sender: TObject);

  private