Задача 9 (6 баллов) Проверка программы.

Определение
-----------
<программа>   := <команда>|<программа><команда>
<команда>     := <простая>|<цикл>
<простая>     := л|п|в|н
<цикл>        := ц<повторитель><простая>
<повторитель> := 4|5

Проверить, является ли запись во второй строке поля программой.
В начальный момент Кукарача расположен перед кубиками с записью:

¤запись

Если проверяемая запись - программа, установить Кукарачу в конец
записи:

 запись¤

Если запись - не программа, поставить исполнитель под первым неверным
символом:

запись
  ¤

п р о в е р к а  к у р а т о р а


Команда 3115
------------
.\15\15.txt
.\15\1591.coc

Оценка: 6
Автор решения 1591 Данил Первушин

Вот диаграмма переходов:

             ┌──────в.о.───────────┬в.о.─────────┐
    ┌────────┴─┐               ┌───┴───┬л─п  ┌───v───┐
    │Транслятор├────л│п│в│н────>Простая│  в  │ Ошибка<──┐
    └─┬────────┘               └┬─^──┬─<──н  └───────┘  │
      │                         │ │  п                  │
      ц                         │ │  у     ┌────┐       │
      │ ┌──────────────ц────────┘ │  └сто──> Да │       │
    ┌─v─v┐       ┌──────┐         │        └────┘       │
    │Цикл├─4│5───>Повтор├л│п│в│н──┘                     │
    └──┬─┘       └───┬──┘                               │
       └──в.о.───────┴─────в.о.─────────────────────────┘


 А вот и сама программа:


//-------------------------------------
// описание                            
ЭТО Транслятор
 Шаг                                   
 ЕСЛИ ц
   ТО Цикл                             
 ИНАЧЕ ЕСЛИ л
  ТО Простая                           
 ИНАЧЕ ЕСЛИ п                          
  ТО Простая                           
 ИНАЧЕ ЕСЛИ н
  ТО Простая                           
 ИНАЧЕ ЕСЛИ в                          
  ТО Простая                           
 ИНАЧЕ Ошибка
КОНЕЦ // Транслятор                    
//-------------------------------------
// описание                            
ЭТО Цикл
 Шаг
 ЕСЛИ 4
  ТО Повтор                            
 ИНАЧЕ ЕСЛИ 5                          
  ТО Повтор                            
 ИНАЧЕ Ошибка
КОНЕЦ // Цикл                          
//-------------------------------------
// описание                            
ЭТО Простая
 Шаг                                   
 ЕСЛИ ц                                
  ТО Цикл                              
 ИНАЧЕ ЕСЛИ л
  ТО Простая                           
 ИНАЧЕ ЕСЛИ п
  ТО Простая                           
 ИНАЧЕ ЕСЛИ н
  ТО Простая                           
 ИНАЧЕ ЕСЛИ в                          
  ТО Простая                           
 ИНАЧЕ ЕСЛИ ПУСТО
  ТО Да
 ИНАЧЕ Ошибка
КОНЕЦ // Простая                       
//-------------------------------------
// описание                            
ЭТО Повтор
 Шаг                                   
 ЕСЛИ л
  ТО Простая                           
 ИНАЧЕ ЕСЛИ п
  ТО Простая                           
 ИНАЧЕ ЕСЛИ н                          
  ТО Простая                           
 ИНАЧЕ ЕСЛИ в
  ТО Простая                           
 ИНАЧЕ Ошибка                          
КОНЕЦ // Повтор                        
//-------------------------------------
// описание                            
ЭТО Шаг                                
 ВНИЗ                                  
 ВПРАВО
 ВВЕРХ
КОНЕЦ // Шаг
//-------------------------------------
// описание                            
ЭТО Ошибка                             
 Шаг
 ЕСЛИ НЕ ПУСТО                         
  ТО Ошибка
 ВЛЕВО                                 
КОНЕЦ // Ошибка
//-------------------------------------
// описание                            
ЭТО Да                                 
 ВВЕРХ
КОНЕЦ // Да                            

к о м м е н т а р и й  к у р а т о р а

Есть два замечания.

Первое по диаграмме переходов.

Начальное состояние лучше обозначать именем "вход", а конечное тем
именем, которое является заглавным в определениях Бэкуса, в нашем
случае "программа". Кроме того, я понял, что схема будет нагляднее,
если не рисовать переходы на состояние "ошибка" (они ведут из каждого
блока, кроме конечного). Рисунок лучше рисовать так, чтобы начальное
состояние и конечное были на одной горизонтали (или вертикали). Все
блоки нужно рисовать одинакового размера и выравнивать их как по
горизонтали, так и по вертикали. Схема получается более понятной:

                         л,п,в,н
                        ┌───────┐
                        V       │
┌───────────┐л,п,в,н  ┌─────────┴─┐ПУСТО    ┌───────────┐
│    вход   ├────────>│  простая  │────────>│ программа │
└─────┬─────┘         └─┬─────────┘         └───────────┘
      │ц               ц│       ^
      │   ┌─────────────┘       │
      V   V                     │л,п,в,н
┌───────────┐         ┌─────────┴─┐
│  цикл     │────────>│повторитель│
└───────────┘4,5      └───────────┘

Второе замечание по внешнему виду программы.

Вместо:

ЭТО Повтор
 Шаг
 ЕСЛИ л
  ТО Простая                           
 ИНАЧЕ ЕСЛИ п                          
  ТО Простая                           
 ИНАЧЕ ЕСЛИ н                          
  ТО Простая                           
 ИНАЧЕ ЕСЛИ в
  ТО Простая
 ИНАЧЕ Ошибка                          
КОНЕЦ // Повтор                        

переключатели лучше писать так (более наглядно):

ЭТО Повтор
 Шаг                                   
 ЕСЛИ       л ТО Простая
 ИНАЧЕ ЕСЛИ п ТО Простая
 ИНАЧЕ ЕСЛИ н ТО Простая
 ИНАЧЕ ЕСЛИ в ТО Простая
 ИНАЧЕ           Ошибка
КОНЕЦ       │    │
            │    │
      уровень    уровень
      условий    команд

И еще: названия собственных команд лучше записывать одними маленькими
буквами: это повышает их выделение в массиве крупносимвольных ключевых
слов:

ЭТО повтор
 шаг
 ЕСЛИ       л ТО простая
 ИНАЧЕ ЕСЛИ п ТО простая
 ИНАЧЕ ЕСЛИ н ТО простая
 ИНАЧЕ ЕСЛИ в ТО простая
 ИНАЧЕ           ошибка
КОНЕЦ

