10.06.2015 Views

Статья в формате PDF - Кафедра «Технологии программирования

Статья в формате PDF - Кафедра «Технологии программирования

Статья в формате PDF - Кафедра «Технологии программирования

SHOW MORE
SHOW LESS

You also want an ePaper? Increase the reach of your titles

YUMPU automatically turns print PDFs into web optimized ePapers that Google loves.

<strong>Статья</strong> опублико<strong>в</strong>ана <strong>в</strong> журнале “Информационно-упра<strong>в</strong>ляющие системы”. 2005.<br />

№ 4, с. 51-60.<br />

УДК 681.3.06<br />

РЕАЛИЗАЦИЯ АНИМАЦИИ ПРИ<br />

ПОСТРОЕНИИ ВИЗУАЛИЗАТОРОВ<br />

АЛГОРИТМОВ НА ОСНОВЕ<br />

АВТОМАТНОГО ПОДХОДА<br />

М. А. Казако<strong>в</strong>,<br />

аспирант<br />

А. А. Шалыто,<br />

д-р техн. наук, профессор<br />

Санкт-Петербургский государст<strong>в</strong>енный уни<strong>в</strong>ерситет<br />

информационных технологий, механики и оптики<br />

В статье предлагается подход к реализации анимации алгоритмо<strong>в</strong>, который расширяет<br />

технологию построения <strong>в</strong>изуализаторо<strong>в</strong> алгоритмо<strong>в</strong> на осно<strong>в</strong>е а<strong>в</strong>томатного подхода.<br />

Article describes proposed approach for algorithm animation extension above existing<br />

technology for algorithm visualizations implementation based on the automaton programming<br />

approach.<br />

В<strong>в</strong>едение<br />

Визуализаторы алгоритмо<strong>в</strong> широко используются <strong>в</strong> процессе препода<strong>в</strong>ания<br />

дискретной математики и теории классических <strong>в</strong>ычислительных алгоритмо<strong>в</strong> [1 – 3].<br />

Визуализатор — программа, иллюстрирующая <strong>в</strong>ыполнение алгоритма при<br />

определенных исходных данных [4].<br />

В работе [5] рассматри<strong>в</strong>ался метод построения <strong>в</strong>изуализаторо<strong>в</strong> на осно<strong>в</strong>е<br />

а<strong>в</strong>томата Мили, а также предлагалась технология формального преобразо<strong>в</strong>ания<br />

<strong>в</strong>ычислительного алгоритма <strong>в</strong> <strong>в</strong>изуализатор. Аналогичным образом логика<br />

<strong>в</strong>изуализаторо<strong>в</strong> может строиться на осно<strong>в</strong>е а<strong>в</strong>томата Мура.<br />

Ранее <strong>в</strong>изуализатор рассматри<strong>в</strong>ался, как дискретная последо<strong>в</strong>ательность<br />

статических иллюстраций, что <strong>в</strong> большинст<strong>в</strong>е случае<strong>в</strong> достаточно для обучения.<br />

Однако, <strong>в</strong> некоторых алгоритмах статических иллюстраций недостаточно. Примером<br />

такого алгоритма может служить обход дере<strong>в</strong>а [6], так как именно процесс д<strong>в</strong>ижения<br />

указателя по <strong>в</strong>ершинам дере<strong>в</strong>а я<strong>в</strong>ляется наиболее интересным и <strong>в</strong>ажным для<br />

понимания этого алгоритма.<br />

В настоящей работе предлагается расширение технологии построения<br />

<strong>в</strong>изуализаторо<strong>в</strong> с целью <strong>в</strong>ключения <strong>в</strong> нее <strong>в</strong>озможности анимации требуемых шаго<strong>в</strong><br />

<strong>в</strong>изуализации. При этом рассматри<strong>в</strong>ается такая разно<strong>в</strong>идность анимации, при<br />

которой изображается переход от предыдущих значений <strong>в</strong>изуализируемых<br />

1


переменных к последующим. Поскольку каждая статическая иллюстрация я<strong>в</strong>ляется<br />

функцией от <strong>в</strong>изуализируемых переменных, то указанная анимация и будет<br />

<strong>в</strong>изуализиро<strong>в</strong>ать шаг алгоритма <strong>в</strong> динамике. Предлагаемый подход иллюстрируется<br />

на примере традиционной реализации алгоритма обхода д<strong>в</strong>оичного дере<strong>в</strong>а [7].<br />

1. А<strong>в</strong>томатная технология построения <strong>в</strong>изуализаторо<strong>в</strong> без<br />

анимации<br />

В работе [5] описана а<strong>в</strong>томатная технология построения <strong>в</strong>изуализаторо<strong>в</strong><br />

алгоритмо<strong>в</strong>, состоящая из следующих этапо<strong>в</strong>.<br />

1. Постано<strong>в</strong>ка задачи, которую решает <strong>в</strong>изуализируемый алгоритм.<br />

2. Решение задачи <strong>в</strong> сло<strong>в</strong>есно-математической форме.<br />

3. Выбор <strong>в</strong>изуализируемых переменных.<br />

4. Анализ алгоритма для <strong>в</strong>изуализации. Анализируется решение с целью<br />

определения того, что и как отображать на экране.<br />

5. Алгоритм решения задачи.<br />

6. Реализация алгоритма на <strong>в</strong>ыбранном языке программиро<strong>в</strong>ания. На этом<br />

шаге произ<strong>в</strong>одится реализация алгоритма, его отладка и про<strong>в</strong>ерка<br />

работоспособности.<br />

7. Построение схемы алгоритма по программе.<br />

8. Преобразо<strong>в</strong>ание схемы алгоритма <strong>в</strong> граф переходо<strong>в</strong> а<strong>в</strong>томата,<br />

реализующего алгоритм, который может быть как а<strong>в</strong>томатом Мили, так и<br />

а<strong>в</strong>томатом Мура [8, 9].<br />

9. Преобразо<strong>в</strong>ание а<strong>в</strong>томата реализующего алгоритм <strong>в</strong> а<strong>в</strong>томат <strong>в</strong>изуализации.<br />

10. Выбор интерфейса <strong>в</strong>изуализатора.<br />

11. Сопоста<strong>в</strong>ление иллюстраций и комментарие<strong>в</strong> с состояниями а<strong>в</strong>томата<br />

(иллюстрации формируются компонентом программы, назы<strong>в</strong>аемым<br />

«рисо<strong>в</strong>альщик»).<br />

12. Архитектура программы <strong>в</strong>изуализатора.<br />

13. Программная реализация <strong>в</strong>изуализатора.<br />

С целью обеспечения <strong>в</strong>озможности анимации <strong>в</strong> последо<strong>в</strong>ательность дейст<strong>в</strong>ий<br />

<strong>в</strong><strong>в</strong>одятся дополнительные шаги. Отметим, что поскольку изменения<br />

<strong>в</strong>изуализируемых переменных <strong>в</strong> используемых <strong>в</strong> настоящей работе а<strong>в</strong>томатах Мура<br />

произ<strong>в</strong>одятся <strong>в</strong> состояниях, что <strong>в</strong>есьма удобно, то будем рассматри<strong>в</strong>ать <strong>в</strong>опрос о<br />

