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

ИСПОЛЬЗУЕТ 
  ОБХОД, 
        (*     \Глагол\                *)
  ОС      ИЗ "..\..\..\Отделы\Обмен\",
        (*     \Глагол\                *)
  Пустой  ИЗ "..\..\..\Отделы\Иное\",
 оЗнака   ИЗ "..\..\..\Отделы\Иное\";

ПОСТ
                                         (* обработка знаков *)
  знУни- = 0;  (* заголовок 0FFH,0FEH *)
  знВин- = 1;  (* по 1251 таблице *)
  знДос- = 2;  (* по  866 таблице *)

                           (* размер ряда ячеек у вида РядПромежуточнаяПамять *)
  РазмерПП = 4096; 

ВИД
  РядПромежуточнаяПамять = РЯД РазмерПП ИЗ ОБХОД.Ячейка;

  ДкПотоку- = ДОСТУП К (*нПоток;
                         нПоток =*)               (* набор с описанием Потока *)
  НАБОР
    рПП:РядПромежуточнаяПамять;  (* ряд ячеек - рПП:РядПромежуточнаяПамять;   *)
    занятоЯчеек:ЦЕЛ;             (* число ячеек, занятых данными              *)
    выбраноЯчеек:ЦЕЛ;            (* число ячеек, уже выбранных из файла       *)
    ссылкаНаФайл:ЦЕЛ;            (* идентификатор/хандлер/ссылка на файл в ОС *)
    позицияВфайле:ЦЕЛ;           (* позиция в файле                           *)
    началоСтроки:КЛЮЧ;           (* ВКЛ, если в начале строки                 *)
    цВидЗнаков+:ЦЕЛ;             (* обработка знаков                          *)
  КОН;


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


(*-------------------------------------Общедоступные ЗАДАЧИ-------------------*)
ЗАДАЧА^
        Открыть-(имяфайла-:ЦЕПЬ):ДкПотоку;
ЗАДАЧА^
        Закрыть-(потокД+:ДкПотоку);
ЗАДАЧА^
        Конец-(потокД:ДкПотоку):КЛЮЧ;
ЗАДАЧА^
        Позиция-(потокД:ДкПотоку):ЦЕЛ;
ЗАДАЧА^
        СменаПозиции-(потокД:ДкПотоку; поз:ЦЕЛ);
ЗАДАЧА^
        Ячейки-(потокД:ДкПотоку; память+:ОБХОД.Ячейки; размер:ЦЕЛ);
ЗАДАЧА^
        БудетЗнак-(потокД:ДкПотоку):ЗНАК;
ЗАДАЧА^
        ЗнакЦепи-(потокД:ДкПотоку):ЗНАК;
ЗАДАЧА^
        ДлинаЦепи-(
                                  потокД:ДкПотоку
                  ):Пустой.ДкЦепи;
ЗАДАЧА^
        Строку-(потокД:ДкПотоку; цепь+:ЦЕПЬ);
ЗАДАЧА^
        ПропуститьСтроку-(потокД:ДкПотоку);
ЗАДАЧА^
        НачалоСтроки-(потокД:ДкПотоку):КЛЮЧ;
ЗАДАЧА^
        Целое-(потокД:ДкПотоку; шцОтвет+:ШИРЦЕЛ; швОтвет+:ШИРВЕЩ):КЛЮЧ;
ЗАДАЧА^
        Вещ64-(потокД:ДкПотоку):ШИРВЕЩ;
ЗАДАЧА^
        Вещ32-(потокД:ДкПотоку):ВЕЩ;
ЗАДАЧА^
        Цел64-(потокД:ДкПотоку):ШИРЦЕЛ;
ЗАДАЧА^
        Цел32-(потокД:ДкПотоку):ЦЕЛ;


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


(*-----------------------------------------локальная ЗАДАЧА-------------------*)
ЗАДАЧА НаполнитьПП(потокД:ДкПотоку);
(*
 *  Наполняет  рПП:РядПромежуточнаяПамять  потока данными из файла.
 *)
УКАЗ
  потокД.занятоЯчеек:=ОС.ЧитатьФ(потокД.ссылкаНаФайл,
                                 потокД.рПП,
                                 РазмерПП);
  потокД.выбраноЯчеек:=0
КОН НаполнитьПП;

(*~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~общедоступная ЗАДАЧА~~~~~~~~~~~~~~~~~~~*)
ЗАДАЧА
       Открыть-(имяфайла-:ЦЕПЬ):ДкПотоку;
