(*~\Глагол\Отделы\Иное\~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~*)
(**)                            ОТДЕЛ оЦепи;
(*============================================================================*)
(* НАЗНАЧЕНИЕ:                                                                *)
(*              обработка строк (цепочек знаков - РЯД ИЗ ЗНАК или ЦЕПЬ)       *)
(*                с участием задач из отделов  оБуквы.отд  и  оЗнака.отд      *)
(* ПРИМЕЧАНИЯ:                                                                *)
(*    Цепочки обычно заканчиваются знаком "0X" (как в языке "Си").            *)
(*    Их длина не может быть больше МАКС(ЦЕЛ).                                *)
(*    Если выходная цепочка не помещается в ряд, предназначенный для ответа,  *)
(*      то она укорачивается до длины этого ряда.                             *)
(*============================================================================*)

ИСПОЛЬЗУЕТ
        (*  \Глагол\              *)
 оБуквы   ИЗ "..\..\Отделы\Иное\",
 оЗнака   ИЗ "..\..\Отделы\Иное\";
(*
<*ЕСЛИ НЕ ЗАДАНО("МПГ") ТО*>
ВИД
  Доступ- = ДОСТУП К ЦЕПЬ;

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

    УВЕЛИЧИТЬ(поз);

    ЕСЛИ
         поз = мин_размер_цепи
    ТО
      ВОЗВРАТ размер_цеп1-размер_цеп2
    КОН
  КОН;
  ВОЗВРАТ 0
КОН Сравнить;

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

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

                поз_в_образце:=0;
  ПОКА
       (        поз_в_образце < дл_образца)
      И
       (        поз_в_цепи +
                поз_в_образце < дл_цепи)
  ВЫП
    ЕСЛИ
           цепь[поз_в_цепи +
                поз_в_образце] = образец[поз_в_образце]
    ТО
      УВЕЛИЧИТЬ(поз_в_образце)
    ИНАЧЕ
                поз_в_образце:=0;
      УВЕЛИЧИТЬ(поз_в_цепи)
    КОН
  КОН;
  ЕСЛИ
          поз_в_образце # дл_образца
  ТО
          поз_в_цепи:= -1
  КОН;
  ВОЗВРАТ поз_в_цепи
КОН ПозицияОбразца;

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

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

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

                  макс_дл:=ДЛИНА(откуда)-цОткуда;
  ЕСЛИ
       дл_части > макс_дл
  ТО
       дл_части:= макс_дл
  КОН;

                  макс_дл:=РАЗМЕР(куда)-1;
  ЕСЛИ
       дл_части > макс_дл
  ТО
       дл_части:= макс_дл
  КОН;
         цКуда:=0;
  ПОКА
         цКуда < дл_части
  ВЫП
    куда[цКуда]:=откуда[цОткуда];
    УВЕЛИЧИТЬ(цКуда);
    УВЕЛИЧИТЬ(цОткуда)
  КОН;
    куда[цКуда]:=0X
КОН Часть;

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

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

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

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

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

<*ЕСЛИ НЕ ЗАДАНО("МПГ") ТО*>

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

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

(*~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~общедоступная ЗАДАЧА~~~~~~~~~~~~~~~~~~~*)
ЗАДАЧА ИзВин-(вин-:РЯД ИЗ ЯЧЦЕЛ;
             цепь+:ЦЕПЬ);
(*
 * Переводит все Вин-знаки ряда <вин> в цепочку знаков <цепь>.
 *)
ПЕР
  зн:ЯЧЦЕЛ;
  поз,р:ЦЕЛ;
УКАЗ
  ЕСЛИ
       РАЗМЕР(вин) < РАЗМЕР(цепь)
  ТО
    р:=РАЗМЕР(вин)
  ИНАЧЕ
    р:=РАЗМЕР(цепь)
  КОН;

  ОТ поз:=0 ДО р-1 ВЫП
    зн:=вин[поз];
    цепь[поз]:=оЗнака.ИзВин(зн);
    ЕСЛИ
         зн = 0
    ТО
      ВОЗВРАТ
    КОН
  КОН
КОН ИзВин;

(*~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~общедоступная ЗАДАЧА~~~~~~~~~~~~~~~~~~~*)
ЗАДАЧА ИзДос-(дос-:РЯД ИЗ ЯЧЦЕЛ;
             цепь+:ЦЕПЬ);
(*
 * Переводит все Дос-знаки ряда <дос> в цепочку знаков <цепь>.
 *)
ПЕР
  зн:ЯЧЦЕЛ;
  поз,р:ЦЕЛ;
УКАЗ
  ЕСЛИ
       РАЗМЕР(дос) < РАЗМЕР(цепь)
  ТО
    р:=РАЗМЕР(дос)
  ИНАЧЕ
    р:=РАЗМЕР(цепь)
  КОН;

  ОТ поз:=0 ДО р-1 ВЫП
    зн:=дос[поз];
    цепь[поз]:=оЗнака.ИзДос(зн);
    ЕСЛИ
         зн = 0
    ТО
      ВОЗВРАТ
    КОН
  КОН
КОН ИзДос;

<*ИНАЧЕ*>                    (* Малый ПГ*)
<*КОН*>

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

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

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

(*~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~общедоступная ЗАДАЧА~~~~~~~~~~~~~~~~~~~*)
ЗАДАЧА УдалитьПробелы-(цепь+:ЦЕПЬ);
(*
 * Удаляет пробелы в начале и в конце цепочки <цепь>.
 *)
УКАЗ
  оЦепи.УдалитьНачПробелы(цепь);
  оЦепи.УдалитьКонПробелы(цепь)
КОН УдалитьПробелы;

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

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

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

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

      УМЕНЬШИТЬ(дл_новая); 
      УМЕНЬШИТЬ(поз)
    КОН;
    ПОКА
                дл_новая > 0
    ВЫП
           цепь[дл_новая]:=" ";
      УМЕНЬШИТЬ(дл_новая)
    КОН;
  КОН
КОН ДобавитьНачПробелы;

КОН оЦепи.