<strong>в</strong><strong>в</strong>едении анимации <strong>в</strong> <strong>в</strong>изуализаторы, построенные на осно<strong>в</strong>е а<strong>в</strong>томато<strong>в</strong> Мура.<br />

2. Анимация <strong>в</strong> <strong>в</strong>изуализаторах на осно<strong>в</strong>е а<strong>в</strong>томато<strong>в</strong> Мура<br />

Для построения <strong>в</strong>изуализатора с анимацией предлагается применять четыре<br />

типа а<strong>в</strong>томато<strong>в</strong>:<br />

• а<strong>в</strong>томат, реализующий алгоритм (формируется на <strong>в</strong>осьмом этапе);<br />

• а<strong>в</strong>томат <strong>в</strong>изуализации (формируется на де<strong>в</strong>ятом этапе);<br />

• преобразо<strong>в</strong>анный а<strong>в</strong>томат <strong>в</strong>изуализации;<br />

• а<strong>в</strong>томат анимации.<br />

А<strong>в</strong>томат <strong>в</strong>изуализации отображает последо<strong>в</strong>ательно статические<br />

иллюстрации <strong>в</strong> каждом состоянии, что при<strong>в</strong>одит к статической (пошаго<strong>в</strong>ой)<br />

2


<strong>в</strong>изуализации. Здесь под статической иллюстрацией понимается фиксиро<strong>в</strong>анный<br />

кадр, не изменяющийся с течением <strong>в</strong>ремени.<br />

Преобразо<strong>в</strong>анный а<strong>в</strong>томат <strong>в</strong>изуализации кроме статических иллюстраций<br />

отображает также и динамические иллюстрации <strong>в</strong> дополнительно <strong>в</strong><strong>в</strong>одимых<br />

анимационных состояниях. Это поз<strong>в</strong>оляет го<strong>в</strong>орить о динамической <strong>в</strong>изуализации<br />

(анимации).<br />

Динамическая иллюстрация состоит из набора промежуточных статических<br />

иллюстраций, отображаемых на экране а<strong>в</strong>томатом анимации через определенные<br />

промежутки <strong>в</strong>ремени. Это при<strong>в</strong>одит к динамическому изменению иллюстрации <strong>в</strong><br />

анимационном состоянии.<br />

Для а<strong>в</strong>томато<strong>в</strong> Мура анимацию естест<strong>в</strong>енно про<strong>в</strong>одить (также как и<br />

формиро<strong>в</strong>ание статических изображений и комментарие<strong>в</strong>) <strong>в</strong> состояниях. Для<br />

<strong>в</strong><strong>в</strong>едения анимации <strong>в</strong> <strong>в</strong>изуализатор расширим технологию за счет <strong>в</strong><strong>в</strong>едения<br />

следующих шаго<strong>в</strong>:<br />

a) <strong>в</strong>ыбор состояний а<strong>в</strong>томата <strong>в</strong>изуализации, <strong>в</strong> которых <strong>в</strong>ыполняется<br />

анимация (такие состояния будем наз<strong>в</strong>ать анимационными);<br />

b) построение преобразо<strong>в</strong>анного а<strong>в</strong>томата <strong>в</strong>изуализации путем<br />

замены каждого из анимационных состояний тремя состояниями, <strong>в</strong><br />

пер<strong>в</strong>ом из которых произ<strong>в</strong>одятся преобразо<strong>в</strong>ания данных, <strong>в</strong>о <strong>в</strong>тором —<br />

анимация, соот<strong>в</strong>етст<strong>в</strong>ующая этому состоянию, при переходе <strong>в</strong> третье<br />

состояние анимация заканчи<strong>в</strong>ается, а непосредст<strong>в</strong>енно <strong>в</strong> третьем<br />

состоянии отображается статическая иллюстрация, соот<strong>в</strong>етст<strong>в</strong>ующая<br />

состоянию исходного а<strong>в</strong>томата;<br />

c) разработка анимационного а<strong>в</strong>томата (<strong>в</strong>ыполняется один раз для <strong>в</strong>сех<br />

<strong>в</strong>изуализаторо<strong>в</strong>, проектируемых по этой технологии);<br />

d) обеспечение <strong>в</strong>заимодейст<strong>в</strong>ия между преобразо<strong>в</strong>анным а<strong>в</strong>томатом<br />

<strong>в</strong>изуализации и анимационным а<strong>в</strong>томатом;<br />

e) разработка и реализация функции <strong>в</strong>ы<strong>в</strong>ода каждой динамической<br />

иллюстрации, за<strong>в</strong>исящей от состояния а<strong>в</strong>томата <strong>в</strong>изуализации и<br />

шага анимации.<br />

До перехода к более подробному рассмотрению но<strong>в</strong>ых этапо<strong>в</strong> изложим, <strong>в</strong> чем<br />

состоит де<strong>в</strong>ятый этап исходной технологии (рис. 1).<br />

Состояние S<br />

Состояние S<br />

z0: <strong>в</strong>ы<strong>в</strong>ести F S (S)<br />

e0<br />

Рис. 1. Формиро<strong>в</strong>ание состояний а<strong>в</strong>томата <strong>в</strong>изуализатора<br />

На этом этапе <strong>в</strong> каждое <strong>в</strong>изуализируемое состояние <strong>в</strong><strong>в</strong>одится <strong>в</strong>ыходное<br />

<strong>в</strong>оздейст<strong>в</strong>ие z0, осущест<strong>в</strong>ляющее формиро<strong>в</strong>ание статического изображения и<br />

комментария <strong>в</strong> рассматри<strong>в</strong>аемом состоянии. Различия <strong>в</strong> изображениях и<br />

комментариях формализуются с помощью функции F S (S), параметром которой<br />

я<strong>в</strong>ляется номер состояния S. В каждом состоянии, формирующем <strong>в</strong>ыходное<br />

3


<strong>в</strong>оздейст<strong>в</strong>ие z0, переход к следующему состоянию осущест<strong>в</strong>ляется по событию e0<br />

(нажатие кла<strong>в</strong>иши «шаг» <strong>в</strong> интерфейсе <strong>в</strong>изуализатора).<br />

Поясним каждый из <strong>в</strong>но<strong>в</strong>ь <strong>в</strong><strong>в</strong>одимых этапо<strong>в</strong> a – e.<br />

На этапе a <strong>в</strong>ыполняется <strong>в</strong>ыбор анимационных состояний <strong>в</strong> соот<strong>в</strong>етст<strong>в</strong>ии с<br />

особенностями алгоритма и принятыми решениями по анимации на чет<strong>в</strong>ертом этапе<br />

исходной технологии («Анализ алгоритма для <strong>в</strong>изуализации»). Так как <strong>в</strong> алгоритме<br />

обхода д<strong>в</strong>оичного дере<strong>в</strong>а наибольший интерес предста<strong>в</strong>ляет процесс перехода<br />

между <strong>в</strong>ершинами, то состояния, <strong>в</strong> которых происходит переход, и будут <strong>в</strong>ыбраны <strong>в</strong><br />

качест<strong>в</strong>е анимационных.<br />

На этапе b <strong>в</strong> а<strong>в</strong>томате <strong>в</strong>изуализации для получения преобразо<strong>в</strong>анного<br />

а<strong>в</strong>томата этого типа каждое анимационное состояние формально заменяется тремя<br />

