ЛОГИЧЕСКАЯ СТРУКТУРА ПРОЦЕДУРЫ и ТАБЛИЦА-СИЛУЭТ
(мысли по дальнейшему развитию программы)

Согласно постулату структурного программирования основными
строительными блоками программы являются действие (присвоение или вызов
процедуры), цикл и сложное условие.

В ДАЛВЯЗ 2 действие (присвоение или вызов процедуры или группа
каких-нибудь операторов языка программирования), обобщенный цикл и
сложное условие являются основными маршрутными операторами, полноценно
отображаемыми на визуальной схеме в виде блоков действий, связанных
между собой линиями логических переходов, и задаваемыми псевдокодом
ПкДАЛВЯЗ в окне ЛСП при создании и редактировании визуальной схемы.
Логическая структура процедуры (ЛСП) - это последовательность основных
маршрутных операторов, укрупненно описывающая логику процедуры
(подробнее см. тему "AB_VJAZ и DAL_VJAZ, 6.04.2012, dalvjaz2_description.pdf).

При считывании исходного кода программа разделяет его на ЛСП и список
соответствующих каждой строке ЛСП действий.

1) Последняя версия ПкДАЛВЯЗ (планируется ее вставка в программу как одного
из первоочередных исправлений при дальнейшем развитии программы)
выглядит следующим образом:
## Код:
```
Назначение операторов                      английская  русская
ПкДАЛВЯЗ                                   мнемоника   мнемоника

Начало процедуры                            HD  NA      ПР  НД   (процедура)
Начало блока условия с номером действия     IF  NA      ЕС  НД   (если )
Дополнительное условие с н. действия        EI  NA      ИЕ  НД   (иначе если)
Альтернативное условие                      EL          ИН       (иначе)
Конец блока условия                         E           К        (конец)
Начало цикла с н. действия                  CB  NA      НЦ  НД   (начало цикла) 
Конец цикла с н. действия                   CE  NA      КЦ  НД   (конец цикла)
Действие с н. действия                      А   NA      Д   НД   (действие) 
Первая ветка блока веток с номером ветки     
и н. действия                               FB  NB NA   ПВ  НВ НД
Следующая ветка блока веток с н. ветки      
и н. действия                               NB  NB NA   СВ  НВ НД
Переход к ветке с н. ветки и н. действия    J   NB NA   П   НВ НД 
Выход из процедуры с н. действия            R   NA      В   НД
```

Если у начала или у конца цикла нет номера действия, то будет использовано
начало или конец цикла по умолчанию, задаваемое в файле конфигурации,
например для паскаля:
- начало цикла по умолчанию: repeat
- конец цикла по умолчанию: end;
Блок веток по смыслу является блоком условия, в котором проверяется
значение номера ветки. Номер действия ветке и переходу к ветке нужен, т.к.
там записываются действие на языке программирования и комментарий к нему.

Номера действий присваиваются автоматически при считывании процедуры.
При создании новых действий номера действий могут задаваться пользователем
или автоматически.
С целью защиты от внесения ошибок при редактировании ЛСП при изменении
пользователем вручную номера действия или ветки у уже существующего
оператора программа должна требовать подтверждения правильности введенного
нового номера действия или ветки, или блокировать изменение, если введенный
номер является заведомо неверным.


2) Предполагается, что в следующей версии программы ЛСП будет не списком,
а текстом в окне редактирования, который пользователь сможет вводить как
функциональными клавишами, так и с клавиатуры.
В нужные места ЛСП можно будет по Shift+Ins вставлять фрагменты ЛСП,
взятые из файлов шаблонов ЛСП.
Список действий будет представлен как текст в окне редактирования,
находящемся ниже окна ЛСП.
При щелчке мышью по номеру действия в окне ЛСП в окне действий будет
появляться действие с этим номером.
Пара "ЛСП + список действий" будет рассматриваться как текущее состояние
редактирования схемы, все состояния будут сохраняться в каталоге состояний
редактирования схемы, так что после начала редактирования будет возможен
откат к любому из состояний после начала редактирования.


