44147

Разработка визуальной системы обучения основам алгоритмизации и программирования курсантов высших военных учебных заведений

Дипломная

Информатика, кибернетика и программирование

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

Русский

2013-11-10

2.9 MB

14 чел.

Реферат

133 стр., 17 табл., 41 рис., 25 библ., 5 прилож.

ОБУЧАЮЩИЙ КОМПЛЕКС, АЛГОРИТМЫ, ПСЕВДОКОД, АВТОМАТИЗАЦИЯ ЭТАПА ОБРАБОТКИ ИНФОРМАЦИИ, ТЕХНОЛОГИЧЕСКИЙ ПРОЦЕСС ФУНКЦИОНИРОВАНИЯ, ПОСТАНОВКА ЗАДАЧ, ПРОГРАММНО-МАТЕМАТИЧЕСКАЯ МОДЕЛЬ СИСТЕМЫ, ИНТЕРФЕЙС

Рассмотрена характеристика учебного процесса в военном институте. Определены требования к дисциплине «Информатика и программирование». Проведено обоснование выбора инструментального средства разработки. Сформирован состав задач, решаемых  системой. Определены необходимые входные и выходные документы. Разработан технологический процесс функционирования системы в автоматизированном режиме. Определены требования к информационной системе. Разработан интерфейс системы. Описана структура программного обеспечения. Проведена разработка и кодирование алгоритмов, отладка и тестирование проектируемой системы. В системе организовано формирование необходимых документов.  Даны методические указания для работы с системой и оформлено руководство пользователя.

Содержание

[1] Введение

[2]    1 Характеристика учебного процесса в военном институте

[2.1]    1.1 Общие положения

[2.2]         1.2. Организационно-методические указания по курсу «Информатика и программирование»

[2.2.1] Всего за раздел “Информатика”

[2.3]          1.3 Особенности организации учебного процесса в военном учебном заведении

[2.4]          1.4 Роль и место изучения информатики в подготовке офицеров внутренних войск

[2.5] 1.5 Особенности выбора подхода к преподаванию программирования

[2.6] 2  Выбор и краткая характеристика инструментального средства разработки

[3] 3  Описание постановки комплекса задач системы

[3.1]   3.1 Характеристика задач

[3.2] 3.3 Выходная информация

[3.3]  

[3.4] 3.4 Входная информация

[3.5] 3.4 Технологический процесс функционирования системы в автоматизированном режиме

[4]        4  Описание программно-математического обеспечения

[4.1]        4.1 Структура программного обеспечения

[5] 4.3 Алгоритм «Генерация программного кода»

[6]  

[7] 4.4 Описание интерфейса пользователя с системой

[8] 4.5  Контрольный пример

[9] 5 Организационно- экономическая часть

[10] 5.1 SWOT – анализ разработки

[11] 5.2 Определение затрат на разработку

[12] 5.3 Калькуляция плановой себестоимости

[13]         6 Охрана труда

[14]
6.1 Характеристика терминального класса и рабочего места курсанта

[15] 6.2 Расчет искусственного освещения методом коэффициента использования светового потока

[16] 6.3 Организация режима труда и отдыха при работе курсантов за ПЭВМ

[17] 6.4 Вывод

[18] Заключение

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

[19.1] Новосибирский военный институт внутренних войск МВД РФ (НВИ ВВ МВД РФ): [электронный ресурс] /официальный сайт – режим доступа к статье- http://vivv.nsk.ru/]

[19.2] Программирование на C++ и C# : [электронный ресурс] /Трубецкой Алексей – режим доступа к статье- http://trubetskoy1.narod.ru/]

[19.3] Совет ректоров ВУЗов новосибирской области: [электронный ресурс] /официальный сайт – режим доступа к статье- http://sr-nso.nstu.ru/vus/voen_vus/nvimvd/]

[20] Приложение А

[21] Техническое задание

[21.1]        А.1  Общие сведения

[21.2]        А.2. Назначение и цели создания системы

[21.3]        А.3. Требования к системе

[21.4]        А.4. Требования к составу и содержанию работ по подготовке и вводу системы в действие

[21.5]        А.5. Порядок приемки системы

[22] Приложение Б

[23] Формы выходных документов

[24]
Приложение В

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

[26] Приложение Г

[27] Приложение Д

[28] Текст программы

Разработка обучающего

 

Лист

Масса

Масштаб

изм

Лист

№ Документа

Подпись

Дата

комплекса по дисциплине

Разраб.

Панина А.С.

"Информатика и програм-

 

Проверил

Лауферман О.В.

мирование" для курсантов

Зав. каф.

Фроловский В.Д.

института МВД.

Лист 2

Листов 2

Введение

В наше время повсеместного распространения электронных вычислительных машин (ЭВМ) человеческие знания о природе информации приобретают общекультурную ценность. Этим объясняется интерес исследователей и практиков всего мира к относительно молодой и быстро развивающейся научной дисциплине - информатике.

Основная проблема, которая встает перед обучаемыми на занятиях по информатике, это неосязаемость изучаемого предмета. Живя в материальном мире человеку довольно трудно и не очень интересно разбираться с неосязаемыми операторами.

Наиболее естественной формой представления (восприятия) информации является графический образ – рисунок, чертеж, схема и т.д. К этой форме человек прибегает всякий раз (возможно неявно для себя), когда необходимо решать (описывать, формулировать) действительно сложные задачи. Эффективное оперирование наглядными образами, быстрое установление смысловой связи между ними – является сильной стороной человеческого мышления.

Еще во времена становления программирования, когда программы писались на внутреннем языке ЭВМ – машинном коде, неотъемлемой частью разработки программ было использование блок-схем. Как мы все хорошо знаем: “ Схемой алгоритма называется такое графическое представление алгоритма, в котором этапы процесса обработки информации и носители информации представлены в виде геометрических символов из заданного ограниченного набора, а последовательность процесса отражена направлением линий ”. Их применение значительно облегчало восприятие и анализ программы. Двумерное представление программы более ясно отражало ее структуру. Применение блок-схем позволяло быстрее и качественнее разрабатывать и отлаживать программы, а также облегчалось их сопровождение.

Естественным развитием данной ситуации является объединение двух подходов в описании программ: в виде текста и блок-схемы. Результатом такого объединения является понятие визуального программирования. Под ним понимается способ описания алгоритма решения задачи в графическом виде, соединяющий достоинства текста и блок-схем программ. Что в сочетании с современными графическими возможностями ЭВМ и их способностью взять на себя рутинные операции и максимально упростить весь процесс программирования, делает это направление очень перспективным.

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

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

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

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

Созданная визуальная система обладает удобным интерфейсом, графическим редактором блок-схем, встроенным текстовым редактором, интерпретатором и конвертором на язык структурного  программирования С++ и язык объектно- ориентированного программирования C#. Последний не был представлен в бакалаврской работе, а был реализован непосредственно в дипломном проекте. Выбор этих языков обусловлен их широким применением в «программистской» среде, для разработки программных продуктов самой различной сложности. В системе предусмотрена возможность получения информации (справок) как о самой системе, так и о языке блок - схем.

Данная разработка внедрена в учебный процесс Новосибирского военного института ВВ имени генерала армии И.К. Яковлева МВД России.

   1 Характеристика учебного процесса в военном институте

   1.1 Общие положения

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

В соответствии с приказом КВВ МВД России № 93 от 24 октября 1998г. Новосибирский военный институт ВВ имени генерала армии И.К. Яковлева МВД России осуществляют выпуск офицеров по специальности «Боевая и повседневная деятельность мотострелковых подразделений. Юриспруденция» с присвоением квалификации «Офицер внутренних войск с высшим военно-специальным образованием. Юрист». Предназначение выпускников - «замещение офицерских должностей тактического уровня во внутренних войсках МВД России. Организация правовой работы».

В соответствии с государственными образовательными стандартами высшего профессионального образования (далее - ГОС ВПО) второго поколения основная образовательная программа подготовки выпускника военно-учебного заведения должна предусматривать изучение курсантом следующих циклов дисциплин:

  •  цикл ГСЭ - общие гуманитарные и социально-экономические дисциплины;
  •  цикл EH - общие математические и естественнонаучные дисциплины;
  •  цикл ОПД - обще профессиональные дисциплины;
  •  цикл ВПД - военно-профессиональные дисциплины.

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

В результате изучения дисциплины выпускник должен иметь представление:

  •  о принципах построения, структуре и функциях системы автоматизации управления внутренними войсками;
  •  о перспективах развития современных информационных технологий и особенностях их применения в военном деле.

      В результате изучения дисциплины выпускник должен знать:

  •  основные положения концепции информатизации общества, понятие системы, ее свойства, структуры, функции;
  •  основы информатики, устройства и эксплуатации вычислительной техники;
  •  основы алгоритмизации и программирования;
  •  основные сведения о новых информационных технологиях в решении служебно-боевых задач внутренних войск МВД России.

     В результате изучения дисциплины выпускник должен уметь:

  •  применять общее и специальное программное обеспечение для сбора, анализа и отображения данных обстановки, принятия решения и планирования служебно-боевой деятельности воинских частей и подразделений;
  •  проводить ежедневное техническое обслуживание персональных ЭВМ и периферийного оборудования.

В Новосибирском военном институте ВВ МВД России дисциплина «Информатика и программирование» изучается на первом и втором курсе. В течение двух лет  курсанты изучают теоретические основы обработки информации и овладевают компьютерной грамотностью, знакомятся с рядом прикладных программ в рамках дисциплины "Информатика и программирование" и работой с обучающими и контролирующими программами, которые имеются на кафедре технических и естественнонаучных дисциплин. При этом используются обучающие, демонстрационные, контролирующие и информационно-справочные программы. Начинают использоваться электронные учебники.

        1.2. Организационно-методические указания по курсу «Информатика и программирование»

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

Курс состоит из разделов, охватывающих основы информатики, устройства и применения вычислительной техники, постановку и решение задач на ПЭВМ и новые информационные технологии решения служебно-боевых задач внутренних войск МВД России. 

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

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

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

При изучении данной темы должны быть отражены следующие вопросы:

  •  основные понятия алгоритмизации и программирования, формы представления и свойства алгоритмов. Линейные, разветвляющиеся и циклические алгоритмы;
  •  языки программирования;
  •  последовательность подготовки и решения задач на ЭВМ. Методика алгоритмизации и программирования;
  •  практическая работа по составлению линейных, разветвляющихся и циклических алгоритмов.

Таблица 1.1- Распределение учебного времени по семестрам, темам и видам учебных занятий

Наименование тем

Всего часов учебных занятий

Из них

Из них по видам учебных занятий

Самостоятель-ная работа

Учебные занятия

Лекции

Контрольные работы

Групповые занятия

Практические занятия

1

2

3

4

5

6

7

8

1 семестр

Тема 1 .Основы информатики.

2

2

2

Тема 2 .Аппаратные средства информационных систем.

2

2

2

Тема 3.Программное обеспечение информационных систем.

4

4

4

Тема 4.Практическая работа с клавиатурой ПК.

4

4

4

Тема 5 .Практическая работа с файловой системой ПК.

4

4

4

Тема 6.Интегрированные пакеты для работы с дисками и файлами (NС; WC).

6

6

6

Контрольная работа по темам: 1-6

2

2

2

Всего за семестр

24

24

2

2

20

2 семестр

Тема 7.Среда WINDOWS.

4

4

4

Тема 8.Текстовые процессоры.

14

8

6

6

Тема 9. Графические редакторы (PB; CDR).

12

8

4

4

Контрольная работа

2

2

2

Тема:10. Электронные таблицы.

14

8

6

6

Контрольная работа

2

2

Всего за семестр

48

24

24

2

20

3 семестр

Тема 11 .Базы и банки данных.

22

12

10

10

Контрольная работа

2

2

Тема 12. Основы алгоритмизации и программирования.

4

4

4

Контрольная работа

2

2

Всего за семестр

28

12

18

4

14

Продолжение таблицы 1.1

1

2

3

4

5

6

7

8

4 семестр

Тема 13. Основные сведения об АСУ ВВ МВД России. Компьютерные технологии решения СБЗ.

24

10

14

14

Контрольная работа

2

2

2

Всего за семестр.

26

10

16

2

14

Всего за раздел “Информатика”

128

46

82

10

2

68

         1.3 Особенности организации учебного процесса в военном учебном заведении

В любом высшем учебном заведении всегда были и будут свои особенности процесса обучения студентов. Везде складывается своя определенная система подготовки кадров, отражающая будущую профессию обучаемого. Обучение курсантов в вузах системы МВД России, наряду со сложившимися методами и способами, имеет свою специфику и не может полностью копировать стереотипы гражданских вузов. Особенности подготовки военных кадров в военном институте МВД во многом определяются характером будущей профессиональной деятельности. В отличие от студентов, курсанты попадают в условия, когда по 9 часов в сутки (6 часов - учебные занятия, 3 часа - самостоятельная подготовка) они должны находиться в условиях интенсивной умственной работы. У них нет возможности отвлечься, отдохнуть лежа или путем разнообразия деятельности. Курсанты находятся в условиях постоянной напряженности, диктуемой воинской дисциплиной. Кроме того, характер служебно-боевой деятельности внутренних войск, которую курсанту приходится сочетать с учебной деятельностью, уже в процессе обучения в институте, сопряжен с выполнением набора специфических рабочих операций, с особенностями режима труда и отдыха (несение службы в ночное время, выполнение специальных служебных задач), с влиянием неблагоприятных факторов внешней среды и воздействием различных экстремальных ситуаций. В самих  военных институтах существует проблема другого характера, которая осложняет учебный процесс. В военных институтах обострилась проблема учебника. Учебный процесс не подкрепляется соответствующими печатными учебными и методическими материалами. Библиотеки военных институтов не содержат (или содержат крайне мало) учебников, сборников задач по тем разделам информатики, которые внесены в учебную программу. Постоянная занятость курсантов, ограниченное личное время не позволяют им посещать городские библиотеки в поисках нужного материала. Анализ условий обучения курсантов высших учебных заведений ВВ МВД позволяет предположить, что некоторые изменения в обеспечении и  методике обучения  информатики позволят приблизиться к реализации задачи подготовки высококвалифицированных специалистов. С этой целью используются различные методики и технологии обучения.

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

         1.4 Роль и место изучения информатики в подготовке офицеров внутренних войск

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

Практика военного дела требует резко интенсифицировать деятельность всех офицеров за счет внедрения новой техники управления. Компьютеризация - не столько рост количества компьютеров, сколько перестройка мышления человека. Первоначально требовалось снизить затраты офицеров на техническую работу – составление документов, их хранение, поиск, транспортировку, производство некоторых расчетов и т.п. Но этого на сегодняшний день оказалось не достаточно. Надо анализировать всю управленческую деятельность и внедрить технические средства в наиболее трудоемкие, узловые точки. Внутренние войска не могут заказывать на стороне все разработки. Сейчас много фирм имеют в своем составе блестящие команды квалифицированных программистов, но они не знают предметной области. Специалистам следует осваивать специфику ВВ, а людям, знакомым с предметной областью, нужно изучать базовые технологии, позволяющие автоматизировать их рутинную работу. Тем более что средства программирования сейчас развиваются в направлении, дающем каждому пользователю возможность создать специальный набор инструментов, учитывающий особенности выполняемых задач. В штате внутренних войск немало таких специалистов, в основном офицеры. Это выпускники военных вузов и гражданских высших учебных. Однако АСУ ВВ испытывает острую нужду в кадрах от обычных пользователей персональных компьютеров, знакомых со стандартными офисными и графическими пакетами, до программистов, дизайнеров, специалистов по Internet, телекоммуникационным и видеотехнологиям. Специфика функционирования системы управления ВВ требует порой разработки оригинального программного обеспечения, в том числе и для классических задач учета и контроля материальных средств.