состояниями (рис. 2).<br />

Состояние S’<br />

Состояние S<br />

v 1 = ;<br />

…<br />

v n = ;<br />

z0: <strong>в</strong>ы<strong>в</strong>ести F S (S)<br />

e0<br />

old_v 1 = v 1 ;<br />

v 1 = ;<br />

…<br />

old_v n = v n ;<br />

v n = ;<br />

!x1 A<br />

Состояние S<br />

x1 A<br />

Состояние S A<br />

z0 A : <strong>в</strong>ы<strong>в</strong>ести F A (S, 0)<br />

e1 A : старт<br />

e0 || e3 A<br />

z0: <strong>в</strong>ы<strong>в</strong>ести F S (S)<br />

e2 A : стоп<br />

e0<br />

Рис. 2. Преобразо<strong>в</strong>ание анимационного состояния<br />

Опишем это преобразо<strong>в</strong>ание. Предположим, что состояние S <strong>в</strong>ыбрано для<br />

<strong>в</strong>изуализации. Предположим также, что <strong>в</strong> этом состоянии изменяются значения<br />

<strong>в</strong>изуализируемых переменных v 1 , … , v n . При этом переменной v i прис<strong>в</strong>аи<strong>в</strong>ается<br />

значение <strong>в</strong>ыражения < expr i >. Преобразо<strong>в</strong>ание состоит <strong>в</strong> замене <strong>в</strong>ыбранного<br />

состояния на три состояния — S', S и S A .<br />

В состоянии S' значения переменных v 1 , … , v n пред<strong>в</strong>арительно сохраняются <strong>в</strong><br />

переменных old_v 1 , … , old_v n , а также про<strong>в</strong>одятся <strong>в</strong>се дейст<strong>в</strong>ия, <strong>в</strong>ыполняемые <strong>в</strong><br />

состоянии S а<strong>в</strong>томата <strong>в</strong>изуализации.<br />

В состоянии S' преобразо<strong>в</strong>анного а<strong>в</strong>томата <strong>в</strong>изуализации <strong>в</strong> отличие от<br />

состояния S исходного а<strong>в</strong>томата этого типа не происходит ожидания события, а<br />

<strong>в</strong>ыполняется переход <strong>в</strong> одно из состояний S A или S.<br />

Переход <strong>в</strong> состояние S A произ<strong>в</strong>одится, если переменная x1 A принимает<br />

значение true (анимация <strong>в</strong>ключена). Анимация осущест<strong>в</strong>ляется, пока<br />

преобразо<strong>в</strong>анный а<strong>в</strong>томат <strong>в</strong>изуализации находится <strong>в</strong> состоянии S A . При <strong>в</strong>ходе <strong>в</strong> это<br />

состояние осущест<strong>в</strong>ляется запуск а<strong>в</strong>томата анимации при помощи события e1 A :<br />

старт и отображается иллюстрация F A (S, 0), соот<strong>в</strong>етст<strong>в</strong>ующая началу анимации.<br />

Выход из состояния анимации и переход <strong>в</strong> состояние S происходит, как по<br />

событию e0 (нажатие кла<strong>в</strong>иши), так и по событию e3 A (окончание анимации), и<br />

4


сопро<strong>в</strong>ождается сигналом e2 A : стоп. Таким образом, обеспечи<strong>в</strong>ается как<br />

а<strong>в</strong>томатическое, так и ручное за<strong>в</strong>ершение анимации.<br />

Состояние S я<strong>в</strong>ляется за<strong>в</strong>ершающим. В этом состоянии осущест<strong>в</strong>ляется<br />

отображение статической иллюстрации F S (S). Отметим, что поскольку <strong>в</strong><br />

преобразо<strong>в</strong>анном анимационном а<strong>в</strong>томате присутст<strong>в</strong>уют дейст<strong>в</strong>ия на дугах, то этот<br />

а<strong>в</strong>томат я<strong>в</strong>ляется смешанным а<strong>в</strong>томатом.<br />

Следует отметить, что при <strong>в</strong>ыключении анимации (x1 A отсутст<strong>в</strong>ует)<br />

преобразо<strong>в</strong>анный а<strong>в</strong>томат <strong>в</strong>изуализации стано<strong>в</strong>ится изоморфным исходному<br />

а<strong>в</strong>томату <strong>в</strong>изуализации. Поэтому <strong>в</strong>ключение анимации может рассматри<strong>в</strong>аться<br />

именно как расширение исходного <strong>в</strong>изуализатора, а не его преобразо<strong>в</strong>ание.<br />

На этапе c строится а<strong>в</strong>томат анимации (рис. 3). Следует отметить, что он<br />

я<strong>в</strong>ляется смешанным а<strong>в</strong>томатом, поскольку содержит дейст<strong>в</strong>ия как на дугах. Так и <strong>в</strong><br />

<strong>в</strong>ершинах графа перехода.<br />

0: Начало/Пауза<br />

e1 A<br />

step = 0<br />

2: иначе<br />

e3 A : конец<br />

1: Шаг<br />

step++;<br />

z0 A : <strong>в</strong>ы<strong>в</strong>ести F A (S 0 , step)<br />

eT A : t > T<br />

1: step < n - 1<br />

e2 A<br />

2: Следующий<br />

z1 A : запустить<br />

таймер<br />

Рис. 3. А<strong>в</strong>томат анимации<br />

Из рассмотрения этого рисунка следует, что а<strong>в</strong>томат предназначен для<br />

изменения значения переменной step, которая хранит номер шага анимации.<br />

А<strong>в</strong>томат анимации формирует следующие <strong>в</strong>ыходные <strong>в</strong>оздейст<strong>в</strong>ия и события:<br />

• z1 A : запустить таймер — запускает таймер, который через период<br />

<strong>в</strong>ремени T генерирует событие eT A ;<br />

• z0 A : <strong>в</strong>ы<strong>в</strong>ести F A (S 0 , step) — информирует «рисо<strong>в</strong>альщик» о<br />

необходимости перерисо<strong>в</strong>ать иллюстрацию;<br />

• e3 A : конец анимации — сигнализирует о том, что анимация закончилась.<br />

Анимационный а<strong>в</strong>томат реагирует на следующие события:<br />

• e1 A : старт — а<strong>в</strong>томат <strong>в</strong>изуализации перешел <strong>в</strong> состояние, <strong>в</strong> котором<br />

должна начаться анимация;<br />

• e2 A : стоп — а<strong>в</strong>томат <strong>в</strong>изуализации перешел <strong>в</strong> состояние, <strong>в</strong> котором<br />

анимация должна закончиться;<br />

• eT A — событие от таймера, по которому осущест<strong>в</strong>ляется переход к<br />

следующему шагу анимации.<br />

Описанный а<strong>в</strong>томат я<strong>в</strong>ляется уни<strong>в</strong>ерсальным и может быть использо<strong>в</strong>ан <strong>в</strong><br />

любом <strong>в</strong>изуализаторе.<br />

На этапе d а<strong>в</strong>томат <strong>в</strong>изуализации и а<strong>в</strong>томат анимации с<strong>в</strong>язы<strong>в</strong>аются<br />

посредст<strong>в</strong>ом событий и <strong>в</strong>ыходных <strong>в</strong>оздейст<strong>в</strong>ий, как показано на рис. 4.<br />

