Разработка и экспериментальное исследование редактора схем программ

Реализация системы визуального программирования. Выбор технических средств для нее. Варианты использования языка JavaScript. Создание приложения программы-редактора блок-схем и сайта удалённого обучения на основе интерактивной системы обучения Moodle.

Рубрика Программирование, компьютеры и кибернетика
Вид дипломная работа
Язык русский
Дата добавления 07.07.2012
Размер файла 2,2 M

Отправить свою хорошую работу в базу знаний просто. Используйте форму, расположенную ниже

Студенты, аспиранты, молодые ученые, использующие базу знаний в своей учебе и работе, будут вам очень благодарны.

5) кнопка «Удалить блок» позволяет удалить выделенный блок или всю ветку, чтобы выбрать блок надо кликнуть по нему;

6) кнопка «Undo» - отменить последнее действие;

7) кнопка «Копировать» - копирует выделенные блок, и все входящие в него в буфер обмена;

8) кнопка «Вставить» - вставить блоки из буфера в точку вставки. При нажатии программа перейдет в режим вставки;

9) кнопка «Вырезать» - аналогично последовательному нажатию кнопок Копировать, Удалить и Вставить.

7.3 Описание вставки новых блоков

Для вставки нового блока нужно:

1) на панели инструментов нажать кнопку нужного блока;

2) на схеме появятся точки для вставки нового блока (рисунок 7.4). Узел, находящий под курсором, подсвечивается синим цветом, остальные доступные узлы красным;

Рисунок 7.5 - Режим вставки нового блока

3) кликнуть по нужной точке вставки. Вставится новый блок и программа сама выровняет все блоки схемы (рисунок 7.5):

Рисунок 7.6 - Результат вставки нового блока

7.4 Описание работы с массивами

Для создания массива следует открыть раздел «Код программы» в меню программы и нажать на кнопку «Вставить массив»- откроется окно с формой ввода элементов массива (рисунок 7.6):

Рисунок 7.7 - Форма ввода элементов массива

На этой форме можно задать имя нового массива, количество строк и столбцов в нём. С помощью кнопки «Построить» можно визуализировать массив - в нижней части формы появятся ячейки массива с полем для ввода значений. С помощью кнопки «Добавить» можно добавить созданный массив в программу, он отобразится на главной форме программы в окне «Массивы» (рисунок 7.7):

Рисунок 7.8 - Форма отображения массива

При создании блок-схемы инициализированный массив будет отображаться выше всего остального кода программы в окне «исходный код». Обращение к элементам массива следует проводить при помощи переменных или циклов.

7.5 Выполнение кода блок-схемы

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

Главным достоинством созданной нами программы являются простота создания схем, не нужно открывать множество окон и всплывающих меню, для того, чтобы создать схему. Откройте программу, выберите нужные блоки и подпишите их. Схема создана, теперь вы можете экспортировать созданную схему в какую-либо программу, чтобы интегрировать схему, куда вам нужно.

8. Примеры программ, созданных в редакторе

В этом разделе приведены программы, созданные в редакторе.

8.1 Решение квадратного уравнения

Пример решения квадратного уравнения приведен на рисунке 8.1.

Рисунок 8.1 - Решение квадратного уравнения

8.2 Сортировка массива пузырьком

Пример сортировки массива приведен на рисунке 8.2.

Рисунок 8.2 - Сортировка массива пузырьком

8.3 Вычисление среднего значения элементов массива

Пример вычисления среднего значения элементов массива приведен на рисунке 8.3.

Рисунок 8.3 - Среднее значение элементов массива

9. Создание сайта удалённого обучения на основе интерактивной системы обучения Moodle

9.1 Общая характеристика интерактивной системы обучения Moodle

Moodle - это система управления курсами (CMS)[19], также известная как система управления обучением (LMS) или виртуальная обучающая среда (VLE). Это бесплатное веб-приложение, предоставляющее возможность преподавателям создавать эффективные сайты для онлайн-обучения.

Целью проекта Moodle является предоставление преподавателям всегда самых лучших средств для управления и способствования процессу обучения. Есть несколько путей использования Moodle:

1) Moodle имеет возможности для масштабирования вплоть до нескольких сотен тысяч учащихся, а может использоваться даже для начальной школы или самостоятельного обучения;

2) многие организации используют Moodle в качестве платформы для создания полностью онлайновых курсов (известное как смешанное обучение);

3) многим пользователям нравятся модули элементов курса (такие как форумы, базы данных и вики) за возможность создания удобной среды для обмена информацией по изучаемым темам (в традициях социального конструктивизма), в то время как другие предпочитают использовать Moodle как способ предоставления информации для студентов (например, стандарт пакетов SCORM) и оценки обучения с использованием заданий или тестов;

Moodle написана на PHP с использованием SQL-базы данных (MySQL, PostgreSQL, Microsoft SQL Server и др. БД -- используется ADOdb XML). Moodle может работать с объектами SCO и отвечает стандарту SCORM.

Благодаря развитой модульной архитектуре, возможности Moodle могут легко расширяться сторонними разработчиками. Помимо языковой поддержки и шаблонов оформления, Moodle позволяет подключать также следующие типы модулей: 1)элементы курса, 2)отчёты администратора, 3)типы заданий, 4)плагины аутенфикации, 5)блоки, 6)форматы курсов, 7)отчёты по курсам, 8)плагины подписки на курсы, 9)отчёты по оценкам, 10)форматы экспорта оценок, 11)форматы импорта оценок, 12)типы вопросов в тестах, 13)отчёты по тестам, 14)плагины поиска.

В Moodle используются следующие роли:

1) администратор (может делать все на сайте и в любом курсе);

2) создатель курса (может создать курс и учить в нем);

3) учитель (может многое делать внутри курса, редактировать материалы курса);

4) учитель без права редактировать (может учить студентов, оценивать их);

5) студент (имеет доступ к материалам курса);

6) гость (может иметь доступ к каким-либо курсам при разрешении гостевого доступа).

Moodle относится к классу LMS (Learning Management System) -- систем управления обучением. В нашей стране подобное программное обеспечение чаще называют системами дистанционного обучения (СДО), так как именно при помощи подобных систем во многих вузах организовано дистанционное обучение. Moodle -- это свободное программное обеспечение с лицензией GPL, что дает возможность бесплатного использования системы, а также ее безболезненного изменения в соответствии с нуждами образовательного учреждения и интеграции с другими продуктами. Moodle -- аббревиатура от Modular Object-Oriented Dynamic Learning Environment (модульная объектно-ориентированная динамическая обучающая среда). Благодаря своим функциональным возможностям система приобрела большую популярность и успешно конкурирует с коммерческими LMS. Moodle используется более чем в 30 000 учебных заведений по всему миру и переведена почти на 80 языков, в том числе и на русский.

Moodle дает возможность проектировать, создавать и в дальнейшем управлять ресурсами информационно-образовательной среды[20]. Интерфейс системы изначально был ориентирован на работу учителей, не обладающих глубокими знаниями в области программирования и администрирования баз данных, веб-сайтов и т.п. Система имеет удобный интуитивно понятный интерфейс. Преподаватель самостоятельно, прибегая только к помощи справочной системы, может создать электронный курс и управлять его работой. Практически во всех ресурсах и элементах курса в качестве полей ввода используется удобный WYSIWYG HTML редактор, кроме того, существует возможность ввода формул в формате TeX или Algebra. Можно вставлять таблицы, схемы, графику, видео, флэш и др. Используя удобный механизм настройки, составитель курса может, даже не обладая знанием языка HTML, легко выбрать цветовую гамму и другие элементы оформления учебного материала.

9.2 Создание базы заданий для тестирования

В системе Moodle используется[21] несколько типов вопросов в заданиях, а именно:

1) множественный выбор (студент выбирает ответ на вопрос из нескольких предложенных ему вариантов, причем вопросы могут предполагать один или сразу несколько правильных ответов);

2) верно/неверно (ответ на вопрос, студент выбирает между двумя вариантами "Верно" и "Неверно");

3) на соответствие (каждому элементу ответов первой группы нужно сопоставить элемент ответов второй группы);

4) короткие ответы (ответом на вопрос является слово или короткая фраза, допускается несколько правильных ответов с различными оценками);

5) числовой (то же, что и короткий ответ, только на выполнение вычислительных операций, числовой ответ может иметь заданный интервал предельно допустимой погрешности отклонения от правильного значения);

6) вычисляемый (такой вопрос предлагает вычислить значение по формуле. Формула является шаблоном, в который при каждом тестировании подставляются случайные значения из указанных диапазонов);

7) вложенные ответы, embedded answers (представляют собой текст, непосредственно в который вставляются короткие ответы, числовые ответы или множественный выбор, как в «рабочей тетради»);

8) эссе (студент кратко излагает свой взгляд на рассматриваемую проблему).

Однако, эти типы заданий плохо подходят для реализации механизма взаимодействия системы Moodle и программы-редактора блок-схем. В Moodle есть ещё один тип заданий - задания с ответом в виде файла. Студент может спроектировать блок-схему какого-либо задания, сохранить блок-схему в файл и прикрепить этот файл к ответу на задание. Проверяющий скачивает файл, запускает его с помощью программы-редактора блок-схем на своём компьютере, тестирует правильности построения не нескольких примерах, а затем выставляет оценку студенту.

Для того, чтобы создать задание с ответом в виду файла необходимо в окне «Тематический план» выбрать нужный раздел обучения и щёлкнуть по выпадающему меню «добавить элемент курса…»(рисунок 9.1):

Рисунок. 9.1 - Внешний вид формы редактирования раздела обучения

В выпадающем меню выбрать «Задания. Ответ - в виде файла» (рисунок 9.2):

Рисунок. 9.2 - Выпадающее меню «Добавить элемент курса…»

Далее появится окно редактирования задания, в этом окне можно ввести название задания, описания задания, а также максимальную оценку, по которой будет оценивать задание проверяющий.

Для тестирования студентов- первокурсников в первом семестре обучения были созданы два раздела обучения: Аттестация №1 и Аттестация №2. В каждой аттестации было создано по пять задач на различные аспекты программирования, каждая задача оценивается максимум в 7 баллов, таким образом, максимальная сумма баллов по каждой из аттестаций составляет 35, что соответствует действительности.

9.3 Создание базы пользователей

Для того, чтобы студенты могли проходить тестирование администратор должен зарегистрировать каждого студента: ввести его логин, пароль, имя, фамилию, адрес электронной почты и т. п. (рисунок 9.3) и записать его на соответствующий курс.

Рисунок. 9.3 - Добавление нового пользователя

Для демонстрации возможностей системы Moodle была создана база данных, состоящая из пяти студентов (рисунок 9.4):

Рисунок. 9.4 - База данных пользователей

После того, как студент зарегистрирован и записан на курс, студент может приступить к обучению по соответствующему курсу.

9.4 Разработка механизма выставления преподавателем оценки

В системе Moodle существуют следующие методы выставления итоговой оценки:

1) среднее значение - сумма всех оценок делится на их количество;

2) медиана - выбирается значение, находящееся в середине упорядоченного по возрастанию списка оценок;

3) худшая оценка;

4) лучшая оценка;

5) мода оценок - оценка, которая встречается наиболее часто;

6) сумма оценок - сумма значений оценок.

Для проведения аттестаций в университетах наиболее подходит метод выставления итоговой оценки по сумме значений всех оценок, так, в нашем примере каждая из двух аттестаций состоит из пяти заданий с максимальным баллов 7, таким образом, общая сумма баллов по аттестации будет равняться 35.

После выставления проверяющим оценки студент может посмотреть свои баллы, итоговую оценку за курс, отношения набранного количества баллов к максимальному количеству баллов в процентах, а также краткие комментарии проверяющего по каждой задаче (рисунок 9.5):

Отчет по пользователю - Анастасия Корепанова

Рисунок. 9.5 - Отчёт по пользователю

Заключение

В ходе данного дипломного проекта была разработана система визуального программирования. Были реализованы основные функции этой системы, такие как сохранение построенной схемы в XML, автоматическая генерация программного кода и автоматическое расположение блоков на форме.

Был разработан удобный визуальный редактор для создания блок-схем программ. С его помощью пользователь может в интерактивном режиме проверять результат своей работы, запускать выполнение кода своей программы.

Программа была написана на платформе .NET Framework, были изучены и использованы некоторые возможности этой платформы.

Так же был разработан сайт для удаленного обучения на основе Moodle.

Полученную программу можно использовать в школах на начальных этапах обучения программированию.

Список использованных источников

1. Джон Пол Мюллер, Дебби Валковски. Microsoft Office Visio 2007 для "чайников" / Джон Пол Мюллер, Дебби Валковски - М.: Диалектика, 2008. - 25 с.

2. Джон Пол Мюллер, Дебби Валковски. Microsoft Office Visio 2007 для "чайников" / Джон Пол Мюллер, Дебби Валковски - М.: Диалектика, 2008. - 27 с.

3. Джон Пол Мюллер, Дебби Валковски. Microsoft Office Visio 2007 для "чайников" / Джон Пол Мюллер, Дебби Валковски - М.: Диалектика, 2008. - 38 с.

4. Бонни Бьяфоре. Visio 2007 Библия пользователя / Бонни Бьяфоре - М.: Диалектика, 2009. - 58 c.

5. Джон Пол Мюллер, Дебби Валковски. Microsoft Office Visio 2007 для "чайников" / Джон Пол Мюллер, Дебби Валковски - М.: Диалектика, 2008. - 49 с.

6. Леонтьев Б.Е. Microsoft Office Visio 2003 / Леонтьев Б. Е. - М.: Новый Издательский Дом, 2005. - 54 с.

7. Леонтьев Б.Е. Microsoft Office Visio 2003 / Леонтьев Б. Е. - М.: Новый Издательский Дом, 2005. - 57 с.

6. В.И. Грекул. Интернет университет информационных технологий. Проектирование информационных систем. Функционально-ориентированные и объектно-ориентированные методологии описания предметной области. URL: http://www.intuit.ru/department/se/devis/6/3.html (дата обращения: 15.06.2012).

8. Г.Верников. Описание стандарта IDEF0. Автоматизация управления компаниями. URL: http://www.insapov.ru/idef0-standard-description.html (дата обращения: 15.06.2012).

9. Черемных С.В, Семенов И.О., Ручкин В.С. Структурный анализ систем: IDEF-технологии / Черемных С.В, Семенов И.О., Ручкин В.С. - М.: Финансы и статистика, 2006. - 157 с.

10. Черемных С.В, Семенов И.О., Ручкин В.С. Структурный анализ систем: IDEF-технологии / Черемных С.В, Семенов И.О., Ручкин В.С. - М.: Финансы и статистика, 2006. - 285 с.

11. А.В. Леоненков. Интернет университет информационных технологий. Нотация и семантика языка UML. Диаграмма прецедентов. URL: http://www.intuit.ru/department/pl/umlbasics/8/. (дата обращения: 15.06.2012).

12. Джим Арлоу, Айла Нейдштадт, UML и Унифицированный процесс / Джим Арлоу, Айла Нейдштадт - М.: АСТ, 2007. - 266 с.

13. Альфред В. Ахо, Джон Хопкрофт, Джеффри Д. Ульман. Структуры данных и алгоритмы / Альфред В. Ахо, Джон Хопкрофт, Джеффри Д. Ульман - М.: Вильямс, 2000. - 219 с.

