Разработка и экспериментальное исследование редактора схем программ
Реализация системы визуального программирования. Выбор технических средств для нее. Варианты использования языка 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