(*~\Глагол\Отделы\ЧисАн\32\ц\~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~*)
(**)                         ОТДЕЛ Замеры;
(*============================================================================*
 * НАЗНАЧЕНИЕ: 
 *   Содержит задачи-статистики по определению правильного времени работы теста,
 *                                             т.е. замеру времени  [в мсек]
 *     НаиболееЧастоеВремя
 *    (
 *        выходФайлД :ВФайл.ДкПотоку;      (* поток для выходного файла *)
 *           цВремяД-:цВектор.Доступ
 *    ):ЦЕЛ;
 *============================================================================*)

ИСПОЛЬЗУЕТ 
 цВектор  ИЗ "..\..\..\..\Отделы\ЧисАн\32\ц\",
  ВФайл   ИЗ "..\..\..\..\Отделы\Обмен\ВводВывод\";


(*=рррррррррррррррррррррррр= реализация задач =рррррррррррррррррррррррррррррр=*)


(*~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~*)
(* Ищем правильное/минимальное/наиболее повторяющееся время
                            вычисления пары БПФ2 и оБПФ2 комплексного вектора
 *)
ЗАДАЧА НаиболееЧастоеВремя-
      (
          выходФайлД :ВФайл.ДкПотоку;      (* поток для выходного файла *)
(* вход *)
             цВремяД-:цВектор.Доступ;
      группаМенее1мс-:ЦЕЛ;             (*     число повторов коротких тестов < 1мс, чтобы время теста превысило 1-10 мс *)
(* выход *)
правильноеВремяТеста+:ЦЕЛ              (* или группы коротких тестов менее 1-й мсек *) 
      ):ЦЕЛ;
ПЕР
  k,i,
         минВремяТеста,                   (* в [Мсек] *)
        максВремяТеста,                   (* в [Мсек] *)

максПовторовВремяТеста,
            времяТеста :ЦЕЛ;              (* в [Мсек] *)
(* внутренние рабочие таблицы *)
      цВремяТестаД,                       (* в [Мсек] *)
        цПовторовД :цВектор.Доступ;       (* в [Мсек] *)

  всегоПовторовТеста:ЦЕЛ;

УКАЗ
  всегоПовторовТеста:=РАЗМЕР(цВремяД^);(* или группы коротких тестов менее 1-й мсек - для поиска наиболее частого по времени *)

  СОЗДАТЬ(цВремяТестаД,всегоПовторовТеста);
                                            ОБНУЛИТЬ(цВремяТестаД^);
  СОЗДАТЬ(цПовторовД,  всегоПовторовТеста);
(*
  ОТ k:=0 ДО           всегоПовторовТеста-1 ВЫП
    ВФайл.Цел4числа(выходФайлД," k= %4d, цПовторовД[k]=%8d ^",k,цПовторовД[k],0,0);
  КОН;
*)
                                            ОБНУЛИТЬ(цПовторовД^);

                     (* находим минимум времени вычисления Теста в цВремяД[i] *)
   минВремяТеста:=цВектор.минБольше0(цВремяД^);
                    (* находим максимум времени вычисления Теста в цВремяД[i] *)
  максВремяТеста:=цВектор.макс(цВремяД^);
                     (*
                          подсчёт частоты повторения времени вычисления Теста
                         от минВремяТеста и до максВремяТеста
                      *)
                              k:=0;
  ОТ             времяТеста:= минВремяТеста ДО максВремяТеста ВЫП
                                         (* заполняем часть РЯДа
                                                  с временем выполнения теста *)
цВремяТестаД[k]:=времяТеста;
                               (* частота повторов времени теста <времяТеста>
                                  в диапазоне [минВремяТеста..максВремяТеста] *)
                   цПовторовД[k]:=0;    
    ОТ i:=0 ДО всегоПовторовТеста-1 ВЫП
      ЕСЛИ 
                 времяТеста = цВремяД[i]
      ТО                                 (* заполняем часть РЯДа
                                   с числом повторов времени выполнения теста *)
         УВЕЛИЧИТЬ(цПовторовД[k])
      ИНАЧЕ
      КОН
    КОН;
               (* для не нулевых повторов увеличиваем номер k-элемента в РЯДу *)
      ЕСЛИ 
                   цПовторовД[k] > 0
      ТО
                    УВЕЛИЧИТЬ(k)
      ИНАЧЕ
      КОН   (* увеличиваем счётчик цикла <времяТеста> *)
  КОН;
(*
  ОТ k:=k+1 ДО всегоПовторовТеста-1 ВЫП
                      цВремяТестаД[k]:=0;
                        цПовторовД[k]:=0
  КОН;
*)
          (* находим максимум частоты времени вычисления Теста в цПовторовД[k]
                      и выбираем в качестве правильного ответа цВремяТестаД[k]
           *)
              максПовторовВремяТеста:=0;
  ОТ k:=0 ДО всегоПовторовТеста-1 ВЫП
    ЕСЛИ
              максПовторовВремяТеста < цПовторовД[k]
    ТО
              максПовторовВремяТеста:= цПовторовД[k];  правильноеВремяТеста:=цВремяТестаД[k]
    ИНАЧЕ
    КОН
  КОН;
(*-...............................................отладочная печать.......
  ОТ k:=0 ДО           всегоПовторовТеста-1 ВЫП
    ВФайл.Цел4числа(выходФайлД," k=%4d, цВремяТестаД[k]=%8d, цПовторовД[k]=%4d ^",k,цВремяТестаД[k],цПовторовД[k],0);
  КОН;
-*)
(*
   Если <максПовторовВремяТеста> = 0 или 1 или 2, то нужно выбирать в качестве
          <правильноеВремяТеста> <минВремяТеста>
 *)
  ЕСЛИ  (максПовторовВремяТеста = 0)
      ИЛИ
        (максПовторовВремяТеста = 1)
      ИЛИ
        (максПовторовВремяТеста = 2)
  ТО
           правильноеВремяТеста:=минВремяТеста
  ИНАЧЕ
  КОН;
                      (* печать результатов поиска правильного времени в файл *)
    ВФайл.ЦепьЗнаков(выходФайлД,'^');  (* перевод строки *)
        k:=0;
  ПОКА
       (k < всегоПовторовТеста) И (цВремяТестаД[k] > 0)
                                И (  цПовторовД[k] > 0)     (* при  цПовторовД[k]=0 дальше можно не проверять *)
  ВЫП
     ВФайл.Цел4числа(выходФайлД," k=%4d, цВремяТестаД[k]=%8d, цПовторовД[k]=%4d,  группаМенее1мс=%5d ^",k,цВремяТестаД[k],цПовторовД[k],группаМенее1мс);
    УВЕЛИЧИТЬ(k)
  КОН;
     ВФайл.Цел4числа(выходФайлД,"правильноеВремяТеста=%3d, максПовторовВремяТеста=%4d, всегоПовторовТеста=%4d ^",правильноеВремяТеста,максПовторовВремяТеста,всегоПовторовТеста,0);
    ВФайл.ЦепьЗнаков(выходФайлД,'^');  (* перевод строки *)

                     (* высвобождение памяти при уборке, которая была выделена для временных рядов длиной <всегоПовторовТеста> *)
  цВремяТестаД:=ПУСТО;
    цПовторовД:=ПУСТО;

  ВОЗВРАТ правильноеВремяТеста*всегоПовторовТеста                 (* в [Мсек] *)

КОН НаиболееЧастоеВремя;

(*-ssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssss-*)
УКАЗ
КОН Замеры.