14. Рева О.Н. JavaScript в кармане / Рева О.Н - М.: АСТ, 2008. - 67 с.

15. Рева О.Н. JavaScript в кармане / Рева О.Н - М.: АСТ, 2008. - 72 с.

16. Рева О.Н. JavaScript в кармане / Рева О.Н - М.: АСТ, 2008. - 80 с.

17. Рева О.Н. JavaScript в кармане / Рева О.Н - М.: АСТ, 2008. - 84 с.

18. Дунаев В.Д. Самоучитель JavaScript. 2-е издание / Дунаев В.Д. - Спб.: Питер, 2004. - 106 с.

19. Анисимов А.М. Работа в системе дистанционного обучения Moodle. Учебное пособие. 2-е издание / Анисимов А. М. - Харьков: ХНАГХ, 2009. - 40 с.

20. Анисимов А.М. Работа в системе дистанционного обучения Moodle. Учебное пособие. 2-е издание / Анисимов А. М. - Харьков: ХНАГХ, 2009. - 48 с.

21. Анисимов А.М. Работа в системе дистанционного обучения Moodle. Учебное пособие. 2-е издание / Анисимов А. М. - Харьков: ХНАГХ, 2009. - 72 с.

Приложение А

(обязательное)

Программный код

1) Block.cs

using System;

using System.Collections.Generic;

using System.Drawing;

using flowchart.blocks;

using System.Xml.Serialization;

namespace flowchart

{

[Serializable]

public abstract class Block

{

public List<Block> Items;

[XmlIgnore]

public Block Branch;

protected int w = 100;

protected int h = 50;

protected int marginTop;

protected int marginRight;

protected int marginBottom;

protected int marginLeft;

[XmlIgnore]

public int width;

[XmlIgnore]

public int height;

[XmlIgnore]

public int X;

[XmlIgnore]

public int Y;

[XmlIgnore]

public bool isSelected = false;

//смещение вниз чтобы не перекрывало точку вставки

protected int dy = 18;

[XmlAttribute]

public string Text;

[XmlAttribute]

public string TextAtTheEnd;

protected Font drawFont = new Font("Sans Serif", 10);

protected SolidBrush drawBrush = new SolidBrush(Color.Black);

protected static StringFormat strFormat = new StringFormat()

{

Alignment = StringAlignment.Center,

LineAlignment = StringAlignment.Center

};

public Block() { }

public Block (string text)

{

Branch = null;

Items = new List<Block>();

X = 0;

Y = 0;

this.Text = text;

}

public virtual bool PointInsideBlock(int x, int y)

{

int blockX = X + width / 2 - w/2;

int blockY = Y + dy;

return ((x > blockX && x < blockX + w) && (y > blockY && y < blockY + h));

}

public void AdjustSize()

{

int clientWidth = 0;

int clientHeight = 0;

if (this is Branch)

{

foreach (Block item in Items)

{

item.AdjustSize();

if (clientWidth < item.width)

clientWidth = item.width;

clientHeight += item.height;

}

int minWidth = 180;

int minHeight = 16;

if (clientHeight < minHeight)

clientHeight = minHeight;

if (clientWidth < minWidth)

clientWidth = minWidth;

height = clientHeight;

width = clientWidth;

}

else

{

foreach (Block item in Items)

{

item.AdjustSize();

if (clientHeight < item.height)

clientHeight = item.height;

clientWidth += item.width;

}

marginTop = 40;

marginBottom = 40;

marginLeft = 10;

marginRight = 10;

if (this is ChartMainBlock)

{

marginTop = 40;

marginBottom = 18;

}

else if (this is RegularBLock)

{

marginTop = 16;

marginBottom = 10;

clientWidth = 120;

clientHeight = 60;

}

else if (this is ConditionBlock)

{

marginTop = 92;

marginRight = 16;

}

else if (this is LoopBlock)

{

marginTop = 80;

marginBottom = 80;

}

width = marginLeft + clientWidth + marginRight;

height = marginTop + clientHeight + marginBottom;

}

}

public void AdjustPosition(int ox, int oy)

{

X = ox;

Y = oy;

if (this is Branch)

{

int cy = Y;

foreach (Block item in Items)

{

item.AdjustPosition(ox + (width - item.width) / 2, cy);

cy += item.height;

}

}

else

{

int cx = X + marginLeft;

foreach (Block item in Items)

{

item.AdjustPosition(cx, Y + marginTop);

cx += item.width;

}

}

}

/// <summary>

/// Если открыть блок из файла, то информация о том какой ветке принадлежит каждый блок теряется

/// Метод устанавливает для каждого блока какой ветке он принадлежит

/// </summary>

public void SetBranches(Block branch)

{

this.Branch = branch;

if (this is RegularBLock)

return;

foreach (Block block in Items)

{

block.SetBranches(this);

}

}

public abstract void Draw(Graphics g);

}

}

2) RegularBlock.cs

using System;

using System.Drawing;

using System.Drawing.Drawing2D;

namespace flowchart.blocks

{

[Serializable]

public class RegularBLock : Block

{

public RegularBLock() { }

public RegularBLock(string text) : base(text) { }

public override void Draw(Graphics g)

{

int containerCenter = X + width / 2;

Pen pen = isSelected ? new Pen(Color.Firebrick, 3) : new Pen(Color.Black, 1);

pen.EndCap = LineCap.ArrowAnchor;

g.DrawLine(pen, containerCenter, Y, containerCenter, Y + dy);

pen.EndCap = LineCap.NoAnchor;

g.DrawRectangle(pen, containerCenter - w/2, Y + dy, w, h);

Rectangle r = new Rectangle(containerCenter - w / 2, Y + dy, w, h);

g.DrawString(Text, drawFont, drawBrush, r, strFormat);

g.DrawLine(pen, containerCenter, Y + height - dy, containerCenter, Y + height);

}

}

}

3) Branch.cs

using System;

using System.Drawing;

namespace flowchart.blocks

{

[Serializable]

public class Branch : Block

{

public Branch() { }

public Branch(string text): base(text) { }

public override void Draw(Graphics g)

{

Pen pen = isSelected ? new Pen(Color.Firebrick, 3) : new Pen(Color.Black, 1);

int containerCenter = X + width / 2;

g.DrawLine(pen, containerCenter, Y, containerCenter, Y + dy);

return;

}

}

}

4) ChartMainBlock.cs

using System;

using System.Collections.Generic;

using System.Drawing;

using System.Drawing.Drawing2D;

using System.IO;

using System.Xml.Serialization;

namespace flowchart.blocks