5


А<strong>в</strong>томат<br />

<strong>в</strong>изуализации<br />

(A 0 )<br />

Старт<br />

Стоп<br />

А<strong>в</strong>томат<br />

анимации<br />

(A A )<br />

e1 A z0 A<br />

e2 A<br />

e3 A<br />

Вы<strong>в</strong>ести F A (S 0 , step)<br />

Конец анимации<br />

Рисо<strong>в</strong>альщик<br />

А<strong>в</strong>томат<br />

<strong>в</strong>изуализации<br />

(A 0 )<br />

Таймер<br />

Таймер<br />

eT A<br />

z1 A<br />

Запустить таймер<br />

Таймер<br />

Рис. 4. Схема с<strong>в</strong>язей а<strong>в</strong>томата анимации<br />

На этапе e стандартная функциональность «рисо<strong>в</strong>альщика» сопоста<strong>в</strong>ления<br />

номера состояния с тексто<strong>в</strong>ым комментарием и статической иллюстрацией<br />

расширяется. В режиме анимации «рисо<strong>в</strong>альщик» принимает на <strong>в</strong>ход значение<br />

номера шага. Другими сло<strong>в</strong>ами, если функция F S реализует статические<br />

иллюстрации, а функция F A — динамические (анимационные) иллюстрации, то при<br />

переходе от статики к анимации осущест<strong>в</strong>ляется преобразо<strong>в</strong>ание <strong>в</strong>ида:<br />

⎧ FS<br />

( state);<br />

F(<br />

state)<br />

→ ⎨<br />

⎩FA(<br />

state,<br />

step).<br />

При этом спра<strong>в</strong>едли<strong>в</strong>ы следующие соотношения:<br />

F S<br />

( state)<br />

= F(<br />

state);<br />

(1)<br />

FA ( state,0)<br />

= FS<br />

( state −1);<br />

(2)<br />

FA ( state,<br />

N)<br />

= FS<br />

( state).<br />

(3)<br />

Соотношение (1) отражает тот факт, что преобразо<strong>в</strong>анный а<strong>в</strong>томат<br />

<strong>в</strong>изуализации формирует статические иллюстрации, со<strong>в</strong>падающие с иллюстрациями<br />

исходного а<strong>в</strong>томата. Соотношения (2, 3) показы<strong>в</strong>ают, что формиро<strong>в</strong>ание<br />

динамических (анимационных) иллюстраций <strong>в</strong> состоянии state происходит таким<br />

образом, что начальная анимационная иллюстрация со<strong>в</strong>падает со статической<br />

иллюстрацией <strong>в</strong> предыдущем состоянии а<strong>в</strong>томата, а конечная — со статической<br />

иллюстрацией <strong>в</strong> состоянии state.<br />

Из изложенного следует, что рисо<strong>в</strong>альщик <strong>в</strong> <strong>в</strong>изуализаторе <strong>в</strong> общем случае<br />

будет реализо<strong>в</strong>ы<strong>в</strong>аться посредст<strong>в</strong>ом не одного, а д<strong>в</strong>ух операторо<strong>в</strong> switch. При этом<br />

пер<strong>в</strong>ый оператор switch будет соот<strong>в</strong>етст<strong>в</strong>о<strong>в</strong>ать статическим иллюстрациям, а <strong>в</strong>торой<br />

– динамическим.<br />

Таким образом, пер<strong>в</strong>ые четыре перечисленных шага <strong>в</strong><strong>в</strong>одятся <strong>в</strong> указанную<br />

<strong>в</strong>ыше технологию между этапами с номерами де<strong>в</strong>ять и десять, а пятый шаг – между<br />

этапами одиннадцать и д<strong>в</strong>енадцать. При этом этапы технологии с пер<strong>в</strong>ого по<br />

де<strong>в</strong>ятый не изменяются, а последующие шаги преобразуются следующим образом.<br />

10. Выбор состояний, <strong>в</strong> которых будет <strong>в</strong>ыполняться анимация.<br />

11. Замена каждого из <strong>в</strong>ыбранных состояний тремя состояниями.<br />

6


12. Использо<strong>в</strong>ание а<strong>в</strong>томата анимации.<br />

13. Обеспечение <strong>в</strong>заимодейст<strong>в</strong>ия между преобразо<strong>в</strong>анным и анимационным<br />

а<strong>в</strong>томатами.<br />

14. Выбор интерфейса <strong>в</strong>изуализатора.<br />

15. Сопоста<strong>в</strong>ление иллюстраций и комментарие<strong>в</strong> с состояниями а<strong>в</strong>томата.<br />

16. Обеспечение <strong>в</strong>ыбора <strong>в</strong> каждом анимационном состоянии статического либо<br />

динамического изображения, за<strong>в</strong>исящего не только от состояния осно<strong>в</strong>ного<br />

а<strong>в</strong>томата, но и от номера шага анимации.<br />

17. Архитектура программы <strong>в</strong>изуализатора.<br />

18. Программная реализация <strong>в</strong>изуализатора.<br />

3. Построение <strong>в</strong>изуализатора для алгоритма обхода д<strong>в</strong>оичного<br />

дере<strong>в</strong>а<br />

Продемонстрируем технологию на примере построения <strong>в</strong>изуализатора обхода<br />

д<strong>в</strong>оичного дере<strong>в</strong>а.<br />

3.1. Постано<strong>в</strong>ка задачи обхода д<strong>в</strong>оичного дере<strong>в</strong>а<br />

Задано д<strong>в</strong>оичное дере<strong>в</strong>о, состоящее из n <strong>в</strong>ершин, каждая из которых имеет<br />

ссылки пра<strong>в</strong>ого и ле<strong>в</strong>ого потомка. Требуется реализо<strong>в</strong>ать алгоритм, который <strong>в</strong>ы<strong>в</strong>одит<br />

по одному разу <strong>в</strong>се <strong>в</strong>ершины этого дере<strong>в</strong>а [7].<br />

3.2. Решение задачи<br />

При<strong>в</strong>едем сло<strong>в</strong>есную формулиро<strong>в</strong>ку решения этой задачи.<br />

Для описания <strong>в</strong>ершины дере<strong>в</strong>а <strong>в</strong><strong>в</strong>едем следующую структуру данных:<br />

public class Node {<br />

private int left; // ле<strong>в</strong>ое поддере<strong>в</strong>о<br />

private int right; // пра<strong>в</strong>ое поддере<strong>в</strong>о<br />

private int index; // индекс <strong>в</strong> масси<strong>в</strong>е<br />

...<br />

}<br />

В<strong>в</strong>едем масси<strong>в</strong> visited[0..n-1], <strong>в</strong> котором будем отмечать пройденные<br />

<strong>в</strong>ершины.<br />

Для решения этой задачи предлагается создать <strong>в</strong>спомогательный стек <strong>в</strong>ершин<br />

(stack). Далее, д<strong>в</strong>игаясь от корня к листьям, предлагается со<strong>в</strong>ершать следующее<br />

дейст<strong>в</strong>ие <strong>в</strong> цикле:<br />

• если <strong>в</strong> текущей <strong>в</strong>ершине (node) ле<strong>в</strong>ое поддере<strong>в</strong>о не пройдено<br />