На основании  распоряжения начальника отдела автоматизации УС и АУВ главного штаба внутренних войск от 11 декабря 2003 г приказано организовать факультативную подготовку сводного взвода курсантов выпускного курса для назначения их на первичные офицерские должности в подразделения автоматизации ВВ МВД России. Одной из сторон подготовки является то, что выпускник должен знать основы алгоритмизации и иметь навыки кодирования как на языках структурного программирования, так и на языках объектно-ориентированного программирования. В таком случае, как никогда остро встает вопрос за короткий срок обучит его этому. Разработанная мною визуальная система позволит облегчить этот процесс обучения.

1.5 Особенности выбора подхода к преподаванию программирования 

При решении задач с использованием программирования можно выделить два основных направления:

  1.  "алгоритмический" подход; он заключается в следующем: схема решения задачи описывается на алгоритмическом языке (языке блок-схем алгоритмов) и затем переводится в программную реализацию на конкретном языке программирования;
  2.  "программный" подход - описание решения задачи сразу на конкретном языке программирования.

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

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

     Как правило, при изучении программирования с использованием алгоритмического подхода учащиеся сталкиваются с двумя проблемами:

  1.  описание и детализация решения задачи на алгоритмическом языке;
  2.  переход от алгоритмических конструкций к конкретному языку программирования.

     На разрешение этих трудностей и должно быть направлено методическое обеспечение.

2  Выбор и краткая характеристика инструментального средства разработки

На этапе подготовки задания на бакалаврский проект рассматривалось несколько возможных вариантов реализации данной системы.

Основные критерии, по которым производился выбор среды программирования:

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

Нельзя не сказать об условиях эксплуатации разрабатываемой системы.

Данная система должна работать на персональных компьютерах Intel Pentium II (и выше), с объемом оперативной памяти 256 МВ, установленного на рабочем месте пользователя.

Дополнительные специальные требования к конфигурации ПК:

-      ОС Windows;

-      Microsoft NET Framework 3.5;

-      объем жесткого диска не менее 20 Гб;

-      клавиатура и манипулятор типа «мышь» для управления в программе;

-      принтер формата А4 для печати выходных документов;

-      цветной монитор.

В ходе последующего анализа имеющихся средств программирования на основании перечисленных критериев был выбран вариант написания данной программы с использованием системы визуального проектирования Microsoft Visual Studio 8. Данное заключение основывалось на следующем.

Microsoft Visual Studio 8 продукт корпорации Microsoft, предназначенный для быстрой разработки приложений на языке С#.

Microsoft Visual Studio 8 – мощная система визуального объектно-ориентированного проектирования, позволяющая решать множество задач, в частности:

-    создавать законченные приложения под WINDOWS самой различной направленности, от чисто вычислительных и логических, до графических и мультимедиа;

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

-   интерфейс удовлетворяет всем требованиям WINDOWS и автоматически настраивается на ту систему, которая установлена на компьютере пользователя, поскольку использует многие функции, процедуры, библиотеки WINDOWS;

-   формировать и печатать сложные отчеты, включающие таблицы, графики и т.д.;

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

С помощью Microsoft Visual Studio 8 можно создавать WINDOWS – программы на С# быстрее и проще, чем когда-либо ранее. Так как подавляющее большинство пользователей персональных компьютеров работают сегодня в среде операционных систем семейства Windows, то этот интерфейс является для них наиболее привычным и удобным.

Можно создавать как консольные приложения Win32, так и использовать графический интерфейс пользователя (GUI– graphical user interface). Это означает, что можно создавать интерфейс пользователя (меню, диалоговые окна, кнопки и т.д.), используя технику drag-and-drop. При этом не возникает потерь в скорости выполнения программ, потому что вся мощь языка С# по-прежнему остается в распоряжении разработчика. Microsoft Visual Studio 8 поддерживает основные принципы объектно-ориентированного программирования – инкапсуляцию, полиморфизм и множественное наследование, а также последние расширения языка С#. Сам по себе язык С# не является простым даже для профессионала, поэтому в Microsoft Visual Studio 8 многое сделано для того, чтобы скрыть некоторые низкоуровневые детали, которые составляют внутренности Windows-программ.

Microsoft Visual Studio 8 обеспечивает высокое быстродействие при компиляции и сборке 32 и 64-разрядных приложений для современных операционных систем Windows 95/98/NT/XP/Vista. Результирующие программы оптимизированы с точки зрения скорости выполнения и затрат памяти. Удобный отладчик (с пошаговым исполнением, точками остановки, трассировкой и т.д.) полностью интегрирован в среду Microsoft Visual Studio 8. Дизайнер форм, Редактор кода, Инспектор объектов и другие средства остаются доступными во время работы программы, поэтому вносить изменения можно в процессе отладки.

Справочная служба Microsoft Visual Studio 8 содержит полное описание каждого управляющего компонента, включая списки свойств и методов, а также многочисленные примеры.

В отличие от предыдущих версий, Microsoft Visual Studio 8 – это, прежде всего, возможность построения исполняемых кодов, существенно оптимизированных по быстродействию и затратам памяти. В результате повторной компиляции и компоновки некоторых проектов, ранее созданный в средах Microsoft Visual Studio 8  более ранних версий длина их ехе-файлов сократилась в несколько раз.

Для запуска программы необходимо наличие Microsoft NET Framework 3.5 в используемой операционной системе (Microsoft Windows XP / 2003). Стоит отметить, что для ОС Microsoft Windows Vista / 2008 достаточно лишь скопировать исполняемый файл программы в любой удобный каталог. Благодаря всему этому разработка программ в среде Microsoft Visual Studio 8 становится легкой и приятной.

Таким образом, выбранная платформа, как было показано выше, удовлетворяет поставленным требованиям, поэтому выбор был остановлен на данной системе программирования.

3  Описание постановки комплекса задач системы

Алгоритмизация и анализ задач позволяют понять и запомнить основные алгоритмические конструкции, границы их применения. Задачи развивают навык в использовании основных приемов алгоритмизации для решения конкретных задач, имеющих практическое и познавательное значение. Умение составлять алгоритм решение задачи является лучшим критерием оценки глубины изучения программного материала и его усвоения.

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

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

  1.  постановка задачи (сбор информации о задаче, формулировка условия задачи, определение конечных целей решения задачи, определение формы выдачи результатов, описание данных (их типов, диапазонов величин, структуры и т.п.);
  2.  анализ и исследование задачи, модели (анализ существующих аналогов, анализ технических и программных средств, разработка математической модели, разработка структур данных);
  3.  разработка алгоритма (выбор метода проектирования алгоритма, выбор формы записи алгоритма (блок-схемы, псевдокод и др.), выбор тестов и метода тестирования, проектирование алгоритма);
  4.  программирование (выбор языка программирования, уточнение способов организации данных, запись алгоритма на выбранном языке программирования);
  5.   тестирование и отладка (синтаксическая отладка, отладка семантики и логической структуры, тестовые расчеты и анализ результатов тестирования, совершенствование программы);
  6.   анализ результатов решения задачи и уточнение в случае необходимости математической модели с повторным выполнением 2 - 5 этапов;
  7.   сопровождение программы (доработка программы для решения конкретных задач, составление документации к решенной задаче, к математической модели, к алгоритму, к программе, к набору тестов, к использованию).

Некоторые этапы алгоритмизации задач является в какой-то мере вспомогательным, и нередко они опускается, если общий алгоритм решения задачи оказывается достаточно ясным.

Требуемая визуальная система предназначена  для автоматизации части третьего и всего четвертого этапа решения задачи с помощью компьютера (под выбранным языком программирования подразумеваются языки С++ и C#). Курсант в диалоге составляет блок-схему решения задачи и после проверки правильности составления блок-схемы генерируется код на языки С++ и C#, в противном случае код генерируется сразу без проверки правильности.

В связи с поставленной целью проектирования выделены следующие этапы:

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

  3.1 Характеристика задач

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

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

  •  «Построения блок-схемы» (Z1);
  •  «Проверка целостности  построенной блок-схемы и генерация алгоритма на псевдокоде» (Z2); под «целостностью» понимается наличие блоков начала и конца, отсутствие «висячих» ветвей в блок-схеме, правильность использования блоков и т.д.
  •  «Генерация кода на языке С++ по построенной блок-схеме» (Z3);
  •  «Генерация кода на языке C# по построенной блок-схеме» (Z4).

Задачи, подлежащие автоматизации в первую очередь: автоматизация построения блок-схем и начало разработки задачи - Z1; генерация алгоритма на псевдокоде и проверка целостности  построенной блок-схемы - Z2. Автоматизация  задач Z3 и Z4, а также окончание автоматизации задачи Z2 проводится во вторую очередь.

Рассмотрим более подробно данные задачи.

Назначением задачи Z1 является построение блок-схемы в «Графическом редакторе» с использованием инструментального набора данного приложения. Входным документом задачи Z1 является условие задачи  Д1. Выходной информацией данной задачи является алгоритм данной задачи в виде блок-схемы  D1.

При выполнении задачи Z2, если будет обнаружена ошибка в построенной блок-схеме, то пользователь опять вернется к первой задаче. Входной информацией для задачи Z2 является выходная информация задачи Z1. Выходной информацией для задачи Z2 является сгенерированный алгоритм на псевдокоде D2.

При правильно построенной блок-схеме и сгенерированном псевдокоде, а также объявлении всех типов данных, решение задачи Д1 описывается на языках С++ и C#. Входной информацией для задач Z3 и Z4 является построенная курсантом блок-схема. Выходной информацией для задач Z3 и Z4 является алгоритм задачи на языке С++  и C# D3 и D4 соответственно.

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

Рисунок 3.1- Схема информационной взаимосвязи задач управления

3.3 Выходная информация

При построении алгоритма в визуальной системе выходной информацией является протокол, содержащий условие задачи и  алгоритм в виде блок-схемы (D1), протокол, содержащий алгоритм задачи на псевдокоде (D2), протокол, содержащий алгоритм задачи на языке С++ (D3), а также протокол, содержащий алгоритм задачи на языке С# (D4). Описание основных выходных документов показано в таблице 3.1.

Таблица 3.1- Описание выходных документов

Обозначение документа

Наименование документа

Периодичность формирования

Получатель

Примечания

1

2

3

4

5

D1

Блок-схема алгоритма

По мере выполнения работы

Курсант, преподаватель

Алгоритм решения задачи в виде блок-схемы

D2

Псевдокод

По мере выполнения работы

Курсант, преподаватель

Алгоритм решения задачи в виде псевдокода

D3

Решение задачи на языке С++

По мере выполнения работы

Курсант, преподаватель

Алгоритм решения задачи на языке С++

D4

Решение задачи на языке С#

По мере выполнения работы

Курсант, преподаватель

Алгоритм решения задачи на языке С#

 

3.4 Входная информация

В процессе обследования объекта автоматизацией выявлено, что необходимой входной информацией для решения поставленных задач и получения результатов является условие самих задачи. Описание  входящих документов показано в таблице 3.2.

                                                  

Таблица 3.2- Описание входных документов

Обозначение документа

Наименование документа

Периодичность подготовки

Источник информации

Примечания

1

2

3

4

5

Д1

Задание на разработку алгоритма

По мере проведения работы

Преподаватель

Содержит номер задания для курсанта

3.4 Технологический процесс функционирования системы в автоматизированном режиме

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

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

Машинная обработка состоит из генерации алгоритма на псевдокоде, проверки целостности построенной блок-схемы  и генерации алгоритма на языках С++ и С#.

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

Вся последовательность обработки информации отображена на рисунке 3.3.

В данной схеме введены сокращения, которые имеют следующие обозначения:

Д - входные документы;

D- выходные документы.

     

Рисунок 3.3- Схема технологического процесса функционирования системы в автоматизированном режиме

       4  Описание программно-математического обеспечения

       4.1 Структура программного обеспечения

На основе исследования объекта автоматизации и анализа ее функционирования разработана структура программы, представляющая собой сложную иерархию программных модулей. Структура программного обеспечения представлена на рисунке 4.1.

Главным программным модулем является модуль Main(), который вызывается сразу после запуска системы.

Рисунок 4.1- Структура программного обеспечения

Open()  – открытие файла (блок-схемы);

Save()   – сохранение в файл;

Exit()   – выход из системы;

       PictureBox1_Paint() – функция построения блок – схемы;

Psevdokod()  – перевод блок-схемы на псевдокод;

Cpp()    – перевод псевдокода на язык программирования С++;

Csh()      – перевод псевдокода на язык программирования С#;

Help()   – справка по языкам С++ и С# и построению блок-схемы;

About()  – сведения о разработчиках.

Следует отметить, что в системе программно реализована также функция Neskf(), позволяющая объединять несколько функций в одной программе автоматически,  путем последовательного добавления и сохранения функций в один файл.

       4.2 Алгоритм головного модуля программы

Программа написана с использованием системы визуального проектирования Microsoft Visual Studio 8. Она предназначена для изучения основам алгоритмизации и программирования курсантов высших военных учебных заведений.

Алгоритм головного модуля, представлен на  рисунке 4.2.

       После запуска программы перед пользователем на экране появляется главная форма «Графический редактор», где пользователь выбирает режим работы. После выполнения вышеуказанных действий начинается непосредственно построение блок-схемы (блок 2). Обучаемый последовательно выполняет все действия (блоки 3, 5, 7, 8). На форме отображаются все действия курсанта. В ходе своей работы обучаемый может сохранить созданную блок-схему, загрузить созданную ранее или работать не сохраняясь. В любой момент работы можно обратиться к справочной информации, для чего необходимо вернуться в главное окно. Программа создана таким образом, что такие окна как «Графический редактор», «Псевдокод», «Алгоритм на С++» и «Алгоритм на С#»  по желанию пользователя остаются на экране монитора. Преподаватель может проверить построение алгоритма на каждом его этапе.

Рисунок 4.2- Алгоритм головного модуля

4.3 Алгоритм «Генерация программного кода»

 

4.4 Описание интерфейса пользователя с системой

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

Разработанная система удовлетворяет следующим требованиям:

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

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

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

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

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

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

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

Полное описание интерфейса дано в приложении В «Руководство пользователя».

4.5  Контрольный пример

Контрольный пример должен показать работоспособность разработанной системы.

Изначально пользователь загружает приложение и открывается главное окно «Графический редактор», представленное на рисунке В.1.

Курсант строит блок-схему в графическом редакторе по задаче «Алгоритм Евклида нахождения наибольшего общего делителя», по окончанию построения (рисунок 4.5) необходимо нажать на кнопку перевода блок-схемы на псевдокод для вывода его на экран и проверки правильности построенного алгоритма (рисунок 4.6).

Рисунок 4.5- Пример построенной блок-схемы в окне «Графический редактор»

Рисунок 4.6- Пример полученного псевдокода

Для генерации кода необходимо определить типы данных (рисунок 4.7).

Рисунок 4.7- Окно «Структура данных»

Если введенный алгоритм правилен, то система генерирует код на языке С++ или C# (рисунки 4.8, 4.9 соответственно) и предоставляет возможность запуска полученной программы на выполнение, а также возможность ее редактирования и тестирования.

Рисунок 4.8- Алгоритм на языке С++

Рисунок 4.9- Алгоритм на языке С#

5 Организационно- экономическая часть

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

Использование визуальной системы и реализация сетевой модели курсант – преподаватель позволит одному преподавателю охватить вниманием большее число курсантов, т.е. курсант может отправить выполненное задание преподавателю по сети и получить оценку, тем самым на занятии все курсанты будут оценены.

Также может быть получена экономия за отказ от аналогичного программного обеспечения.

5.1 SWOT – анализ разработки

Сильные стороны:

  1.  Удобный и понятный интерфейс, т.е. реализован такой интерфейс системы, который интуитивно понятен даже начинающему пользователю ПК;
  2.  Невысокие требования к ресурсам, данная система может работать на любых ПК, с установленной операционной системой WINDOWS;
  3.  Объемная и содержательная сопроводительная информация, в справочном разделе можно найти ответы практически на все  вопросы, возникающие во время разработки алгоритма задачи;
  4.  Осуществление контроля за действиями курсантов на любой стадии работы с программой;
  5.  Самостоятельное изучение указанной темы при использовании данного программного продукта.

Слабые стороны:

  1.  Узкая спецификация, данная визуальная система направлена на автоматизацию очень небольшого круга задач;
  2.  Совместима не со всеми ОС, программа может работать только под операционной системой Windows;
  3.  Отсутствие мультимедийных компонентов. Не реализована поддержка мультимедиа: звуков и видеоклипов, что позволило бы более наглядно отобразить тему, но значительно увеличило бы размер данного программного продукта и уменьшило ее быстродействие;
  4.  Отсутствие защиты. Возможность копирования и использования без уведомления заказчика.

Возможности:

  1.  Расширение функций разработки. Увеличение блочных символов, мультимедиа;
  2.  Реализация генерации кода на нескольких языках программирования;
  3.  Пригодность в любом учебном заведении. Данная система позволяет курсанту, студенту, а также школьнику, обучающемуся на любой специальности, получить всю необходимую информацию по данной теме.

Угрозы:

  1.  Изменение действующих образовательных и технических стандартов. Уменьшение круга потребителей, возможно при изменении школьной или университетской программы курса «Информатика»;
  2.  Появление более усовершенствованных программных продуктов по данной задаче;
  3.  Изменение нужд заказчика. Изменение нужд заказчика, что может привести к значительной переработке/доработке программного продукта.

Взаимное влияние разных сторон представлено в таблице 5.1.

Проведем анализ SWOT - матрицы:

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

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

Таблица 5.1- SWOT – матрица

Сильные стороны

Возможности

Угрозы

Итого

      1

     2

      3

      1

      2

     3

1

+

+

++

+

0

+

+6

2

++

+

++

0

0

+

+6

3

++

+

++

+

0

+

+7

4

+

+

++

0

+

+

+6

5

++

++

++

+

+

0

+8

Итого

+8

+6

+10

+3

+2

+4

+33

Слабые стороны

1

- -

- -

- -

- -

-

- -

-11

2

- -

-

-

-

0

-

-6

3

- -

-

-

-

0

-

-6

4

-

0

-

0

-

-

-4

Итого

-7

-4

-5

-4

-2

-5

-27

Общий итог

+1

+2

+5

-1

0

-1

+6

  •  самостоятельное изучение указанной темы при использовании данного программного продукта (+8);
  •  объемная и содержательная сопроводительная информация, в справочном разделе можно найти ответы практически на все  вопросы, возникающие во время разработки алгоритма задачи (+7).

Из слабых сторон сильнее всего обостряет риски узкая спецификация, данная визуальная система направлена на автоматизацию небольшого круга задач (-11).

Строка “Итог” (сумма по каждому столбцу) показывает какие из возможностей или угроз наиболее влиятельны на данный проект. Итак, наиболее выгодным параметром для системы будет являться пригодность в любом учебном заведении (+5).

Основные угрозы представляют изменения нужд заказчика и изменение действующих стандартов.

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

5.2 Определение затрат на разработку

Затраты на разработку проекта (производственные затраты) представляют собой единовременные расходы на всех этапах инновационного процесса: исследование, разработка, эксплуатация. Определение затрат на разработку проекта производится путем составления калькуляции плановой себестоимости. В плановую себестоимость включаются все затраты, связанные с ее выполнением, независимо от источника их финансирования. Смета затрат состоит из прямых и накладных расходов. Расходы на разработку проекта включают в себя следующие пункты:

  1.  Затраты на основные материалы и комплектующие;
  2.  Основная заработная плата;
  3.  Дополнительная заработная плата;
  4.  Социальные отчисления:

а) социальное страхование;

б) пенсионный фонд;