{

[Serializable]

public class ChartMainBlock : Block

{

public ChartMainBlock() { }

public ChartMainBlock(string text) : base(text) { }

public override bool PointInsideBlock(int x, int y)

{

int blockX = X + width / 2 - w / 2;

int blockY = Y - dy;

return ((x > blockX && x < blockX + w) && (y > blockY && y < blockY + h));

}

public override void Draw(Graphics g)

{

//центр контейнера

int containerCenter = X + width / 2;

//центр контейнера минус половина ширины блока

int dx = X + width/2 - w/2;

Pen pen = isSelected ? new Pen(Color.Firebrick, 3) : new Pen(Color.Black, 1);

g.DrawLine(pen, dx + h / 2, Y - dy, dx + w - h / 2, Y - dy);

g.DrawLine(pen, dx + h / 2, Y + h - dy, dx + w - h / 2, Y + h - dy);

g.DrawArc(pen, dx, Y - dy, h, h, 90, 180);

g.DrawArc(pen, dx + w - h, Y - dy, h, h, 270, 180);

g.DrawLine(pen, containerCenter, Y + h - dy, containerCenter, Y + h);

Rectangle r = new Rectangle(dx, Y - dy, w, h);

g.DrawString("begin", drawFont, drawBrush, r, strFormat);

//блок в конце схемы

int downy = Y + height;

g.DrawLine(pen, dx + h / 2, downy, dx + w - h / 2, downy);

g.DrawLine(pen, dx + h / 2, downy + h, dx + w - h / 2, downy + h);

g.DrawArc(pen, dx, downy, h, h, 90, 180);

g.DrawArc(pen, dx + w - h, downy, h, h, 270, 180);

r = new Rectangle(dx, downy, w, h);

g.DrawString("end", drawFont, drawBrush, r, strFormat);

pen.EndCap = LineCap.ArrowAnchor;

g.DrawLine(pen, containerCenter, Y + height - dy, containerCenter, Y + height);

pen.EndCap = LineCap.NoAnchor;

}

public void SaveToXml(string path)

{

FileStream fStream = new FileStream(path, FileMode.Create, FileAccess.Write, FileShare.None);

XmlSerializer xmlFormat = new XmlSerializer(

typeof(ChartMainBlock),

new Type[]

{

typeof (Block),

typeof (ConditionBlock),

typeof (RegularBLock),

typeof (Branch),

typeof (LoopBlock),

typeof (ChartMainBlock),

typeof (List<Block>),

typeof (List<ConditionBlock>),

typeof (List<RegularBLock>),

typeof (List<Branch>),

typeof (List<LoopBlock>),

typeof (List<ChartMainBlock>),

}

);

xmlFormat.Serialize(fStream, this);

fStream.Close();

}

}

}

5) ConditionBLock.cs

using System;

using System.Drawing;

using System.Drawing.Drawing2D;

namespace flowchart.blocks

{

[Serializable]

public class ConditionBlock : Block

{

public ConditionBlock() { }

public ConditionBlock(string text) : base(text) { }

public override void Draw(Graphics g)

{

//центр контейнера

int containerCenter = X + width / 2;

//центр контейнера минус половина ширины блока

int dx = containerCenter - w / 2;

Pen pen = isSelected ? new Pen(Color.Firebrick, 3) : new Pen(Color.Black, 1);

//верхняя линия

pen.EndCap = LineCap.ArrowAnchor;

g.DrawLine(pen, containerCenter, Y, containerCenter, Y + dy);

pen.EndCap = LineCap.NoAnchor;

//сам блок в виде ромба

Point[] points = new Point[]

{

new Point(dx + w / 2, Y + dy),

new Point(dx + w, Y + h / 2 + dy),

new Point(dx + w / 2, Y + h + dy),

new Point(dx, Y + h / 2 + dy),

new Point(dx + w / 2, Y + dy),

};

g.DrawCurve(pen, points, 0);

Rectangle r = new Rectangle(dx, Y + dy, w, h);

g.DrawString(Text, drawFont, drawBrush, r, strFormat);

//подпись да

r = new Rectangle(dx - w/2, Y + dy, w/2, h/2);

g.DrawString("да", drawFont, drawBrush, r, strFormat);

//подпись нет

r = new Rectangle(dx + w , Y + dy, w / 2, h / 2);

g.DrawString("нет", drawFont, drawBrush, r, strFormat);

Block left = Items[0];

Block right = Items[1];

//левая линия

points = new Point[]

{

new Point(containerCenter - w / 2, Y + dy + h/2),

new Point(left.X + left.width/2, Y + dy + h/2),

new Point(left.X + left.width/2, left.Y),

};

g.DrawCurve(pen, points, 0);

//правая линия

points = new Point[]

{

new Point(containerCenter + w/2, Y + dy + h/2),

new Point(right.X + right.width/2, Y + dy + h/2),

new Point(right.X + right.width/2, right.Y),

};

g.DrawCurve(pen, points, 0);

//нижняя часть

points = new Point[]

{

new Point(left.X + left.width/2, left.Y + left.height),

new Point(left.X + left.width/2, Y + height - 20),

new Point(right.X + right.width/2, Y + height - 20),

new Point(right.X + right.width/2, right.Y + right.height),

};

g.DrawCurve(pen, points, 0);

g.DrawLine(pen, containerCenter, Y + height - 20, containerCenter, Y + height);

}

}

}

6) LoopBlock.cs

using System;

using System.Drawing;

using System.Drawing.Drawing2D;

namespace flowchart.blocks

{

[Serializable]

public class LoopBlock : Block

{

public LoopBlock() { }

public LoopBlock(string text) : base(text) { }

public override void Draw(Graphics g)

{

int containerCenter = X + width / 2;

int dx = containerCenter - w / 2;

Pen pen = isSelected ? new Pen(Color.Firebrick, 3) : new Pen(Color.Black, 1);

pen.EndCap = LineCap.ArrowAnchor;

g.DrawLine(pen, containerCenter, Y, containerCenter, Y + dy);

pen.EndCap = LineCap.NoAnchor;

//начало цикла

Point[] points = new Point[]

{

new Point(dx + h / 3, Y + dy),

new Point(dx + w - h/3, Y + dy),

new Point(dx + w, Y + dy + h/3),

new Point(dx + w, Y + h + dy),

new Point(dx , Y + h + dy),

new Point(dx, Y + dy + h/3),

new Point(dx + h / 3, Y + dy),

};

g.DrawCurve(pen, points, 0);

g.DrawLine(pen, containerCenter, Y + h + dy*2, containerCenter, Y + h + dy);

Rectangle r = new Rectangle(containerCenter - w / 2, Y + dy, w, h);

g.DrawString(Text, drawFont, drawBrush, r, strFormat);

//смещение к низу контейнера

int delta = height - h - 35;

pen.EndCap = LineCap.ArrowAnchor;

g.DrawLine(pen, containerCenter, Y + delta, containerCenter, Y + dy + delta);

pen.EndCap = LineCap.NoAnchor;

//конец цикла

points = new Point[]

{

new Point(dx, Y + dy + delta),

new Point(dx + w, Y + dy+ delta),

new Point(dx + w, Y + dy + h - h/3+ delta),

new Point(dx + w - h/3, Y + h + dy+ delta),

new Point(dx + h/3, Y + h + dy+ delta),

new Point(dx, Y + dy + h - h/3+ delta),

new Point(dx, Y + dy + delta),

};

g.DrawCurve(pen, points, 0);

r = new Rectangle(containerCenter - w / 2, Y + dy + delta, w, h);

g.DrawString(TextAtTheEnd, drawFont, drawBrush, r, strFormat);

g.DrawLine(pen, containerCenter, Y + h + dy + delta, containerCenter, Y + h + dy*2 + delta);

}

}

}

7) MainForm.cs

using System;

using System.Collections.Generic;

using System.IO;

using System.Windows.Forms;

using System.Xml.Serialization;

using Jint;

using flowchart.blocks;

namespace flowchart