3) Предполагается приблизить формат псевдокода к формату текстовой
инструкции.
Будет считаться, что строка первой или следующей ветки блока веток
обозначается числом, соответствующим номеру ветки, за которым следуют
символы "точка" и "пробел".
Если после текущий ветки сразу же будет выполняться следующая ветка, то
переход к следующей ветке, являющийся последним действием ветки, можно не
ставить. Переход в конце ветки также не нужен, если в теле ветки задается
несколько переходов (например с помощью блока переключателей).

(можно сравнить приводимый ниже текст с текстом алгоритма 4 выше в этой теме
из поста от 3.07.2012 )
## Код:
```
АЛГОРИТМ.4. ТАБЛИЦА-СИЛУЭТ
   * ветка := 1 
   * цикл-силуэт пока (ветка <> 0) 
      1. описание действий для ветки 
         * k := 1;
           n := 1;   
      2. описание действий для ветки
         * переход к 61
           вход в основной режим
      * конец
      3. описание действий для ветки
         * если (n = 2)
            * переход к 62
         * иначе если (n = 3)
            * переход к 63
         * иначе если (n = 4)
            * переход к 64
         * конец
      * конец
      4. описание действий для ветки
         * делаем что-нибудь
      5. описание действий для ветки
         * делаем что-нибудь
      6. описание действий для ветки
         * делаем что-нибудь
      * конец
      7. описание действий для ветки
         * делаем что-нибудь
      11. описание действий для ветки
         * делаем что-нибудь
      12. описание действий для ветки
         * делаем что-нибудь
      * конец
      13. описание действий для ветки
         * делаем что-нибудь
      14. описание действий для ветки
         * делаем что-нибудь
      15. описание действий для ветки
         * делаем что-нибудь
         * к := к+1
      * конец
      16. описание действий для ветки
         * если (k < 10) 
            * переход к 2
         * иначе
            * переход к 17
         * конец
      17. описание действий для ветки
         * обработка ошибок
         * ВЫХОД
      * конец
      61. описание действий для ветки
         * загрузка параметров
         * вызов процедуры-обработчика
         * обработка ответа процедуры обработчика
           получаем значение n
         * переход к 3
      62. описание действий для ветки
         * загрузка параметров
         * вызов процедуры-обработчика
         * обработка ответа процедуры обработчика
         * переход к 4
      * конец
      63. описание действий для ветки
         * загрузка параметров
         * вызов процедуры-обработчика
         * обработка ответа процедуры обработчика
         * переход к 4
      64. описание действий для ветки
         * загрузка параметров
         * вызов процедуры-обработчика
         * обработка ответа процедуры обработчика
         * переход к 4
      * конец
   * конец цикла-силуэта   
   * выход
КОНЕЦ АЛГОРИТМА
```

4) Предполагается, что для таблицы-силуэта ЛСП может быть двумерной, причем
стандартный цикл-силуэт будет рассматриваться как таблица-силуэт с одной
строкой.
Пример двумерной ЛСП для вышеприведенного алгоритма:
## Код:
```
ПР  1 
   Д  2
   НЦ   3
      ПВ  1  4    СВ  2  6  
         Д   5       П  61  7
      К
      ПВ  3        8
         ЕС        9
            П  62  10
         ИЕ        11
            П  63  12
         ИЕ        13
            П  64  14
         К
      К
      ПВ  4  15    СВ  5  17    СВ  6  19
         Д  16        Д  18        Д  20
      К
      ПВ  7  21    СВ  11  23   СВ  12  25
         Д  22        Д  24        Д  26
      К
      ПВ  13  27   СВ  14  29   СВ  15  31
         Д  28        Д  30        Д  32
                                   Д  33
      К 
      ПВ  16  34         СВ  17  38
         ЕС  35             Д  39
            П  2  36        П  0  40
         ИН
            П  17  37
         К
      К
      ПВ  61  41     СВ  62  46  
         Д  42          Д  47
         Д  43          Д  48
         Д  44          Д  49
         П  3  45       П  4  50
      К
      ПВ  63  51     СВ  64  56
         Д  52          Д  57
         Д  53          Д  58
         Д  54          Д  59
         П  4  55       П  4  60
      К
   КЦ
В  61
```