в) фонд занятости населения;

г) медицинское страхование.

  1.  Эксплуатационные затраты при использовании ЭВМ в процессе программирования.
  2.  Накладные расходы.

Затраты на основные материалы и комплектующие представлены в  таблице 5.2.

Таблица 5.2- Затраты на основные материалы и комплектующие

Наименование материальных затрат

Единицы измерения

Количество

Цена без НДС с учетом комиссионных вознаграждений, таможенных пошлин и транспортных затрат

Сумма

1

2

3

4

5

CD-диск

шт.

10

10,00

100,00

Картридж для принтера

шт.

1

1 200,00

1 200,00

Бумага для офисной техники «Снегурочка», пачка 500 листов

шт.

1

120,00

120,00

1

2

3

4

5

Справочное пособие «С++ Builder»

шт.

1

600,00

600,00

Справочное пособие «Полный справочник по С#»

шт.

1

600,00

600,00

Электроэнергия

кВт/час

200

1,5

300,00

Итого:

2 920,00

На основании загрузки исполнителя рассчитаем основную и дополнительную заработную плату:

Трудоемкость разработки представлена в таблице 5.3.

Таблица 5.3- Трудоемкость разработки

Наименование этапа

Трудоемкость этапа, часы

1

Анализ задания и знакомство с темой

32

2

Подбор литературы и выбор средства реализации

32

3

Изучение литературы

80

4

Установка необходимого программного обеспечения

8

5

Согласование с заказчиком состава задач, реализуемых в разработке

16

6

Разработка и согласование программного модуля

160

7

Отладка

48

8

Документирование разработки

24

Итого

400

Следовательно, на разработку затрачено 400/8=50 рабочих дней при восьмичасовом рабочем дне.

Разработка выполнялась инженером – программистом в течении 50 рабочих дней при восьмичасовом рабочем дне. Месячный фонд времени работы инженера-программиста 166,25 часов, среднемесячная заработная плата – 12 000 руб.

Основная заработная плата разработчика составила:

Зосн=12 000*8*50/166,25=28 872,18 руб.

Дополнительная заработная плата составляет 20%:

Здоп=0,2* Зосн=0,2*7218,05=5 774,44 руб.

Затраты на оплату труда с учетом поясного коэффициента(25%):

Зтр=1,25*(Зосндоп)=1,25*(28 872+5 774)=43 307,50 руб.

Рассчитаем отчисления на социальные нужды.

Единый социальный налог:

а) отчисления в Пенсионный фонд (20 %):

0,20*43 307,50 =8 661,50 руб.

б) отчисления в фонд социального страхования (2,9%):

0,029*43 307,50 =1 255,92 руб.

в) отчисления в Федеральный Фонд обязательного медицинского страхования (1,1%):

0,011* 43 307,50 =476,38 руб.

г) отчисления в Территориальный фонд обязательного медицинского страхования (2 %):

0,02*43 307,50 =866,15 руб.

Итого единый социальный налог 11 259, 95 руб.

Страховой взнос на обязательное социальное страхование от несчастных случаев на производстве и профессиональных заболеваний (0,2%):

0,002*43 307,50 =86,62 руб.

Итого отчисления на социальные нужды 11 346,57 руб.

Работа ЭВМ составляет 50 дней, это приблизительно 2 месяца. Амортизационные отчисления для ПЭВМ составляют 20% в год. За 2 месяца амортизационные отчисления при первоначальной стоимости
ПЭВМ 23106 руб. составят:

Замор=23106*0,2*2/12=770 руб.

Амортизационные отчисления на нематериальные активы составляют 30% годовых. При общей стоимости всего используемого лицензионного ПО 4603 руб. это составит:

Зна=4603*0,3*2/12=230,15 руб.

Итого амортизационные отчисления составят 1000,15 руб.

Прочие прямые расходы:

Услуги связи (Internet) – 500 руб.

Накладные расходы: (80% от затрат на основную оплату труда):

0,8*28 872,18 =23 097,74 руб.

5.3 Калькуляция плановой себестоимости

Калькуляция плановой себестоимости представлена в таблице 5.4.

   Таблица 5.4- Калькуляция плановой себестоимости

Наименование статей затрат

Сумма (руб.)

Материалы

2 920,00

Затраты на оплату труда работников, непосредственно занятых созданием научно-технической продукции

43 307,50

Отчисления на социальные нужды

11 346,57

Амортизационные отчисления

1000,15

Прочие прямые расходы

500,00

Накладные расходы

23 097,74

Итого:

82 171,96

Затраты по работам, выполняемым сторонними организациями и предприятиями

0,00

Всего себестоимость

82 171,96

        6 Охрана труда

Целью данного дипломного проекта является разработка визуальной системы обучения основам алгоритмизации и программирования курсантов высших военных учебных заведений. Данный программный продукт разрабатывается для обучения курсантов и будет установлен в терминальном классе Новосибирского военного института ВВ МВД России. В данном терминальном классе, площадью 45 м2, имеется 8 рабочих мест (рисунок 6.1). Основными пользователями являются курсанты военного института, возраст  которых 17 – 23 года. Средний рост составляет свыше 175 см. Все они имеют отличное здоровье и раз в год проходят обязательный медицинский осмотр.

При работе с ЭВМ обучаемые сталкиваются, в основном, с физическими и психофизиологическими опасными и вредными факторами.

К физическим - опасным факторам при работе с ЭВМ, можно отнести:

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

К психофизиологическим опасным и вредным факторам относятся физические (статические и динамические) и нервно-психические перегрузки (умственное перенапряжение, перенапряжение анализаторов, монотонность труда, эмоциональные перегрузки).

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


6.1 Характеристика терминального класса и рабочего места курсанта

Терминальный класс находится на втором этаже учебного корпуса. В классе имеется естественное и искусственное освещение [17]. Окна ориентированы на север. Оконные проемы оборудованы регулируемыми устройствами типа жалюзи [15].

Размещение рабочих мест в терминальном классе представлено
на схеме (рисунок 6.1).

Рисунок 6.1- Схема размещение рабочих мест с ПК

Площадь на одно рабочее место составляет  5,6 м2, что соответствует нормам, указанным в [15]  (т.к. ПЭВМ с ВДТ используется без вспомогательных устройств). Стены покрашены в светлый желтый цвет, потолок побелен.

Питающая сеть трехфазная четырехпроводная с заземленной нейтралью, фазное напряжение - 220 В. Класс оборудован занулением в соответствии с техническими требованиями [18]. Аппаратура, подключается к сети с помощью штепсельных вилок  и имеет конструкцию, исключающую поражения электрическим током в случае прикосновения к штырям и контактам штепсельной вилки после изъятия ее из штепсельной розетки. Предусмотрен аварийный рубильник выключения всего электропитания.

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

Согласно требованиям [15] в помещениях образовательных учреждений должны быть установлены оптимальные параметры, приведенные в таблице 6.1, кроме того необходимо учитывать сезон года и тяжесть выполняемой работы (категория - 1а)[19]. В холодный период года для обеспечения необходимой температура воздуха в классе используются отопительные приборы систем водяного отопления (радиаторы секционные), в теплый путем использования естественной вентиляции.

Таблица 6.1- Оптимальные параметры микроклимата

Период года

Темп. воздуха, гр. С

Относит. влажность воздуха, %

Скорость движения воздуха, м/с

холодный

20-22

50-60

< 0,1

теплый

20-22

50-60

< 0,1

Концентрация вредных веществ в воздухе рабочего помещения ничтожно мала и не опасна для здоровья [19]. Источником выделения вредных веществ в классе могут только мониторы, но они соответствуют стандарту ТСО 99, а он предъявляет достаточно жесткие требования к материалам, из которых сделан монитор, - они не должны выделять вредных веществ. Для того, чтобы содержание обычной пыли и других примесей (в частности СО2 выдыхаемый обучаемыми и преподавателем), содержащихся в атмосфере помещения не превышало установленных норм ежедневно проводится влажная уборка и систематическое проветривание после каждого часа работы на ПЭВМ [15].

Рабочие столы размещены по всему периметру помещения (рисунок 6.1), в результате чего 4 рабочих места, где курсант находится лицом к оконному проему, не соответствуют установленным нормам [15].  

Однако при другом размещении (боковой стороной к световым проемам, чтобы естественный свет падал преимущественно слева [15]) возникают другие проблемы (неэффективное использование площади, курсанты в большинстве своем сидят спиной к преподавателю), поэтому рекомендовано в яркий день закрывать жалюзи и использовать искусственное освещение, для чего предусмотрено раздельное включение рядов светильников [17]. В этом случае освещенность на поверхности стола в зоне размещения рабочего документа будет в пределах 300-500 лк, что не противоречит нормам [15]. В качестве источников света при искусственном освещении применены о люминесцентные лампы типа ЛБ, в рассматриваемом помещении искусственное освещение составляет 312 лк, что также не противоречит нормам [15] (расчет искусственного освещения приведен далее). Линии светильников располагаются локализовано над рабочим столом ближе к его переднему краю, обращенному к оператору [15]. Для обеспечения нормы значений освещенности в помещениях проводится чистка стекол оконных рам и светильников несколько раз в год[15].

При размещении рабочих мест применена периметральная схема. Расстояние между боковыми поверхностями видеомониторов составляют   1,3 м, что соответствует рекомендованным нормам (расстояние между боковыми поверхностями видеомониторов – не менее 1,2 м [15]).

Шумы и вибрации на рабочем месте практически отсутствуют. Согласно требованиям [15] уровень звука, создаваемого одной ПЭВМ не должен превышать 50 дБ, в нашем случае максимальный уровень шума составляет 35дБ (по техническому паспорту). Другого шумящего оборудования (печатающие устройства, серверы и т.п.), уровни шума которого могут превышать нормативные, в терминальном классе не размещается.

Расположение видеомонитора и курсанта соответствуют [15]. Экран монитора находится от глаз пользователей на расстоянии 600 мм. Конструкция рабочего места курсанта с указанием расстояний приведены на рисунках 6.2, 6.3.

Рисунок 6.2- Вид сбоку

Рисунок 6.3- Вид сверху

Высота одноместного стола для занятий с ПЭВМ не регулируется и составляет 750 мм. Рабочий стол имеет пространство для ног высотой 600 мм, шириной - 800 мм, глубиной на уровне колен - 550 мм и на уровне вытянутых ног - 650 мм. Высота сиденья над полом составляет 450 мм. Рабочий стул не является подъемно-поворотным и регулируемым по высоте и углам наклона сидения и спинки, что противоречит рекомендациям [15].

Установленные в терминальном классе мониторы LG L1742S имеют возможность регулировки параметров изображения (яркость, контраст и т.д.). Кадровая частота, при разрешении 1280x1024 пикс - 75 Гц (при этом пользователь перестает замечать мерцание изображения, которое ведет к быстрому уставанию глаз). Все мониторы имеют гигиенический сертификат, включающий, в том числе оценку визуальных параметров. Данная модель монитора полностью соответствует требованиям [15].