(*
 * Открывает новый вход.файл = <потокД> для чтения данных.
 *)
ПЕР
  потокД:ДкПотоку;
  фссылка:ЦЕЛ;
УКАЗ
  фссылка:=ОС.ФДляЧтения(имяфайла);
  ЕСЛИ
       фссылка = 0
  ТО
    ВОЗВРАТ ПУСТО
  КОН;
  СОЗДАТЬ(потокД);

  потокД.ссылкаНаФайл:=фссылка;
  потокД.позицияВфайле:=0;
  потокД.началоСтроки:=ВКЛ;
  потокД.цВидЗнаков:=ИзФайла.знВин;    (* будет знУни! *)

  НаполнитьПП(потокД);                                         (* поток -> ПП *)

  ВОЗВРАТ потокД
КОН Открыть;

(*~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~общедоступная ЗАДАЧА~~~~~~~~~~~~~~~~~~~*)
ЗАДАЧА
       Закрыть-(потокД+:ДкПотоку);
(*
 * Закрывает уже открытый вход.файл = <потокД> для чтения данных.
 *)
УКАЗ
  ОС.ЗакрытьФ(потокД.ссылкаНаФайл);
  потокД:=ПУСТО
КОН Закрыть;

(*~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~общедоступная ЗАДАЧА~~~~~~~~~~~~~~~~~~~*)
ЗАДАЧА
       Конец-(потокД:ДкПотоку):КЛЮЧ;
(*
 * Возвращает ВКЛ, если в <потокД> уже окончились данные.
 *)
УКАЗ
  ВОЗВРАТ потокД.занятоЯчеек = 0
КОН Конец;

(*~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~общедоступная ЗАДАЧА~~~~~~~~~~~~~~~~~~~*)
ЗАДАЧА
       Позиция-(потокД:ДкПотоку):ЦЕЛ;
(*
 * Возвращает позицию, отсчитываемую от начала вх.файла = <потокД>.
 *)
УКАЗ
  ВОЗВРАТ потокД.позицияВфайле
КОН Позиция;

(*~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~общедоступная ЗАДАЧА~~~~~~~~~~~~~~~~~~~*)
ЗАДАЧА
       СменаПозиции-(потокД:ДкПотоку;
                        поз:ЦЕЛ);
(*
 * Меняет позицию чтения на <поз>, отсчитываемую от начала файла.
 *)
УКАЗ
  ОС.СменаПозицииФ(потокД.ссылкаНаФайл,поз);
  НаполнитьПП(потокД);                                         (* поток -> ПП *)
  потокД.позицияВфайле:=поз
КОН СменаПозиции;

(*~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~общедоступная ЗАДАЧА~~~~~~~~~~~~~~~~~~~*)
ЗАДАЧА
       Ячейки-(потокД :ДкПотоку;
               память+:ОБХОД.Ячейки;
               размер :ЦЕЛ);
(*
 * Читает в вых.ряд <память> определенное число ячеек.
 * При невозможности чтения заполняет ячейки нулями.
 *)
ПЕР
     поз:ЦЕЛ;
УКАЗ
  ОТ поз:=0 ДО размер-1 ВЫП
    ЕСЛИ
         ИзФайла.Конец(потокД)
    ТО 
      память[поз]:=0
    ИНАЧЕ
      память[поз]:=потокД.рПП[потокД.выбраноЯчеек];
      УВЕЛИЧИТЬ(потокД.выбраноЯчеек);
      УВЕЛИЧИТЬ(потокД.позицияВфайле);
      ЕСЛИ потокД.выбраноЯчеек >= потокД.занятоЯчеек ТО
        НаполнитьПП(потокД)                                    (* поток -> ПП *)
      КОН
    КОН
  КОН
КОН Ячейки;

(*-----------------------------------------локальная ЗАДАЧА-------------------*)
ЗАДАЧА БудутЯчейки(потокД :ДкПотоку;
                   память+:ОБХОД.Ячейки;
                   размер :ЦЕЛ);
ПЕР
  поз:ЦЕЛ;
УКАЗ
  ОТ поз:=0 ДО размер-1 ВЫП
    память[поз]:=потокД.рПП[потокД.выбраноЯчеек+поз]
  КОН
КОН БудутЯчейки;

(*~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~общедоступная ЗАДАЧА~~~~~~~~~~~~~~~~~~~*)
ЗАДАЧА
       БудетЗнак-(потокД:ДкПотоку):ЗНАК;
ПЕР
  знак:ЗНАК;
    уз:ЯЧЦЕЛ;