{

public partial class MainForm : Form

{

private WorkAreaForm workAreaForm;

SaveFileDialog saveFileDialog = new SaveFileDialog { Filter = "xml files (*.xml)|*.xml|All files (*.*)|*.*" };

OpenFileDialog openFileDialog = new OpenFileDialog { Filter = "xml files (*.xml)|*.xml|All files (*.*)|*.*" };

private string filePath = String.Empty;

public MainForm()

{

InitializeComponent();

workAreaForm = new WorkAreaForm(codeTextBox);

workAreaForm.MdiParent = this;

workAreaForm.Clear();

workAreaForm.Show();

workAreaForm.Chart = new Chart();

workAreaForm.DrawChart();

codeTextBox.Text = workAreaForm.Chart.GetCode();

panel1.Height = ClientSize.Height;

panel1.Left = 0;

panel1.Top = menuStrip1.Height + 1;

codePanel.Height = ClientSize.Height - menuStrip1.Height;

codePanel.Left = ClientSize.Width - codePanel.Width;

codePanel.Top = menuStrip1.Height + 1;

codeTextBox.Left = 0;

codeTextBox.Width = codePanel.Width;

codeTextBox.Height = codePanel.Height- 200;

codeResultTextBox.Height = 130;

codeResultTextBox.Width = codePanel.Width;

codeResultTextBox.Left = 0;

codeResultTextBox.Top = codePanel.Top + codeTextBox.Height + 40;

label4.Top = codeResultTextBox.Top - 25;

}

private void button1_Click(object sender, EventArgs e)

{

workAreaForm.Insertion = true;

workAreaForm.BlockType = 1;

workAreaForm.UpdateChart(true);

}

private void button2_Click(object sender, EventArgs e)

{

workAreaForm.Insertion = true;

workAreaForm.BlockType = 2;

workAreaForm.UpdateChart(true);

}

private void loopButton_Click(object sender, EventArgs e)

{

workAreaForm.Insertion = true;

workAreaForm.BlockType = 3;

workAreaForm.UpdateChart(true);

}

private void deleteButton_Click(object sender, EventArgs e)

{

workAreaForm.DeleteBLock();

}

private void MainForm_Resize(object sender, EventArgs e)

{

panel1.Height = ClientSize.Height - menuStrip1.Height;

codePanel.Height = ClientSize.Height - menuStrip1.Height;

codePanel.Left = ClientSize.Width - codePanel.Width;

codeTextBox.Height = codePanel.Height - 200;

codeResultTextBox.Top = codePanel.Top + codeTextBox.Height + 40;

label4.Top = codeResultTextBox.Top - 25;

}

private void button3_Click(object sender, EventArgs e)

{

workAreaForm.ClearChart();

}

private void saveToolStripMenuItem_Click(object sender, EventArgs e)

{

if (filePath != String.Empty)

{

workAreaForm.Chart.root.SaveToXml(filePath);

return;

}

string fileName = String.Empty;

if (saveFileDialog.ShowDialog() == DialogResult.OK)

fileName = saveFileDialog.FileName;

if (fileName == String.Empty)

return;

workAreaForm.Chart.root.SaveToXml(fileName);

filePath = fileName;

workAreaForm.Text = fileName;

}

private void saveAsToolStripMenuItem_Click(object sender, EventArgs e)

{

string fileName = String.Empty;

if (saveFileDialog.ShowDialog() == DialogResult.OK)

fileName = saveFileDialog.FileName;

if (fileName == String.Empty)

return;

workAreaForm.Chart.root.SaveToXml(fileName);

filePath = fileName;

workAreaForm.Text = fileName;

}

private void exitToolStripMenuItem_Click(object sender, EventArgs e)

{

Close();

}

private void openToolStripMenuItem_Click(object sender, EventArgs e)

{

string fileName = String.Empty;

if (openFileDialog.ShowDialog() == DialogResult.OK)

fileName = openFileDialog.FileName;

if (fileName == String.Empty)

return;

FileStream fStream = File.OpenRead(fileName);

XmlSerializer xmlFormat = new XmlSerializer(

typeof (ChartMainBlock),

new Type[]

{

typeof (Block),

typeof (ConditionBlock),

typeof (RegularBLock),

typeof (Branch),

typeof (LoopBlock),

typeof (ChartMainBlock),

typeof (List<Block>),

typeof (List<ConditionBlock>),

typeof (List<RegularBLock>),

typeof (List<Branch>),

typeof (List<LoopBlock>),

typeof (List<ChartMainBlock>),

}

);

ChartMainBlock rootBlockFromFile;

try

{

rootBlockFromFile = (ChartMainBlock)xmlFormat.Deserialize(fStream);

}

catch (System.Exception ex)

{

MessageBox.Show(ex.Message, "Ошибка при попытке открыть файл");

fStream.Close();

return;

}

fStream.Close();

filePath = fileName;

workAreaForm.Text = filePath;

rootBlockFromFile.Items[0].SetBranches(rootBlockFromFile);

workAreaForm.Chart.root = rootBlockFromFile;

workAreaForm.Chart.codeGen = new CodeGenerator(rootBlockFromFile);

workAreaForm.Chart.RealignBlocks();

workAreaForm.Chart.RegenerateInsertionPoints();

workAreaForm.Chart.UpdateAllBlocksList();

workAreaForm.UpdateChart();

workAreaForm.UpdateCode();

}

private void newChartToolStripMenuItem_Click(object sender, EventArgs e)

{

workAreaForm.ClearChart();

filePath = String.Empty;

workAreaForm.Text = "Новая схема";

}

private void executeToolStripMenuItem_Click(object sender, EventArgs e)

{

string script = @codeTextBox.Text;

JsCodeInterpreter engine = new JsCodeInterpreter(codeResultTextBox);

try

{

engine.RunScript(script);

}

catch (JintException ex)

{

MessageBox.Show(ex.Message, "Ошибка при выполнении программы");

}

}

}

}

8) WorkAreaForm.cs

using System.Drawing;

using System.Drawing.Drawing2D;

using System.Windows.Forms;

using flowchart.blocks;

namespace flowchart

{

public partial class WorkAreaForm : Form

{

private Bitmap _picture;

private Graphics g;

private TextBox codeTextBox;

public Chart Chart;

private BlockProreptiesEditor blockProreptiesEditorForm;

public bool Insertion = false;

public int BlockType = 0;

public WorkAreaForm(TextBox textBox)

{

codeTextBox = textBox;

InitializeComponent();

panel1.Width = ClientSize.Width;

panel1.Height = ClientSize.Height;

panel1.Top = panel1.Left = 0;

_picture = new Bitmap(ClientSize.Width, ClientSize.Height);

workAreaFormPictureBox.Image = _picture;

workAreaFormPictureBox.Width = ClientSize.Width;

workAreaFormPictureBox.Height = ClientSize.Height;

workAreaFormPictureBox.Top = workAreaFormPictureBox.Left = 0;

g = Graphics.FromImage(workAreaFormPictureBox.Image);

g.SmoothingMode = SmoothingMode.AntiAlias;

}

private void WorkAreaForm_Load(object sender, System.EventArgs e)

{

Location = new Point(95, 0);

}

private void workAreaFormPictureBox_MouseClick(object sender, MouseEventArgs e)

{

if (e.Button == MouseButtons.Right)

{

Insertion = false;

UpdateChart();

BlockType = 0;

Cursor = Cursors.Arrow;

return;

}

if (Insertion)

{

Chart.ProcessMouseClickInsertion(e.X, e.Y, BlockType);

UpdateChart();

Insertion = false;

BlockType = 0;

codeTextBox.Text = Chart.GetCode();

Cursor = Cursors.Arrow;

}

else

{

Chart.ProcessMouseClickBlockSelection(e.X, e.Y);

UpdateChart();

}

}

public void UpdateChart(bool insertion = false)

{

if (Chart.width > ClientSize.Width)

{

workAreaFormPictureBox.Width = Chart.width;

_picture = new Bitmap(Chart.width, ClientSize.Height);

workAreaFormPictureBox.Image = _picture;

g = Graphics.FromImage(workAreaFormPictureBox.Image);

g.SmoothingMode = SmoothingMode.AntiAlias;

}

else if (Chart.height > ClientSize.Height)

{

workAreaFormPictureBox.Height = Chart.height;

_picture = new Bitmap(ClientSize.Width, Chart.height);

workAreaFormPictureBox.Image = _picture;

g = Graphics.FromImage(workAreaFormPictureBox.Image);

g.SmoothingMode = SmoothingMode.AntiAlias;

}

Clear();

DrawChart(insertion);

}

public void UpdateCode()

{

codeTextBox.Text = Chart.GetCode();

}

public void DrawChart(bool insertion = false)

{

Chart.Draw(g, insertion);

workAreaFormPictureBox.Refresh();

}

public void Clear()

{

g.Clear(Color.White);

}

private void WorkAreaForm_Resize(object sender, System.EventArgs e)

{

panel1.Width = ClientSize.Width;

panel1.Height = ClientSize.Height;

if (workAreaFormPictureBox.Width < panel1.Width || workAreaFormPictureBox.Height < panel1.Height)

{

workAreaFormPictureBox.Width = panel1.Width;

workAreaFormPictureBox.Height = panel1.Height;

_picture = new Bitmap(panel1.Width, panel1.Height);

workAreaFormPictureBox.Image = _picture;

g = Graphics.FromImage(workAreaFormPictureBox.Image);

g.SmoothingMode = SmoothingMode.AntiAlias;

UpdateChart();

}

}

private void workAreaFormPictureBox_MouseMove(object sender, MouseEventArgs e)

{

if (!Insertion)

return;

bool movementResult = Chart.ProcessMouseMove(e.X, e.Y);

Cursor = movementResult ? Cursors.Hand : Cursors.Arrow;

UpdateChart(true);

}

private void workAreaFormPictureBox_MouseDoubleClick(object sender, MouseEventArgs e)

{

Block block = Chart.ProcessMouseDoubleClick(e.X, e.Y);

if (block == null)

return;

if (block is RegularBLock)

{

blockProreptiesEditorForm = new BlockProreptiesEditor("regular", block, this);

}

else if (block is ConditionBlock)

{

blockProreptiesEditorForm = new BlockProreptiesEditor("condition", block, this);

}

else if (block is LoopBlock)

{

blockProreptiesEditorForm = new BlockProreptiesEditor("loop_for", block, this);

}

blockProreptiesEditorForm.MdiParent = this.MdiParent;

blockProreptiesEditorForm.Show();

}

public void DeleteBLock()

{

if (Chart.DeleteSelectedBlock())

{

UpdateChart();

UpdateCode();

}

}

public void ClearChart()

{

Chart.ClearChart();

UpdateChart();

UpdateCode();

}

}

}

