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

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

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

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


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


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

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

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

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

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

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

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


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

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

КОН кпВектВВ.
