Статья в формате PDF - Кафедра «Технологии программирования
Статья в формате PDF - Кафедра «Технологии программирования
Статья в формате PDF - Кафедра «Технологии программирования
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