9) BlockProreptiesEditor.cs

using System;

using System.Drawing;

using System.Windows.Forms;

namespace flowchart

{

public partial class BlockProreptiesEditor : Form

{

private Block blockToEdit;

private WorkAreaForm workAreaForm;

private string loopType;

public BlockProreptiesEditor(string type, Block block, WorkAreaForm workAreaForm)

{

loopType = type;

InitializeComponent();

this.blockToEdit = block;

this.workAreaForm = workAreaForm;

blockContentTextBox.Text = block.Text;

switch (type)

{

case "regular":

blockContentLabel.Text = "Текст";

Text = "Обычный блок";

AdjustFormFormForConditionOrRegular();

break;

case "condition":

blockContentLabel.Text = "Условие";

Text = "Условие";

AdjustFormFormForConditionOrRegular();

break;

case "loop_for":

blockContentLabel.Text = " Цикл";

Text = "Цикл";

loopTypeComboBox.SelectedIndex = 0;

break;

case "loop_while":

blockContentLabel.Text = "Предусловие";

Text = "Цикл";

loopTypeComboBox.SelectedIndex = 1;

break;

case "loop_do_while":

blockContentLabel.Text = "Постусловие";

Text = "Цикл";

loopTypeComboBox.SelectedIndex = 2;

break;

}

}

private void AdjustFormFormForConditionOrRegular()

{

loopTypeLabel.Visible = false;

loopTypeComboBox.Visible = false;

Width = 300;

Height = 170;

blockContentLabel.Top = 15;

blockContentLabel.Left = 1;

blockContentTextBox.Top = 12;

blockContentTextBox.Left = 55;

blockContentTextBox.Height = 80;

}

private void loopTypeComboBox_SelectedIndexChanged(object sender, EventArgs e)

{

switch(loopTypeComboBox.SelectedIndex)

{

case 0:

blockContentLabel.Text = " Цикл";

loopType = "loop_for";

break;

case 1:

blockContentLabel.Text = "Предусловие";

loopType = "loop_while";

break;

case 2:

blockContentLabel.Text = "Постусловие";

loopType = "loop_do_while";

break;

}

}

private void cancelButton_Click(object sender, EventArgs e)

{

Close();

}

private void okButton_Click(object sender, EventArgs e)

{

if (loopType == "loop_do_while")

{

blockToEdit.Text = "do";

blockToEdit.TextAtTheEnd = blockContentTextBox.Text;

}

else

{

blockToEdit.Text = blockContentTextBox.Text;

blockToEdit.TextAtTheEnd = "";

}

foreach (Block block in workAreaForm.Chart.blocks)

{

block.isSelected = false;

}

workAreaForm.UpdateChart();

workAreaForm.UpdateCode();

Close();

}

private void BlockProreptiesEditor_Load(object sender, EventArgs e)

{

Location = new Point(400, 150);

}

}

}

10) Chart.cs

using System;

using System.Collections.Generic;

using System.Drawing;

using flowchart.blocks;

using System.Xml.Serialization;

namespace flowchart