------------------------------------
замечание от 26.07.12  11:10 :
А в пример кода ЛСП вкрались ошибки - т.к. для псевдокода по умолчанию
переход к следующей по порядку ветке мы опускаем, а во внутреннем формате
программы такие переходы должны быть. Поэтому в примере для ЛСП нужно
расставить

П Вслед НД

для веток:  1, 4, 5, 6, 7, 11, 12, 13, 14, 15
------------------------------------
Из вышеприведенного текста алгоритма 4 видно, что таблица-силуэт была
отформатирована так, что ветки с одинаковыми номерами логических строк
(в пределах одного десятка) относятся к разным визуальным строкам
таблицы-силуэта. Это было сделано для удобства отображения схемы на экране.

Кстати, из вышеприведенной ЛСП видно, что введение двумерности для ЛСП
повышает ее читабельность по сравнению с одномерной ЛСП.


5) Предполагается ввести функцию нормализации номеров веток при
редактировании ЛСП. В промежутках между нормализациями номеров веток, если
вдруг потребуется вставить новую ветку между двумя ветками или в начале
логической строки таблицы-силуэта, можно взять для этой ветки максимальный
из свободных номеров для данной логической строки - это может привести
к последовательности номеров веток для логической строки вида:
26, 21, 22, 24, 23, 25.
После нормализации ситуация будет исправлена.
Количество веток для логической строки таблицы-силуэта не должно быть
больше 9 (желательно не создавать больше 7 веток для логической строки), при
необходимости нужно прибегать к декомпозиции с использованием нижних строк
таблицы-силуэта.


6) Предполагается реализовать одновременную работу с псевдокодом и языком
программирования. Программные записи модулей, заданных в конфигурации
как ДОК, будут считаться записями, написанными на псевдокоде, а программные
записи модулей, заданных в конфигурации как КОД - записями, написанными на
исходном коде и, возможно, включающими в себя комментарии, написанные на
псевдокоде.
Из псеводкода можно будет сгенерировать шаблон прцедуры во временный файл,
а затем вставить его в модуль исходного кода и наполнить нужным содержанием.
Аналогично можно будет из программной записи на исходном коде с комментариями
сгенерировать текущий комментарий для этой процедуры на псевдокоде.

Рассмотрим следующий пример:
## Код:
```
(*i*)  if (wetka = 3)
       (*---                                 // начало комментариев действия
       .. описание действий для ветки 
          вторая строка описания  ---*)      // конец комментариев действия
       (* какой-нибудь комментарий *)      
   (*i*)  if (n = 2)  then begin     
          (*--- * если (n = 2)   ---*)
      (*i*)  wetka := 62;
             (*--- * переход к .. ---*)
   (*i*)  end else if (n = 3) then begin  
          (*--- * иначе если (n = 3)   ---*)
      (*i*)  wetka := 63;
             (*--- * переход к .. ---*)
   (*i*)  end else if (n = 4) then begin   
          (*--- * иначе если (n = 4)   ---*)
      (*i*)  wetka := 64;
             (*--- * переход к .. ---*)
   (*i*)  end;
(*i*)  end;
```

Для него будет сгенерирован следующий псевдокод:
## Код:
```
3. описание действий для ветки
   вторая строка описания
   * если (n = 2)
      * переход к 62
   * иначе если (n = 3)
      * переход к 63
   * иначе если (n = 4)
      * переход к 64
   * конец
* конец
```

Из вышеприведенного примера видно, что правильные номера веток в
сгенерированный псевдокод будут подставлены автоматически.


7) Введение комментариев действий в ДАЛВЯЗ 2 позволит при построении
изображения схемы отображать в блоках либо только исходный код, либо
только комментарии, либо исходный код вместе с комментариями.


8 ) Предполагается возможность отображения блоков веток в стиле языка
ДРАКОН. Для таблицы-силуэта это предположительно будет выглядеть
следующим образом:
Вложение:
ts2507.JPG [ 78.26 КБ | Просмотров: 20849 ]

Почему не как в ДМ-О2-схеме у Владислава Жаринова - я посчитал, что
будет более естественно не направлять в одну горизонтальную линию
встречные логические переходы из обратной петли силуэта и из верхней
строки схемы, а сохранить порядок переходов "вниз-вправо".