unit class_values;

interface

uses user_types;

CONST FIND_MAX = 0;
      FIND_MIN = 1;

      SORT_UP  = 0;
      SORT_DOWN = 1;
{$REGION 'КЛАСС ЗНАЧЕНИЯ'}
type
  TValues = class (TObject)
    private
       data_values: TValues_array;
       min: extended;
       max: extended;
       avr: extended;

       function array_summ(local_array:TValues_array; number_of_elements:integer):extended;
       function Sort_Array(local_array:TValues_array; number_of_elements, dir:integer):TValues_array;
       function Find_max_min(local_array:TValues_array; number_of_elements, min_max:integer; var position:integer):extended;
    public
       constructor Create;

       function Get_min():extended;
       function Get_max():extended;
       function Get_avr():extended;

       function Get_values():TValues_array;

       function Sort_asc():TValues_array;
       function Sort_desc():TValues_array;

       function Set_all_values(values:TValues_array):boolean;
       function Set_one_value(value:extended; position:integer):boolean;
end;

{$ENDREGION}
implementation

constructor TValues.Create;
var i:integer;
begin
  inherited;
  //инициализация
  for i := 1 to REPEAT_AMOUNT do
    begin
      self.data_values[ i ] := 0;
    end;
  self.min := 0;
  self.max := 0;
  self.avr := 0;
end;

function TValues.Get_min():extended;
begin
  //
end;

function TValues.Get_max():extended;
begin
  //
end;

function TValues.Get_avr():extended;
begin
  Assert((REPEAT_AMOUNT>0), 'Значения количества повторов недопустимо!'+'{78661A7E-4879-432F-B33F-B8CDEF30BFAE}');
  result:=self.array_summ(self.data_values,REPEAT_AMOUNT)/REPEAT_AMOUNT;
end;

function TValues.Sort_asc():TValues_array;
begin
  result:=Sort_Array(self.data_values, REPEAT_AMOUNT, 0);
end;

function TValues.Sort_desc():TValues_array;
begin
  result:=Sort_Array(self.data_values, REPEAT_AMOUNT, 1);
end;

function TValues.Get_values():TValues_array;
begin
  result:=self.data_values;
end;

function TValues.Set_all_values(values:TValues_array):boolean;
begin
  try
    self.data_values:=values;
  finally
    result:=true;
  end;
end;

function TValues.Set_one_value(value:extended; position:integer):boolean;
begin
Assert(((0<position) and (position<REPEAT_AMOUNT)), 'Значение позиции числа в массиве недопустимо!'+'{46271C86-5F70-403C-AF21-04B5812956F5}');
  try
    self.data_values[position]:=value;
  finally
    result:=true;
  end;
end;

function TValues.array_summ(local_array:TValues_array; number_of_elements:integer):extended;
  var temp_summ:extended;
  I: Integer;
begin
  temp_summ := 0;
  for I := 1 to number_of_elements do
    begin
      temp_summ := temp_Summ + local_array[ i ];
    end;
  result := temp_summ;
end;

function TValues.Sort_Array(local_array:TValues_array; number_of_elements, dir:integer):TValues_array;
//dir 0 - по возрастанию
//dir 1 - по убыванию
Var d, i: integer;
    t:extended;
    k : boolean; { пpизнак пеpестановки }
begin
   d := number_of_elements div 2;  { начальное значение интеpвала }
   while d>0 do
    begin { цикл с yменьшением интеpвала до 1 }
     { пyзыpьковая соpтиpовка с интеpвалом d }
     k:=true;
     while k do
        begin  { цикл, пока есть пеpестановки }
          k := false;
          i := 1;
          for i := 1 to number_of_elements - d do
            begin
              { сpавнение эл-тов на интеpвале d }
              if dir = SORT_UP then
                begin
                  if local_array[ i ] > local_array[ i+d ] then
                    begin
                      { пеpестановка }
                      t := local_array[ i ];
                      local_array[ i ] := local_array[ i+d ];
                      local_array[ i+d ] := t;
                      k := true;  { пpизнак пеpестановки }
                    end; { if ... }
                end
              else if dir = SORT_DOWN then
                begin
                   if local_array[ i ] < local_array[ i+d ] then
                    begin
                      { пеpестановка }
                      t := local_array[ i ];
                      local_array[ i ] := local_array[ i+d ];
                      local_array[ i+d ] := t;
                      k := true;  { пpизнак пеpестановки }
                    end; { if ... }
                end;

            end; { for ... }
        end; { while k }
     d := d div 2;  { yменьшение интеpвала }
    end;  { while d>0 }
end;

function TValues.Find_max_min(local_array:TValues_array; number_of_elements, min_max:integer; var position:integer):extended;
//min_max 0 - max
//min_max 1 - min
var
  min_max_pos: integer; // номер минимального элемента массива
  i: integer; // номер элемента, сравниваемого с минимальным
begin
  position := 0;
  result := 0;
  try
    // поиск минимального элемента
    min_max_pos := 1; // пусть первый элемент минимальный
    for i := 2 to number_of_elements do
      begin
        if min_max = FIND_MAX then
          begin
            if local_array[ i ] < local_array[ min_max_pos ] then
              begin
                min_max_pos := i;
              end;
          end
        else if min_max = FIND_MIN then
          begin
            if local_array[ i ] > local_array[ min_max_pos ] then
              begin
                min_max_pos := i;
              end;
          end
      end;
  finally
     position := min_max_pos;
     result := local_Array[ min ];
  end;
end;


end.