{

[Serializable]

public class Chart

{

public ChartMainBlock root;

private Block selectedBlock;

[XmlIgnore]

public CodeGenerator codeGen;

[XmlIgnore]

public List<Block> blocks = new List<Block>();

[XmlIgnore]

public List<InsertionPoint> insertionPoints = new List<InsertionPoint>();

[XmlIgnore]

public int height;

[XmlIgnore]

public int width;

public Chart()

{

root = new ChartMainBlock("main block");

Branch rootMainBranch = new Branch("main branch");

root.Items.Add(rootMainBranch);

blocks.Add(root);

blocks.Add(rootMainBranch);

RealignBlocks();

RegenerateInsertionPoints();

codeGen = new CodeGenerator(root);

}

public void RealignBlocks()

{

root.AdjustSize();

root.AdjustPosition(0, 20);

width = root.width;

height = root.height+100;

}

public void RegenerateInsertionPoints()

{

insertionPoints.Clear();

GenerateInsertionPoints(root);

}

public void GenerateInsertionPoints(Block block)

{

if (block is Branch)

{

int x = block.X + block.width / 2;

for (int i = 0; i < block.Items.Count; i++)

{

int y = block.Items[i].Y;

InsertionPoint point = new InsertionPoint();

point.branch = block;

point.x = x;

point.y = y;

point.index = i;

insertionPoints.Add(point);

GenerateInsertionPoints(block.Items[i]);

}

InsertionPoint p = new InsertionPoint();

p.branch = block;

if (block.Items.Count == 0)

{

p.x = x;

p.y = block.Y + block.height / 2;

}

else

{

p.x = x;

p.y = block.Y + block.height;

}

p.index = block.Items.Count;

insertionPoints.Add(p);

}

else

{

foreach (Block item in block.Items)

{

GenerateInsertionPoints(item);

}

}

}

public void InsertIntoBranch(Block branch, Block newBlock, int index)

{

newBlock.Branch = branch;

branch.Items.Insert(index, newBlock);

RealignBlocks();

RegenerateInsertionPoints();

}

private Block CreateNewBlock(int type)

{

switch (type)

{

case (1):

Block regularBLock = new RegularBLock("action");

blocks.Add(regularBLock);

return regularBLock;

case (2):

Block conditionBlock = new ConditionBlock("condition");

Block left = new Branch("condition left branch");

Block right = new Branch("condition right branch");

//left.Branch = right.Branch = conditionBlock;

conditionBlock.Items.Add(left);

conditionBlock.Items.Add(right);

blocks.Add(conditionBlock);

blocks.Add(left);

blocks.Add(right);

return conditionBlock;

case (3):

LoopBlock loopBlock = new LoopBlock("loop");

loopBlock.TextAtTheEnd = "loop end";

Block loopBranch = new Branch("loop branch");

//loopBranch.Branch = loopBlock;

loopBlock.Items.Add(loopBranch);

blocks.Add(loopBlock);

blocks.Add(loopBranch);

return loopBlock;

default:

return null;

}

}

/// <summary>

/// Проверить является ли расстояние между двумя точками меньше заданного

/// </summary>

public bool CheckTwoPoints(int x1, int y1, int x2, int y2, int r)

{

int dx = Math.Abs(x1 - x2);

int dy = Math.Abs(y1 - y2);

return dx * dx + dy * dy <= r * r;

}

public InsertionPoint GetPointAt(int x, int y)

{

foreach (InsertionPoint ip in insertionPoints)

{

if (CheckTwoPoints(ip.x, ip.y, x, y, ip.R))

{

return ip;

}

}

return null;

}

/// <summary>

/// Удаляет выбранный блок схемы

/// </summary>

/// <returns>true - если был удален блок (было что удалять) </returns>

public bool DeleteSelectedBlock()

{

if (selectedBlock == null)

return false;

selectedBlock.Branch.Items.Remove(selectedBlock);

UpdateAllBlocksList();

RealignBlocks();

RegenerateInsertionPoints();

return true;

}

public void UpdateAllBlocksList()

{

blocks.Clear();

WalkChart(root);

}

private void WalkChart(Block block)

{

blocks.Add(block);

foreach (var item in block.Items)

{

WalkChart(item);

}

}

public void ClearChart()

{

root.Items[0].Items.Clear();

blocks.Clear();

RealignBlocks();

RegenerateInsertionPoints();

}

#region mouse events handling

public void ProcessMouseClickInsertion(int mouseX, int mouseY, int blockType)

{

InsertionPoint insertionPointClicked = GetPointAt(mouseX, mouseY);

if (insertionPointClicked == null)

return;

Block newBLock = CreateNewBlock(blockType);

InsertIntoBranch(insertionPointClicked.branch, newBLock, insertionPointClicked.index);

}

public void ProcessMouseClickBlockSelection(int mouseX, int mouseY)

{

selectedBlock = null;

foreach (Block block in blocks)

{

block.isSelected = false;

}

foreach (Block block in blocks)

{

if (block is Branch || block is ChartMainBlock)

continue;

if (block.PointInsideBlock(mouseX, mouseY))

{

selectedBlock = block;

selectBlock(block);

return;

}

}

}

public bool ProcessMouseMove(int mouseX, int mouseY)

{

bool result = false;

foreach (InsertionPoint ip in insertionPoints)

{

if (CheckTwoPoints(ip.x, ip.y, mouseX, mouseY, ip.R))

{

ip.underCursor = true;

result = true;

}

else

{

ip.underCursor = false;

}

}

return result;

}

public Block ProcessMouseDoubleClick(int mouseX, int mouseY)

{

foreach (Block block in blocks)

{

if (block is Branch || block is ChartMainBlock)

continue;

if (block.PointInsideBlock(mouseX, mouseY))

{

return block;

}

}

return null;

}

#endregion

private void selectBlock(Block block)

{

block.isSelected = true;

if (block is RegularBLock)

return;

foreach (Block item in block.Items)

{

selectBlock(item);

}

}

//отрисовка схемы

public void Draw(Graphics g, bool insertion = false)

{

root.Draw(g);

drawBlockItems(root, g);

if (!insertion) return;

foreach (InsertionPoint insertionPoint in insertionPoints)

{

insertionPoint.draw(g);

}

}

private void drawBlockItems(Block block, Graphics g)

{

foreach (Block item in block.Items)

{

item.Draw(g);

drawBlockItems(item, g);

}

}

public string GetCode()

{

return codeGen.GetGeneratedCode();

}

}

}

11) CodeGenerator.cs

using System;

using flowchart.blocks;

namespace flowchart

{

public class CodeGenerator

{

private Block root;

private string code;

//новая строка

private string br = Environment.NewLine;

private int tab = 2;

public CodeGenerator(Block root)

{

this.root = root;

}

public string GetGeneratedCode()

{

code = "";

GenerateCode(root, 0);

return code;

}

private void GenerateCode(Block block, int indent)

{

if (block is ChartMainBlock)

{

GenerateCode(block.Items[0], indent);

}

else if (block is Branch)

{

foreach (var item in block.Items)

{

GenerateCode(item, indent);

}

}

else if (block is RegularBLock)

{

code += GetIndent(indent);

code += block.Text + ";" + br;

}

else if (block is ConditionBlock)

{

code += GetIndent(indent) + String.Format("if ({0})", block.Text) + br;

code += GetIndent(indent) + "{" + br;

GenerateCode(block.Items[0], indent + tab);

code += GetIndent(indent) + "}" + br;

code += GetIndent(indent) + "else" + br;

code += GetIndent(indent) + "{" + br;

GenerateCode(block.Items[1], indent + tab);

code += GetIndent(indent) + "}" + br;

}

else if (block is LoopBlock)

{

code += GetIndent(indent) + block.Text + br;

code += GetIndent(indent) + "{" + br;

GenerateCode(block.Items[0], indent + tab);

code += GetIndent(indent) + "} ";

if (block.TextAtTheEnd != "")

{

code += block.TextAtTheEnd + ";";

}

code += br;

}

}

private string GetIndent(int indent)

{

string res = "";

for (int i = 0; i < indent; i++)

{

res += " ";

}

return res;

}

}

}

12) InsertionPoint.cs

using System.Drawing;

namespace flowchart

{

public class InsertionPoint

{

public Block branch;

public int index;

public int x;

public int y;

public bool underCursor = false;

public int R = 10;

private int paintingR = 4;

public void draw(Graphics g)

{

g.FillEllipse(Brushes.Firebrick, x - paintingR, y - paintingR, 2 * paintingR, 2 * paintingR);

if (underCursor)

{

g.FillEllipse(Brushes.CornflowerBlue, x - R, y - R, 2 * R, 2 * R);

}

}

13) JsCodeInterpreter.cs

using System;

using System.Windows.Forms;

using Jint;

namespace flowchart

{

public class JsCodeInterpreter

{

private TextBox textBox;

private JintEngine jsEngine;

public JsCodeInterpreter(TextBox textBox)

{

this.textBox = textBox;

jsEngine = new JintEngine();

PrintCodeExecutionResultDelegate print = delegate(object text) { textBox.Text += text + Environment.NewLine; };

jsEngine.SetFunction("print", print);

}

public delegate void PrintCodeExecutionResultDelegate(object text);

public void RunScript(string script)

{

textBox.Text = "";

jsEngine.Run(script);

}

}

Приложение Б

(обязательное)

Руководство пользователя

Данное руководство содержит следующие разделы:

1) назначение и условия применения;

2) подготовка к работе;

3) описание операций;

4) аварийные ситуации.

Б1 Назначение и условия применения

Программная система представляет собой приложение для создания блок-схем, генерирования по ним программного кода и его выполнения.

Б1.1 Область применения

Система может быть использована для построения блок-схем различной сложности, обучения или удалённого обучения школьников старших классов и студентов младших курсов, изучающих дисциплины «Информатика», «Программирование на языках высокого уровня» и другие подобные дисциплины. Также система может быть использована для тестирования уже существующих блок-схем.

Б1.2 Краткое описание возможностей

Система позволяет производить следующие операции:

-добавлять в блок-схему блоки процесса, условия или цикла;