6.2 Расчет искусственного освещения методом коэффициента использования светового потока

Схема расположения светильников представлена на рисунке 6.4.

Площадь помещения  S = 45 м2;

Длина помещения  А = 7,5 м;

Ширина помещения  В = 6 м;

Высота подвеса светильников над рабочей поверхностью h = 3,2 м;

Лампы люминесцентные ЛБ-30, ГОСТ 6825-74;

Число светильников  N = 12 по 2 лампы;

Мощность ламп    30 Вт;

Рисунок 6.4- Схема расположения светильников

U = 220 В.

Необходимо определить  световой поток F в данном помещении.

F = (Eн*Kзап*S*Z)/ ,  где   (1)

F - рассчитываемый световой поток, лм;

Ен- нормированная минимальная освещенность, лк. При люминесцентных лампах Ен=300 лк [15];

S- площадь освещаемого помещения , S = 45 м2;

Z- отношение средней освещенности к минимальной (коэфициент минимальной освещенности Z = 1,1);

Kзап- коэффициент запаса, учитывающий уменьшение светового потока лампы в результате загрязнения светильников в процессе эксплуатации К=1,4[15];

- коэффициент использования светового потока, он зависит от индекса помещения (i), от характеристик светильника, размеров помещения, окраски стен и потолка, характеризуемых коэффициентами отражения от стен (Рс) и потолка (Рпт). Тип светильника – ЛСП02. Значение коэффициентов Рс и Рп определим по таблице зависимостей коэффициентов отражения от характера поверхности: Рс=50% (стены окрашены в светлую краску), Рпт=70% (потолок побелен). Значение определяется по таблице коэффициентов использования различных светильников.

Для этого вычислим индекс помещения по формуле:

i =  S/h*(A+B) = 45/3,2*(7,5+6) = 1,04

Зная индекс помещения i=1,04; Рс=50%; Рпт=70% по таблице[7] находим = 0,43

Подставив все значения в формулу (1) для определения светового

потока F, получим

F = (300*1,4*45*1,1)/0,43 = 48349 лм

Рассчитаем количество светильников, необходимых для обеспечения светового потока  F.

Число n ламп определяем по формуле:   

n = F/Fл = 48349 / 2100 = 23,02 24 лампы, где

Fл – световой поток люминесцентных ламп ЛБ-30.

В таком случае необходимо 12 светильников, что соответствует установленному их количеству в терминальном классе.

При таком количестве ламп освещенность данного помещения будет ненамного больше нормированной, что подтверждается расчетом и соответствует нормам:

Е = (Fл*n*)/S*Z* Kзап = (2100*24*0,43)/45*1,1*1,4 = 312 лк;

Ен < E

Таким образом, искусственное освещение в помещении соответствует предъявляемым нормам [17],[20].

6.3 Организация режима труда и отдыха при работе курсантов за ПЭВМ

Длительность работ на ПЭВМ с ВДТ курсантов во время учебных занятий определяется курсом обучения, характером (ввод данных, программирование, отладка программ, редактирование и др.) и сложностью выполняемых заданий, а также техническими данными ПЭВМ и ВДТ и их разрешающей способностью.

При составлении расписания учебных занятий на ПЭВМ с ВДТ необходимо выполнять следующие требования:

  •   исключить большие перерывы длительностью в один час между спаренными академическими часами, отведенными для занятий на ПЭВМ с ВДТ;
  •  не допускать для курсантов старших курсов объединение третьей и четвертой пар учебных занятий на ПЭВМ с ВДТ;
  •  двигательный режим курсантов и темп работы на ПЭВМ с ВДТ должен быть свободным.

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

6.4 Вывод

Рабочие места пользователей дисплеев желательно не располагать непосредственно у окон. Во всех случаях экран монитора следует ориентировать так, чтобы он не давал бликов, а именно - под углом к окну, близким к прямому. Принцип должен быть ясен: как можно меньше света должно падать на экран дисплея. Перед началом работы с монитором необходимо установить с помощью кнопок управления наиболее комфортные контрастность и яркость на экране. Они подбираются индивидуально, так как слишком низкая контрастность и высокая яркость могут приводить к быстрому утомлению. Заменить рабочие стулья. Рабочий стул должен быть подъемно-поворотным, регулируемым по высоте и углам наклона сиденья и спинки, а также расстоянию спинки от переднего края сиденья, при этом регулировка каждого параметра должна быть независимой, легко осуществляемой и иметь надежную фиксацию. Рабочее место пользователя ПЭВМ следует оборудовать подставкой для ног. Таким образом, данный терминальный класс с учетом высказанных рекомендаций соответствует установленным нормам.

Заключение

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

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

В результате анализа существующей системы обучения курсантов данной дисциплине был выявлен ряд трудностей, с которыми сталкиваются курсанты при изучении курса «Информатика и программирование». Построена программно-математическая модель системы обучения, описаны и классифицированы формы входных и выходных документов. Определены основные требования, предъявляемые пользователем (как курсантом, так и преподавателем) к системе, исходя из которых сделано обоснование среды программирования C# Microsoft Visual Studio 8, как средства решения поставленной задачи.

Разработан технологический процесс функционирования системы в автоматизированном режиме.  В среде С# Microsoft Visual Studio 8 разработаны программные модули данной системы.

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

При правильном построении блок-схемы генерируется код на языке С++ либо на языке С#, что позволяет курсантам сравнить запись базовых алгоритмических структур при графическом представлении, т.е. в виде блок-схемы, и в программном виде, в данном случае для программной реализации были выбраны языки высокого уровня С++ и С#. После генерации алгоритма на языках программирования сохраняется возможность его отладки.

Навыки, полученные курсантами при работе с данной системой, могут использоваться в их дальнейшем обучении.

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

  1.  Язык программирования C# 2008 и платформа .NET 3.5, 4-е издание, Эндрю Троелсен
  2.  Язык программирования C++. Вводный курс, Стенли Липпман, Жози Лажойе
  3.  C# 3.0: полное руководство. Полный справочник по C# 2008, Герберт Шилдт
  4.  Купрюхин А. И. Автоматизированные системы обработки информации и управления [Текст] : методическое пособие к дипломному проекту / А. И. Купрюхин, М. М. Раздобреев, Ю. Н. Кошкин. – Новосибирск : НЭТИ, 1990. – 42 с.
  5.  Лауферман О.В.  Информатика. Часть 1. Учебное пособие для студентов I курса дневного отделения АВТФ направления 552800 "Информатика и ВТ" : учебное пособие / О. В. Лауферман, Р. Г. Шахмаметов. - Новосибирск: Издательство НГТУ, 2005. -  74 c.
  6.  Лауферман О.В.  Информатика. Часть 2. Учебное пособие для студентов I курса дневного отделения АВТФ направления 230100 "Информатика и ВТ" : учебное пособие / О. В. Лауферман, Р. Г. Шахмаметов. - Новосибирск: Издательство НГТУ, 2006. -  60 c.
  7.  Лауферман О.В. Информатика.Методические указания к курсовой работе : учебно-методическое пособие / Новосиб. гос. техн. ун-т ; сост. О. В. Лауферман. - НГТУ, 2005. -  40 c.
  8.  Раздобреев М. М. Функциональная обработка информации [Текст]. В 2 ч. Ч. 1. Функциональная обработка информации / М. М. Раздореев. – Новосибирск : НГТУ, 1994. – 130 с.
  9.  Алгоритмы. Алгоритмизация. Алгоритмические языки: [электронный ресурс]/ -  режим доступа к статьеhttp://college.biysk.secna.ru/inform/1_7.html]
  10.  Алгоритмы и методы: [электронный ресурс]/ -  режим доступа к статьеhttp: // http://algolist.manual.ru/
  11.  Новосибирский военный институт внутренних войск МВД РФ (НВИ ВВ МВД РФ): [электронный ресурс] /официальный сайт – режим доступа к статье- http://vivv.nsk.ru/]
  12.  Обучение курсантов военных вузов ВВ МВД России с применением информационных систем на примере обучения информатике в Новосибирском военном институте ВВ МВД России: [электронный ресурс]/ Баранчеев Олег Леонидович-  режим доступа к статье- http://sr-nso.nstu.ru/vus/voen_vus/nvimvd/]
  13.  Программирование на C++ и C# : [электронный ресурс] /Трубецкой Алексей – режим доступа к статье- http://trubetskoy1.narod.ru/]
  14.  Совет ректоров ВУЗов новосибирской области: [электронный ресурс] /официальный сайт – режим доступа к статье- http://sr-nso.nstu.ru/vus/voen_vus/nvimvd/]
  15.  «Гигиенические требования к персональным электронно-вычислительным машинам и организации работы. СанПиН 2.2.2/2.4.1340-03», утвержденные Главным государственным санитарным врачом Российской Федерации 30 мая 2003 года.
  16.  «Гигиенические критерии оценки и классификация условий труда по показателям вредности и опасности факторов производственной среды, тяжести и напряженности трудового процесса. Руководство Р 2.2.755-99». Утверждено и введено в действие Главным государственным санитарным врачом Российской Федерации - 1999 год.
  17.  «Гигиенические требования к естественному, искусственному и совмещенному освещению жилых и общественных зданий. СанПиН 2.2.1/2.1.1.1278-03». Утвержденные Главным государственным санитарным врачом Российской Федерации 6 апреля 2003 года, с 15 июня  2003 г.
  18.  ГОСТ 12.1.038-82. Электробезопасность. Предельно допустимые уровни напряжения прикосновения и токов.
  19.  «Гигиенические требования к микроклимату производственных помещений. Санитарные правила и нормы. СанПиН 2.2.4.548-96». Утверждены Постановлением Госкомсанэпиднадзора России от 1 октября 1996 г. № 21.
  20.  «Естественное и искусственное освещение. СНиП 23-05-95». Приняты и введены в действие постановлением Минстроя России от 2 августа 1995 г. № 18-78
  21.  Расчет  искусственного  освещения:   Метод,   указ./Ю.И.Фалин. - Новосибирск: НЭТИ, - 1989.
  22.  ГОСТ 7.1–2003. Библиографическая запись. Библиографическая запись [Текст]. – Взамен ГОСТ 7.1-84, ГОСТ 7.16-79, ГОСТ 7.18-79, ГОСТ 7.34-81, ГОСТ 7.40-82; введ. 2004–07–01. – М. : Изд-во стандартов, 2004. – 166 с.
  23.  ГОСТ 7.32–2001. Отчет о научно-исследовательской работе [Текст]. – Взамен ГОСТ 7.32-91; введ. 2002-07-01. – М. : Изд-во стандартов, 2002. – 19 с.
  24.  ГОСТ 7.9–95(ИСО 214–76). Реферат и аннотация. Общие требования [Текст]. – Взамен ГОСТ 7.9-77; введ. 1997-07-01. – М. : Изд-во стандартов, 1997. – 7 с.]
  25.  ГОСТ 19.701-90 (ИСО 5807-85). ЕСПД. Схемы алгоритмов, программ, данных и систем. Обозначения условные и правила выполнения. [Текст]. – Взамен ГОСТ 19.003-80; введ. 1992-01-01. – М. : Изд-во стандартов, 1992. – 22 с.]

Приложение А

Техническое задание 

       А.1  Общие сведения

Наименование системы – визуальная система обучения основам алгоритмизации и программирования.

Разработчик – студент очного отделения АВТФ НГТУ Панина Анна Сергеевна.

Заказчик – Новосибирский военный институт внутренних войск МВД России.

       А.2. Назначение и цели создания системы

Визуальная система обучения основам алгоритмизации и программирования предназначена для повышения эффективности обучения курсантов построению алгоритмов в виде блок-схем и переводу полученных алгоритмов на языки С++ и C#, а также для использования в качестве контролирующего средства.

Целями создания автоматизированной системы являются:

  •  обучение курсантов работе за компьютером с самого начала рассмотрения темы;
  •  ускорение обучения курсантов построению алгоритмов в виде блок-схем;
  •  ускорение освоения курсантами языков программирования С++ и С#  и перевода на них построенных алгоритмов.

Степень достижения поставленных целей подлежит проверке путем экспертной оценки после создания и внедрения системы.

       А.3. Требования к системе

Визуальная система обучения основам алгоритмизации и программирования должна удовлетворять следующим требованиям:

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

Структура системы должна обеспечивать достижение поставленных целей.

К режиму функционирования системы не предъявляются специальные требования.

Численность пользователей разрабатываемой системы не ограничивается.

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

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

Визуальная система обучения основам алгоритмизации и программирования используется для построения алгоритмов в виде блок-схем  и генерации кода на языки С++ и C# согласно построенной блок-схеме. Поставленная задача реализуется с помощью следующих функций:

  •  ввод данных в систему;
  •  контроль правильности введенного алгоритма;
  •  генерация кода на языке С++;
  •  генерация кода на языке С#;
  •  ввод ранее построенных блок-схем из файла;
  •  сохранение выполненной блок-схемы в отдельном файле.

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

Требования к программному обеспечению разработки и эксплуатации системы совпадают и определяют использование пакета Microsoft Visual Studio 8, при этом разработчик поставляет заказчику только модуль поддержки прикладных задач и не несет ответственность за несанкционированное с его стороны использование любых программных средств для оценки, тестирования, просмотра работы, а также модификации модулей системы.

Для запуска программы необходимо наличие Microsoft NET Framework 3.5 в используемой операционной системе (Microsoft Windows XP / 2003). Стоит отметить, что для ОС Microsoft Windows Vista / 2008 достаточно лишь скопировать исполняемый файл программы в любой удобный каталог.

Дополнительные специальные требования к конфигурации ПК:

-      ОС Windows;

-      объем жесткого диска не менее 20 Гб;

-      клавиатура и манипулятор типа «мышь» для управления в программе;

-      принтер формата А4 для печати выходных документов;

-      цветной монитор.

       А.4. Требования к составу и содержанию работ по подготовке и вводу системы в действие

Разработчик производит установку контрольного варианта системы на рабочих станциях заказчика. Подключение на дополнительных станциях осуществляется администратором системы. Также разработчик своевременно (до начала опытной эксплуатации) производит обучение выделенного заказчиком персонала.

       А.5. Порядок приемки системы

Работа считается законченной после утверждения акта технической приемки.

Приложение Б

Формы выходных документов

На рисунке Б.1 представлена форма выходного документа «Блок-схема».

Рисунок Б.1- Блок-схема алгоритма в соответствии с задачей «Схема алгоритма определения суммы 10 чисел, не превышающих 50»

       На рисунке Б.2 представлена форма выходного документа  «Псевдокод построенного алгоритма»

Начало

i=1,s=0

ЦИКЛ ПОКА i <=10 ВЫПОЛНЯТЬ

ввод a

ЕСЛИ a >50 ТО

i=i+1

s=s+a

ИНАЧЕ 5

вывод а

К_ЕСЛИ 5

К_ЦИКЛА 3

вывод s

Конец

Рисунок Б.2- Псевдокод алгоритма

На рисунке Б.3 представлена форма выходного документа «Программа построенного алгоритма на языке С++».

#include<stdio.h>

#include<conio.h>

#include<math.h>

void main()

{

clrscr();

int i,s,a,а;

i=1,s=0;

while(i <=10 )

{

printf("\nEnter : ");

scanf("%d",&a);

if(a >50 )

{

i=i+1;

s=s+a;

}

else

{

printf("\noutput: %d",а);

}

}

printf("\noutput: %d",s);

getch();

}

