Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
нирс.docx
Скачиваний:
0
Добавлен:
01.03.2025
Размер:
346 Кб
Скачать
☆
  • Место выполнения проекта: лаборатория кафедры.

    Оглавление

    Введение 5

    1 Постановка задачи 6

    2 Принципы разработки 7

    3 Разработка АРМ 8

    3.1 Рекомендации по разработке АРМ 8

    3.2 Математическая модель 9

    3.3 Средства разработки 10

    3.3.1 Среда разработки Delphi 10

    3.3.2 Object Linking and Embedding 10

    3.3.3 Help & Manual 11

    3.3.4 XML 13

    3.3.5 Файлы инициализации 15

    4 Автоматизированное рабочее место преподавателя 16

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

    4.2 Диаграмма использования 17

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

    4.3.1 Работа с базой вопросов 18

    4.3.2 Создание билетов 19

    4.3.3 Добавление темы 20

    Заключение 22

    Список литературы 23

    Приложение A 24

    Приложение Б 28

    Введение

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

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

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

    1 Постановка задачи

    Цель работы – разработка автоматизированного рабочего места преподавателя.

    Показатели назначения:

    • автоматизация работы учебного процесса;

    • повышение качества экзаменационных билетов;

    • возможность рационально распределять рабочее время преподавателя;

    • контроль учебного процесса преподавателем.

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

    • автоматизация рабочего места;

    • математические модели формирования билетов;

    • разработка программ в среде Delphi;

    • использование OLE - объектов для разработки графической части программ;

    • разработка справочной информации в программе Help & Manual 6;

    • язык разметки XML;

    • файлы инициализации.

    2 Принципы разработки

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

    Поэтому система АРМ, являющаяся «человеком – машиной», должна быть открытой, гибкой, приспособленной к постоянному развитию и совершенствованию. В такой системе должны быть обеспечены [2]:

    1. максимальная приближённость специалистов к машинным средствам обработки информации;

    2. работа в диалоговом режиме;

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

    4. максимальная автоматизация рутинных процессов;

    5. моральная удовлетворенность специалистов условиями труда, стимулирующая их творческую активность.

    Методика проектирования АРМ не может не быть связанной с методикой его функционирования, так как функционирование развитого АРМ предусматривает возможность его развития самими пользователями.

    3 Разработка арм

    3.1 Рекомендации по разработке арм

    Важную роль при разработке АРМ играют исходные данные. Эти данные определяют заказчиком. В состав исходных данных для создания АРМ обязательно должны быть включены [3]:

    • назначение АРМ;

    • основные задачи АРМ;

    • функции специалиста или руководителя;

    • технические требования к АРМ;

    • прочие требования.

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

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

    3.2 Математическая модель

    Для правильного формирования билетов в программе предусмотрены следующие условия:

    1. Количество вопросов в билетах должно быть одинаково;

    2. Все сформированные билеты должны быть одной сложности:

    где Pi, j – вес i-го вопроса в j-ом билете;

    Pmax – вес билета.

    1. Условие непопадания в билет одинаковых вопросов;

    2. Каждый вопрос должен встречаться минимальное число раз.

    3.3 Средства разработки

    3.3.1 Среда разработки Delphi

    Delphi - интегрированная среда разработки ПО для Microsoft Windows на языке Delphi (ранее носившем название Object Pascal), созданная первоначально фирмой Borland и на данный момент принадлежащая и разрабатываемая Embarcadero Technologies. Embarcadero Delphi является частью пакета Embarcadero RAD Studio и поставляется в четырёх редакциях: Starter, Professional, Enterprise и Architect [5]. Среда разработки Delphi была выбрана потому, что это один из популярных современных продуктов быстрой разработки Windows - приложений. Она представляет удобную и мощную среду с достаточно удобной средой разработки, поддерживающую большое число настольных систем и разных языков, возможность для подключения к различным Web-службам и данным и т.д. [6].

    Программы на основе Windows должны иметь графический интерфейс пользователя. Графическая часть проекта Delphi, которая отображает вид программы, сохраняется в файлах ресурсов, а коды находятся в других файлах [7]. Поэтому каждый проекта для Windows состоит из нескольких файлов. На этот набор файлов ссылаются как на проект. Создание каждой новой программы начинается с создания проекта [8].

    3.3.2 Object Linking and Embedding

    OLE (англ. Object Linking and Embedding) — технология связывания и внедрения объектов в другие документы и объекты, разработанные корпорацией Майкрософт [9].

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

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

    OLE используется приобработке составных документов (англ. compound documents), может быть использована при передаче данных между различными несвязанными между собой системами посредством интерфейса переноса (англ. drag-and-drop), а также при выполнении операций с буфером обмена. Идея внедрения широко используется при работе с мультимедийным содержанием на веб-страницах (пример — Веб-ТВ), где используется передача изображения, звука, видео, анимации в страницах HTML (язык гипертекстовой разметки) либо в других файлах, также использующих текстовую разметку (например, XML и SGML). Однако, технология OLE использует архитектуру «толстого клиента», то есть сетевой ПК с избыточными вычислительными ресурсами. Это означает, что тип файла либо программа, которую пытаются внедрить, должна присутствовать на машине клиента. Например, если OLE оперирует таблицами Microsoft Excel, то программа Excel должна быть инсталлирована на машине пользователя.

    3.3.3 Help & Manual

    Help&Manual - программа для создания файлов справочной системы. Все созданные проекты можно сохранить в различных форматах: HTML Help, Winhelp и MS Help 2.0 / Visual Studio Help, Browser-based Help, PDF и Word RTF, а также печатной документации при использовании одного и того же проекта [10].

    Кроме этого, программа позволяет конвертировать help-файлы из одного формата в другой. Помимо программ для работы с текстом в Help & Manual включены утилиты для создания скриншотов и редактирования графических файлов.

    Основные возможности:

    • WYSIWYG XML редактор Help & Manual - XML редактор метода «что видишь, то и получаешь», простой, как Word. Знание XML не требуется.

    • поддержка уникода. Полная поддержка уникода – возможность создавать help файлы на 106 языках, включая азиатские;

    • импорт RoboHelp . Help & Manual может прямо импортировать файлы проектов RoboHelp X5;

    • поддержка шаблонов. Возможность использовать и видоизменять шаблоны HTML для шаблонов разметки для PDF и печати;

    • экспорт с оболочками (скинами). Возможность использовать определенные оболочки HTML для экспорта профессионально свёрстанных документов одним кликом;

    • единый источник. Help & Manual создает все нижеперечисленные форматы вывода из единого исходника без пост-обработки;

    • поддерживаются условия включения/исключения для главы, темы и уровня текста;

    • переменные. Помимо опций включить/исключить на уровне текста, возможность использовать заранее определенные текстовые переменные, или создавать собственные;

    • Dynamic cascading styles. Возможность использовать текст, параграфы и таблицы стилей для форматирования контента. Все стили поддерживают различные типы медиа для вывода на экран и на печать;

    • интегрированный редактор hotspot editor. Редактор для графики с поддержкой ссылок и макросов;

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

    • модульные help. Бесшовная интеграция множества проектов друг в друга и объединение результатов. Возможно объединение во время работы, если это поддерживается форматами вывода.

    Форматы вывода:

    • Webhelp. Независимый от платформы HTML с Javascript включает элементы навигации с оглавлением и keyword index;

    • HTML Help (.chm). Преобразованный HTML Help, стандартный формат Windows help;

    • Adobe PDF. Встроенный движок PDF с визуальным дизайнером разметки;

    • Winhelp (.hlp). Старый формат Microsoft Windows help для унаследованных проектов;

    • Microsoft Word. Руководство пользователя в формате RTF оптимизировано для Microsoft Word;

    • e-Books. Электронные книги в форматах, работающих на Windows 32 bit с настраиваемыми скинами;

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

    Включает инструменты:

    • Screen capture. Встроенный инструмент для захвата экрана создаёт скриншоты по клику мыши;

    • Image editor. Использование интегрированного редактора изображений для изменения размера скриншотов, добавления в них текст;

    • Context Help Tool. Полностью интегрированная поддержка help, чувствительных к контексту. Help & Manual также может экспортировать и импортировать help context number maps;

    • Project reports. Подробные отчёты документируют статус help проекта;

    • Syntax highlighter. Быстро выделяет фрагменты исходного кода для Visual Basic, C++, Pascal или SQL выражений.

    3.3.4 XML

    XML (англ. eXtensible Markup Language — расширяемый язык разметки; произносится) — рекомендованный Консорциумом Всемирной паутины язык разметки, фактически представляющий собой свод общих синтаксических правил. XML — текстовый формат, предназначенный для хранения структурированных данных (взамен существующих файлов баз данных), для обмена информацией между программами, а также для создания на его основе более специализированных языков разметки (например, XHTML). XML является упрощённым подмножеством языка SGML [11].

    Стандартом определены два уровня правильности документа XML:

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

    • действительный. Действительный документ дополнительно соответствует некоторым семантическим правилам. Это более строгая дополнительная проверка корректности документа на соответствие заранее определённым, но уже внешним правилам, в целях минимизации количества ошибок, например, структуры и состава данного, конкретного документа или семейства документов. Эти правила могут быть разработаны как самим пользователем, так и сторонними разработчиками, например, разработчиками словарей или стандартов обмена данными. Обычно такие правила хранятся в специальных файлах — схемах, где самым подробным образом описана структура документа, все допустимые названия элементов, атрибутов и многое другое. И если документ, например, содержит не определённое заранее в схемах название элемента, то XML-документ считается недействительным; проверяющий XML-процессор (валидатор) при проверке на соответствие правилам и схемам обязан (по выбору пользователя) сообщить об ошибке.

    3.3.5 Файлы инициализации

    Файлы инициализации являются довольно удобным средством для хранения информации о конфигурации приложения. Не смотря на то, что эта технология, считается устаревшей, она частенько является наиболее целесообразной. Разумеется, можно (иногда даже и нужно) хранить настройки программы в реестре, но реестр довольно опасно править неопытному пользователю. В отличие от реестра, файлы инициализации удобно редактировать в любом текстовом редакторе, да к тому же, с ними очень легко работать с помощью нескольких простых API-функций [12].

    Пожалуй, самым известным примером файла инициализации является файл WIN.INI. Данный файл используется некоторыми версиями Windows для хранения системных настроек. Windows позволяет каждому приложению обзавестись своим собственным файлом инициализации. 

    4 Автоматизированное рабочее место преподавателя

    В проекте «Автоматизированное рабочее место преподавателя» предусмотрены следующие модули:

    • работа с базой вопросов;

    • создание билетов;

    • добавление темы;

    • журнал преподавателя;

    • конструктор лабораторных работ.

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

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

    Модуль «Работа с базой вопросов» позволяет заносить в базу вопросов новые вопросы или удалять вопросы из базы данных.

    Модуль «Создание билетов» позволяет формировать комплект экзаменационных билетов. Сформированные билеты хранятся в формате docx.

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

    Модуль «Справка» содержит в себе руководство пользователя.

    4.2 Диаграмма использования

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

    Рисунок 4.2 - Диаграмма использования

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

    Вкладка AWST – эта вкладка содержит в себе следующие модули:

    • работа с базой вопросов;

    • создание билетов;

    • добавление темы.

    Рисунок 4.3 - Вкладка AWST

    4.3.1 Работа с базой вопросов

    Работа с базой вопросов - это вкладка позволяет открыть сохраненные вопросы, распределенные по темам и весам для создания билета.

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

    Для того чтобы проверить документ на синтаксические ошибки необходимо выбрать пункт Проверить документ на правильность синтаксиса → Выбрать необходимый документ → Нажать кнопку «Выполнить»

    Занести данные документа в базу вопросов.

    Для того чтобы занести данные документа в базу вопросов необходимо выбрать пункт Занести данные документа в базу вопросов →Выбрать необходимый документ→ выбрать Сложность вопроса → нажать кнопку Выполнить.

    Удалить выбранные вопросы из базы.

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

    Выбор темы

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

    Сложность вопросов

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

    Рисунок 4.4 - Сложность вопросов

    4.3.2 Создание билетов

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

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

    Рисунок 4.5 - Создание билетов

    4.3.3 Добавление темы

    Добавить темы- вкладка для добавления новой темы.

    Для создания новой темы вопросов необходимо выбрать вкладку Добавить темы →вести название темы → нажать кнопку Добавить. Вместо пробела используется нижнее подчеркивание.

    Рисунок 4.6 – Добавление темы

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

    Рисунок 4.7 – Удаление темы

    Заключение

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

    На сегодняшний день проект находится в стадии завершения. В программе реализованы следующие модули: Работа с базой вопросов, Создание билетов, Добавление темы.

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

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

    Список литературы

    1. Жигалова Е.Ф., Крыгина М.В. Проблема контроля качества самостоятельной работы студентов и пути ее решения, ТУСУР

    2. Материалы Всероссийской научно-технической конференции студентов, аспирантов и молодых ученых, Томск,4-6 мая 2011 г. – Томск: В-Спектр, 2011: В 6 частях. –Ч.4.-294 с.

    3. Применение программ Excel MathCad для инженерных расчетов [Электронный ресурс] url.:http://scbist.com/vagonniku_/7208-primenenie-program-excel-mathcad-dlya-inzhenernyh-raschetov.html

    4. Учебник по Delphi [Электронный ресурс] url.:http://www.shiva16.narod.ru

    5. Delphi (среда разработки) [Электронный ресурс] url.: http://ru.wikipedia.org/wiki/Delphi_(среда_разработки)

    6. Разработка приложений на Delphi [Электронный ресурс] url.: http://www.delphifaq.ru

    7. Кузнецов В.В., Абдрашитова И.В. Основы визуального программирования в Delphi: Учеб.пособие.- томск,2005.-90 с.

    8. Учебник по Delphi [Электронный ресурс] url.:http://www.shiva16.narod.ru

    9. Object_Linking_and_Embedding [Электронный ресурс] url.: http://ru.wikipedia.org/wiki/Object_Linking_and_Embedding

    10. Help & Manual 6.0 [Электронный ресурс] url.:http://shop.ixbt.com/catalog/program.php?ID=20344&progdesc=long

    11. XML [Электронный ресурс] url.: http://ru.wikipedia.org/wiki/XML

    12. Файлы инициализации и работа с ними [Электронный ресурс] url.: http://bit.pirit.info/forum/viewtopic.php?t=6548

    Приложение a

    Пример сформированных билетов по следующим критериям:

    1. Количество вопросов в билете равно 5;

    2. Количество билетов равно 10;

    3. Максимальный используемый вес вопроса равен 4;

    4. Суммарный вес билета равен 10.

    Билет № 1

    - Вопрос № 1

    Что определяет метрика графа?

    - Вопрос № 2

    Свойства максимальных пустых подграфов.

    - Вопрос № 3

    Алгоритм нахождения кратчайшего маршрута.

    - Вопрос № 4

    Алгоритм для нахождения всех максимальных полных подграфов (клика графов).

    - Вопрос № 5

    Геометрический способ минимизации булевых функций. Минимизация булевых функций с помощью карт Карно.

    Билет № 2

    - Вопрос № 1

    Определение маршрута в графе.

    - Вопрос № 2

    Что понимают под вершинной связностью графа?

    - Вопрос № 3

    Перечислите унарные и бинарные операции на графах.

    - Вопрос № 4

    Метод поиска в глубину.

    - Вопрос № 5

    В алгоритме построения Г_Ц с помощью алгоритма Литтла, с какой целью вычисляются минимальные оценки нулей в текущей матрице расстояний?

    Билет № 3

    - Вопрос № 1

    Элементарные операции на графах.

    - Вопрос № 2

    Связность графа. Алгоритм определения связности графа.

    - Вопрос № 3

    Что определяют метки вершин?

    - Вопрос № 4

    Свойства максимальных пустых подграфов.

    - Вопрос № 5

    Аналитический способ минимизации булевых функций. Метод Квайна.

    Билет № 4

    - Вопрос № 1

    Части графа.

    - Вопрос № 2

    Алгоритм для нахождения всех максимальных пустых подграфов (ядра графов).

    - Вопрос № 3

    Правило пересчёта меток от ведущей вершины.

    - Вопрос № 4

    Связность графа. Алгоритм определения связности графа.

    - Вопрос № 5

    Метод поиска в глубину.

    Билет № 5

    - Вопрос № 1

    Классификация графов.

    - Вопрос № 2

    Способы задания графов.

    - Вопрос № 3

    Правило выбора «ведущей » вершины.

    - Вопрос № 4

    Алгоритм для нахождения всех максимальных пустых подграфов (ядра графов).

    - Вопрос № 5

    Необходимые и достаточные условия существования эйлеровой цепи,

    эйлерового цикла, Г_Ц.

    Билет № 6

    - Вопрос № 1

    Определение графа. Способы задания графов.

    - Вопрос № 2

    Определение максимальных полных и максимальных пустых подграфов.- Вопрос № 3

    Правило построения дерева решений.

    - Вопрос № 4

    Что понимают под правильной раскраской графа?

    - Вопрос № 5

    Метод поиска в ширину.

    Билет № 7

    - Вопрос № 1

    Какая информация о графе является «избыточной» при определении числа его компонент связности?

    - Вопрос № 2

    Алгоритм построения матрицы метрики графа (основные процедуры).

    - Вопрос № 3

    Способы минимизации булевых функций.

    - Вопрос № 4

    Метод поиска в ширину.

    - Вопрос № 5

    Необходимые и достаточные условия существования эйлеровой цепи,

    эйлерового цикла, Г_Ц.

    Билет № 8

    - Вопрос № 1

    Правило пересчёта номеров вершин графа после выполнения операции

    выполнения операции «склеивания» вершин.

    - Вопрос № 2

    Что понимают под правильной раскраской графа?

    - Вопрос № 3

    Что представляет собой «разрез» на сети?

    - Вопрос № 4

    Определение максимальных полных и максимальных пустых подграфов.- Вопрос № 5

    Геометрический способ минимизации булевых функций. Минимизация булевых функций с помощью карт Карно.

    Билет № 9

    - Вопрос № 1

    Что понимают под рёберной связностью графа.

    - Вопрос № 2

    Что даёт операция R+E при определении метрики графа?

    - Вопрос № 3

    Сформулируйте правило для нахождения «минимального» разреза.

    - Вопрос № 4

    Алгоритм нахождения кратчайшего маршрута.

    - Вопрос № 5

    В алгоритме построения Г_Ц с помощью алгоритма Литтла, с какой целью вычисляются минимальные оценки нулей в текущей матрице расстояний?

    Билет № 10

    - Вопрос № 1

    Какой граф называется связным?

    - Вопрос № 2

    Алгоритм для нахождения всех максимальных полных подграфов (клика графов).

    - Вопрос № 3

    Процедура для определения насыщенности сети.

    - Вопрос № 4

    Что определяют метки вершин?

    - Вопрос № 5

    Аналитический способ минимизации булевых функций. Метод Квайна.

    Приложение б

    Пример функции осуществляющей формирование матрицы билетов.

    Function CreatOfTicketsAWST

    (Param: TParamQwestAWST;

    ArrayWeightTheme: TArrayInt3;

    Var ErrorCode: String): TQwestsArrayAWST;

    Var

    m, m1: TArrayOfMaxUseWeight;

    SumWeightInDistr, SumWeight, SumWeightDinam: TArrayInt1;

    DistrByWeight, TimeDistr: array of TArrayOfMaxUseWeight;//массив весового распределения

    DistrTicket: TArrayInt1;

    KoefDistr: TArrayFloat;

    sum: TTicketWeight;

    UseDistr: TArrayBool;

    k: Int64;//содержит количество найденных распределений

    i, j, c, u, f, z, theme, qwest: Int;

    b: Boolean;

    Min: Double;

    begin

    //начало весового распределения

    SetLength(m, Param.NQwest);

    SetLength(m1, Param.NQwest);

    For i := Param.NQwest - 1 DownTo 0 do

    m[i] := 1;

    k := 0;

    Repeat

    sum := 0;

    For i := Param.NQwest - 1 DownTo 0 do

    sum := sum + m[i];

    if sum = Param.TicketWeight then //если нашли удовлетворяющее распределение

    begin

    For i := Param.NQwest - 1 DownTo 0 do

    m1[i] := m[i];

    For i := 0 To Param.NQwest - 2 do //сортируем его по возвостанию (метод пузырька)

    For j := 0 To Param.NQwest - 2 - i do

    if m1[j] > m1[j + 1] then

    begin

    m1[j] := m1[j] + m1[j + 1];

    m1[j + 1] := m1[j] - m1[j + 1];

    m1[j] := m1[j] - m1[j + 1];

    end;

    For j := 0 to k - 1 do//проверяем встречалось ли уже такое распределение

    begin

    b := TRUE;

    For i := Param.NQwest - 1 DownTo 0 do

    if m1[i] <> DistrByWeight[j, i] then

    b := FALSE;

    if b then

    BREAK;

    end;

    If NOT b then//если такого еще не было, то сохраняем

    begin

    inc(k);

    SetLength(DistrByWeight, k, param.NQwest);

    For i := Param.NQwest - 1 DownTo 0 do

    DistrByWeight[k - 1, i] := m1[i];

    end;

    end;

    i := Param.NQwest - 1;//номер вопроса

    while TRUE do//цикл для получения нового весового распределения

    if (m[i] + 1)> param.MaxUseWeight then//если вес итого вопроса в билете больше максимально допустимого

    begin

    if (i - 1) < 0 then//выходим ли мы за граници билета

    begin

    b := TRUE; //закончить весовое распределение

    BREAK;

    end

    else

    begin

    m[i] := 1;

    dec(i);//теперь работаем со следуещем вопросом

    end

    end

    else

    begin

    inc(m[i]);

    b := FALSE;//продолжить весовое распределение

    BREAK;

    end;

    Until b;

    m := nil;

    m1 := nil;

    //конец весового распределения

    //начало проверки достаточности вопросов каждой из сложностей

    SetLength(SumWeight, param.MaxUseWeight);

    For i := param.MaxUseWeight - 1 DownTo 0 do//находим количество вопросов каждого веса

    begin

    SumWeight[i] := 0;

    For j := param.NTheme - 1 DownTo 0 do

    SumWeight[i] := SumWeight[i] + ArrayWeightTheme[i, j, 0];

    end;

    SetLength(SumWeightInDistr, param.MaxUseWeight);

    SetLength(UseDistr, k);

    For i := 0 to k - 1 do

    begin

    FillChar(SumWeightInDistr[0], param.MaxUseWeight* sizeof(SumWeightInDistr[0]), 0);

    For j := param.NQwest - 1 DownTo 0 do

    Inc(SumWeightInDistr[DistrByWeight[i, j] - 1]);

    UseDistr[i] := True;

    For j := param.MaxUseWeight - 1 DownTo 0 do

    if SumWeightInDistr[j] > SumWeight[j] then

    begin

    UseDistr[i] := False;

    Break;

    end;

    end;

    //конец проверки достаточности вопросов каждой из сложностей

    //убираем распределения которые ну удовлетворяют условиям

    j := 0;

    For i := k - 1 DownTo 0 do

    if UseDistr[i] then

    inc(j);

    If Not (j > 0) then

    begin

    ErrorCode := ErrorCodeAWST5;

    Exit;

    end;

    if j <> k then

    begin

    SetLength(TimeDistr, j, Param.NQwest);

    j := 0;

    For i := 0 to k - 1 do

    if UseDistr[i] then

    begin

    For z := Param.NQwest - 1 DownTo 0 do

    TimeDistr[j, z] := DistrByWeight[i, z];

    inc(j);

    end;

    k := j;

    DistrByWeight := TimeDistr;

    TimeDistr := nil;

    end;

    UseDistr := nil;

    //начинаем ставить в соответствие каждому билету весовое распрежеление

    SetLength(DistrTicket, Param.NTicket);

    SetLength(KoefDistr, k);//массив коэффициентов: чем меньше, тем лучше

    SetLength(SumWeightDinam, param.MaxUseWeight);

    For i := 0 to param.MaxUseWeight - 1 do

    SumWeightDinam[i] := SumWeight[i];

    For i := Param.NTicket - 1 DownTo 0 do//цикл ставит в соответствие I-тому билету некоторое распределение

    begin

    For j := 0 to k - 1 do

    begin

    KoefDistr[j] := 0.0;

    FillChar(SumWeightInDistr[0], param.MaxUseWeight* sizeof(SumWeightInDistr[0]), 0);

    For z := param.NQwest - 1 DownTo 0 do

    Inc(SumWeightInDistr[DistrByWeight[j, z] - 1]);

    For z := Param.MaxUseWeight - 1 downTo 0 do

    if SumWeightInDistr[z] > 0 then

    begin

    KoefDistr[j] := KoefDistr[j] +

    (SumWeightInDistr[z] - SumWeightDinam[z])/ SumWeight[z];

    end;

    For z := param.NQwest - 1 DownTo 0 do

    begin

    c := DistrByWeight[j, z] - 1;

    KoefDistr[j] := KoefDistr[j] +

    (SumWeightInDistr[c] - SumWeightDinam[c])/ SumWeight[c];

    end;

    end;

    z := 0;

    Min := KoefDistr[0];

    For j := 1 to k - 1 do

    if Min > KoefDistr[j] then

    begin

    z := j;

    Min := KoefDistr[j];

    end;

    DistrTicket[i] := z;

    for j := Param.NQwest - 1 DownTo 0 do

    dec(SumWeightDinam[DistrByWeight[z, j] - 1]);

    end;

    SumWeightInDistr := nil;

    SumWeight := nil;

    SumWeightDinam := nil;

    KoefDistr := nil;

    //Начинаем создавать результирующую матрицу

    SetLength(Result, Param.NTicket, Param.NQwest);

    For j := 0 to Param.NQwest - 1 do

    For i := 0 to Param.NTicket - 1 do

    begin

    //выбор начальных условий

    theme := 0;

    c := DistrByWeight[ DistrTicket[i], j ] - 1;

    For z := theme to Param.NTheme - 1 do//берем любой вопрос удовлетволяющий условию тем и весов

    begin //который еще не встречался в этом билете

    if ArrayWeightTheme[c, z, 0 ] <> 0 then

    begin

    b := True;

    qwest := 1;

    u := 0;

    while u <= j - 1 do

    begin

    if (Result[i, u].Theme = z)

    AND(Result[i, u].Nomer = qwest) then

    begin

    if qwest = ArrayWeightTheme[c, z, 0 ] then

    begin

    b := False;

    Break;

    end;

    u := -1;

    inc(qwest);

    end;

    inc(u);

    end;

    if b then

    Break;

    end;

    end;

    //берем вопрос удовлетволяющий условию тем и весов

    //который еще не встречался в этом билете

    //и использовался минимальное число раз

    theme := z;

    For z := theme to Param.NTheme - 1 do

    begin

    u := ArrayWeightTheme[c , z, 0 ];

    while u >= 1 do

    begin

    if ArrayWeightTheme[c, z, u ] < ArrayWeightTheme[c, theme, qwest ] then

    begin

    f := 0;

    b := True;

    while f <= j - 1 do

    begin

    if (Result[i, f].Theme = z)

    AND(Result[i, f].Nomer = u) then

    begin

    b := False;

    Break;

    end;

    inc(f);

    end;

    if b then

    begin

    theme := z;

    qwest := u;

    end;

    end;

    dec(u);

    end;

    end;

    With Result[i, j] do

    begin

    Weight := c;

    Nomer := qwest;

    end;

    Result[i, j].Theme := Theme;

    Inc(ArrayWeightTheme[c, theme, qwest]);

    end;

    ArrayWeightTheme := nil;

    DistrByWeight := nil;

    DistrTicket := nil;

    end;