(*~\Глагол\Отделы\Поле\~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~*)
(**)                           ОТДЕЛ Памятка;
(*============================================================================* 
 * НАЗНАЧЕНИЕ: хранилище для ПолеПамятки
 *============================================================================*)

ИСПОЛЬЗУЕТ 
  Надел,
        (*  \Глагол\               *)
  ИзФайла ИЗ "..\..\Отделы\Обмен\ВводВывод\",
   ВФайл  ИЗ "..\..\Отделы\Обмен\ВводВывод\",
Настройки ИЗ "..\..\Отделы\Обмен\ВводВывод\",
        (*  \Глагол\               *)
 оЦепи    ИЗ "..\..\Отделы\Иное\",
  Пустой  ИЗ "..\..\Отделы\Иное\",  
ЧэргаСлеД ИЗ "..\..\Отделы\Иное\";

ПОСТ
  ВсегоСтрок = 30;
                   (*
                       вид-доступ к телу звена в списке памяток - памяткиД
                    *)
ВИД
  Доступ- = ДОСТУП К (*Вид;                              (* Памятка.Доступ <- ЧэргаСлеД.ДкПустомуНабору *)
                       Вид- =*) НАБОР(ЧэргаСлеД.нПустой) (* Памятка.Вид    <- ЧэргаСлеД.нПустой         *)

     имяЦепиД :Пустой.ДкЦепи;                      (* доступ  к пустой цепи *)
     строк-   :ЦЕЛ;
     рСтроки- :РЯД ВсегоСтрок ИЗ Пустой.ДкЦепи;(* ряд доступов к пустым цепочкам *)
  КОН;

(*---
                        набор-список памяток 'памятки' = 'список_НА_память'
  ---*)
ПЕР
  список_НА_память:ЧэргаСлеД.нСписок; (* так хуже - ЧэргаСлеД.ДкСписку; *)

    (*-
        Примеры задач для работы с телами звеньев списка памяток
(<список_НА_память> вида ЧэргаСлеД.нСписок),
      -*)

(*~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~общедоступная ЗАДАЧА~~~~~~~~~~~~~~~~~~~*)
ЗАДАЧА                                                         (*(Памятка.Вид)*)
       ДобавитьСтроку-(памяткаД:Памятка.Доступ;    (* вид-доступ к телу звена в <список_НА_память> *)
                          цепь-:ЦЕПЬ);
ПЕР
  строка:ЦЕЛ;
   цепьД:Пустой.ДкЦепи;(* доступ к пустой цепи *)
УКАЗ
  ЕСЛИ
       цепь = ""
  ТО
    ВОЗВРАТ
  КОН;
          строка:=0;
  КОЛЬЦО
    ЕСЛИ
          строка >= памяткаД.строк
    ТО                                        (* создаём наверху новую строку *)
      ЕСЛИ
          строка >= ВсегоСтрок
      ТО
        УМЕНЬШИТЬ(строка)
      КОН;
      памяткаД.строк:=строка+1;
      СОЗДАТЬ(цепьД,цепь);
      ВЫХОД
    КОН;
    ЕСЛИ
         оЦепи.Сравнить(памяткаД.рСтроки[строка]^,цепь) = 0
     ТО                                            (* переносим строку наверх *)
      цепьД:=памяткаД.рСтроки[строка];
      ВЫХОД
    КОН;
    УВЕЛИЧИТЬ(строка)
  КОН;
  ПОКА строка > 0 ВЫП
    памяткаД.рСтроки[строка]:=памяткаД.рСтроки[строка-1];
    УМЕНЬШИТЬ(строка)
  КОН;
    памяткаД.рСтроки[0]:=цепьД
КОН ДобавитьСтроку;

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

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

   (* создаём новое <звеноД> (с доступом к телоД) внутри задачи ЧэргаСлеД.ДобавитьНовЗвеноВконСписка(..)
                                                                 и присоединяем это звено к концу списка звеньев *)
  ЧэргаСлеД.ДобавитьНовЗвеноВконСписка(список_НА_память,памяткаД);

      ВОЗВРАТ памяткаД
