(*~\Глагол\Приложения\Иное\~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~*)
(**)                           ОТДЕЛ ЧислоЕ+;
(*============================================================================*)
(* НАЗНАЧЕНИЕ:
//         Приложение "Вычисление числа e с точностью 'ЗНАКОВ' после запятой"
// АЛГОРИТМ:
//   e = 1 + X1 + X2 + ... + Xi + ... , где Xi = 1/1/2/3/.../i
// ОБОЗНАЧЕНИЯ:
//   р  - значение десятичного разряда
//   п  - позиция разряда
//   п0 - число ведущих 0-х разрядов в Xi *)
(*============================================================================*)

ИСПОЛЬЗУЕТ
  НаЭкран ИЗ "..\..\Отделы\Обмен\ВводВывод\";

ПОСТ
  ЗНАКОВ=1024;
  ЦИФР=ЗНАКОВ + (ЗНАКОВ+31) ДЕЛИТЬ 32; (* цифр для расчёта *)

ВИД 
  Число=РЯД ЦИФР ИЗ ЯЧЦЕЛ;
  (*
   * [0] - единицы
   * [1] - десятые
   * [2] - сотые
   * и т.д.
   *)

(*-----------------------------------------локальная ЗАДАЧА-------------------*)
ЗАДАЧА Разделить(X+:Число; i,п0+:ЦЕЛ);                              (* X:=X/i *)
ПЕР
  п,р:ЦЕЛ;
УКАЗ
  р:=0;
  ОТ п:=п0 ДО ЦИФР-1 ВЫП
    р:=10*р+X[п];
    X[п]:=УЗК(УЗК(р ДЕЛИТЬ i));
    р:=р ОСТАТОК i
  КОН;
          (* продвигаем п0 *)
  ПОКА (п0 < ЦИФР) И (X[п0] = 0) ВЫП 
    УВЕЛИЧИТЬ(п0) 
  КОН
КОН Разделить;

(*-----------------------------------------локальная ЗАДАЧА-------------------*)
ЗАДАЧА Добавить(E+,X-:Число; п0:ЦЕЛ);                               (* E:=E+X *)
ПЕР
  п:ЦЕЛ;
  р:ЯЧЦЕЛ;
УКАЗ
  р:=0;
  ОТ п:=ЦИФР-1 ДО п0 ПО -1 ВЫП
    УВЕЛИЧИТЬ(р,E[п]+X[п]);
    ЕСЛИ р >= 10 ТО
      E[п]:=р-10;
      р:=1
    ИНАЧЕ
      E[п]:=р;
      р:=0
    КОН
  КОН;
  ПОКА р # 0 ВЫП
    УВЕЛИЧИТЬ(р,E[п]);
    ЕСЛИ р >= 10 ТО
      E[п]:=р-10;
      р:=1
    ИНАЧЕ
      E[п]:=р;
      р:=0
    КОН;
    УМЕНЬШИТЬ(п)
  КОН
КОН Добавить;

(*-----------------------------------------локальная ЗАДАЧА-------------------*)
ЗАДАЧА ВыводЧисла(E-:Число);                              (* на экран числа E *)
ПЕР
  п:ЦЕЛ;
УКАЗ
  НаЭкран.Цел4числа("^   e = %d.%d",E[0],E[1],0,0);
  ОТ п:=2 ДО ЗНАКОВ ВЫП
    ЕСЛИ п ОСТАТОК 64 = 1 ТО
      НаЭкран.Цел4числа("^%5d:   ",п,0,0,0);
    КОН;
    НаЭкран.Цел4числа("%d",E[п],0,0,0)
  КОН
КОН ВыводЧисла;

(*------------------------------------------ Главная ЗАДАЧА-------------------*)
ЗАДАЧА Расчёт;
(*
 * Распределение памяти, расчёт по алгоритму и вывод ответа на экран
 *)
ПЕР
  E,X:ДОСТУП К Число;
  п0,i:ЦЕЛ;
УКАЗ
  НаЭкран.ВсяЦепь("^Расчёт числа 'e': 1 + 1/1 + 1/1/2 + 1/1/2/3 + ... .");
  СОЗДАТЬ(E);
  СОЗДАТЬ(X);
  X[0]:=1; (* X:=1.0 *)
  E[0]:=1; (* E:=1.0 *)
  п0:=0;
  i:=1;
  ПОВТОРЯТЬ
    Разделить(X^,i,п0);
    Добавить(E^,X^,п0);
    УВЕЛИЧИТЬ(i)
  ДО п0 = ЦИФР;
  НаЭкран.Цел4числа("^Всего: %d слагаемых, %d знака после запятой, %d цифр для расчёта.^",
                      i,            ЗНАКОВ,                  ЦИФР,              0); 
  ВыводЧисла(E^)
КОН Расчёт;

(*-SSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSS-*)
УКАЗ
  Расчёт
КОН ЧислоЕ.