(node.left > 0 && !visited[node.left]), то записать ее <strong>в</strong> стек и д<strong>в</strong>игаться к<br />

ле<strong>в</strong>ому потомку;<br />

• иначе, если пра<strong>в</strong>ое поддере<strong>в</strong>о не пройдено<br />

(node.right > 0 && !visited[node.right]), то записать текущую <strong>в</strong>ершину <strong>в</strong><br />

стек и д<strong>в</strong>игаться к пра<strong>в</strong>ому потомку;<br />

• иначе, если <strong>в</strong> стеке находится хотя бы одно значение, то «снять» с<br />

<strong>в</strong>ершины стека предыдущую <strong>в</strong>ершину и д<strong>в</strong>игаться к ней;<br />

• иначе за<strong>в</strong>ершить алгоритм.<br />

7


3.3. Выбор <strong>в</strong>изуализируемых переменных<br />

Предлагается <strong>в</strong>изуализиро<strong>в</strong>ать следующие переменные:<br />

• stack — стек <strong>в</strong>ершин от корня до текущей <strong>в</strong>ершины;<br />

• visited — масси<strong>в</strong> флаго<strong>в</strong> для идентификации пройденных <strong>в</strong>ершин;<br />

• result — результирующий масси<strong>в</strong>;<br />

• node — текущая <strong>в</strong>ершина.<br />

3.4. Выбор алгоритма <strong>в</strong>изуализации<br />

Предлагается <strong>в</strong>изуализиро<strong>в</strong>ать следующие особенности алгоритма для<br />

обеспечения <strong>в</strong>озможности наилучшего разъяснения его дейст<strong>в</strong>ия:<br />

• процесс занесения <strong>в</strong>ершины <strong>в</strong> стек;<br />

• текущая <strong>в</strong>ершина;<br />

• процесс перехода из предыдущей <strong>в</strong> следующую <strong>в</strong>ершину;<br />

• результат <strong>в</strong>ыполнения алгоритма;<br />

• пройденные <strong>в</strong>ершины (отмечать ц<strong>в</strong>етом).<br />

3.5. Алгоритм решения задачи<br />

При<strong>в</strong>едем алгоритм решения задачи на псе<strong>в</strong>докоде [10]:<br />

1 node nodes[0]<br />

2 доба<strong>в</strong>ить node <strong>в</strong> результат<br />

3 while true<br />

4 do<br />

5 отметить node.left как пройденную<br />

6 if node.left ≥ 0 and node.left не пройдена<br />

7 then<br />

8 доба<strong>в</strong>ить node <strong>в</strong> стек<br />

9 node node.left<br />

10 доба<strong>в</strong>ить node <strong>в</strong> результат<br />

11 else if node.right ≥ 0 and node.right не пройдена<br />

12 then<br />

13 доба<strong>в</strong>ить node <strong>в</strong> стек<br />

14 node node.left<br />

15 доба<strong>в</strong>ить node <strong>в</strong> результат<br />

16 else if стек не пуст<br />

17 then node с <strong>в</strong>ершины стека<br />

18 else break<br />

19 return результат<br />

8


3.6. Реализация алгоритма на языке Java<br />

Перепишем программу, записанную на псе<strong>в</strong>докоде, с помощью языка Java.<br />

/**<br />

* @param nodes масси<strong>в</strong> <strong>в</strong>ершин дере<strong>в</strong>а<br />

* @return список <strong>в</strong>сех <strong>в</strong>ершин, <strong>в</strong>ы<strong>в</strong>еденных <strong>в</strong> порядке обхода<br />

*/<br />

private static List traverse(Node[] nodes) {<br />

// Содержит результат<br />

List result = new ArrayList();<br />

// Стек для обеспечения <strong>в</strong>оз<strong>в</strong>рата<br />

LinkedList stack = new LinkedList();<br />

// Хранят флаги того, что <strong>в</strong>ершина пройдена<br />

boolean[] visited = new boolean[nodes.length];<br />

// Заполняем исходными значениями<br />

Arrays.fill(visited, false);<br />

// Выбираем корне<strong>в</strong>ую <strong>в</strong>ершину<br />

Node node = nodes[0];<br />

result.add(node);<br />

while (true) {<br />

// Отмечаем текущую <strong>в</strong>ершину, как пройденную<br />

visited[node.index()] = true;<br />

if (node.left() >= 0 && !visited[node.left()]) {<br />

// Переход к ле<strong>в</strong>ому поддере<strong>в</strong>у<br />

stack.addLast(node);<br />

node = nodes[node.left()];<br />

result.add(node);<br />

} else if (node.right() >= 0 && !visited[node.right()]) {<br />

// Переход к пра<strong>в</strong>ому поддере<strong>в</strong>у<br />

stack.addLast(node);<br />

node = nodes[node.right()];<br />

result.add(node);<br />

} else {<br />

// Воз<strong>в</strong>рат<br />

if (stack.isEmpty()) {<br />

break;<br />

}<br />

node = (Node)stack.removeLast();<br />

}<br />

}<br />

return result;<br />

}<br />

В этой программе операции <strong>в</strong><strong>в</strong>ода/<strong>в</strong>ы<strong>в</strong>ода не при<strong>в</strong>едены, так как их будет<br />

<strong>в</strong>ыполнять <strong>в</strong>изуализатор.<br />

3.7. Построение схемы алгоритма по программе<br />

Построим по тексту программы схему алгоритма (рис. 5).<br />

9


Start<br />

0<br />

Arrays.fill(visited, false);<br />

node = nodes[0];<br />

result.add(node);<br />

1<br />

visited[node.index()] = true;<br />

2<br />

node = stack.removeLast();<br />

7<br />

no<br />

stack.isEmpty()<br />

yes<br />

Finish<br />

8<br />

no<br />

node.left() >= 0 &&<br />

!visited[node.left()]<br />

yes<br />

no<br />

node.right() >= 0 &&<br />

!visited[node.right()]<br />

yes<br />

stack.addLast(node);<br />

3<br />

stack.addLast(node);<br />

5<br />

node = nodes[node.left()];<br />

result.add(node);<br />

4<br />

node = nodes[node.right()];<br />

result.add(node);<br />

6<br />

Рис. 5. Схема алгоритма д<strong>в</strong>оичного обхода дере<strong>в</strong>а<br />

3.8. Преобразо<strong>в</strong>ание схемы алгоритма <strong>в</strong> а<strong>в</strong>томат Мура<br />

Следуя методу, при<strong>в</strong>еденному <strong>в</strong> работе [8], построим а<strong>в</strong>томат Мура,<br />

соот<strong>в</strong>етст<strong>в</strong>ующий при<strong>в</strong>еденной <strong>в</strong>ыше схеме алгоритма (рис. 6)<br />

0: Начало<br />

8: Конец<br />

1<br />

1: Пер<strong>в</strong>ая <strong>в</strong>ершина<br />

Arrays.fill(visited, false);<br />

node = nodes[0];<br />

result.add(node);<br />

3: stack.isEmpty()<br />

2: Результат<br />

1 else<br />

visited[node.index()] = true;<br />

7: Обратный ход<br />

node = stack.removeLast();<br />

1<br />

1: node.left() >= 0 && !visited[node.left()] 2: node.right() >= 0 && !visited[node.right()]<br />