-редактировать каждый из блоков блок-схемы;

-удалять из блок-схемы текущий блок;

-полностью очищать блок-схему(на блок-схеме остаются только блоки начала и конца);

-отменять последнее совершённое действие

-копировать отдельные блок или части блок-схемы;

-вставлять отдельные блоки или части блок-схемы;

-вырезать отдельные блоки или части блок-схемы;

-инициализировать массив, определяя его размерность и название;

-присваивать элементам массива определённые значения;

-сохранять созданную блок-схему в формат .XML;

-загружать ранее созданную блок-схему для её последующего тестирования и редактирования;

-генерировать программный код по созданной блок-схеме;

-выполнять сгенерированный программный код.

Б1.3 Уровень подготовки пользователя

Использующий систему пользователь может иметь минимальный опыт в работе с компьютером, уметь пользоваться манипулятором «мышь» и клавиатурой. Кроме того, пользователь должен владеть знанием ГОСТа РД 52.04.253-90 и быть ознакомлен с руководством пользователя.

Б1.4 Перечень эксплуатационной документации

Перечень эксплуатационных документов, с которым необходимо ознакомиться:

- Руководство пользователя программой;

- ГОСТ 19.701-90.

Б1.5 Программные и аппаратные требования к системе

Технические и программные средства необходимые для запуска программы:

1) операционные системы: Windows Server 2003, Windows Server 2008, Windows Vista, Windows 7, Windows XP;

2) процессор: Pentium с тактовой частотой 400 MГц или аналогичный процессор (рекомендуется Pentium с тактовой частотой 1ГГц или аналогичный процессор);

3) ОЗУ: не менее 96 МБ (рекомендуется 256 МБ);

4) жесткий диск: может потребоваться до 500 МБ доступного дискового пространств;

5) дисковод для компакт-дисков или DVD-дисков: не требуется;

6) экран: разрешение 800 x 600, 256 цветов (рекомендуется разрешение 1024 x 768, 32-разрядный));

7) .NET Framework версии 2 и выше

Б2 Подготовка к работе

В разделе «Подготовка к работе» содержится вся необходимая информация о составе дистрибутива системы, запуске системы и проверки ее работоспособности.

Б2.1 Состав дистрибутива

В состав дистрибутива Программы входят:

- исполняемый файл flowchart.exe

- dll файл Jint.dll

Б2.2 Запуск системы

Предварительно необходимо разместить файлы flowchart.exe и Jint.dll в одной директории. После этого система является работоспособной. Для работы с системой запустите flowchart.exe.

Б2.3 Проверка работоспособности системы

Программное обеспечение работоспособно, если в результате действий пользователя, изложенных в пункте П. 2 2.2 , на экране монитора отобразилось главное окно клиентского приложения без выдачи пользователю сообщений о сбое в работе.

Б3 Описание операций

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

Б3.1 Добавление в блок-схему блока процесса, условия или цикла

Наименование операции: «Добавление в блок-схему блока процесса, условия или цикла».

Условия выполнения операции: приложение запущено, успешно функционирует, не выполняет никаких операций, блокирующих доступ к панели инструментов.

Для вставки нового блока нужно:

1) на панели инструментов нажать кнопку нужного блока;

2) на схеме появятся точки для вставки нового блока (рисунок Б.1). Узел, находящий под курсором, подсвечивается синим цветом, остальные доступные узлы красным;

Рисунок Б.1 - Режим вставки нового блока

3) кликнуть по нужной точке вставки. Вставится новый блок и программа сама выровняет все блоки схемы (рисунок Б.2):

Рисунок 6.5 - Результат вставки нового блока

Б3.2 Редактирование блока в блок-схеме

Наименование операции: «Редактирование блока в блок-схеме».

Условия выполнения операции: приложение запущено, успешно функционирует, не выполняет никаких операций, блокирующих доступ к главной форме приложения.

Для редактирования блока в блок схеме нажмите двойным щелчком левой кнопки мышь на блок, который хотите отредактировать.

Если это блок процесса, то появится следующее окно (рисунок Б.3):

Рисунок Б.3 - Окно редактирования блока процесса

В поле «Текст» напишите присваивание переменной какого-либо значение, или выполнение какой-либо продседуры или функции.

Если Вы хотите отредактировать блок условия, то после двойного нажатия левой кнопкой мыши по блоку появится следующее окно (рисунок Б.4):

Рисунок Б.4 - Окно редактирования блока условия

В поле «Условие» напишите значение какой-либо переменной логического типа или логическое выражения.

Если Вы хотите отредактировать блок цикла, то после двойного нажатия левой кнопкой мыши по блоку появится следующее окно (рисунок Б.5):

Рисунок Б.5 - Окно редактирования блока цикла


Подобные документы

  • Аналитический обзор существующих программ-редакторов схем (Microsoft Office Visio 2007, FCEditor, редактор блок-схем). Математическое описание программы и её интерпретатора. Описание системы и руководство пользователя, XML и текст редактора схем.

    дипломная работа [2,1 M], добавлен 07.07.2012

  • Исследование возможностей и областей использования языка программирования JavaScript. Сравнительный анализ языков программирования JavaScript и PHP. Разработка интерактивного Web-приложения на примере теста по теме "Программирование на языке Delphi".

    практическая работа [26,0 K], добавлен 04.02.2015

  • Анализ методов разработки сайта с помощью веб-инструментов, конструктора, системы управления сайтом. Выбор языка веб-программирования, графического редактора. Разработка корпоративного сайта, его внедрение в интернет и тестирование на различных браузерах.

    курсовая работа [2,5 M], добавлен 22.03.2017

  • Изучение особенностей растровых и векторных графических редакторов. Создание графического редактора: выбор языка программирования, разработка структуры программы и алгоритма работы. Описание интерфейса программы. Руководство программиста и пользователя.

    курсовая работа [1,3 M], добавлен 28.07.2013

  • Сравнительная характеристика, возможности и функции языков программирования JavaScript и PHP. Основные области их использования. Разработка интерактивного Web-приложения с применением JavaScript на примере теста по теме "Программирование на языке Delphi".

    курсовая работа [19,3 K], добавлен 01.07.2014

  • Создание Windows-приложения для проведения обучения и тестирования студентов по информационной безопасности. Алгоритм решения задачи, блок-схема работы программы, выбор языка программирования Delphi. Охрана труда программиста, обязанности пользователя.

    дипломная работа [4,8 M], добавлен 04.06.2013

  • Система управления обучением Moodle. Компьютерное тестирование как элемент контроля и обучения. Проектирование компьютерных тестов в системе дистанционного обучения Moodle. Наполнение банка тестовых заданий. Создание теста и настройка его параметров.

    дипломная работа [5,4 M], добавлен 10.11.2010

  • Необходимые компоненты и порядок составления текстового редактора. Текст программы решения задачи на языке программирования C++. Контрольный пример работы текстового редактора. Создание и произведение операции форматирования простого документа.

    курсовая работа [1,6 M], добавлен 03.09.2011

  • Разработка информационной образовательной технологии на основе системы управления обучением Moodle. Теоретические основы электронного образования и программные платформы для организации электронного обучения, преимущества и недостатки такого обучения.

    дипломная работа [1,7 M], добавлен 07.07.2012

  • Разработка алгоритма и программы, которая позволяет создавать программное обеспечение для языка программирования Паскаль. Функциональная спецификация программы. Выбор и обоснование комплекса технических средств. Пользовательское меню и интерфейс.

    курсовая работа [1,3 M], добавлен 02.02.2014

Работы в архивах красиво оформлены согласно требованиям ВУЗов и содержат рисунки, диаграммы, формулы и т.д.
PPT, PPTX и PDF-файлы представлены только в архивах.
Рекомендуем скачать работу.