(*~\Глагол\Отделы\ЧисАн\64\к\Пара\ВводВывод\~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~*)
(**)                                  ОТДЕЛ кпМатрВВ;
(*============================================================================*
 * НАЗНАЧЕНИЕ: (ввод из файла)/(вывод в файл) и печать на экран матриц
 *                             комплексных чисел (64 разряда) в виде пары вещ.
 *============================================================================*)

ИСПОЛЬЗУЕТ
 дМатем   ИЗ "..\..\..\..\..\..\Отделы\ЧисАн\64\д\",

 дМатрица ИЗ "..\..\..\..\..\..\Отделы\ЧисАн\64\д\",
(*
кпМатем   ИЗ "..\..\..\..\..\..\Отделы\ЧисАн\64\к\Пара\",  
кпВектор  ИЗ "..\..\..\..\..\..\Отделы\ЧисАн\64\к\Пара\",
кпМатрица ИЗ "..\..\..\..\..\..\Отделы\ЧисАн\64\к\Пара\",
*)
  ИзФайла ИЗ "..\..\..\..\..\..\Отделы\Обмен\ВводВывод\",
   ВФайл  ИЗ "..\..\..\..\..\..\Отделы\Обмен\ВводВывод\",
  НаЭкран ИЗ "..\..\..\..\..\..\Отделы\Обмен\ВводВывод\";

ВИД
        (* вид Вещ - это удвоенная точность 64 разряда (16 десятичных знаков) *)
  Вещ = дМатем.Вещ;                   (* локально *)
(*
основной Вид отдела:
                     Вид- = РЯД ИЗ дВектор.Вид;  (* матрица из вещ.чисел, пара матриц = компл.матрице *)
                 или
                     Вид- = РЯД ИЗ
                            РЯД ИЗ Вещ;          (* матрица из вещ.чисел, пара матриц = компл.матрице *)
  Доступ- = ДОСТУП К Вид;               (* доступ к матрице из вещ.чисел, пара матриц = компл.матрице *)
*)


(*-оооооооооооооо- опережающие определения/заготовки задач -ооооооооооооооооо-*)


ЗАДАЧА^ ОткрытиеФайла-(имяФайла-:ЦЕПЬ):ИзФайла.ДкПотоку;

ЗАДАЧА^ изФайла-(  потокЧтеД:ИзФайла.ДкПотоку;
                        дВыхМатД+,
                        мВыхМатД+ :дМатрица.Доступ);

ЗАДАЧА^ наЭкран-(описание-:ЦЕПЬ;
                         дМатр-,
                         мМатр- : дМатрица.Вид);

ЗАДАЧА^ вФайл-(выходФайл:ВФайл.ДкПотоку;
                     описание-:ЦЕПЬ;
                         дМатр-,
                         мМатр- : дМатрица.Вид);
 

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


(*~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~*)
ЗАДАЧА ОткрытиеФайла-(имяФайла-:ЦЕПЬ):ИзФайла.ДкПотоку;
(*
 * Цель:  если возможно, то открыть поток на чтение, иначе АВОСТ
 *----------------------------------------------------------------------------*
 * До:    <имяФайла> - имя считываемого файла
 * Ответ: открытый на чтение поток (ДОСТУП к Потоку)
 *)
ПЕР
       потокД:ИзФайла.ДкПотоку;
УКАЗ
       потокД:=ИзФайла.Открыть(имяФайла);
  ЕСЛИ
       потокД = ПУСТО
  ТО
(*
    НаЭкран.ОшибкаВпотоке-(имяФайла,' " не найден.^');
*)
    НаЭкран.ВсяЦепь('^Файл "');
    НаЭкран.ВсяЦепь(имяФайла);
    НаЭкран.ВсяЦепь('" не найден.^');
    СТОП(1) 
  КОН;
          потокД.цВидЗнаков:=ИзФайла.знУни;
  ВОЗВРАТ потокД
КОН ОткрытиеФайла;
 
(*~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~*)
ЗАДАЧА изФайла-(  потокЧтеД:ИзФайла.ДкПотоку;
                       дВыхМатД+,
                       мВыхМатД+ :дМатрица.Доступ);