Рисунок Б.3- Алгоритм на языке С++

На рисунке Б.4 представлена форма выходного документа «Программа построенного алгоритма на языке С#».

using System;

namespace Program

{

class ConsoleProg

{

static void Main(string[] args)

{

int i;

int s;

int a;

int а;

i=1,s=0;

while(i <=10 )

{

Console.WriteLine("Enter : ");

a=Convert.ToInt32(Console.ReadLine());

if(a >50 )

{

i=i+1;

s=s+a;

}

else

{

Console.WriteLine("\noutput: {0}",а);

}

}

Console.WriteLine("\noutput: {0}",s);

Console.ReadKey();

}

}

}

Рисунок Б.4- Алгоритм на языке С#


Приложение В

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

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

Рисунок В.1- Вид окна «Графический редактор»

Основное меню этого окна содержит пункты: Файл, Редактирование, Настройка, Справка.

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


Таблица  В.1-Описание меню «Файл»

Команда

Инст-румент

Назначение

Действие

Новый

Создание новой блок-схемы

Если в окне «Графический редактор» нарисована блок-схема или её элементы, то прежде чем начать создавать новую блок-схему появится диалоговое окно «Вопрос» с предложением сохранить имеющуюся блок-схему (рисунок В.2).

Открыть

Открытие существующего файла блок-схемы

Появляется диалоговое окно «Открыть», подобное изображенному на рисунке В.3. Выберите файл и нажмите клавишу «Enter». Если в окне «Графический редактор» нарисована блок-схема или её элементы, то прежде чем откроется файл, появится сообщение с предложением удалить имеющуюся блок-схему (рисунок В.4).

Сохранить

Сохраняет изменения редактируемого файла блок-схемы

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

Сохранить как…

Сохранение под другим именем

Аналогично предыдущей, но файл можно сохранить под другим именем.

Экспорт в *.bmp

Преобразова-ние редакти-руемой блок-схемы в точеч-ный рисунок

Появляется диалоговое окно «Экспорт в *.bmp», подобное изображенному на рисунке В.6. Блок-схема сохраняется в виде точечного рисунка.

Закрыть

Закрытие редактируемой блок-схемы

Завершает работу графического редактора с текущей блок-схемой.

Выход

Завершение работы с «Графическим редактором»

Завершает работу с приложением. Перед выходом запрашивает о сохранение файла редактируемой блок-схемы (рисунок В.7).

Рисунок В.2- Вид окна «Вопрос»

Рисунок В.3- Диалоговое окно «Открыть»

Рисунок В.4-  Диалоговое окно «Сообщение»

Рисунок  В.5- Диалоговое окно «Сохранить блок-схему»

Рисунок В.6- диалоговое окно «Экспорт в *.bmp»

Рисунок В.7- Диалоговое окно «Сообщение»

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

Таблица  В.2-Описание меню «Редактирование»

Команда

Инст-румент

Назначение

Действие

Переместить блок

Перемещение блока

Установить указатель «мыши» на блок, нажать левую клавишу и перетащить на новое место, при  этом границы блока меняются на синий цвет.

Удалить блок

Удаление текущего блока

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

Удалить все

Удаление всей блок-схемы

Удаляет всю блок-схему, при этом появляется сообщение, показанное на рисунке В.4.

Продолжение таблицы 2

1

2

3

4

Удалить связь

Удаление линии связи

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

Редактировать связь

Редактирование линии связи

Указатель «мыши» установить на узел линии связи. Нажав и не отпуская левую клавишу «мыши» перетащить узел на необходимое место.

Добавить узел

Добавление узла на линию связи

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

Рисунок В.8- Диалоговое окно «Вопрос»

Рисунок В.9- Диалоговое окно «Удаление линии связи»

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

Таблица  В.3- Описание меню «Настройка»

Команда

Инст-румент

Назначение

Действие

Блоки

Указание размеров блоков

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

Продолжение таблицы 3

1

2

3

4

Шрифт

Установка параметров шрифта

Появляется стандартное диалоговое окно «Шрифт» для выбора типа и размера шрифта при записи внутри блоков.

Математика

Видимость панели инструментов «Математика».

Наличие галочки около этого пункта меню определяет видимость панели инструментов «Математика» (рисунок В.11). На панели приведены основные математические функции и операторы отношения.

Рисунок В.10- Диалоговое окно «Настройка блоков»

Рисунок В.11- Панель инструментов «Математика»

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

Таблица  В.4- Описание меню «Справка»

Команда

Инст-румент

Назначение

Действие

Помощь

Вызов справочной системы

Вызов окна справочной системы (рисунок В.12)

О программе

Сведения о разработчиках

Вызов окна «О программе» (рисунок В.13)

Рисунок В.12- Окно справочной системы

Рисунок В.13- Окно «О программе»

В таблице В.5 приведены названия и функции инструментов с панели инструментов.

Блоки помеченные <*> прорисовываются в графическом редакторе при наличии первого блока «Терминатор»

Линии связи рисуются от логически первого блока и должны заканчиваться на блоке.

Таблица В.5- Описание панели инструментов

Инструмент

Название

Назначение

Терминатор

Рисование блока «терминатор», т.е. блока пуска или останова

Блок решение*

Рисование блока «решения»

Блок процесс*

Рисование блока «процесс»

Модификация*

Рисование блока «модификации»

Ввод/вывод*

Рисование блока «ввода-вывода»

Нарисовать связь

Рисование линии связи между блоками

Псевдокод

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

Рисунок В.14- Окно «Псевдокод»

Для удачного перевода блок-схемы на псевдокод необходимо, чтобы блок-схема отвечала ряду требований, а именно:

  •  при рисовании связей между блоками связь должна «тянуться» от логически первого блока;
  •  при построении базовой структуры «цикл для» необходимо сначала связять блоки, входящие в тело цикла, а уже затем блоки, идущие после завершения цикла;
  •  при построении базовой структуры «цикл пока» тело цикла должно выполняться при истинности условия, стоящего в блоке решения;
  •  выход из цикла должен также осуществляться при истинности условия в блоке решения;
  •  каждый цикл может иметь не более одного выхода из цикла;
  •  в блоке «ввод/вывод» текст должен начинаться со слов «ввод» либо «вывод», затем через запятую должен следовать список необходимых переменных;
  •  в блоке «модификация» текст должен иметь следующий вид:
  •  <имя_переменной>=<начальное значение>,<конечное значение>,<шаг>
  •  значение шага, равное единице, может опускать

Окно «Псевдокод» имеет собственное меню Отладка.

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

Таблица  В.6- Описание меню «Отладка»

Команда

Назначение

Действие

Структура данных

Указание типов переменных, используемых в программе

При выборе этой команды появляется диалоговое окно (рисунок В.15) для указания типов переменных, используемых в программе. Типы данных, используемые в программе: int, float, char.

Структура программы

Указание прототипа написанной функции

Вызывает диалоговое окно «Структура программы» для указания прототипа написанной функции (рисунок В.16), если программа состоит из нескольких функций, по умолчанию программа состоит только из функции main()

Перевод на С++

Генерация кода на С++

Вызывает окно «Алгоритм на языке С++» с написанной программой.

Перевод на С#

Генерация кода на С#

Вызывает окно «Алгоритм на языке С#» с написанной программой.

Рисунок В.15- Окно «Структура данных»

Рисунок В.16- Диалоговое окно «Структура программы»

Рисунок В.17- Окно «Алгоритм на языке С++»

Рисунок В.18- Окно «Алгоритм на языке С#»

Окна «Алгоритм на языке С++» и «Алгоритм на языке С#» имеют собственное меню Компиляция.

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

Таблица  В.7- Описание меню «Компиляция для C++»

Команда

Назначение

Описание

С++ for DOS 

Сохранение и запуск полученной программы в С++ for DOS

отладка полученного кода и запуск на выполнение в оболочке С++ for DOS

С++ for Windows

Сохранение и запуск полученной программы в С++ for Windows

отладка полученного кода и запуск на выполнение в С++ for Windows (рисунок В.18)

Настройка

указания пути до С++  for DOS

вызов диалогового окна для указания пути до С++  for DOS (рисунок В.19).

Рисунок В.18- Диалоговое окно «Сохранение файла *.cpp»

Рисунок В.19- Диалоговое окно для указания пути до С++  for DOS

Таблица  В.8- Описание меню «Компиляция для C

Команда

Назначение

Описание

С#

Сохранение и запуск полученной программы в С#

отладка полученного кода и запуск на выполнение в С#  (рисунок В.20)

Настройка

Указания пути до С#

вызов диалогового окна для указания пути до С# (рисунок В.21).

Рисунок В.20- Диалоговое окно «Сохранение файла *.cs»

Рисунок В.21- Диалоговое окно для указания пути до С#  

При некорректной работе с программой могут возникать ошибки. В таблице В.8 приведены сообщения об ошибках и пути их устранения меню.

Таблица В.9- Описание ошибок

Сообщение

Ошибки и пути устранения

1

2

Блок-схема не составлена

При попытке сохранить в файл пустую область ввода блок-схемы. Предварительно нарисовать блок-схему.

Блок-схема должна начинаться с блока пуска/останова (рисунок В.20).

Блок-схема должна начинаться с блока начало. Для построения блок-схемы необходимо первым блоком ввести блок «Терминатор».

К текущему блоку нельзя присоединить еще один блок

Попытка нарисовать лишнюю линию связи от блока (к блоку), у которого уже все связи определены. Удалить ранее созданную ненужную связь, повторить действие.

Продолжение таблицы В.9 

1

2

Все связи уже заведены

Попытка нарисовать лишнюю линию связи к блоку, у которого уже все связи определены. Удалить ранее созданную ненужную связь, повторить действие.

У данного блока нет свободных выходов

Попытка нарисовать лишнюю линию связи от блока решения, у которого уже все связи определены. Удалить ранее созданную ненужную связь, повторить действие.

В блоке отсутствует информация

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

Пустые связи в блоках: …..

При переводе блок-схемы на псевдокод не определены связи между указанными блоками. Добавить недостающие связи.

Неверная запись в блоке

При переводе псевдокода на С++ или C# (в режиме решения задач из базы данных), сформированный псевдокод отличен от установленного. Вернуться в главное окно, пересмотреть и отредактировать блок-схему.

Определены не все типы переменных

При попытке перевести псевдокод на С++ или C#. Выбрать команду Структура данных в меню Отладка и в появившемся окне определить всем указанные в блок-схеме переменным соответствующие типы.

Ниже, на рисунке В.22 показан пример сообщения об ошибке.

Рисунок В.22- Сообщение об ошибке

Приложение Г

Основные графические символы блок-схем алгоритмов

В данной работе для построения блок-схем используются блоки указанные в таблице Г.1.

Таблица  Г.1-Описание блоков алгоритмов

Основные блоки

Название блоков и их описание

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

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

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

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

Модификация (подготовка). Отображает моделируемую команду или группу команд с целью воздействия на некоторую последующую функцию (установка переключателя, модификация индексного регистра или инициализация программы).

Данные. Символ отображает данные, носитель данных не определен.

Линия. Символ отображает поток данных или управления.

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

Приложение Д

Текст программы

//Вид окна «Графический редактор»

namespace bseditor

{

   public partial class Form1 : Form

   {

       public struct line//элемент структуры "линия"

       {

           public int x;//координаты начала

           public int y;

           public int x1;//координаты конца

           public int y1;

       };

       

       public struct log_spis

       {

           public int num;

           public int ob;

           public int kod;

           public int tip;

           public int num1;//номер блока, концом которого является данный(КЦИКЛА, КЕСЛИ)

       };

       public struct block//элемент структуры "блок"

       {

           public int tip;//тип блока

           public int x;//координаты верхнего левого угла

           public int y;

           public int width;//ширина

           public int height;//высота

           public string text;//текст в блоке

           public int num;//номер блока TEdit

           public int ist;

           public int fals;

           public int next1;//указатель на след. блок

           public int next2;//ещё один указатель на след. блок (для блоков решения и модификации

           public LinkedList<line> first1; //указатель на первую соед. линию

           public LinkedList<line> first2;

       };

       public struct varieble//список переменных, используемых в программе

       {

           public string name;

           public string tip;

           public string sp;

       };

       public static LinkedList<block> head;

       public static LinkedList<log_spis> head_osn;

       public static LinkedList<varieble> head_v;

 //Имя файла конфигурции

 public static string CfgFileName;

       public static Form7.AppSetting AppSettings;

       string Title = "Редактор блок-схем | ";

       string Fname = "Безымянный.bsm";

       bool NewFile = true;

       block temporery;//указатель на переносимый блок

       LinkedListNode<block> curnode;

       int num_curent_block=0;

       //TImage* kant;//окантовка вокруг блока при переносе

       int dx, dy;//смещение курсора мыши от верхнего левого угла блока

       int num;//номер последнего добавленного блока

       int x, y, x1, y1;

       bool f_per = false;//флаг перемещения

       bool f_red = false;//флаг редактирования связи

       bool f_line = false;//флаг процесса создания связи между блоками

       bool flag_move = false; //Флаг перемещения2

       int x_l, y_l;//исходные координаты перемещаемой линии

       public static string text_for_block;

       public static Form9 MathForm;

       public static Form2 SizeBlockForm;

       public static Form4 DeleteLinkForm;

       public static Form3 PsevdoKodForm;

       public static Form6 VarForm;

       public static Form5 CompileForm;

       public static Form7 SettingForm;

       public static Form10 StructProg;

       public Form1()

       {

           InitializeComponent();

       }

       

       //===========================================================================

       private void Form1_Load(object sender, EventArgs e)

       {

           CfgFileName = Application.StartupPath + "\\config.xml";

           AppSettings = new Form7.AppSetting();

           head = null;

           head_osn = null;

           head_v = null;

           num=1;

           FileInfo f = new FileInfo(CfgFileName);

           if (f.Exists)

           {

               TextReader myStreamReader = new StreamReader(Form1.CfgFileName);

               Form7.AppSetting ss = Form7.AppSetting.LoadXMLSetting(myStreamReader);

               if (ss != null)

               {

                   AppSettings = ss;

               }

               else Application.Exit();

               myStreamReader.Close();

           }

           else

           {

               Form1.AppSettings.SaveXMLSetting();

           }

           this.Text = Title + Fname;

       }

       //===========================================================================

       private void Form1_Shown(object sender, EventArgs e)