УКАЗ
  ЕСЛИ
    ИзФайла.Конец(потокД)
  ТО
    ВОЗВРАТ 0X
  КОН;
  ЕСЛИ
                  потокД.цВидЗнаков = знУни
  ТО
      БудутЯчейки(потокД,знак,2);
    ЕСЛИ
         (потокД.позицияВфайле = 0)
        И
         (знак = "#FEFF")
    ТО
      ИзФайла.Ячейки(потокД,знак,2);
      БудутЯчейки(потокД,знак,2)
    КОН
  ИНАЧЕ
    БудутЯчейки(потокД,уз,1);
    ЕСЛИ
         потокД.цВидЗнаков = знДос
    ТО
      знак:=оЗнака.ИзДос(уз)
    ИНАЧЕ
      знак:=оЗнака.ИзВин(уз)
    КОН
  КОН;
  ВОЗВРАТ знак
КОН БудетЗнак;

(*~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~общедоступная ЗАДАЧА~~~~~~~~~~~~~~~~~~~*)
ЗАДАЧА
       ЗнакЦепи-(потокД:ДкПотоку):ЗНАК;
(*     ЗнакЦепи
 * Считывает знак из потока.
 *)
ПЕР
  знак:ЗНАК;
    уз:ЯЧЦЕЛ;
УКАЗ
  ЕСЛИ
       потокД.цВидЗнаков = знУни
  ТО
      ИзФайла.Ячейки(потокД,знак,2);
    ЕСЛИ
         (потокД.позицияВфайле = 2)
        И
         (знак = "#FEFF")
    ТО
      ИзФайла.Ячейки(потокД,знак,2)
    КОН
  ИНАЧЕ
      ИзФайла.Ячейки(потокД,уз,1);
    ЕСЛИ
         потокД.цВидЗнаков = знДос
    ТО
      знак:=оЗнака.ИзДос(уз)
    ИНАЧЕ
      знак:=оЗнака.ИзВин(уз)
    КОН
  КОН;
  ВОЗВРАТ знак
КОН ЗнакЦепи;

(*~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~общедоступная ЗАДАЧА~~~~~~~~~~~~~~~~~~~*)
ЗАДАЧА
       ДлинаЦепи-(
                                  потокД:ДкПотоку
                  ):Пустой.ДкЦепи;
(*
 * Читает из вход.файла <потокД> длину (?) цепи и саму цепочку знаков\символов
 *                                       во вновь распределённую память
 *)
ПЕР
  длина,
    поз:ЦЕЛ;
             цепьД:Пустой.ДкЦепи;
УКАЗ
  ИзФайла.Ячейки(потокД,длина,4);

  СОЗДАТЬ(цепьД,длина+1);                (* уже НЕ пустая цепочка <цепьД> *)

  ОТ
          поз:=0
  ДО             длина-1
  ВЫП
    цепьД[поз]:=ИзФайла.ЗнакЦепи(потокД) (* заполняем <цепьД> из вход.файла <потокД> *)
  КОН;
  цепьД[длина]:=0X;
  ВОЗВРАТ цепьД
КОН ДлинаЦепи;

(*~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~общедоступная ЗАДАЧА~~~~~~~~~~~~~~~~~~~*)
ЗАДАЧА
       Строку-(потокД:ДкПотоку;
                цепь+:ЦЕПЬ);
(*
 * Считывает строку знаков из <потокД> в цепочку знаков.
 * При этом конец строки "#000D#000A" не записывается в конец этой цепочки.
 *)
ПЕР
  занято:ЦЕЛ;
    знак:ЗНАК;
УКАЗ
          занято:=0;
  КОЛЬЦО
    ЕСЛИ
         (занято >= РАЗМЕР(цепь))
        ИЛИ
           ИзФайла.Конец(потокД)
    ТО
                                 потокД.началоСтроки:=ОТКЛ;
      ВЫХОД
    КОН;
          знак:=ИзФайла.ЗнакЦепи(потокД);
    ЕСЛИ
          знак = 0DX
    ТО
                                 потокД.началоСтроки:=ВКЛ;
          знак:=ИзФайла.ЗнакЦепи(потокД);                     (* 0AX *)
      ВЫХОД
    АЕСЛИ
          знак = 0AX
    ТО
      потокД.началоСтроки:=ВКЛ;
      ВЫХОД
    КОН;
    цепь[занято]:=знак;
    УВЕЛИЧИТЬ(занято)
  КОН;
  ЕСЛИ занято < РАЗМЕР(цепь) ТО
    цепь[занято]:=0X
  КОН