КОН Найти;


(*============================================================================*)
(* ******* чтение и запись в поток ******* *)
(*============================================================================*)

(*-----------------------------------------локальная ЗАДАЧА-------------------*)
ЗАДАЧА                                                         (*(Памятка.Вид)*)
       ПисатьПамятку(потокД:ВФайл.ДкПотоку;
                   памяткаД:Памятка.Доступ);
ПЕР
     строка:ЦЕЛ;
УКАЗ
    Настройки.ПисатьСтроку(потокД,"памятка",памяткаД.имяЦепиД^);
    Настройки.ПисатьЦел(потокД,"строк",памяткаД.строк);

  ОТ строка:=0 ДО памяткаД.строк-1 ВЫП
    Настройки.ПисатьСтроку(потокД,"",памяткаД.рСтроки[строка]^)
  КОН
КОН ПисатьПамятку;
(*-----------------------------------------локальная ЗАДАЧА-------------------*)
ЗАДАЧА                                                         (*(Памятка.Вид)*)
       ЧитатьПамятку(потокД:ИзФайла.ДкПотоку):Памятка.Доступ;
ПЕР
  памяткаД:Памятка.Доступ;
   строка :ЦЕЛ;
  имяЦепи :ЦЕПЬ[200];
УКАЗ
  СОЗДАТЬ(памяткаД);
    Настройки.ЧитатьСтроку(потокД,имяЦепи);

  СОЗДАТЬ(памяткаД.имяЦепиД,имяЦепи);

                  памяткаД.строк:=Настройки.ЧитатьЦел(потокД);
  ОТ строка:=0 ДО памяткаД.строк-1 ВЫП
    Настройки.ЧитатьСтроку(потокД,имяЦепи);
    СОЗДАТЬ(памяткаД.рСтроки[строка],имяЦепи)
  КОН;
  ВОЗВРАТ памяткаД
КОН ЧитатьПамятку;

    (*-..........продолжение
                             задач для работы с телами звеньев списка памяток
(<список_НА_память> вида ЧэргаСлеД.нСписок),
      -*)

(*~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~общедоступная ЗАДАЧА~~~~~~~~~~~~~~~~~~~*)
ЗАДАЧА
       ЧитатьНастройки-(потокД:ИзФайла.ДкПотоку);
ПЕР
  памятка,
  памяток:ЦЕЛ;
УКАЗ
    ЧэргаСлеД.ОчиститьСписок(список_НА_память);

  памяток:=Настройки.ЧитатьЦел(потокД);

  ОТ памятка:=0 ДО памяток-1 ВЫП
    ЧэргаСлеД.ДобавитьНовЗвеноВконСписка(список_НА_память,ЧитатьПамятку(потокД))
  КОН
КОН ЧитатьНастройки;

(*~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~общедоступная ЗАДАЧА~~~~~~~~~~~~~~~~~~~*)
ЗАДАЧА
       ПисатьНастройки-(потокД:ВФайл.ДкПотоку);
ПЕР
       звеноД: ЧэргаСлеД.ДкЗвену_телоД;
УКАЗ
  Настройки.ПисатьЦел(потокД,"памяток",список_НА_память.всехЗвен);

       звеноД:=ЧэргаСлеД.Дк1муЗвену(список_НА_память);
  ПОКА
       звеноД # ПУСТО
  ВЫП
    ПисатьПамятку(потокД,
                                         (* преобразование полиморфное - опорного доступа у 
             <телоД>               из ЧэргаСлеД.ДкПустомуНабору  в
                    Памятка.Доступ <- ЧэргаСлеД.ДкПустомуНабору               *)
       звеноД.телоД(Памятка.Доступ) 
                 );

       звеноД:=звеноД.слеД
  КОН
КОН ПисатьНастройки;

(*-ssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssss-*)
УКАЗ
  ЧэргаСлеД.ОчиститьСписок(список_НА_память)
КОН Памятка.