(*
 * Цель: прочитать из вх.потока размер комплексной матрицы (строк, столбцов)
 *       создать матрицу комплексных чисел в виде пары вещественных
 *       и заполнить её данными из этого потока
 *----------------------------------------------------------------------------*
 * Ответ: доступ к выходной матрице комплексных чисел в виде набора

 * До:    <потокЧтеД> - открытый на чтение поток - входной файл
 * Ответ: <дВыхМатД,мВыхМатД> - доступ к выходной комплексной паре матриц
 *                               (из пары доступов к действительным матрицам)
 *)
ПЕР
  i,j,строк,столбцов:ЦЕЛ;
  дT,мT:Вещ;
(*
   ДОСТУП к выходной
   комплексной паре матриц
   должен быть определён в источнике
                                       дВыхМатД:дМатрица.Доступ;
                                       мВыхМатД:дМатрица.Доступ;
*)
УКАЗ
                   строк:=         ИзФайла.Цел32(потокЧтеД);
                         столбцов:=ИзФайла.Цел32(потокЧтеД);
  СОЗДАТЬ(дВыхМатД,строк,столбцов);
  СОЗДАТЬ(мВыхМатД,строк,столбцов);

  ОТ i:=0 ДО строк-1 ВЫП
    ОТ j:=0 ДО столбцов-1 ВЫП
                               дT:=ИзФайла.Вещ64(потокЧтеД);
                               мT:=ИзФайла.Вещ64(потокЧтеД);
(*
      кпМатем.алгебрВид(дT,мT,дВыхМатД[i,j],мВыхМатД[i,j])
*)
                              дВыхМатД[i,j]:=дT;
                              мВыхМатД[i,j]:=мT
    КОН 
  КОН
КОН изФайла;
 
(*~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~*)
ЗАДАЧА наЭкран-(описание-:ЦЕПЬ;
                        дМатр-,
                        мМатр- : дМатрица.Вид);
(*
 * Цель:  вывести на экран содержимое комплексной матрицы <дМатр;мМатр> 
 *----------------------------------------------------------------------------*
 * До:    <описание> - описатель печати комплексного элемента
 *                                               (из пары вещественных матриц),
 *                                       т.е. в виде пары Вещ64
 *                         (см. \Отделы\Обмен\Текст.отд)
 *                                         например <описание>="^ (%12.5f; %12.5f)"
 *     <дМатр,мМатр> - прямоугольная комплексная матрица NxN
 *                                               (из пары вещественных матриц)        
 *)
ПЕР
  i,j:ЦЕЛ;
УКАЗ
  ОТ i:=0 ДО РАЗМЕР(дМатр,0)-1 ВЫП
    ОТ j:=0 ДО РАЗМЕР(дМатр,1)-1 ВЫП
      НаЭкран.Вещ4числа(
                            описание,            (* должно иметь (%23.17f; %23.17f) *)
                                      дМатр[i,j],
                                      мМатр[i,j],0,0)
    КОН;  
               (* переход на новую строку для печати следующей строки матрицы *)
      НаЭкран.ВсяЦепь('^')
  КОН
КОН наЭкран;
 
(*~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~*)
ЗАДАЧА вФайл-(выходФайл:ВФайл.ДкПотоку;
                    описание-:ЦЕПЬ;
                        дМатр-,
                        мМатр- : дМатрица.Вид);
(*
 * Цель: записать в выходной файл содержимое комплексной матрицы <кМатр> 
 *----------------------------------------------------------------------------*
 * До:   <выходФайл> - открытый для записи поток - выходной файл
 *        <описание> - описатель печати комплексного элемента
 *                                               (из пары вещественных матриц),
 *                                       т.е. в виде пары Вещ64
 *                         (см. \Отделы\Обмен\Текст.отд)
 *                                         например <описание>="^ (%12.5f; %12.5f)"
 *     <дМатр,мМатр> - прямоугольная комплексная матрица NxN
 *                                               (из пары вещественных матриц)        
 *)
ПЕР
  i,j:ЦЕЛ;
УКАЗ
  ОТ i:=0 ДО РАЗМЕР(дМатр,0)-1 ВЫП
    ОТ j:=0 ДО РАЗМЕР(дМатр,1)-1 ВЫП
      ВФайл.Вещ4числа(выходФайл,
                            описание,            (* должно иметь (%23.17f; %23.17f) *)
                                      дМатр[i,j],
                                      мМатр[i,j],0,0)
    КОН;
               (* переход на новую строку для печати следующей строки матрицы *)
      ВФайл.ЦепьЗнаков(выходФайл,'^')
  КОН
КОН вФайл;

КОН кпМатрВВ.