       {

           SizeBlockForm = new Form2();

           MathForm = new Form9();

           PsevdoKodForm = new Form3();

           VarForm = new Form6();

           CompileForm = new Form5();

           SettingForm = new Form7();

           StructProg = new Form10();

       //===========================================================================

       private void Form1_FormClosing(object sender, FormClosingEventArgs e)

       {

           Form1.AppSettings.SaveXMLSetting();

       }

       

       //===========================================================================

       private void toolStripButton4_Click(object sender, EventArgs e)

       {

           toolStripButton5.Checked = false;

           toolStripButton6.Checked = false;

           toolStripButton7.Checked = false;

           toolStripButton8.Checked = false;

           toolStripButton9.Checked = false;

           toolStripButton10.Checked = false;

           toolStripButton11.Checked = false;

           toolStripButton14.Checked = false;

       }

       //===========================================================================

       private void toolStripButton5_Click(object sender, EventArgs e)

       {

           //toolStripButton4.Checked = false;

           toolStripButton5.Checked = true;

           toolStripButton6.Checked = false;

           toolStripButton7.Checked = false;

           toolStripButton8.Checked = false;

           toolStripButton9.Checked = false;

           toolStripButton10.Checked = false;

           toolStripButton11.Checked = false;

           toolStripButton14.Checked = false;

       }

       //===========================================================================

       private void toolStripButton6_Click(object sender, EventArgs e)

       {

           toolStripButton5.Checked = false;

           toolStripButton6.Checked = true;

           toolStripButton7.Checked = false;

           toolStripButton8.Checked = false;

           toolStripButton9.Checked = false;

           toolStripButton10.Checked = false;

           toolStripButton11.Checked = false;

           toolStripButton14.Checked = false;

       }

       //===========================================================================

       private void toolStripButton7_Click(object sender, EventArgs e)

       {

           //toolStripButton4.Checked = false;

           toolStripButton5.Checked = false;

           toolStripButton6.Checked = false;

           toolStripButton7.Checked = true;

           toolStripButton8.Checked = false;

           toolStripButton9.Checked = false;

           toolStripButton10.Checked = false;

           toolStripButton11.Checked = false;

           toolStripButton14.Checked = false;

       }

               //===========================================================================

       private void toolStripButton8_Click(object sender, EventArgs e)

       {

           toolStripButton5.Checked = false;

           toolStripButton6.Checked = false;

           toolStripButton7.Checked = false;

           toolStripButton8.Checked = true;

           toolStripButton9.Checked = false;

           toolStripButton10.Checked = false;

           toolStripButton11.Checked = false;

           toolStripButton14.Checked = false;

       }

//===========================================================================

       private void toolStripButton9_Click(object sender, EventArgs e)

       {

           //toolStripButton4.Checked = false;

           toolStripButton5.Checked = false;

           toolStripButton6.Checked = false;

           toolStripButton7.Checked = false;

           toolStripButton8.Checked = false;

           toolStripButton9.Checked = true;

           toolStripButton10.Checked = false;

           toolStripButton11.Checked = false;

           toolStripButton14.Checked = false;

       }

       

//===========================================================================

       private void toolStripButton10_Click(object sender, EventArgs e)

       {

           toolStripButton5.Checked = false;

           toolStripButton6.Checked = false;

           toolStripButton7.Checked = false;

           toolStripButton8.Checked = false;

           toolStripButton9.Checked = false;

           toolStripButton10.Checked = true;

           toolStripButton11.Checked = false;

           toolStripButton14.Checked = false;

       }

       

//===========================================================================

       private void toolStripButton11_Click(object sender, EventArgs e)

       {

           toolStripButton5.Checked = false;

           toolStripButton6.Checked = false;

           toolStripButton7.Checked = false;

           toolStripButton8.Checked = false;

           toolStripButton9.Checked = false;

           toolStripButton10.Checked = false;

           toolStripButton11.Checked = true;

           toolStripButton14.Checked = false;

       }

       

//===========================================================================

       private void toolStripButton14_Click(object sender, EventArgs e)

       {

           toolStripButton5.Checked = false;

           toolStripButton6.Checked = false;

           toolStripButton7.Checked = false;

           toolStripButton8.Checked = false;

           toolStripButton9.Checked = false;

           toolStripButton10.Checked = false;

           toolStripButton11.Checked = false;

           toolStripButton14.Checked = true;

       }

               //===========================================================================

       private void exitToolStripMenuItem_Click(object sender, EventArgs e)

       {

           DialogResult otvet=MessageBox.Show("Сохранить файл?", "Сообщение", MessageBoxButtons.YesNoCancel);

           if (otvet == DialogResult.Yes)

           {

               toolStripButton3_Click(sender, e);

               Application.Exit();

           } else if (otvet==DialogResult.No) Application.Exit();

       }

//===========================================================================

       //SAVE

       private void toolStripButton3_Click(object sender, EventArgs e)

       {

           if (head == null) return;

           if (NewFile)

           {

               saveFileDialog1.Filter = "*.bsm|*.bsm";

               saveFileDialog1.DefaultExt = "bsm";

               saveFileDialog1.Title = "Сохранение файла *.bsm";

               saveFileDialog1.FileName = Fname;

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

               {

                   Fname = saveFileDialog1.FileName;

                   NewFile = false;

                   this.Text = Title + Fname;

               }

               else return;

           }

           using (BinaryWriter binWriter = new BinaryWriter(File.Open(Fname, FileMode.Create)))

           {

               Encoding ascii = Encoding.GetEncoding(1251);

               foreach (block el in head)

               {

                   binWriter.Write(el.tip);

                   binWriter.Write(el.x);

                   binWriter.Write(el.y);

                   binWriter.Write(el.width);

                   binWriter.Write(el.height);

                   binWriter.Write(el.num);

                   binWriter.Write(el.ist);

                   binWriter.Write(el.fals);

                   binWriter.Write(el.next1);

                   binWriter.Write(el.next2);

                   if (el.text != null)

                   {

                       binWriter.Write(el.text.Length);

                       binWriter.Write(ascii.GetBytes(el.text));

                   }

                   else binWriter.Write(0x00000000);

                   if (el.first1 != null)

                   {

                       binWriter.Write(el.first1.Count);

                       foreach (line l in el.first1)

                       {

                           binWriter.Write(l.x);

                           binWriter.Write(l.y);

                           binWriter.Write(l.x1);

                           binWriter.Write(l.y1);

                       }

                   }

                   else binWriter.Write(0x00000000);

                   if (el.first2 != null)

                   {

                       binWriter.Write(el.first2.Count);

                       foreach (line l in el.first2)

                       {

                           binWriter.Write(l.x);

                           binWriter.Write(l.y);

                           binWriter.Write(l.x1);

                           binWriter.Write(l.y1);

                       }

                   }

                   else binWriter.Write(0x00000000);

               }

               binWriter.Write(0xffffffff);

               binWriter.Close();

           }

       }

       //===========================================================================

       private void saveToolStripMenuItem_Click(object sender, EventArgs e)

       {

           toolStripButton3_Click(sender, e);

       }

//===========================================================================

       private void saveasToolStripMenuItem_Click(object sender, EventArgs e)

       {

           if (head == null) return;

           saveFileDialog1.Filter = "*.bsm|*.bsm";

           saveFileDialog1.DefaultExt = "bsm";

           saveFileDialog1.Title = "Сохранение файла *.bsm";

           saveFileDialog1.FileName = Fname;

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

           {

               NewFile = false;

               Fname = saveFileDialog1.FileName;

               this.Text = Title + Fname;

               toolStripButton3_Click(sender, e);

           }

       }

       

//===========================================================================

      //NEW

       private void toolStripButton1_Click(object sender, EventArgs e)

       {

           if (head != null)

           {

               DialogResult otvet = MessageBox.Show("Сохранить блок-схему?", "Вопрос", MessageBoxButtons.YesNoCancel);

               if (otvet == DialogResult.Yes)

               {

                   toolStripButton3_Click(sender, e);

                   toolStripButton17_Click(sender, e);

               }

               else if (otvet == DialogResult.No) toolStripButton17_Click(sender, e);

           }

       }

//===========================================================================

       //OPEN

       private void toolStripButton2_Click(object sender, EventArgs e)

       {

           if (head != null)

           {

               DialogResult otvet = MessageBox.Show("Сохранить текущию блок-схему?", "Вопрос", MessageBoxButtons.YesNoCancel);

               if (otvet == DialogResult.Yes)

               {

                   toolStripButton3_Click(sender, e);

               }

               else if (otvet == DialogResult.Cancel) return;

           }

           openFileDialog1.Filter = "*.bsm|*.bsm";

           openFileDialog1.FileName = "";

           openFileDialog1.DefaultExt = "bsm";

           openFileDialog1.Title = "Открыть файл *.bsm";

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

           {

               Fname = openFileDialog1.FileName;

               FileInfo f = new FileInfo(Fname);

               if (f.Exists)

               {

                   if (head != null)

                   {

                       head.Clear();

                       head = null;

                       num = 1;

                       num_curent_block = 0;

                       pictureBox1.Invalidate();

                   }

                   this.Text = Title + Fname;

                   head = new LinkedList<block>();

                   byte[] buf = new byte[4];

                   int text_len=0, count_line;

                   Encoding ascii = Encoding.GetEncoding(1251);

                   using (BinaryReader binReader = new BinaryReader(File.Open(Fname, FileMode.Open)))

                   {

                       while (true)

                       {

                           block node = new block();

                           binReader.Read(buf, 0, 4); uint fff=BitConverter.ToUInt32(buf, 0);

                           if (fff == 0xffffffff) break;

                           node.tip = BitConverter.ToInt32(buf, 0);

                           binReader.Read(buf, 0, 4); node.x = BitConverter.ToInt32(buf, 0);

                           binReader.Read(buf, 0, 4); node.y = BitConverter.ToInt32(buf, 0);

                           binReader.Read(buf, 0, 4); node.width = BitConverter.ToInt32(buf, 0);

                           binReader.Read(buf, 0, 4); node.height = BitConverter.ToInt32(buf, 0);

                           binReader.Read(buf, 0, 4); node.num = BitConverter.ToInt32(buf, 0);

                           if (node.num > num) num = node.num;

                           binReader.Read(buf, 0, 4); node.ist = BitConverter.ToInt32(buf, 0);

                           binReader.Read(buf, 0, 4); node.fals = BitConverter.ToInt32(buf, 0);

                           binReader.Read(buf, 0, 4); node.next1 = BitConverter.ToInt32(buf, 0);

                           binReader.Read(buf, 0, 4); node.next2 = BitConverter.ToInt32(buf, 0);

                           binReader.Read(buf, 0, 4); text_len = BitConverter.ToInt32(buf, 0);

                           if (text_len != 0)

                           {

                               byte[] txt = new byte[text_len];

                               binReader.Read(txt, 0, text_len);

                               node.text = ascii.GetString(txt);

                           }

                           binReader.Read(buf, 0, 4); count_line = BitConverter.ToInt32(buf, 0);

                           if (count_line != 0)

                           {

                               node.first1 = new LinkedList<line>();

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

                               {

                                   line nodeline = new line();

                                   binReader.Read(buf, 0, 4); nodeline.x = BitConverter.ToInt32(buf, 0);

                                   binReader.Read(buf, 0, 4); nodeline.y = BitConverter.ToInt32(buf, 0);

                                   binReader.Read(buf, 0, 4); nodeline.x1 = BitConverter.ToInt32(buf, 0);

                                   binReader.Read(buf, 0, 4); nodeline.y1 = BitConverter.ToInt32(buf, 0);

                                   node.first1.AddLast(nodeline);

                               }

                           }

                           binReader.Read(buf, 0, 4); count_line = BitConverter.ToInt32(buf, 0);

                           if (count_line != 0)

                           {

                               node.first2 = new LinkedList<line>();

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

                               {

                                   line nodeline = new line();

                                   binReader.Read(buf, 0, 4); nodeline.x = BitConverter.ToInt32(buf, 0);

                                   binReader.Read(buf, 0, 4); nodeline.y = BitConverter.ToInt32(buf, 0);

                                   binReader.Read(buf, 0, 4); nodeline.x1 = BitConverter.ToInt32(buf, 0);

                                   binReader.Read(buf, 0, 4); nodeline.y1 = BitConverter.ToInt32(buf, 0);

                                   node.first2.AddLast(nodeline);

                               }

                           }

                           head.AddLast(node);

                       }

                       num++;

                       binReader.Close();

                   }

                   NewFile = false;

                   pictureBox1.Invalidate();

               }

               else

               {

                   MessageBox.Show("Файл не существует", "Ошибка", MessageBoxButtons.OK);

               }

           }

       }

       //===========================================================================

       private void newToolStripMenuItem_Click(object sender, EventArgs e)

       {

           toolStripButton1_Click(sender, e);

       }

       

//===========================================================================

       private void openToolStripMenuItem_Click(object sender, EventArgs e)

       {

           toolStripButton2_Click(sender, e);

       }

               //===========================================================================

       private void exportBmpToolStripMenuItem_Click(object sender, EventArgs e)

       {

           if (head == null) return;

           int x_min = head.First.Value.x, x_max = head.First.Value.x, y_min = head.First.Value.y, y_max = head.First.Value.y;

           foreach(block tmp in head)

           {

               if (x_min > tmp.x) x_min = tmp.x;

               if (x_max < tmp.x + tmp.width) x_max = tmp.x + tmp.width;

               if (y_min > tmp.y) y_min = tmp.y;

               if (y_max < tmp.y + tmp.height) y_max = tmp.y + tmp.height;

               if (tmp.first1!=null)

                   foreach(line L in tmp.first1)

                   {

                       if (x_min > L.x) x_min = L.x;

                       if (x_max < L.x) x_max = L.x;

                       if (y_min > L.y) y_min = L.y;

                       if (y_max < L.y) y_max = L.y;

                       if (x_min > L.x1) x_min = L.x1;

                       if (x_max < L.x1) x_max = L.x1;

                       if (y_min > L.y1) y_min = L.y1;

                       if (y_max < L.y1) y_max = L.y1;

                   }

               if (tmp.first2 != null)

                   foreach (line L in tmp.first2)

                   {

                       if (x_min > L.x) x_min = L.x;

                       if (x_max < L.x) x_max = L.x;

                       if (y_min > L.y) y_min = L.y;

                       if (y_max < L.y) y_max = L.y;

                       if (x_min > L.x1) x_min = L.x1;

                       if (x_max < L.x1) x_max = L.x1;

                       if (y_min > L.y1) y_min = L.y1;

                       if (y_max < L.y1) y_max = L.y1;

                   }

           }

           Brush brush_white = Brushes.White;

           Bitmap bmp = new Bitmap(x_max, y_max);

           Graphics graphics = Graphics.FromImage(bmp);

           graphics.FillRectangle(brush_white, 0, 0, bmp.Width, bmp.Height);

           Pen cur_pen, pen_black, pen_blue, pen_red;

           pen_black = new Pen(Color.Black);

           pen_blue = new Pen(Color.Blue);

           pen_red = new Pen(Color.Red);

           Font f = new Font("Arial", 10);

           Brush brush_black = Brushes.Black;

           Brush brush_blue = Brushes.Blue;

           Brush brush_green = Brushes.Green;

           foreach (block el in head)

           {

               cur_pen = pen_black;

               int left_x = el.x - el.width / 2;

               int top_y = el.y - el.height / 2;

               System.Drawing.SizeF size = graphics.MeasureString(el.text, f);

               float offset_x = el.width / 2 - size.Width / 2;

               if (el.tip == 1) //начало конец

               {

                   graphics.DrawLine(cur_pen, left_x + el.height / 2, top_y, left_x + el.width - el.height / 2, top_y);

                   graphics.DrawLine(cur_pen, left_x + el.height / 2, top_y + el.height, left_x + el.width - el.height / 2, top_y + el.height);

                   graphics.DrawArc(cur_pen, left_x, top_y, el.height, el.height, 90, 180);

                   graphics.DrawArc(cur_pen, left_x + el.width - el.height, top_y, el.height, el.height, 90, -180);

                   graphics.DrawString(el.text, f, brush_black, left_x + offset_x, top_y + f.GetHeight() / 2);

                   graphics.DrawString(el.num.ToString(), f, brush_blue, left_x + el.height / 2, top_y - f.GetHeight());

               }

               else if (el.tip == 3) //ввод вывод

               {

                   graphics.DrawLine(cur_pen, left_x + el.width / 5, top_y, left_x + el.width, top_y);

                   graphics.DrawLine(cur_pen, left_x + el.width, top_y, left_x + 4 * el.width / 5, top_y + el.height);

                   graphics.DrawLine(cur_pen, left_x + 4 * el.width / 5, top_y + el.height, left_x, top_y + el.height);

                   graphics.DrawLine(cur_pen, left_x, top_y + el.height, left_x + el.width / 5, top_y);

                   graphics.DrawString(el.text, f, brush_black, left_x + offset_x, el.y - f.GetHeight() / 2);

                   graphics.DrawString(el.num.ToString(), f, brush_blue, left_x + el.width / 5, top_y - f.GetHeight());

               }

               else if (el.tip == 4) //модификция

               {

                   graphics.DrawLine(cur_pen, left_x + el.width / 5, top_y, left_x + 4 * el.width / 5, top_y);

                   graphics.DrawLine(cur_pen, left_x + 4 * el.width / 5, top_y, left_x + el.width, top_y + el.height / 2);

                   graphics.DrawLine(cur_pen, left_x + el.width, top_y + el.height / 2, left_x + 4 * el.width / 5, top_y + el.height);

                   graphics.DrawLine(cur_pen, left_x + 4 * el.width / 5, top_y + el.height, left_x + el.width / 5, top_y + el.height);

                   graphics.DrawLine(cur_pen, left_x + el.width / 5, top_y + el.height, left_x, top_y + el.height / 2);

                   graphics.DrawLine(cur_pen, left_x, top_y + el.height / 2, left_x + el.width / 5, top_y);

                   graphics.DrawString(el.text, f, brush_black, left_x + offset_x, el.y - f.GetHeight() / 2);

                   graphics.DrawString(el.num.ToString(), f, brush_blue, left_x + el.width / 5, top_y - f.GetHeight());

               }

               else if (el.tip == 2) //процесс

               {

                   graphics.DrawRectangle(cur_pen, left_x, top_y, el.width, el.height);

                   graphics.DrawString(el.text, f, brush_black, left_x + offset_x, el.y - f.GetHeight() / 2);

                   graphics.DrawString(el.num.ToString(), f, brush_blue, left_x, top_y - f.GetHeight());

               }

               else if (el.tip == 5) //решение

               {

                   graphics.DrawLine(cur_pen, left_x + el.width / 2, top_y, left_x + el.width, top_y + el.height / 2);

                   graphics.DrawLine(cur_pen, left_x + el.width, top_y + el.height / 2, left_x + el.width / 2, top_y + el.height);

                   graphics.DrawLine(cur_pen, left_x + el.width / 2, top_y + el.height, left_x, top_y + el.height / 2);

                   graphics.DrawLine(cur_pen, left_x, top_y + el.height / 2, left_x + el.width / 2, top_y);

                   graphics.DrawString(el.text, f, brush_black, left_x + offset_x, el.y - f.GetHeight() / 2);

                   graphics.DrawString(el.num.ToString(), f, brush_blue, left_x + el.width / 2, top_y - f.GetHeight());

                   if (el.first1 != null)

                   {

                       LinkedListNode<line> l1 = el.first1.First;

                       graphics.DrawString("1", f, brush_black, l1.Value.x, l1.Value.y);

                   }

                   if (el.first2 != null)

                   {

                       LinkedListNode<line> l1 = el.first2.First;

                       graphics.DrawString("0", f, brush_black, l1.Value.x, l1.Value.y);

                   }

               }

               if (el.first1 != null)

                   foreach (line l in el.first1)

                   {

                       graphics.DrawLine(pen_black, l.x, l.y, l.x1, l.y1);

                       LinkedListNode<line> ll = el.first1.Find(l);

                       if (ll != el.first1.Last)

                       {

                           graphics.FillRectangle(brush_black, l.x - 2, l.y - 2, 4, 4);

                           graphics.FillRectangle(brush_black, l.x1 - 2, l.y1 - 2, 4, 4);

                       }

                       else

                       {

                           graphics.FillRectangle(brush_green, l.x1 - 2, l.y1 - 2, 4, 4);

                       }

                   }

               if (el.first2 != null)

                   foreach (line l in el.first2)

                   {

                       graphics.DrawLine(pen_black, l.x, l.y, l.x1, l.y1);

                       LinkedListNode<line> ll = el.first2.Find(l);

                       if (ll != el.first2.Last)

                       {

                           graphics.FillRectangle(brush_black, l.x - 2, l.y - 2, 4, 4);

                           graphics.FillRectangle(brush_black, l.x1 - 2, l.y1 - 2, 4, 4);

                       }

                       else

                       {

                           graphics.FillRectangle(brush_green, l.x1 - 2, l.y1 - 2, 4, 4);

                       }

                   }

           }

           saveFileDialog1.Filter = "*.bmp|*.bmp";

           saveFileDialog1.DefaultExt = "bmp";

           saveFileDialog1.Title = "Экспорт в bmp";

           saveFileDialog1.FileName = "";

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

           {

               bmp.Save(saveFileDialog1.FileName, System.Drawing.Imaging.ImageFormat.Bmp);

           }

       }

               //===========================================================================

       //CLEAR ALL

       private void toolStripButton17_Click(object sender, EventArgs e)

       {

           if(head==null) return;

           if(MessageBox.Show("Удалить блок-схему?","Сообщение", MessageBoxButtons.YesNo)==DialogResult.No) return;

           head.Clear();

           head=null;

           num=1;

           num_curent_block = 0;

           pictureBox1.Invalidate();

           Fname = "Безымянный.bsm";

           this.Text = Title + Fname;

           NewFile = true;

       }

       //===========================================================================

       private void moveblockToolStripMenuItem_Click(object sender, EventArgs e)

       {

           toolStripButton11_Click(sender, e);

       }

       

//===========================================================================

       private void clearallToolStripMenuItem_Click(object sender, EventArgs e)

       {

           toolStripButton17_Click(sender, e);

       }

//===========================================================================

       private void editlinkToolStripMenuItem_Click(object sender, EventArgs e)

       {

           toolStripButton14_Click(sender, e);

       }

//===========================================================================

       //DELETE BLOCK

       private void toolStripButton12_Click(object sender, EventArgs e)

       {

           int number=0;//номер удаляемого блока

           LinkedListNode<block> tmpnode;

           block tmpblock;

           if (head == null) return;

           foreach (block el in head)

           {

               if(num_curent_block==el.num)

               {

                   if (MessageBox.Show("Вы действительно хотите удалить текущий блок", "Вопрос", MessageBoxButtons.YesNo) == DialogResult.No) return;

                   number=el.num;

                   break;

               }

           }

           if(number==0)return;

           foreach (block el in head)

           {

               foreach (block bb in head)

               {

                   if (el.next1!=0 && el.next1 == bb.num && bb.num==number)

                   {

                       tmpnode=head.Find(el);

                       tmpblock=tmpnode.Value;

                       tmpblock.next1=0;

                       tmpblock.first1.Clear();

                       tmpblock.first1=null;

                       if (el.tip == 5) tmpblock.ist = -1;

                       tmpnode.Value=tmpblock;

                   }

               }

               foreach (block bb in head)

               {

                   if (el.next2!=0 && el.next2 == bb.num && bb.num==number)

                   {

                       tmpnode=head.Find(el);

                       tmpblock=tmpnode.Value;

                       tmpblock.next2=0;

                       tmpblock.first2.Clear();

                       tmpblock.first2=null;

                       if (el.tip == 5) tmpblock.fals = -1;

                       tmpnode.Value=tmpblock;

                   }

               }

           }

           if(head!=null)

               foreach (block el in head)

               {

                   if(el.num==number)

                   {

                       head.Remove(el);

                       break;

                   }

               }

           if (head.Count == 0)

           {

               head.Clear();

               head = null;

               num = 1;

               num_curent_block = 0;

           }

           pictureBox1.Invalidate();

       }

//===========================================================================

       private void deleteblockToolStripMenuItem_Click(object sender, EventArgs e)

       {

           toolStripButton12_Click(sender, e);

       }

       //===========================================================================

       //DELETE LINK

       private void toolStripButton13_Click(object sender, EventArgs e)

       {

           DeleteLinkForm = new Form4();

           DeleteLinkForm.ShowDialog();

           pictureBox1.Invalidate();

       }

//===========================================================================

       private void deletelinkToolStripMenuItem_Click(object sender, EventArgs e)

       {

           toolStripButton13_Click(sender, e);

       }

//===========================================================================

       private void blocksToolStripMenuItem_Click(object sender, EventArgs e)

       {

           if (head!=null) return;

           SizeBlockForm.ShowDialog();

       }

               //===========================================================================

       private void pictureBox1_MouseDown(object sender, MouseEventArgs e)

       {

           int left_x, top_y;

           {

               if (head == null) return;//если список  пуст, выход из функции

               //поиск блока

               foreach (block el in head)

               {

                   left_x = el.x - el.width / 2;

                   top_y = el.y - el.height / 2;

                   if (e.X >= left_x && e.Y >= top_y && e.X <= left_x + el.width && e.Y <= top_y + el.height)

                   {

                       num_curent_block = el.num;

                       if (e.Clicks >= 2 && el.tip!=1)

                       {

                           LinkedListNode<block> nodeblock = head.Find(el);

                           block tmpblock = nodeblock.Value;

                           text_for_block = el.text;

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

                           {

                               tmpblock.text=text_for_block;

                               nodeblock.Value = tmpblock;

                           }

                       }

                       pictureBox1.Invalidate();

                       break;

                   }

               }

           }

           if (toolStripButton14.Checked && f_red == false) //Редактировать связь

           {

               if (head == null) return;

               foreach (block el in head)

               {

                   if (el.first1 != null)

                   {

                       foreach (line elline in el.first1)

                       {

                           if (elline.x - 3 <= e.X && elline.x + 3 >= e.X && elline.y - 3 <= e.Y && elline.y + 3 >= e.Y)

                           {

                               x_l = elline.x; y_l = elline.y;

                               x = x_l; y = y_l;

                               f_red = true;

                               break;

                           }

                           if (elline.x1 - 3 <= e.X && elline.x1 + 3 >= e.X && elline.y1 - 3 <= e.Y && elline.y1 + 3 >= e.Y)

                           {

                               x_l = elline.x1; y_l = elline.y1;

                               x = x_l; y = y_l;

                               f_red = true;

                               break;

                           }

                       }

                   }

                   if (el.first2 != null)

                   {

                       foreach (line elline in el.first2)

                       {

                           if (elline.x - 3 <= e.X && elline.x + 3 >= e.X && elline.y - 3 <= e.Y && elline.y + 3 >= e.Y)

                           {

                               x_l = elline.x; y_l = elline.y;

                               x = x_l; y = y_l;

                               f_red = true;

                               break;

                           }

                           if (elline.x1 - 3 <= e.X && elline.x1 + 3 >= e.X && elline.y1 - 3 <= e.Y && elline.y1 + 3 >= e.Y)

                           {

                               x_l = elline.x1; y_l = elline.y1;

                               x = x_l; y = y_l;

                               f_red = true;

                               break;

                           }

                       }

                   }

               }

           }

           if (e.Button == MouseButtons.Left)

           {

               if (toolStripButton11.Checked)//перемещение блока

               {

                   temporery.tip = 0;

                   if (head == null) return;//если список  пуст, выход из функции

                   //поиск перемещаемого блока

                   foreach (block el in head)

                   {

                       left_x = el.x - el.width / 2;

                       top_y = el.y - el.height / 2;

                       if (e.X >= left_x && e.Y >= top_y && e.X <= left_x + el.width && e.Y <= top_y + el.height)

                       {

                           f_per = true;

                           x = e.X; y = e.Y;

                           curnode=head.Find(el);

                           temporery = curnode.Value;

                           dx = e.X - left_x;

                           dy = e.Y - top_y;

                           pictureBox1.Invalidate();

                           break;

                       }

                   }

               }

               if (toolStripButton10.Checked && f_line == false)//создание связи

               {

                   if (head == null) return;

                   //обнуление указателя на блок, из которого связь строится

                   temporery.tip = 0;

                   foreach (block el in head)

                   {

                       left_x = el.x - el.width / 2;

                       top_y = el.y - el.height / 2;

                       //если нашли

                       if (e.X >= left_x && e.Y >= top_y && e.X <= left_x + el.width && e.Y <= top_y + el.height)

                       {

                           curnode = head.Find(el); //установка указателя на этот блок

                           temporery = curnode.Value;

                           x = e.X; x1 = e.X;//координаты курсора мыши

                           y = e.Y; y1 = e.Y;

                           f_line = true;//установка флага рисования связи

                       }

                   }

               }

           }

       }

//===========================================================================

       private void pictureBox1_MouseUp(object sender, MouseEventArgs e)

       {

           if(toolStripButton14.Checked && f_red)

           {

               LinkedListNode<block> nodeblock;

               block tmpblock;

               LinkedListNode<line> nodeline;

               line tmpline;

               foreach (block el in head)

               {

                   nodeblock=head.Find(el);

                   tmpblock=nodeblock.Value;

                   if (el.first1 != null)

                   {

                       foreach (line elline in el.first1)

                       {

                           nodeline = tmpblock.first1.Find(elline);

                           tmpline = nodeline.Value;

                           if (x_l == elline.x && y_l == elline.y)

                           {

                               tmpline.x = e.X;

                               tmpline.y = e.Y;

                           }

                           if (x_l == elline.x1 && y_l == elline.y1)

                           {

                               tmpline.x1 = e.X;

                               if (nodeline.Next != null) tmpline.y1 = e.Y;

                               if (nodeline.Next == null)

                               {

                                   foreach (block bb in head)

                                   {

                                       if (el.next1 == bb.num)

                                       {

                                           if (bb.tip != 4)

                                           {

                                               tmpline.x1 = bb.x + bb.width / 2;

                                               tmpline.y1 = bb.y;

                                           }

                                           else

                                           {

                                               if (elline.y1 < bb.y + bb.height / 5)

                                               {

                                                   tmpline.x1 = bb.x + bb.width / 2;

                                                   tmpline.y1 = bb.y;

                                               }

                                               else

                                               {

                                                   tmpline.x1 = bb.x;

                                                   tmpline.y1 = bb.y + bb.height / 2;

                                               }

                                           }

                                           break;

                                       }

                                   }

                               }

                           }

                           nodeline.Value = tmpline;

                       }

                   }

                   if (el.first2 != null)

                   {

                       foreach (line elline in el.first2)

                       {

                           nodeline = tmpblock.first2.Find(elline);

                           tmpline = nodeline.Value;

                           if (x_l == elline.x && y_l == elline.y)

                           {

                               tmpline.x = e.X;

                               tmpline.y = e.Y;

                           }

                           if (x_l == elline.x1 && y_l == elline.y1)

                           {

                               tmpline.x1 = e.X;

                               if (nodeline.Next != null) tmpline.y1 = e.Y;

                               if (nodeline.Next == null)

                               {

                                   foreach (block bb in head)

                                   {

                                       if (el.next2 == bb.num)

                                       {

                                           if (bb.tip != 4)

                                           {

                                               tmpline.x1 = bb.x + bb.width / 2;

                                               tmpline.y1 = bb.y;

                                           }

                                           else

                                           {

                                               if (tmpline.y1 < bb.y + bb.height / 5)

                                               {

                                                   tmpline.x1 = bb.x + bb.width / 2;

                                                   tmpline.y1 = bb.y;

                                               }

                                               else

                                               {

                                                   tmpline.x1 = bb.x;

                                                   tmpline.y1 = bb.y + bb.height / 2;

                                               }

                                           }

                                           break;

                                       }

                                   }

                               }

                           }

                       }

                   }

                   nodeblock.Value = tmpblock;

               }

               toolStripButton14.Checked=false;

               f_red = false;

           }

           if(e.Button == MouseButtons.Left)

           {

               if(toolStripButton5.Checked)

               {

                   oval(sender, e.X, e.Y);

                   toolStripButton5.Checked=false;

               }

               else if(toolStripButton9.Checked)

               {

                   parall(sender, e.X, e.Y);

                   toolStripButton9.Checked=false;

               }

               else if(toolStripButton8.Checked)

               {

                   modify(sender, e.X, e.Y);

                   toolStripButton8.Checked=false;

               }

               else if(toolStripButton7.Checked)

               {

                   rect(sender, e.X, e.Y);

                   toolStripButton7.Checked=false;

               }

               else if(toolStripButton6.Checked)

               {

                   romb(sender, e.X, e.Y);

                   toolStripButton6.Checked=false;

               }

               int Xb,Yb;

               if(toolStripButton11.Checked)//перемещение блока

               {

                   flag_move = false;

                   toolStripButton11.Checked = false;

                   if(head==null)return;

                   if(temporery.tip==0)return;

                   Xb = temporery.x - temporery.width / 2;

                   Yb = temporery.y - temporery.height / 2;

                   f_per=false;

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

                   temporery.x = e.X - dx + temporery.width / 2;

                   temporery.y = e.Y - dy + temporery.height / 2;

                   curnode.Value = temporery;

                   //перерисовка линий связи между блоками

                   line l_tmp;

                   int Xn = temporery.x - temporery.width / 2;

                   int Yn = temporery.y - temporery.height / 2;

                   foreach (block el in head)

                   {

                       if (el.next1 == temporery.num)

                       {

                           //переход на последний блок линии связи

                           LinkedListNode<block> node = head.Find(el);

                           block bb = node.Value;

                           LinkedListNode<line> node2 = bb.first1.Last;

                           l_tmp = node2.Value;

                           l_tmp.x1 = Xn + l_tmp.x1 - Xb;

                           l_tmp.y1 = Yn + l_tmp.y1 - Yb;

                           node2.Value = l_tmp;

                           node.Value = bb;

                       }

                       if (el.next2 == temporery.num)

                       {

                           LinkedListNode<block> node = head.Find(el);

                           block bb = node.Value;

                           LinkedListNode<line> node2 = bb.first2.Last;

                           l_tmp = node2.Value;

                           l_tmp.x1 = Xn + l_tmp.x1 - Xb;

                           l_tmp.y1 = Yn + l_tmp.y1 - Yb;

                           node2.Value = l_tmp;

                           node.Value = bb;

                       }

                   }

                   if (temporery.first1 != null)

                   {

                       LinkedListNode<line> node2 = temporery.first1.First;

                       l_tmp = node2.Value;

                       l_tmp.x = Xn + l_tmp.x - Xb;

                       l_tmp.y = Yn + l_tmp.y - Yb;

                       node2.Value = l_tmp;

                       curnode.Value = temporery;

                   }

                   if(temporery.first2!=null)

                   {

                       LinkedListNode<line> node2 = temporery.first2.First;

                       l_tmp = node2.Value;

                       l_tmp.x = Xn + l_tmp.x - Xb;

                       l_tmp.y = Yn + l_tmp.y - Yb;

                       node2.Value = l_tmp;

                       curnode.Value = temporery;

                   }

                   temporery.tip = 0;

               }

               //рисование связи между блоками

               if (toolStripButton10.Checked)

               {

                   //если не выделили никакой блок для начала рисования связи

                   if(temporery.tip==0)

                   {

                       toolStripButton10.Checked = false;

                       f_line=false;

                       return;

                   }

                   svaz_line(ref temporery,x,y,x1,y1);

                   curnode.Value = temporery;

                   //если довели связь до следующего блока

                   foreach (block el in head)

                   {

                       int left_x = el.x - el.width / 2;

                       int top_y = el.y - el.height / 2;

                       if (e.X >= left_x && e.Y >= top_y && e.X <= left_x + el.width && e.Y <= top_y + el.height)

                       {

                           if (temporery.num == el.num) return;

                           toolStripButton10.Checked = false;

                           f_line = false;

                           block_next(el);

                           curnode.Value = temporery;

                           break;

                       }

                   }

                   if (f_line == true)

                   {

                       x = e.X; y = e.Y; x1 = e.X; y1 = e.Y;

                   }

               }

           }

           pictureBox1.Invalidate();

           if (panel1.AutoScrollMinSize.Width < e.X + 100) panel1.AutoScrollMinSize = new System.Drawing.Size(e.X + 100, panel1.AutoScrollMinSize.Height);

           if (panel1.AutoScrollMinSize.Height < e.Y + 60) panel1.AutoScrollMinSize = new System.Drawing.Size(panel1.AutoScrollMinSize.Width, e.Y+60);

       }

//===========================================================================

       private void pictureBox1_MouseMove(object sender, MouseEventArgs e)

       {

           if (toolStripButton14.Checked && f_red)

           {

               x = e.X; y = e.Y;

               pictureBox1.Invalidate();

           }

           //рисование связи между блоками

           if (toolStripButton10.Checked && f_line)

           {

               x1 = e.X; y1 = e.Y;//сохранение новых координат курсора мыши

               pictureBox1.Invalidate();

           }

           if (toolStripButton11.Checked && f_per) //перемещение

           {

               if (temporery.tip!=0)

               {

                   flag_move = true;

                   x = e.X; y=e.Y;

                   pictureBox1.Invalidate();

               }

           }

       }

//===========================================================================

       private void pictureBox1_Paint(object sender, PaintEventArgs e)

       {

           Pen cur_pen, pen_black, pen_blue, pen_red;

           pen_black = new Pen(Color.Black);

           pen_blue = new Pen(Color.Blue);

           pen_red = new Pen(Color.Red);

           Font f = new Font("Arial", 10);

           Brush brush_black = Brushes.Black;

           Brush brush_blue = Brushes.Blue;

           Brush brush_green = Brushes.Green;

          if (flag_move)

           {

               e.Graphics.DrawRectangle(pen_blue, x-dx, y-dy, temporery.width, temporery.height);

           }

           if (f_line)

           {

               e.Graphics.DrawLine(pen_black, x, y, x1, y1);

               e.Graphics.FillRectangle(brush_black, x - 2, y - 2, 4, 4);

               e.Graphics.FillRectangle(brush_black, x1 - 2, y1 - 2, 4, 4);

           }

           if (head != null)

           {

               foreach (block el in head)

               {

                   if ((el.tip == temporery.tip && el.x == temporery.x && el.y == temporery.y)||(num_curent_block==el.num))

                   {

                       cur_pen= pen_blue;

                   }

                   else

                   {

                       cur_pen = pen_black;

                   }

                   int left_x = el.x - el.width / 2;

                   int top_y = el.y - el.height / 2;

                   System.Drawing.SizeF size = e.Graphics.MeasureString(el.text, f);

                   float offset_x = el.width / 2 - size.Width / 2;

                   if (el.tip == 1) //начало конец

                   {

                       e.Graphics.DrawLine(cur_pen, left_x + el.height / 2, top_y, left_x + el.width - el.height / 2, top_y);

                       e.Graphics.DrawLine(cur_pen, left_x + el.height / 2, top_y + el.height, left_x+el.width - el.height / 2, top_y + el.height);

                       e.Graphics.DrawArc(cur_pen, left_x, top_y, el.height, el.height, 90, 180);

                       e.Graphics.DrawArc(cur_pen, left_x + el.width - el.height, top_y, el.height, el.height, 90, -180);

                       e.Graphics.DrawString(el.text, f, brush_black, left_x + offset_x, top_y + f.GetHeight() / 2);

                       e.Graphics.DrawString(el.num.ToString(), f, brush_blue, left_x + el.height / 2, top_y - f.GetHeight());

                   }

                   else if (el.tip == 3) //ввод вывод

                   {

                       e.Graphics.DrawLine(cur_pen, left_x + el.width / 5, top_y, left_x + el.width, top_y);

                       e.Graphics.DrawLine(cur_pen, left_x + el.width, top_y, left_x + 4 * el.width / 5, top_y + el.height);

                       e.Graphics.DrawLine(cur_pen, left_x + 4 * el.width / 5, top_y + el.height, left_x, top_y + el.height);

                       e.Graphics.DrawLine(cur_pen, left_x, top_y + el.height, left_x + el.width / 5, top_y);

                       e.Graphics.DrawString(el.text, f, brush_black, left_x + offset_x, el.y - f.GetHeight() / 2);

                       e.Graphics.DrawString(el.num.ToString(), f, brush_blue, left_x + el.width / 5, top_y - f.GetHeight());

                   }

                   else if (el.tip == 4) //модификция

                   {

                       e.Graphics.DrawLine(cur_pen, left_x + el.width / 5, top_y, left_x + 4 * el.width / 5, top_y);

                       e.Graphics.DrawLine(cur_pen, left_x + 4 * el.width / 5, top_y, left_x + el.width, top_y + el.height / 2);

                       e.Graphics.DrawLine(cur_pen, left_x + el.width, top_y + el.height / 2, left_x + 4 * el.width / 5, top_y + el.height);

                       e.Graphics.DrawLine(cur_pen, left_x + 4 * el.width / 5, top_y + el.height, left_x + el.width / 5, top_y + el.height);

                       e.Graphics.DrawLine(cur_pen, left_x + el.width / 5, top_y + el.height, left_x, top_y + el.height / 2);

                       e.Graphics.DrawLine(cur_pen, left_x, top_y + el.height / 2, left_x + el.width / 5, top_y);

                       e.Graphics.DrawString(el.text, f, brush_black, left_x + offset_x, el.y - f.GetHeight() / 2);

                       e.Graphics.DrawString(el.num.ToString(), f, brush_blue, left_x + el.width / 5, top_y - f.GetHeight());

                   }

                   else if (el.tip == 2) //процесс

                   {

                       e.Graphics.DrawRectangle(cur_pen, left_x, top_y, el.width, el.height);

                       e.Graphics.DrawString(el.text, f, brush_black, left_x + offset_x, el.y - f.GetHeight() / 2);

                       e.Graphics.DrawString(el.num.ToString(), f, brush_blue, left_x, top_y - f.GetHeight());

                   }

                   else if (el.tip == 5) //решение

                   {

                       e.Graphics.DrawLine(cur_pen, left_x + el.width / 2, top_y, left_x + el.width, top_y + el.height / 2);

                       e.Graphics.DrawLine(cur_pen, left_x + el.width, top_y + el.height / 2, left_x + el.width / 2, top_y + el.height);

                       e.Graphics.DrawLine(cur_pen, left_x + el.width / 2, top_y + el.height, left_x, top_y + el.height / 2);

                       e.Graphics.DrawLine(cur_pen, left_x, top_y + el.height / 2, left_x + el.width / 2, top_y);

                       e.Graphics.DrawString(el.text, f, brush_black, left_x + offset_x, el.y - f.GetHeight() / 2);

                       e.Graphics.DrawString(el.num.ToString(), f, brush_blue, left_x + el.width / 2, top_y - f.GetHeight());

                       if (el.first1 != null)

                       {

                           LinkedListNode<line> l1 = el.first1.First;

                           e.Graphics.DrawString("1", f, brush_black, l1.Value.x, l1.Value.y);

                       }

                       if (el.first2 != null)

                       {

                           LinkedListNode<line> l1 = el.first2.First;

                           e.Graphics.DrawString("0", f, brush_black, l1.Value.x, l1.Value.y);

                       }

                   }

                   if (el.first1!=null)

                       foreach(line l in el.first1)

                       {

                           bool flag_dif = true;

                           e.Graphics.DrawLine(pen_black, l.x, l.y, l.x1, l.y1);

                           if (f_red)

                           {

                               if (l.x - 3 <= x_l && l.x + 3 >= x_l && l.y - 3 <= y_l && l.y + 3 >= y_l)

                               {

                                   e.Graphics.FillRectangle(brush_blue, l.x - 3, l.y - 3, 6, 6);

                                   e.Graphics.FillRectangle(brush_black, l.x1 - 2, l.y1 - 2, 4, 4);

                                   flag_dif = false;

                               }

                               if (l.x1 - 3 <= x_l && l.x1 + 3 >= x_l && l.y1 - 3 <= y_l && l.y1 + 3 >= y_l)

                               {

                                   e.Graphics.FillRectangle(brush_black, l.x - 2, l.y - 2, 4, 4);

                                   e.Graphics.FillRectangle(brush_blue, l.x1 - 3, l.y1 - 3, 6, 6);

                                   flag_dif = false;

                               }

                           }

                           if (flag_dif)

                           {

                               LinkedListNode<line> ll = el.first1.Find(l);

                               if (ll != el.first1.Last)

                               {

                                   e.Graphics.FillRectangle(brush_black, l.x - 2, l.y - 2, 4, 4);

                                   e.Graphics.FillRectangle(brush_black, l.x1 - 2, l.y1 - 2, 4, 4);

                               }

                               else

                               {

                                   e.Graphics.FillRectangle(brush_green, l.x1 - 2, l.y1 - 2, 4, 4);

                               }

                           }

                       }

                   if (el.first2!=null)

                       foreach (line l in el.first2)

                       {

                           bool flag_dif = true;

                           e.Graphics.DrawLine(pen_black, l.x, l.y, l.x1, l.y1);

                           if (f_red)

                           {

                               if (l.x - 3 <= x_l && l.x + 3 >= x_l && l.y - 3 <= y_l && l.y + 3 >= y_l)

                               {

                                   e.Graphics.FillRectangle(brush_blue, l.x - 3, l.y - 3, 6, 6);

                                   e.Graphics.FillRectangle(brush_black, l.x1 - 2, l.y1 - 2, 4, 4);

                                   flag_dif = false;

                               }

                               if (l.x1 - 3 <= x_l && l.x1 + 3 >= x_l && l.y1 - 3 <= y_l && l.y1 + 3 >= y_l)

                               {

                                   e.Graphics.FillRectangle(brush_black, l.x - 2, l.y - 2, 4, 4);

                                   e.Graphics.FillRectangle(brush_blue, l.x1 - 3, l.y1 - 3, 6, 6);

                                   flag_dif = false;

                               }

                           }

                           if (flag_dif)

                           {

                               LinkedListNode<line> ll = el.first2.Find(l);

                               if (ll != el.first2.Last)

                               {

                                   e.Graphics.FillRectangle(brush_black, l.x - 2, l.y - 2, 4, 4);

                                   e.Graphics.FillRectangle(brush_black, l.x1 - 2, l.y1 - 2, 4, 4);

                               }

                               else

                               {

                                   e.Graphics.FillRectangle(brush_green, l.x1 - 2, l.y1 - 2, 4, 4);

                               }

                           }

                       }

               }

           }

       }

       

//===========================================================================

       //рисование терминатора----------------------------------------------

       private void oval(object sender, int x,int y)

       {

           block tmp = new block();

           

           tmp.width = (int)SizeBlockForm.width_terminator;

           tmp.height = (int)SizeBlockForm.height_terminator;

           if (head == null) tmp.text = "Начало";

           else tmp.text = "Конец";

           tmp.num = num;

           num++;//увеличение счетчика блоков

           tmp.x = x;

           tmp.y = y;

           tmp.tip = 1;

           tm