3: Вершина <strong>в</strong> стек<br />

stack.addLast(node);<br />

1<br />

4: Переход нале<strong>в</strong>о<br />

1 1<br />

6: Переход напра<strong>в</strong>о<br />

1<br />

node = nodes[node.left()];<br />

node = nodes[node.right()];<br />

result.add(node);<br />

result.add(node);<br />

5: Вершина <strong>в</strong> стек<br />

stack.addLast(node);<br />

Рис. 6. А<strong>в</strong>томат Мура, реализующий обход д<strong>в</strong>оичного дере<strong>в</strong>а<br />

10


Исходя из схемы алгоритма на рис. 5, <strong>в</strong>ыделим <strong>в</strong>осемь состояний. В состоянии<br />

1 осущест<strong>в</strong>ляется инициализация алгоритма. В состоянии 2 текущая <strong>в</strong>ершина<br />

отмечается как пройденная. В состояниях 3 и 5 текущая <strong>в</strong>ершина помещается <strong>в</strong> стек,<br />

а <strong>в</strong> состояниях 4 и 6 осущест<strong>в</strong>ляется переход. Состояние 7 от<strong>в</strong>ечает за обратный<br />

ход. Состояние 8 я<strong>в</strong>ляется конечным.<br />

3.9. Преобразо<strong>в</strong>ание а<strong>в</strong>томата, реализующего алгоритм <strong>в</strong> а<strong>в</strong>томат<br />

<strong>в</strong>изуализации<br />

В соот<strong>в</strong>етст<strong>в</strong>ии с методом, изображенным на рис. 1, а<strong>в</strong>томат, изображенный на<br />

рис. 6, преобразуется <strong>в</strong> а<strong>в</strong>томат, изображенный на рис. 7.<br />

0: Начало<br />

z0: <strong>в</strong>ы<strong>в</strong>ести F S (0)<br />

8: Конец<br />

z0: <strong>в</strong>ы<strong>в</strong>ести F S (8)<br />

e0<br />

1: Пер<strong>в</strong>ая <strong>в</strong>ершина<br />

3: stack.isEmpty()<br />

e0<br />

Arrays.fill(visited, false);<br />

node = nodes[0];<br />

result.add(node);<br />

z0: <strong>в</strong>ы<strong>в</strong>ести F S(1)<br />

e0<br />

2: Результат<br />

visited[node.index()] = true;<br />

else<br />

7: Обратный ход<br />

node = stack.removeLast();<br />

z0: <strong>в</strong>ы<strong>в</strong>ести F S(7)<br />

1: node.left() >= 0 && !visited[node.left()] 2: node.right() >= 0 && !visited[node.right()]<br />

3: Вершина <strong>в</strong> стек<br />

stack.addLast(node);<br />

4: Переход нале<strong>в</strong>о<br />

6: Переход напра<strong>в</strong>о<br />

e0 node = nodes[node.left()]; e0 e0 node = nodes[node.right()]; e0<br />

result.add(node);<br />

result.add(node);<br />

5: Вершина <strong>в</strong> стек<br />

stack.addLast(node);<br />

z0: <strong>в</strong>ы<strong>в</strong>ести F S (3)<br />

z0: <strong>в</strong>ы<strong>в</strong>ести F S (4)<br />

z0: <strong>в</strong>ы<strong>в</strong>ести F S (6)<br />

z0: <strong>в</strong>ы<strong>в</strong>ести F S (5)<br />

Рис. 7. А<strong>в</strong>томат <strong>в</strong>изуализации<br />

3.10. Выбор состояний, <strong>в</strong> которых будет <strong>в</strong>ыполняться анимация<br />

В алгоритме обхода дере<strong>в</strong>а наиболее <strong>в</strong>ажным для отображения я<strong>в</strong>ляется<br />

процесс перед<strong>в</strong>ижения по <strong>в</strong>ершинам, поэтому анимационными я<strong>в</strong>ляются состояния,<br />

<strong>в</strong> которых изменяется номер текущей <strong>в</strong>ершины. Такими состояниями я<strong>в</strong>ляются<br />

состояния с номерами 4, 6, 7.<br />

3.11. Замена каждого из анимационных состояний тремя состояниями<br />

В соот<strong>в</strong>етст<strong>в</strong>ии с методом, изложенным <strong>в</strong>ыше (рис. 2), заменим состояния 4, 6,<br />

7 тройками состояний, <strong>в</strong> пер<strong>в</strong>ом из которых запоминается номер предыдущей<br />

<strong>в</strong>ершины, <strong>в</strong>о <strong>в</strong>тором формируется событие начала анимации, а <strong>в</strong> третьем<br />

за<strong>в</strong>ершается шаг <strong>в</strong>изуализатора и создается конечная иллюстрация <strong>в</strong> состоянии<br />

(рис. 8). При этом событие окончания анимации формируется на переходе между<br />

анимационным и конечным состояниями шага <strong>в</strong>изуализации.<br />

11


0: Начало<br />

z0: <strong>в</strong>ы<strong>в</strong>ести F S(0)<br />

e0<br />

8: Конец<br />

z0: <strong>в</strong>ы<strong>в</strong>ести F S(8)<br />

e4: конец<br />

7: Стоп анимации<br />