КОН Строку;

(*~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~общедоступная ЗАДАЧА~~~~~~~~~~~~~~~~~~~*)
ЗАДАЧА
       ПропуститьСтроку-(потокД:ДкПотоку);
(*
 * Пропускает в потоке строку знаков.
 *)
УКАЗ
                         потокД.началоСтроки:=ОТКЛ;
  ПОКА
     НЕ ИзФайла.Конец(   потокД)
  ВЫП
    ЕСЛИ
        ИзФайла.ЗнакЦепи(потокД) = 0AX
    ТО
      потокД.началоСтроки:=ВКЛ;
      ВОЗВРАТ
    КОН
  КОН
КОН ПропуститьСтроку;

(*~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~общедоступная ЗАДАЧА~~~~~~~~~~~~~~~~~~~*)
ЗАДАЧА
       НачалоСтроки-(потокД:ДкПотоку):КЛЮЧ;
(*
 * Возвращает ВКЛ, если задача ИзФайла.Строку   или 
 *                      задача ИзФайла.ПропуститьСтроку в прошлый раз
 * прочитали конец строки "#000D#000A".
 *)
УКАЗ
  ВОЗВРАТ потокД.началоСтроки
КОН НачалоСтроки;

(*~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~общедоступная ЗАДАЧА~~~~~~~~~~~~~~~~~~~*)
ЗАДАЧА
       Целое-(потокД:ДкПотоку; шцОтвет+:ШИРЦЕЛ;
                               швОтвет+:ШИРВЕЩ):КЛЮЧ;
(*
 * Считывает из <потокД> знаковое представление числа.
 * Если это представление целого числа, то возвращает ВКЛ и записывает
 * значение числа в <шцОтвет>, иначе возвращает ОТКЛ, а значение записывает
 * в <швОтвет>. 
 * Следующий за числом знак остаётся в потоке.
 *)
ПЕР
    i,m,n,d,эксп:ЦЕЛ;
           цифры:ЦЕПЬ[64];
          ошибка:КЛЮЧ;
            мант:ШИРВЕЩ;
        знакМант,
        знакЭксп:ЦЕЛ;
            знак:ЗНАК;                   (* будущий знак *)

(*...............................подЗадача..*)
  ЗАДАЧА ЗнакЦифра(знак:ЗНАК):КЛЮЧ;        (* проверка знака на цифру или НЕцифру *)
  УКАЗ
    ЕСЛИ
         ("0" <= знак) И (знак <= "9")
    ТО
      ВОЗВРАТ ВКЛ
    ИНАЧЕ
      ВОЗВРАТ ОТКЛ
    КОН
  КОН ЗнакЦифра;
(*...............................подЗадача..*)
  ЗАДАЧА ЧитатьЗнакИзПотока;               (* Считывает будущий знак из потока. *)
  ПЕР
    прошлыйЗнак:ЗНАК;
  УКАЗ
    прошлыйЗнак:=ЗнакЦепи(потокД);
    знак:=БудетЗнак(потокД)
  КОН ЧитатьЗнакИзПотока;
(*...............................подЗадача..*)
  ЗАДАЧА ДесятьВ(x:ЦЕЛ):ШИРВЕЩ;            (* 10 в степени <x> *)
  ПЕР
    ответ,множитель:ШИРВЕЩ;
  УКАЗ
    ответ:=1;
    множитель:=10;
    ПОКА
           x > 0
    ВЫП
      ЕСЛИ
           НЕ ЧЕТ(x)
      ТО
        ответ:=ответ*множитель
      КОН;
           x:=x ДЕЛИТЬ 2;
      ЕСЛИ
           x > 0
      ТО                                (* защита <множитель> от переполнения *)
        множитель:=множитель*множитель 
      КОН
    КОН;
    ВОЗВРАТ ответ
  КОН ДесятьВ;
(*...............................подЗадача..*)
  ЗАДАЧА ЗнакВЦел(     знак:ЗНАК;
                  система16:КЛЮЧ):ЦЕЛ;  (* преобразование знака в целое *)
  УКАЗ 
    ЕСЛИ
         ЗнакЦифра(знак)
    ТО
      ВОЗВРАТ ВЦЕЛ(знак)-ВЦЕЛ("0")
    АЕСЛИ
           система16
         И
          ("A" <= знак)
         И
          (знак <= "F")
    ТО
      ВОЗВРАТ ВЦЕЛ(знак)-ВЦЕЛ("A")+10
    ИНАЧЕ
      ошибка:=ВКЛ
    КОН
  КОН ЗнакВЦел;

(*-zzzzzzzzzzzzzzzzzzzzzzzzzzzzz Целое() zzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzz-*)
УКАЗ
  швОтвет:=0;
  шцОтвет:=0;
  ошибка:=ОТКЛ;
  знак:=ИзФайла.БудетЗнак(потокД);

                         (*--- пропускаем пробелы перед первой цифрой ---*)
  ПОКА знак <= " " ВЫП
    ЕСЛИ
         ИзФайла.Конец(потокД)
    ТО                              (* ошибка: достигнут конец потока *)
      ВОЗВРАТ ВКЛ
    КОН;
    ЧитатьЗнакИзПотока                                   (* подЗадача *)
  КОН;

    знакМант:=1;
  ЕСЛИ 
        знак = "-"
  ТО
    знакМант:=-1;
    ЧитатьЗнакИзПотока                                   (* подЗадача *)
  АЕСЛИ
        знак = "+"
  ТО
    ЧитатьЗнакИзПотока                                   (* подЗадача *)
  АЕСЛИ
        НЕ ЗнакЦифра(знак)
  ТО                                (* ошибка: не нашли числа *)
    ВОЗВРАТ ВКЛ
  КОН;
                          (* читаем мантиссу *)
  i:=0; m:=0; n:=0; d:=0;
  КОЛЬЦО 
    ЕСЛИ
          ЗнакЦифра(знак)
       ИЛИ
        (d = 0)
       И
        ("A" <= знак)
       И
        (знак <= "F")
    ТО
      ЕСЛИ
           (m > 0)
          ИЛИ 
           (знак # "0")
      ТО                               (* предстоящие нули пропускаем *)
        ЕСЛИ
             n < РАЗМЕР(цифры)
        ТО
          цифры[n]:=знак;
          УВЕЛИЧИТЬ(n)
        КОН;
        УВЕЛИЧИТЬ(m)
      КОН;
      ЧитатьЗнакИзПотока;                                (* подЗадача *)
      УВЕЛИЧИТЬ(i)
    АЕСЛИ
          знак = ","
    ТО
      ЧитатьЗнакИзПотока;                                (* подЗадача *)
      ЕСЛИ
           d = 0
      ТО                   (* i > 0 *)
           d:=i
      ИНАЧЕ                         (* ошибка: неверный знак в записи числа *)
        ВОЗВРАТ ВКЛ
      КОН
    ИНАЧЕ
      ВЫХОД
    КОН
  КОН; (* 0 <= n <= m <= i, 0 <= d <= i *)

  ЕСЛИ d = 0 ТО            (* целое *)
    ЕСЛИ n = m ТО
      i:=0;
      ЕСЛИ
           (знак = "H")
          ИЛИ
           (знак = "X")
      ТО                   (* 16-тиричное *)
        ЧитатьЗнакИзПотока;                              (* подЗадача *)
        ЕСЛИ
             (  n > 16)
            ИЛИ
             ( (n = 16) И (цифры[0] > "7"))
        ТО                          (* ошибка: слишком большое целое *)
          ВОЗВРАТ ВКЛ
        КОН;
        ПОКА i < n ВЫП
          шцОтвет:=шцОтвет*10H+ЗнакВЦел(цифры[i],ВКЛ);
          ЕСЛИ ошибка ТО               (* ошибка: неверный знак в записи числа *)
            ВОЗВРАТ ВКЛ
          КОН;
          УВЕЛИЧИТЬ(i)
        КОН
      ИНАЧЕ                (* 10-тичное *)
        ПОКА i < n ВЫП
          d:=ЗнакВЦел(цифры[i],ОТКЛ);
          ЕСЛИ
               ошибка
          ТО                        (* ошибка: неверный знак в записи числа *)
            ВОЗВРАТ ВКЛ
          КОН;
          УВЕЛИЧИТЬ(i);
          ЕСЛИ
               шцОтвет > (МАКС(ШИРЦЕЛ)-d) ДЕЛИТЬ 10
          ТО                        (* ошибка: слишком большое целое *)
            ВОЗВРАТ ВКЛ
          КОН;
          шцОтвет:=шцОтвет*10+d
        КОН
      КОН
    ИНАЧЕ                           (* ошибка: очень большое число *)
      ВОЗВРАТ ВКЛ
    КОН;
    шцОтвет:=знакМант*шцОтвет;
      ВОЗВРАТ ВКЛ
  ИНАЧЕ                                (* дробная часть *)
    мант:=0;
    эксп:=0;
    ПОКА n > 0 ВЫП           (* 0 <= мант < 1 *)
      УМЕНЬШИТЬ(n);
      мант:=(ЗнакВЦел(цифры[n],ОТКЛ)+мант)/10;
      ЕСЛИ
           ошибка
      ТО                     (* ошибка: неверный знак в записи числа *)
        ВОЗВРАТ ВКЛ
      КОН
    КОН;
    ЕСЛИ
         (знак = "E") ИЛИ (знак = "D")
    ТО
      ЧитатьЗнакИзПотока;                                (* подЗадача *)
      знакЭксп:=1;
      ЕСЛИ
           знак = "-" 
      ТО
        знакЭксп:=-1;
        ЧитатьЗнакИзПотока                               (* подЗадача *)
      АЕСЛИ
           знак = "+"
      ТО
        ЧитатьЗнакИзПотока                               (* подЗадача *)
      КОН;
      ЕСЛИ
           ЗнакЦифра(знак)
      ТО
        ПОВТОРЯТЬ
          n:=ЗнакВЦел(знак,ОТКЛ);
          ЧитатьЗнакИзПотока;                            (* подЗадача *)
          ЕСЛИ
               эксп <= (МАКС(ШИРЦЕЛ)-n) ДЕЛИТЬ 10
          ТО
            эксп:=эксп*10+n
          ИНАЧЕ                     (* ошибка: очень большое число *)
            ВОЗВРАТ ВКЛ
          КОН
        ДО НЕ ЗнакЦифра(знак);
        эксп:=знакЭксп*эксп
      ИНАЧЕ                         (* ошибка: неверный знак в записи числа *)
        ВОЗВРАТ ВКЛ
      КОН
    КОН;
    УМЕНЬШИТЬ(эксп,i-d-m);          (* сдвиг десятичной точки *)
    ЕСЛИ
         эксп < 0
    ТО
      ЕСЛИ эксп <= -307 ТО          (* ошибка: очень маленькое число *)
        ВОЗВРАТ ВКЛ
      КОН;
      швОтвет:=мант/ДесятьВ(-эксп)
    ИНАЧЕ
      ЕСЛИ эксп > 308 ТО            (* ошибка: очень большое число *)
        ВОЗВРАТ ВКЛ
      КОН;
      швОтвет:=мант*ДесятьВ(эксп)
    КОН
  КОН;
  швОтвет:=знакМант*швОтвет;
  ВОЗВРАТ ОТКЛ
КОН Целое;

(*~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~общедоступная ЗАДАЧА~~~~~~~~~~~~~~~~~~~*)
ЗАДАЧА
       Вещ64-(потокД:ДкПотоку):ШИРВЕЩ;
ПЕР
  ширцел:ШИРЦЕЛ;
  ширвещ:ШИРВЕЩ;
УКАЗ
  ЕСЛИ
       ИзФайла.Целое(потокД,ширцел,ширвещ)
  ТО
    ВОЗВРАТ ширцел
  ИНАЧЕ
    ВОЗВРАТ ширвещ
  КОН
КОН Вещ64;

(*~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~общедоступная ЗАДАЧА~~~~~~~~~~~~~~~~~~~*)
ЗАДАЧА
       Вещ32-(потокД:ДкПотоку):ВЕЩ;
УКАЗ
  ВОЗВРАТ УЗК(ИзФайла.Вещ64(потокД))
КОН Вещ32;

(*~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~общедоступная ЗАДАЧА~~~~~~~~~~~~~~~~~~~*)
ЗАДАЧА
       Цел64-(потокД:ДкПотоку):ШИРЦЕЛ;
ПЕР
  ширцел:ШИРЦЕЛ;
  ширвещ:ШИРВЕЩ;
УКАЗ
  ЕСЛИ
       ИзФайла.Целое(потокД,ширцел,ширвещ)
  ТО
    ВОЗВРАТ ширцел
  ИНАЧЕ
    ВОЗВРАТ ВШИРЦЕЛ(ширвещ)
  КОН
КОН Цел64;

(*~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~общедоступная ЗАДАЧА~~~~~~~~~~~~~~~~~~~*)
ЗАДАЧА
       Цел32-(потокД:ДкПотоку):ЦЕЛ;
УКАЗ
  ВОЗВРАТ УЗК(ИзФайла.Цел64(потокД))
КОН Цел32;

КОН ИзФайла.