z0: <strong>в</strong>ы<strong>в</strong>ести F S(7')<br />

!x1 A<br />

old_node = node;<br />

!x1 A<br />

e0<br />

e0<br />

old_node = node;<br />

z A0: <strong>в</strong>ы<strong>в</strong>ести F A(7,0)<br />

1: Пер<strong>в</strong>ая <strong>в</strong>ершина<br />

3: stack.isEmpty()<br />

!x1 A<br />

e1 A: старт<br />

Arrays.fill(visited, false);<br />

2: Результат<br />

7': Обратный ход<br />

e0<br />

else<br />

node = nodes[0];<br />

old_node = node;<br />

result.add(node);<br />

visited[node.index()] = true;<br />

x1<br />

node = stack.removeLast(); A<br />

z0: <strong>в</strong>ы<strong>в</strong>ести F S(1)<br />

1: node.left() >= 0 && !visited[node.left()] 2: node.right() >= 0 && !visited[node.right()]<br />

3: Вершина <strong>в</strong> стек<br />

stack.addLast(node);<br />

z0: <strong>в</strong>ы<strong>в</strong>ести F S(3)<br />

5: Вершина <strong>в</strong> стек<br />

stack.addLast(node);<br />

z0: <strong>в</strong>ы<strong>в</strong>ести F S(5)<br />

e0<br />

e0<br />

4': Начало перехода<br />

4: Переход нале<strong>в</strong>о<br />

6: Переход напра<strong>в</strong>о<br />

6': Начало перехода<br />

node = nodes[node.left()];<br />

z0: <strong>в</strong>ы<strong>в</strong>ести F S(4)<br />

z0: <strong>в</strong>ы<strong>в</strong>ести F S(6)<br />

node = nodes[node.right()];<br />

result.add(node);<br />

result.add(node);<br />

e0<br />

e0 || e3 A<br />

e2 A: стоп<br />

7 A: Анимация перехода<br />

x1 A<br />

x1 A<br />

4 A: Анимация перехода<br />

6 A: Анимация перехода<br />

z0 A: <strong>в</strong>ы<strong>в</strong>ести F A(4,0)<br />

e1 A: старт<br />

e0 || e3 A<br />

e2 A: стоп<br />

e0 || e3 A<br />

e2 A: стоп<br />

z0 A: <strong>в</strong>ы<strong>в</strong>ести F A(6,0)<br />

e1 A: старт<br />

Рис. 8. Преобразо<strong>в</strong>анный а<strong>в</strong>томат <strong>в</strong>изуализации<br />

3.12. Использо<strong>в</strong>ание а<strong>в</strong>томата анимации<br />

Как отмечалось <strong>в</strong>ыше, для анимации используется стандартный а<strong>в</strong>томат,<br />

при<strong>в</strong>еденный на рис. 3.<br />

3.13. Обеспечения <strong>в</strong>заимодейст<strong>в</strong>ия между преобразо<strong>в</strong>анным и<br />

анимационным а<strong>в</strong>томатами<br />

Для обеспечения <strong>в</strong>заимодейст<strong>в</strong>ия между а<strong>в</strong>томатом <strong>в</strong>изуализации и<br />

а<strong>в</strong>томатом анимации <strong>в</strong><strong>в</strong>одятся с<strong>в</strong>язи, предста<strong>в</strong>ленные на рис. 4.<br />

3.14. Выбор интерфейса <strong>в</strong>изуализатора<br />

В <strong>в</strong>ерхней части <strong>в</strong>изуализатора (рис. 10) при<strong>в</strong>одится следующая информация:<br />

• дере<strong>в</strong>о, изображенное графически. Серым ц<strong>в</strong>етом отмечены<br />

пройденные <strong>в</strong>ершины, а не пройденные <strong>в</strong>ершины — белым ц<strong>в</strong>етом.<br />

Текущая <strong>в</strong>ершина отмечена темно серым ц<strong>в</strong>етом;<br />

• <strong>в</strong> пра<strong>в</strong>ой части иллюстрации изображен стек, а <strong>в</strong> нижней части —<br />

порядок обхода дере<strong>в</strong>а (масси<strong>в</strong> пройденных <strong>в</strong>ершин).<br />

Под масси<strong>в</strong>ом пройденных <strong>в</strong>ершин динамически отображаются тексто<strong>в</strong>ые<br />

комментарии, соот<strong>в</strong>етст<strong>в</strong>ующие текущим состояниям а<strong>в</strong>томата <strong>в</strong>изуализации.<br />

Например, на рис. 9 изображен комментарий «Д<strong>в</strong>игаемся напра<strong>в</strong>о»,<br />

соот<strong>в</strong>етст<strong>в</strong>ующий состоянию 6. Под комментарием расположены элементы<br />

12


упра<strong>в</strong>ления. Следует отметить, что по сра<strong>в</strong>нению с обычным <strong>в</strong>изуализатором<br />

поя<strong>в</strong>ляется флаг упра<strong>в</strong>ления анимацией:<br />

• «>>» — сделать шаг алгоритма;<br />

• «Зано<strong>в</strong>о» — начать алгоритм сначала;<br />

• «Анимация» — отображать или не отображать анимацию;<br />

• «А<strong>в</strong>то» — перейти <strong>в</strong> а<strong>в</strong>томатический режим;<br />

• «» — изменить паузу между а<strong>в</strong>томатическими шагами алгоритма.<br />

Рис. 9. Интерфейс <strong>в</strong>изуализатора<br />

3.15. Сопоста<strong>в</strong>ление иллюстраций и комментарие<strong>в</strong> с состояниями<br />

а<strong>в</strong>томата<br />

Для наглядности <strong>в</strong>изуализации алгоритма предлагается акцентиро<strong>в</strong>ать<br />

<strong>в</strong>нимание на следующих элементах.<br />

В состояниях 4 и 6 (рис. 9) статическая иллюстрация отображает:<br />

• текущую <strong>в</strong>ершину;<br />

• пройденные <strong>в</strong>ершины;<br />

• последнюю <strong>в</strong>ершину <strong>в</strong> результирующем масси<strong>в</strong>е.<br />

В состояниях 3 и 5 (рис. 10) отмечается <strong>в</strong>ершина, доба<strong>в</strong>ленная <strong>в</strong> стек.<br />

13


Рис. 10. Иллюстрация <strong>в</strong> состояниях 3 и 5<br />

В состоянии 7 (рис. 11) отображается обратный ход. При этом отмечается<br />

только текущая <strong>в</strong>ершина, поскольку данные <strong>в</strong> стек и масси<strong>в</strong> пройденных <strong>в</strong>ершин не<br />

доба<strong>в</strong>ляются.<br />

Рис. 11. Иллюстрация <strong>в</strong> состоянии 7<br />

3.16. Обеспечение <strong>в</strong>ыбора <strong>в</strong> каждом анимационном состоянии<br />

статического либо динамического изображения<br />

Для отображения динамических иллюстраций используются статические<br />

иллюстрации с наложенным изображением д<strong>в</strong>ижущегося указателя (рис. 12).<br />

14


Рис. 12. Динамическая иллюстрация<br />

3.17. Архитектура программы <strong>в</strong>изуализатора<br />

Для реализации пользо<strong>в</strong>ательского интерфейса сформиро<strong>в</strong>ан еще один<br />

а<strong>в</strong>томат, реализующий по<strong>в</strong>едение интерфейса <strong>в</strong>изуализатора. Схема<br />

<strong>в</strong>заимодейст<strong>в</strong>ия этого а<strong>в</strong>томата при<strong>в</strong>едена на рис. 13.<br />

А<strong>в</strong>томат<br />

Визуализации<br />

(A 0 )<br />

Пользо<strong>в</strong>атель<br />

Таймер<br />

Начало анимации<br />

Конец анимации<br />

Конец<br />

Кла<strong>в</strong>иша А<strong>в</strong>то<br />

Кла<strong>в</strong>иша Зано<strong>в</strong>о<br />

Таймер<br />

А<strong>в</strong>томат<br />

интерфейса<br />

(A 1 )<br />

e1 A<br />

e2 A<br />

e4<br />

e10<br />

e11<br />

t10<br />

e0<br />

z10<br />

z11<br />

z12<br />

z13<br />

z14<br />

Шаг <strong>в</strong>изуализации<br />

Инициализация<br />

Включить режим а<strong>в</strong>то<br />

Выключить режим а<strong>в</strong>то<br />

Включить шаг и а<strong>в</strong>то<br />

Выключить шаг и а<strong>в</strong>то<br />

А<strong>в</strong>томат<br />

Визуализации<br />

(A 0 )<br />

Визуализатор<br />

z15<br />

Запустить таймер<br />

Таймер<br />

Рис. 13. Схема <strong>в</strong>заимодейст<strong>в</strong>ия а<strong>в</strong>томата интерфейса <strong>в</strong>изуализатора<br />

Как следует из этого рисунка, а<strong>в</strong>томат <strong>в</strong>заимодейст<strong>в</strong>ует с а<strong>в</strong>томатом<br />

<strong>в</strong>изуализации и упра<strong>в</strong>ляет интерфейсом <strong>в</strong>изуализатора. Таймер используется для<br />

реализации функции А<strong>в</strong>то. Диаграмма переходо<strong>в</strong> интерфейсного а<strong>в</strong>томата<br />

при<strong>в</strong>едена на рис. 14.<br />

15


e11<br />

z13, z10<br />

4: Конец<br />

z14<br />

e4<br />

e4<br />

e10<br />

z12<br />

1: Шаг<br />

z12<br />

2: А<strong>в</strong>то<br />

t10<br />

e10<br />

z15<br />

e0<br />

z11<br />

e A 1<br />

e2 A<br />

e11<br />

e10<br />

3: Пауза<br />

z10<br />

z12<br />

Рис. 14. Диаграмма переходо<strong>в</strong> а<strong>в</strong>томата интерфейса <strong>в</strong>изуализатора<br />

Схема <strong>в</strong>заимодейст<strong>в</strong>ий преобразо<strong>в</strong>анного а<strong>в</strong>томата <strong>в</strong>изуализации изображена<br />

на рис. 15.<br />

А<strong>в</strong>томат<br />

анимации<br />

(A A )<br />

Пользо<strong>в</strong>атель<br />

Визуализатор<br />

Конец анимации<br />

Нажатие кла<strong>в</strong>иши<br />

Анимация <strong>в</strong>ключена<br />

А<strong>в</strong>томат<br />

<strong>в</strong>изуализации<br />

(A 0 ) Вы<strong>в</strong>ести F S (S 0 )<br />

z0<br />

e3 A Вы<strong>в</strong>ести F A (S 0 ,0)<br />

z0 A<br />

e0<br />

x1 A<br />

e1 A<br />

e2 A<br />

e1 A<br />

e2 A<br />

e4<br />

Старт<br />

Стоп<br />

Старт<br />

Стоп<br />

Конец<br />

Рисо<strong>в</strong>альщик<br />

А<strong>в</strong>томат<br />

анимации<br />

(A A )<br />

А<strong>в</strong>томат<br />

интерфейса<br />

пользо<strong>в</strong>ателя<br />

(A 1 )<br />

Рис. 15. Схема <strong>в</strong>заимодейст<strong>в</strong>ия преобразо<strong>в</strong>анного а<strong>в</strong>томата <strong>в</strong>изуализации<br />

Схема <strong>в</strong>заимодейст<strong>в</strong>ия <strong>в</strong>сех компонент <strong>в</strong>изуализатора предста<strong>в</strong>лена на<br />

рис. 16.<br />

16


Рисо<strong>в</strong>альщик<br />

z0 A<br />

z1 A<br />

А<strong>в</strong>томат<br />

Таймер<br />

анимации<br />

eT A<br />

z0, z0 A<br />

А<strong>в</strong>томат<br />

(A A )<br />

e3 A<br />

e1 A ,<br />

e2 A<br />

<strong>в</strong>изуализации<br />

(A 0 )<br />

e0<br />

e1 A ,<br />

e2 A ,<br />

e4<br />

e0<br />

Пользо<strong>в</strong>атель<br />

e10, e11<br />

А<strong>в</strong>томат<br />

интерфейса<br />

пользо<strong>в</strong>ателя<br />

(A 1 )<br />

z10, z11, z12,<br />

z13, z14<br />

x1 A<br />

Визуализатор<br />

t0<br />

z15<br />

Таймер<br />

Рис. 16. Схема <strong>в</strong>заимодейст<strong>в</strong>ия компонент <strong>в</strong>изуализатора<br />

Заключение<br />

В статье предложен подход к реализации <strong>в</strong>изуализаторо<strong>в</strong> алгоритмо<strong>в</strong> с<br />

анимацией, улучшающий <strong>в</strong>осприятие алгоритмо<strong>в</strong> обучающимися, что особенно<br />

<strong>в</strong>ажно при дистанционном обучении. Подход расширяет технологию построения<br />

<strong>в</strong>изуализаторо<strong>в</strong> алгоритмо<strong>в</strong> на осно<strong>в</strong>е а<strong>в</strong>томатного подхода, предложенную <strong>в</strong> работе<br />

[5].<br />

Литература<br />

1. Интернет-школа программиро<strong>в</strong>ания. http://ips.ifmo.ru<br />

2. Казако<strong>в</strong> М.А., Мельничук О.П., Парфено<strong>в</strong> В.Г. Интернет школа<br />

программиро<strong>в</strong>ания <strong>в</strong> СПбГИТМО (ТУ). Реализация и <strong>в</strong>недрение // Материалы<br />

Всероссийская научно-методическая конференция «Телематика'2002». СПб.:<br />

2002, с.308–309. http://tm.ifmo.ru/tm2002/db/doc/get_thes.php?id=170.<br />

3. Столяр С.Е., Осипо<strong>в</strong>а Т.Г., Крыло<strong>в</strong> И.П., Столяр С.С. Об инструментальных<br />

средст<strong>в</strong>ах для курса информатики // Труды II Всероссийской конференции<br />

«Компьютеры <strong>в</strong> образо<strong>в</strong>ании». СПб.: 1994, с.18–19.<br />

4. Казако<strong>в</strong> М.А., Столяр С.Е. Визуализаторы алгоритмо<strong>в</strong> как элемент технологии<br />

препода<strong>в</strong>ания дискретной математики и программиро<strong>в</strong>ания // Материалы<br />

международной научно-методическая конференция «Телематика'2000» . СПб.:<br />

2000, с.189–191.<br />

17


5. Казако<strong>в</strong> М.А., Шалыто А.А. Использо<strong>в</strong>ание а<strong>в</strong>томатного программиро<strong>в</strong>ания для<br />

реализации <strong>в</strong>изуализаторо<strong>в</strong> // Компьютерные инструменты <strong>в</strong> образо<strong>в</strong>ании. СПб.:<br />

2004. № 2, с.19–33. http://is.ifmo.ru, раздел «Статьи».<br />

6. Корнее<strong>в</strong> Г.А., Шамгуно<strong>в</strong> Н.Н., Шалыто А.А. Обход дере<strong>в</strong>ье<strong>в</strong> на осно<strong>в</strong>е<br />

а<strong>в</strong>томатного подхода // Компьютерные инструменты <strong>в</strong> образо<strong>в</strong>ании. СПб.: 2004. №<br />

3, с.32–37. http://is.ifmo.ru, раздел «Статьи».<br />

7. Шень А. Программиро<strong>в</strong>ание: теоремы и задачи. М.: МЦНМО, 2004. – 296 с.<br />

8. Шалыто А.А., Туккель Н.И. Преобразо<strong>в</strong>ание итерати<strong>в</strong>ных алгоритмо<strong>в</strong> <strong>в</strong><br />

а<strong>в</strong>томатные // Программиро<strong>в</strong>ание. 2002. № 5, с.12–26. http://is.ifmo.ru, раздел<br />

«Статьи».<br />

9. Шалыто А.А. SWITCH-технология. Алгоритмизация и программиро<strong>в</strong>ание задач<br />

логического упра<strong>в</strong>ления. СПб.: Наука, 1998. – 628 с.<br />

10. Кормен Т., Лайзерсон Ч., Ри<strong>в</strong>ест Р. Алгоритмы. Построение и анализ. М.:<br />

МЦМНО, 2000. – 960 с.<br />

18

Hooray! Your file is uploaded and ready to be published.

Saved successfully!

Ooh no, something went wrong!