Разработка электронного учебного методического комплекса по изучению раздела "Симплексный метод решения задачи линейного программирования" дисциплины "Математические методы"

 

СОДЕРЖАНИЕ


ВВЕДЕНИЕ

.ПОСТАНОВКА ЗАДАЧИ

.ОПИСАНИЕ СИМПЛЕКСНОГО МЕТОДА РЕШЕНИЯ ЗАДАЧИ ЛИНЕЙНОГОПРОГРАММИРОВАНИЯ

.ОБОСНОВАНИЕ ВЫБОРА ЯЗЫКА ПРОГРАММИРВОАНИЯ

.ПЕРЕЧЕНЬ ИДЕНТИФИКАТОРОВ

.БЛОК-СХЕМА АЛГОРИТМА

.1 Блок - схема модуля Symplex

.2 Блок - схема модуля eTest

.ЛОГИЧЕСКАЯ СХЕМА РАБОТЫ ПРОГРАММЫ

.ОПИСАНИЕ РАБОТЫ ПРОГРАММЫ

.ПРОВЕРКА СЧЕТА ПО ПРОГРАММЕ

.ТЕХНИКА БЕЗОПАСНОСТИ И НАУЧНАЯ ОРГАНИЗАЦИЯ ТРУДА

.1 Общие требования безопасности

.2 Требования безопасности перед началом работ

.3 Требования безопасности во время работы

.4 Требования безопасности в аварийных ситуациях

.5 Требования безопасности по окончании работ

.ЭКОНОМИЧЕСКАЯ ЧАСТЬ

ЗАКЛЮЧЕНИЕ

СПИСОК ИСПОЛЬЗУЕМОЙ ЛИТЕРАТУРЫ

ПРИЛОЖЕНИЕ 1. ЛИСТИНГ ПРОГРАММЫ

ПРИЛОЖЕНИЕ 2. РЕЗУЛЬТАТ РАБОТЫ ПРОГРАММЫ



ВВЕДЕНИЕ


Сами истоки линейного программирования (методы решения, геометрическая интерпретация и т.д.) были введены в 30х годах в ленинградском университете Л. В. Конторовичем.

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

В последние годы толчок в развитии этой дисциплины дало развитие вычислительной техники.

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

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

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

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

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

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

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

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

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

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

Предметом исследования автоматизация процессов решения задачи линейного программирования, формирования отчета и организации процесса контроля знаний.

Для достижения поставленной цели были поставлены и решены следующие задачи:

·изучение метода решения задачи линейного программрования, приведенного к стандартному виду;

·определение основных функций электронного учебного методического комплекса;

·выбор инструментария программирования;

·описание алгоритмов работы программы;

·разаработка логической и реализация физической структуры приложения;

·тестирование правильности работы программы и алгоритм её использования;

·расчет эконормической эффективности создания программы.


1.ПОСТАНОВКА ЗАДАЧИ


Дана линейная функция вида при ограничениях


,


где:

- коэффициент целевой функции ;

- коэффициент при ;

- неизвестные ;

- свободные члены ;

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

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

1.Вносить исходные данные;

2.Производить протокол расчета решения задачи;

.Выдавать справочную информацию по теории решения задачи;

.Вести базу данных тестовых материалов по заданной теме;

.Вести базу данных учетных записей пользователей тестовой системы;

.Проводить тестирование с выдачей и сохранением результатов.


2.ОПИСАНИЕ СИМПЛЕКСНОГО МЕТОДА РЕШЕНИЯ ЗАДАЧИ ЛИНЕЙНОГОПРОГРАММИРОВАНИЯ


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

Заметим, что каждое из линейных неравенств на переменные ограничивает полупространство в соответствующем линейном пространстве. В результате все неравенства ограничивают некоторый многогранник (возможно, бесконечный), называемый также полиэдральным конусом. Уравнение W(x) = c, где W(x) - максимизируемый (или минимизируемый) линейный функционал, порождает гиперплоскость L(c). Зависимость от c порождает семейство параллельных гиперплоскостей. Тогда экстремальная задача приобретает следующую формулировку - требуется найти такое наибольшее c, что гиперплоскость L(c) пересекает многогранник хотя бы в одной точке. Заметим, что пересечение оптимальной гиперплоскости и многогранника будет содержать хотя бы одну вершину, причём, их будет более одной, если пересечение содержит ребро или k-мерную грань. Поэтому максимум функционала можно искать в вершинах многогранника. Принцип симплекс-метода состоит в том, что выбирается одна из вершин многогранника, после чего начинается движение по его рёбрам от вершины к вершине в сторону увеличения значения функционала. Когда переход по ребру из текущей вершины в другую вершину с более высоким значением функционала невозможен, считается, что оптимальное значение c найдено.

Последовательность вычислений симплекс-методом можно разделить на две основные фазы:

1.нахождение исходной вершины множества допустимых решений,

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

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

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



где cB - коэффициенты вектора c соответствующие простым переменным (переменным xs соответствуют 0), B - столбцы , соответствующие простым переменным. Матрицу, образованную оставшимися столбцами обозначим D. Почему матрица будет иметь такой вид поясним в описании шагов алгоритма.

Первый шаг.

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

Второй шаг

Покажем, что в выражении только непростые переменные имеют ненулевой коэффициент. Заметим, что из выражения Ax+xs=b простые переменные однозначно выражаются через непростые, так как число простых переменных равно числу уравнений. Пусть x ' - простые, а x ' ' - непростые переменные на данной итерации. Уравнение Ax+xs=b можно переписать, как Bx '+Dx ' '=b. Умножим его на B ? 1 слева: x' + B ? 1Dx'' = B ? 1b. Таким образом мы выразили простые переменные через непростые, и в выражении B ? 1Ax + B ? 1xs, эквивалентному левой части равенства, все простые переменные имеют единичные коэффициенты. Поэтому, если прибавить к равенству Z ? cTx = 0 равенство , то в полученном равенстве все простые переменные будут иметь нулевой коэффициент - все простые переменные вида x сократятся, а простые переменные вида xs не войдут в выражение .

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


.


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

Третий шаг

Теперь необходимо понять, какая простая переменная первой обратится в ноль по мере увеличения входящей переменной. Для этого достаточно рассмотреть систему:



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

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


3.ОБОСНОВАНИЕ ВЫБОРА ЯЗЫКА ПРОГРАММИРВОАНИЯ


Программа для решения задач Симплекс - методом и система тестового контроля знаний студентов написана на языке программирования С++ и отлажена в среде Borland C++ Builder 6.0.

Си++ (англ. <#"justify">·Поддерживаются различные стили и технологии программирования, включая традиционное директивное программирование, ООП, обобщённое программирование, метапрограммирование (шаблоны, макросы).

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

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

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

·Язык поддерживает понятия физической (const) и логической (mutable) константности. Это делает программу надёжнее, так как позволяет компилятору, например, диагностировать ошибочные попытки изменения значения переменной. Объявление константности даёт программисту, читающему текст программы дополнительное представление о правильном использовании классов и функций, а также может являться подсказкой для оптимизации. Перегрузка функций-членов по признаку константности позволяет определять изнутри объекта цели вызова метода (константный для чтения, неконстантный для изменения). Объявление mutable позволяет сохранять логическую константность при использовании кэшей и ленивых вычислений.

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

·Возможность имитации расширения языка для поддержки парадигм, которые не поддерживаются компиляторами напрямую. Например, библиотека Boost.Bind позволяет связывать аргументы функций.

·Возможность создания встроенных предметно-ориентированных языков программирования. Такой подход использует, например библиотека Boost.Spirit, позволяющая задавать EBNF-грамматику парсеров прямо в коде C++.

·Используя шаблоны и множественное наследование можно имитировать классы-примеси и комбинаторную параметризацию библиотек. Такой подход применён в библиотеке Loki, класс SmartPrt которой позволяет, управляя всего несколькими параметрами времени компиляции, сгенерировать около 300 видов «умных указателей» для управления ресурсами.

·Кроссплатформенность: стандарт языка накладывает минимальные требования на ЭВМ для запуска скомпилированных программ. Для определения реальных свойств системы выполнения в стандартной библиотеке присутствуют соответствующие возможности (например, std::numeric_limits <T>). Доступны компиляторы для большого количества платформ, на языке C++ разрабатывают программы для самых различных платформ и систем.

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

·Имеется возможность работы на низком уровне с памятью, адресами.

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

Borland C++ Builder 6.0 - это комплексное решение для быстрой разработки приложений Windows®, .NET, веб-приложений и приложений баз данных.

Основные возможности для разработки приложений Windows

Интегрированная среда разработки C++Builder с функцией перетаскивания мышью.

Более 250 компонентов в библиотеке VCL.

dbExpress с поддержкой 9 основных баз данных, включая InterBase®.

DataSnap с поддержкой JSON, REST, HTTP, COM и XML.

Возможность отладки многопоточных приложений.

UML/аудит кода и учет показателей.


4.ПЕРЕЧЕНЬ ИДЕНТИФИКАТОРОВ


Модуль Symplex


Главная форма Form1

Таблица 4.1

НазваниеОписаниеLabel1Метка, содержащая текст «f=».Label2Метка, содержащая текст «Количество коэффициентов:».Label3Метка, содержащая текст «Стремится к:».CSpinEdit1Поле для ввода количества коэффициентов.Button1Кнопка вызова процедуры применения параметров, введенных в CSpinEdit1, для таблиц StringGrid1 и StringGrid2.Label4Метка, содержащая текст «Количество ограничений».CSpinEdit2Поле для ввода количества строк ограничений.StringGrid2Таблица для ввода исходных данных системы ограничений.Button2Кнопка вызова процедуры применения параметров, введенных в CSpinEdit1, для таблицы StringGrid2.StringGrid3Таблица для ведения расчетов Симплекс - методом.Memo1Многострочный текст. Используется для формирования файла отчета в *.html.

Unit 1

Таблица 4.2

НазваниеОписаниеiПеременная целочисленного типа, используется в качестве счетчика цикла.jПеременная целочисленного типа, используется в качестве счетчика цикла.ErrПеременная строкового типа, используется для формирования текста информации об ошибке ввода данных.err1Переменная строкового типа, используется для формирования текста информации об ошибке ввода данных.err2Переменная строкового типа, используется для формирования текста информации об ошибке ввода данных.e1Переменная целочисленного типа, используется для идентификации ошибок ввода данных.e2Переменная целочисленного типа, используется для идентификации ошибок ввода данных.convertПеременная вещественного типа, используется для хранения преобразования преобразованных данных.NCCПеременная целочисленного типа, используется в качестве счетчика итераций процесса.OtrStrПеременная целочисленного типа, используется для поиска отрицательных элементов в нижней строке.MinStlbПеременная вещественного типа, используется для хранения значения минимального отрицательного элемента нижней строки.NomStlbПеременная целочисленного типа, используется для хранения номера столбца, соответствующего минимальному отрицательному элементу в нижней строке.PolStlbПеременная целочисленного типа, используется для поиска положительных элементов в столбце, соответствующем минимальному отрицательному значению нижней строки.kПеременная целочисленного типа, используемая в качестве счетчика отношений элементов столбца «План» и положительных элементов столбца, соответствующему минимальному отрицательному значению нижней строки. MinOtМассив структур, используемых для поиска минимального отношения элементов столбца «План» и положительных элементов столбца, соответствующему минимальному отрицательному значению нижней строки.NomStrПеременная целочисленного типа, используется для хранения номера выводимой строки.MinStrПеременная вещественного типа, используется для хранения значения минимального отношения элементов столбца «План» и положительных элементов столбца, соответствующему минимальному отрицательному значению нижней строки.RestПеременная вещественного типа, используется для хранения результирующего значения при расчетах в Симплекс - таблице.RazElПеременная вещественного типа, используется для хранения разрешающего элемента таблицы.TekZnПеременная вещественного типа, используется для хранения значения текущей ячейки таблицы при расчетах в Симплекс - таблице.RazZnПеременная вещественного типа, используется для хранения значения элемента из разрешающего столбца , соответствующего текущему элементу, при расчетах в Симплекс - таблице.KonZnПеременная вещественного типа, используется для хранения значения элемента введенной строки , соответствующего текущему элементу.

Форма отчета Form2

Таблица 4.3

НазваниеОписаниеCppWebBowser1Компонент, служащий для преобразования файла отчета Report.html.Button1Кнопка вызова процедуры печати текста отчета работы программы.Button2Кнопка вызова процедуры закрытия формы отчета Form2.

Модуль eTest


Главная форма Form1

Таблица 4.4

НазваниеОписаниеLebel1Метка, содержащая текст «Система электронного тестирования "eTest"».Lebel2Метка, содержащая текст «Для того чтобы пройти тестирования, Вам необходимо быть зарегистрированным в базе данных программы».Lebel3Метка, содержащая текст «Если Вы зарегистрированы, то Вам необходимо авторизоваться и начать тестирование».Button1Кнопка вызова формы регистрации Form2.Button2Кнопка вызова формы авторизации Form5.Button3Кнопка вызова формы тестирования Form9.

Unit1

Таблица 4.5

НазваниеОписаниеIDПеременная целочисленного типа, используется для хранения ID - номера авторизованного пользователя.LoginПеременная строкового типа, используется для хранения логина авторизованного пользователя.sNameПеременная строкового типа, используется для хранения имени авторизованного пользователя.SurNameПеременная строкового типа, используется для хранения фамилии авторизованного пользователя.GroupПеременная строкового типа, используется для хранения номера группы авторизованного пользователя.StatusПеременная строкового типа, используется для хранения статуса авторизованного пользователя.DateOfRegistПеременная строкового типа, используется для хранения даты регистрации авторизованного пользователя.TimeOfRegistПеременная строкового типа, используется для хранения времени регистрации авторизованного пользователяLockПеременная строкового типа, используется для хранения информации о блокировке аккаунта зарегистрированного пользователяAVTORIZПеременная строкового типа, используется для хранения информации об активности текущей учетной записи авторизованного пользователя

Форма регистрации Form2

Таблица 4.6

НазваниеОписаниеLabel1Метка, содержащая текст «Логин:».Label2Метка, содержащая текст «Пароль:».Label3Метка, содержащая текст «Подтверждение пароля:».Label4Метка, содержащая текст «Имя:».Label5Метка, содержащая текст «Фамилия:».Label6Метка, содержащая текст «Группа:».Edit1Поле для ввода логина.Edit2Поле для ввода пароля.Edit3Поле для повторного ввода пароля.Edit4Поле для ввода имени.Edit5Поле для ввода фамилии.Edit6Поле для ввода Группы.Button1Кнопка вызова процедуры регистрации в базеButton2Кнопка отмены процедуры регистрацииButton3Кнопка вызова процедуры очистки полей формы

Unit2

Таблица 4.7

НазваниеОписаниеDATEПеременная типа Дата/время, используется для хранения текущих даты и времени.MaxIDUПеременная целочисленного типа, используется для хранения максимального ID - номера пользователя базы данных.

Форма панели управления Form4

Таблица 4.8

НазваниеОписаниеDBGrid1Таблица, используемая для вывода результатов запросов к базе данных.RadioButton1Переключатель, используемый для вывода информации о результатах тестирования в таблицу DBGrid1..RadioButton2Переключатель, используемый для вывода вопросов и ответов в таблицу DBGrid1.RadioButton3Переключатель, используемый для вывода вопросов тестирования в таблицу DBGrid1.RadioButton4Переключатель, используемый для вывода списка пользователей в таблицу DBGrid1.MaskEdit1Поле для ввода даты.MaskEdit2Поле для ввода даты.MaskEdit3Поле для ввода даты.Button2Кнопка вызова процедуры формирования отчета за определенную дату.Button3Кнопка вызова процедуры формирования отчета за определенный период.Label1Метка, содержащая текст «С».Label2Метка, содержащая текст «По».Memo1Многострочный текст, используется для формирования файла отчета.Button1Кнопка вызова формы конструктора вопросов Form7.Button4Кнопка вызова формы регистрации Form2.Button5Кнопка вызова формы авторизации Form5.Button6Кнопка вызова формы информации о текущей сессии Form6.Button7Кнопка вызова формы тестирования Form9.

Unit4

Таблица 4.9

НазваниеОписаниеiПеременная целочисленного типа, используется в качестве счетчика цикла.DПеременная строкового типа, используется для хранения введенной даты.D1Переменная строкового типа, используется для хранения введенной даты.D2Переменная строкового типа, используется для хранения введенной даты.

Форма авторизации Form5

Таблица 4.10

НазваниеОписаниеLabel1Метка, содержащая текст «Логин:».Label2Метка, содержащая текст «Пароль:».Edit1Поле для ввода логина.Edit2Поле для ввода пароля.Button1Кнопка вызова процедуры входа в систему и авторизации.Button2Кнопка отмены авторизации.


Unit5

Таблица 4.11

НазваниеОписаниеIDПеременная целочисленного типа, используется для хранения ID - номера авторизованного пользователя.LoginПеременная строкового типа, используется для хранения логина авторизованного пользователя.sNameПеременная строкового типа, используется для хранения имени авторизованного пользователя.SurNameПеременная строкового типа, используется для хранения фамилии авторизованного пользователя.GroupПеременная строкового типа, используется для хранения номера группы авторизованного пользователя.StatusПеременная строкового типа, используется для хранения статуса авторизованного пользователя.DateOfRegistПеременная строкового типа, используется для хранения даты регистрации авторизованного пользователя.TimeOfRegistПеременная строкового типа, используется для хранения времени регистрации авторизованного пользователяLockПеременная строкового типа, используется для хранения информации о блокировке аккаунта зарегистрированного пользователяAVTORIZПеременная строкового типа, используется для хранения информации об активности текущей учетной записи авторизованного пользователя

Форма информации о текущей сессии Form6

Таблица 4.12

НазваниеОписаниеLabel1Метка с текстом «ID:».Label2Метка с текстом «Имя:».Label3Метка с текстом «Фамилия:».Label4Метка с текстом «Группа:».Label5Метка с текстом «Статус:».Label6Метка с текстом «Дата регистрации:».Label7Метка с текстом «Время регистрации:».Label8Метка с текстом «Блокировка:».Label9Метка с текстом «Активность».Label10Метка для вывода ID - номера авторизованного пользователя.Label11Метка для вывода имени авторизованного пользователя.Label12Метка для вывода фамилии авторизованного пользователя.Label13Метка для вывода группы авторизованного пользователя.Label14Метка для вывода статус авторизованного пользователя.Label15Метка для вывода даты регистрации авторизованного пользователя.Label16Метка для вывода времени регистрации авторизованного пользователя.Label17Метка для вывода информации о блокировке авторизованного пользователя.Label18Метка для вывода информации об активности авторизованного пользователя.

Форма конструктора вопросов на выборку Form7

Таблица 4.13

НазваниеОписаниеRadioButton1Переключатель типа вопроса. Установлен на вопрос - выборку.RadioButton2Переключатель Типа вопроса. Переключает на вопрос, который требует письменного ответа.L1able1Метка с текстом «Текст вопроса:».L1able2Метка с текстом «Варианты ответа:».L3able3Метка с текстом «Количество вариантов:».Memo1Многострочный текст, используется для ввода текста вопроса.CSpinEdit1Поле для ввода количества вариантов ответа.Button1Кнопка вызова процедуры формирования компонентов на форме.Button2Кнопка вызова процедуры изменения вариантов ответа.Button3Кнопка вызова процедуры сохранения вопроса и ответов к нему в базе.

Unit7

Таблица 4.14

НазваниеОписание*LabelМассив типа TLabel, используется для формирования меток на форме.*EditМассив типа TEdit, используется для формирования полей ввода на форме.*RadioButtonМассив типа TRadioButton, используется для формирования переключателей на форме.iПеременная целочисленного типа, используется в качестве счетчика по циклу.ErrorПеременная строкового типа, используется для хранения текста ошибки.errПеременная целочисленного типа, используется для обнаружения ошибок при заполнении полей.RBSПеременная целочисленного типа, используется для обнаружения ошибок при выборе верного ответа.bulПеременная строкового типа, используется для хранения текста для хэширвоания.MaxIDQПеременная целочисленного типа, используется для хранения количества вопросов в базе.MaxIDAПеременная целочисленного типа, используется для хранения количества ответов в базе.

Форма конструктора вопросов, требующих письменного ответа Form8

Таблица 4.15

НазваниеОписаниеRadioButton1Переключатель типа вопроса. Установлен на вопрос, требующий ответ.RadioButton2Переключатель типа вопроса. Переключает на вопрос - выборку.Edit1Поле, для вывода адреса загружаемого на изображения.Button1Кнопка вызова процедуры загрузки изображения.Button2Кнопка вызова процедуры сохранения вопроса и ответа в базуLabel1Метка с текстом «Изображение:».Label2Метка с текстом «Текс вопроса:».Label3Метка с текстом «Ответ:».Edit2Поле для ввода ответа.Memo1Многострочный текст, используется для ввода текста вопроса.Image1Компонент, используемый для вывода изображения.

Unit8

Таблица 4.16

НазваниеОписаниеDBFNameПеременная строкового типа, используется для хранения имени графического файла.FNameПеременная строкового типа, используется для хранения имени графического файла.DirПеременная строкового типа, используется для хранения адреса текущей директории.NewNameПеременная строкового типа, используется для хранения имени графического файла.ErrorПеременная строкового типа, используется для хранения текста ошибки.errПеременная целочисленного типа, используется для обнаружения ошибок при заполнении полей.MaxIDQПеременная целочисленного типа, используется для хранения количества вопросов в базе.MaxIDAПеременная целочисленного типа, используется для хранения количества ответов в базе.


Форма тестирования Form9

Таблица 4.17

НазваниеОписаниеLabel1Метка с текстом «Текст вопроса:».Label2Метка с текстом «Варианты ответа:».Label3Метка с текстом «ID».Label4Метка с текстом «Логин:».Label5Метка с текстом «Имя:».Label6Метка с текстом «Фамилия:».Label7Метка с текстом «Группа:».Label8Метка с текстом «Статус:».Label9Метка с текстом «Активность:».Label10Метка для вывода ID - номера авторизованного пользователя.Label11Метка для вывода логина авторизованного пользователя.Label12Метка для вывода имени авторизованного пользователя.Label13Метка для вывода фамилии авторизованного пользователя.Label14Метка для вывода группы авторизованного пользователя.Label15Метка для вывода статус авторизованного пользователя.Label16Метка для вывода информации об активности авторизованного пользователя.Label17Метка с текстом «Изображение:».Label18Метка с текстом «Текущий вопрос:».Label19Метка с текстом «Всего вопросов:».Label20Метка для вывода номера текущего вопроса.Label21Метка для вывода количества вопросов текущего тестирования.Label23Метка с текстом «Ответ:».Memo1Многострочный текст, используется для вывода текста вопроса.Memo2Многострочный текст, используется для формирования файла отчета о тестировании.Edit1Поле для ввода ответа.Button1Кнопка вызова процедуры начала тестированияButton2Кнопка вызова процедуры переключения вопросов тестированияButton3Кнопка вызова процедуры завершения тестирования

Unit9

Таблица 4.18

НазваниеОписаниеIDПеременная целочисленного типа, используется для хранения ID - номера авторизованного пользователя.LoginПеременная строкового типа, используется для хранения логина авторизованного пользователя.sNameПеременная строкового типа, используется для хранения имени авторизованного пользователя.SurNameПеременная строкового типа, используется для хранения фамилии авторизованного пользователя.GroupПеременная строкового типа, используется для хранения номера группы авторизованного пользователя.StatusПеременная строкового типа, используется для хранения статуса авторизованного пользователя.DateOfRegistПеременная строкового типа, используется для хранения даты регистрации авторизованного пользователя.TimeOfRegistПеременная строкового типа, используется для хранения времени регистрации авторизованного пользователяLockПеременная строкового типа, используется для хранения информации о блокировке аккаунта зарегистрированного пользователяAVTORIZПеременная строкового типа, используется для хранения информации об активности текущей учетной записи авторизованного пользователяNowIDQПеременная целочисленного типа, используется для хранения номера текущего вопроса.NowIDAПеременная целочисленного типа, используется для хранения номера текущего ответа.MaxIDQПеременная целочисленного типа, используется для хранения количества вопросов.MaxIDAПеременная целочисленного типа, используется для хранения количества ответов.AnsПеременная целочисленного типа, используется для хранения количества данных ответов.TrAnsПеременная целочисленного типа, используется для хранения количества правильных ответов.CControlПеременная целочисленного типа, используется для определения типа предыдущего вопроса.iПеременная целочисленного типа, используется в качестве счетчика цикла.TypeПеременная строкового типа используется для определения типа текущего вопроса.NCheckAnsПеременная целочисленного типа, используется для хранения номера выбранного варианта ответа.ErrorПеременная строкового типа, используется для хранения текста ошибки.errПеременная целочисленного типа, используется для обнаружения ошибок при заполнении полей.TПеременная текстового типа, используется для хранения текста для хэшиварования правильного ответаFПеременная текстового типа, используется для хранения текста для хэшиварования неправильного ответаDirПеременная строкового типа, используется для хранения адреса текущей директории.NDПеременная типа Дата/Время, используется для хранения даты и времени.MaxIDTПеременная целочисленного типа, используется для хранения номера последней записи в таблице TestResults базы данных.


5.БЛОК-СХЕМА АЛГОРИТМА


5.1 Блок - схема модуля Symplex



5.2 Блок - схема модуля eTest


Блок- схема модуля регистрации



Блок - схема модуля авторизации



Блок - схема модуля конструктора вопросов 1




Блок - схема модуля конструктора вопросов 2




Блок - схема модуля тестирования



6.ЛОГИЧЕСКАЯ СХЕМА РАБОТЫ ПРОГРАММЫ




7.ОПИСАНИЕ РАБОТЫ ПРОГРАММЫ


Программа состоит из двух независимых модулей: модуля решения Symplex и модуля системы тестового контроля eTest.

После запуска модуля Symplex, перед пользователем открывается главное окно программы, в котором содержатся элементы управления (Рис. 6.1).


Рис. 6.1. Головная форма программы Symplex


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

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

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

В случае если введены не все исходные данные, то программа выдаст сообщение об этом (Рис. 6.2).


Рис. 6.2. Сообщение об ошибке ввода данных


Если же все данные введены верно, то программа выдаст сообщение о том, что найден оптимальный план, либо сообщение о том, что задача не имеет решения (Рис. 6.3).



Рис. 6.3. Сообщения о результате работы программы


После этого кнопка «Сформировать отчет на форме становится активна». При ее нажатии появляется форма с отчетом (Рис. 6.4).


Рис. 6.4. Форма вывода отчета

Отчет на данной форме можно распечатать при нажатии на кнопку «Печать». При нажатии на кнопку «Закрыть» форма закроется.

Модуль eTest может быть запущен независимо от модуля Symplex, а может быть вызван из модуля Symplex через меню Опции / Пройти тестирование (Рис. 6.5).


Рис. 6.5 Запуск модуля eTest


После запуска модуля eTest, пользователь увидит главное окно программы (Рис. 6.6).


Рис. 6.6. Головная форма программы eTest


Система тестового контроля работает на основе базы данных UsDB. Она сформирована при помощи программы Microsoft Access и содержит 4 таблицы:

·Таблица учетных записей пользователей;

·Таблица результатов тестирования пользователей;

·Таблица вопросов тестирования;

·Таблица ответов на вопросы.

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


Рис. 6.7. Форма регистрации


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

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


Рис. 6.8. Возможные сообщения об ошибках при регистрации


В случае успешной авторизации, программа выдаст сообщение следующего вида. (Рис. 6.9)


Рис. 6.9. Сообщение об успешной регистрации


Программа прописывает в базу данных новую запись.

После регистрации пользователю нужно авторизоваться. Нужно вызвать форму авторизации и ввести в нее логин и пароль, указанные при регистрации (Рис.6.10).


Рис. 6.10. Форма авторизации


При успешной авторизации, программа выдаст сообщение следующего вида. (Рис. 6.11)


Рис. 6.11. Сообщение об успешной авторизации


Каждому пользователю при регистрации присваивается статус «Student». Этот статус предоставляет право только проходить тестирование.

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

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


Рис. 6.12. Форма тестирования, вопрос второго типа


Рис. 6.13. Форма тестирования, вопрос первого типа


Если пользователю присвоен статус «Admin», то он имеет доступ к панели управления. Для перехода к ней, он должен быть авторизован и должен перейти по пунктам главного меню Управление / Панель управления (Рис. 6.14).


Рис. 6.14. Форма панели управления


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

Так же из этой формы есть кнопки вызова всех остальных основных форм. Это удобно, среди которых есть кнопка конструктора вопросов.

Конструктор вопросов позволяет вводить вопросы двух видов, для переключения между режимами ввода используются переключатели в области объединения «Тип вопроса». По умолчанию представлена форма ввода вопросов с выбором вариантов ответа. Форма ввода вопросов, подразумевающих ввод ответа выглядит следующим образом:

Для ввода вопросов с выбором ответа нужно ввести текст вопроса, выставить количество вариантов ответа, заполнить поля и выбрать верный ответ. После чего нажать кнопку «Сохранить вопрос в базу» (Рис. 6.15).


Рис. 6.15. Форма конструктора вопросов первого типа


Для ввода вопросов с вводом ответа необходимо загрузить сопроводительное изображение, если оно необходимо, ввести текст вопроса и ввести правильный ответ, после чего нажать кнопку «Сохранить вопрос в базу» (Рис. 6.16).


Рис. 6.16. Форма конструктора вопросов второго типа


По завершению тестирования, пользователю будет выдано сообщение о результате (Рис. 6.17)


Рис. 6.17 Сообщение результата тестирования


Создастся файл отчета, а результат запишется в базу.


8.ПРОВЕРКА СЧЕТА ПО ПРОГРАММЕ


Используя симплексный метод, решим следующую задачу:

Дана функция

При ограничениях


.


Задача представлена в общем виде. Для ее решения условие необходимо преобразовать в вид ОЗЛП путем введения новых переменных. В этом случае, условие задачи примет вид:


.


По данному условию составим Симплекс - таблицу. В столбец «План» заносятся свободные члены из системы ограничений. Ячейки столбцов X1 - X5 заполняются в соответствии с коэффициентами уравнений системы ограничений.

Нижняя строка заполняется по следующему алгоритму:

·Поскольку задача решается обычным симплекс -методом, то в ячейке соответствующей столбцу «План» записывается 0;

·Ячейки, соответствующие столбцам X1- X5, заполняются в соответствие с целевой функцией, но с противоположным знаком.

БазисПланX1X2X3X4X5X31212100X42416010X53011001F0-1-3000Найден начальный опорный план:

0=0;

X3=12; X4=24; X5=30.


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

Необходимо найти максимальный по модулю отрицательный элемент. Если таковых нет, то считается, что задача приведена к оптимальному плану. В нашем случае таким элементом является элемент -3, находящийся в нижней строке столбца X2. Переменная, соответствующая этому столбцу будет вводимой. Затем происходит поиск выводимой переменной. Для этого нужно найти минимальное отношение элементов столбца «План» и соответствующих им положительных элементов столбца, соответствующего вводимой переменной. Если в столбце нет положительных элементов, то задача не имеет решения. Та строка, на которой находится наименьшее отношение, является выводимой, а элемент на пересечении выводимого вводимого столбца и выводимой строки называется направляющий. В данном случае из базиса выводиться будет переменная X4, а вводиться - X2.

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

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

В результате этих операций, получим следующую Симплекс - таблицу:

БазисПланX1X2X3X4X5X340,6601-0,340X240,17100,170X5260,8300-0,171F12-0,49000,510Найден новый опорный план:

1=12;

X3=4; X2=4; X5=26.


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


БазисПланX1X2X3X4X5X16,06101,52-0,520X22,9701-0,260,260X520,9700-1,260,261F14,97000,740,260Найден новый опорный план:

2=14,97;

X1=6,06; X2=2,97; X5=20,97.


Данный опорный план является оптимальным, так как в нижней строке нет отрицательных элементов.

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

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


9.ТЕХНИКА БЕЗОПАСНОСТИ И НАУЧНАЯ ОРГАНИЗАЦИЯ ТРУДА


Инструктажи по требованиям безопасности в зависимости от характера, цели, места и времени проведения подразделяют на:

·вводный;

·первичный;

·повторный;

·внеплановый;

·целевой;

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

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

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

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

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

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

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

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


9.1 Общие требования безопасности


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

Работник обязан проходить периодический инструктаж не реже одного раза в 3 месяца с оформлением в Журнале учета проведения инструктажей по правилам и мерам безопасности» и ежегодно проверку знаний в квалификационной комиссии на квалификационную группу по технике электробезопасности.

Работник должен помнить об опасности поражения электрическим током (на ПЭВМ имеются точки с высоким потенциалом и 220В - ОПАСНО ДЛЯ ЖИЗНИ).

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

О случаях травмирования работников и неисправностях аппаратуры немедленно докладывать начальнику отдела.

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


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


1.Для проведения работ на ПЭВМ получить разрешение у ответственного за ПЭВМ.

2.Перед началом работы произвести внешний осмотр ПЭВМ, ее составных частей. Убедиться:

-в наличии и исправности защитного заземления в сетевой розетке;

-в закрытом положении крышек, кожухов, панелей;

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

-в обеспечении свободного доступа воздуха к ПЭВМ (не менее 200мм между составными частями и внешними предметами);

-в том, что органы управления составных частей ПЭВМ и периферии находятся в исходном положении.


9.3 Требования безопасности во время работы


1.Включение ПЭВМ и работа на ней должны производиться в строгом соответствии с «Инструкцией оператору по работе на ПЭВМ».

2.Запрещается:

-снимать крышки, кожухи, панели, заменять предохранители;

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

-допускать посторонних лиц к работе на ПЭВМ.

-оставлять включенную ПЭВМ или ее составные части без присмотра.


9.4 Требования безопасности в аварийных ситуациях


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

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

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


9.5 Требования безопасности по окончании работ


1.Выключить ПЭВМ, ее составные части и затем вынуть вилку из сетевой розетки или отключить автомат на щите питания.

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

.Уходя из помещения выключить освещение.


10.ЭКОНОМИЧЕСКАЯ ЧАСТЬ


10.1 Расчет экономической эффективности применения ПЭВМ для решения задачи


.1.1 Расчет стоимости одного часа работы ПЭВМ

Расчет стоимости одного часа работы ПЭВМ производится по формуле:


, где


- затраты на содержание и обслуживание ПЭВМ;

- полезный фонд времени работы ПЭВМ;

- количество машин;

Затраты на содержание и обслуживание ПЭВМ рассчитываются по формуле:


, где


- зарплата обслуживающего персонала;

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

- накладные расходы;

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

- затраты на ремонт оборудования;

- затраты на электроэнергию;

- затраты на материалы;



10.1.2 Расчет зарплаты обслуживающего персонала


Таблица 2 Обслуживающий персонал

№Обслуживающий персоналЗаработная плата в месяц (руб.)Количество работников (чел.)Фонд заработной платы (руб.)1Начальник УВЦ5440154402Инженер - программист5040150403Оператор ЭВМ443014430Итого14910

; , где


- заработная плата работника в месяц, данные приведены в таблице;

- количество машин, обслуживаемых работником;

- количество машин, на которых установлена программа;

;

;

;

;

;

;

Так как отсутствует дополнительная зарплата, .



10.1.3 Расчет взноса, зачисляемого в государственные внебюджетные фонды


Таблица 3 Ставка взноса, зачисляемого в государственные внебюджетные фонды

Государственные внебюджетные фондыСтавка налога (%)Пенсионный фонд РФ20,0Фонд социального страхования РФ2,9Фонд обязательного медицинского страхования РФ3,1Страховые взносы на социальное страхование от несчастных случаев на производстве и профзаболеваний0,2Итого26,2

, где


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

;


10.1.4 Расчет накладных расходов


, где


- ставка накладных расходов (%);

;

;



10.1.5 Расчет амортизационных отчислений


, где


- первоначальная стоимость оборудования;

- ставка годовой нормы амортизации;

;

;


Таблица 4 Состав оборудования

Наименование оборудованияЦена за единицу (руб.)КоличествоСтоимостьПроцессор6000318000Материнская плата4500313500Модуль памяти150069000Жесткий диск5000315000Мышь2503750Устройство чтения CD - дисков200036000Накопитель на гибких дисках3003900Клавиатура60031800Корпус300039000Монитор5000315000Принтер лазерный855018550Итого97500

10.1.6 Расчет затрат на ремонт оборудования


, где


- ставка годовых плановых затрат на ремонт оборудования (%);

;

;


10.1.7 Расчет затрат на электроэнергию


, где


- общая мощность оборудования;

- полезный фонд времени работы оборудования (час.)

- цена одного кВт/ч (руб.)


, где


- режимный фонд работы оборудования (час.);

- плановые затраты времени на профилактику и ремонт оборудования;


, где


- ставка плановых потерь на профилактику и ремонт оборудования (%);

;


, где


- количество календарных дней за период;

- количество выходных дней за период;

- количество праздничных дней за период;

- количество предпраздничных дней, в которые сокращается рабочий день;

- длительность смены;

- количество смен;

- количество часов, на которые сокращается рабочий день в предпраздничный день;


Таблица 5 Общая мощность оборудования

Наименование оборудованияМощность единицы оборудования (кВт/ч)Количество единиц оборудованияСуммарная мощность (кВт/ч)Системный блок и монитор0,4831,29Принтер0,3110,31Итого1,6

Расчетный месяц: апрель;

;

;

;

;

;

;

;

;

;

;

;

;

;


10.1.8 Расчет затрат на материалы

По данным бухгалтерии затраты на материалы в месяц составили 670 рублей. ( руб.)


10.2 Расчет стоимости одного часа работы ПЭВМ


;

;

Структура стоимости одного часа работы ПЭВМ


Таблица 6 Структура стоимости одного часа работы ПЭВМ

№Элементы затратСумма (руб.)Удельный вес (%)1Заработная плата обслуживающему персоналу298230,47%2Взнос, зачисляемый в государственные внебюджетные фонды781,2847,98%3Накладные расходы2564,5226,20%4Амортизационные отчисления812,58,30%5Затраты на ремонт оборудования9759,96%6Затраты на электроэнергию1001,840610,24%7Затраты на материалы6706,85%Итого9787,144100%

10.3Расчет затрат на составление и отладку программы


.3.1 Расчет стоимости решения задачи на ПЭВМ

Стоимость решения задачи на ПЭВМ рассчитывается по формуле:


, где


- заработная плата руководителя;

- заработная плата студента;

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

- накладные расходы;

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

- затраты времени на отладку программы и решения её на ПЭВМ;


10.3.2 Расчет заработной платы руководителя


, где


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

- часовая тарифная ставка руководителя;

- количество студентов в группе;

;

;

;

;


10.3.3 Расчет заработной платы студента


, где

- стипендия студента;

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

- затраты времени на отладку программы и решения ее на ПЭВМ;

, где

- средняя занятость в течение дня;

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

;

;

- количество рабочих дней в месяце;

;

;

;

;


10.3.4 Расчет взноса, зачисляемого в государственные внебюджетные фонды


, где


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

;

;



10.3.5 Расчет накладных расходов


, где


- ставка накладных расходов;

;

;


10.3.6 Расчет затрат на материалы, используемые при составлении и отладке программы


Таблица 7 материалы, используемые при составлении и отладке программы

Наименования материаловЦена за единицу (руб.)КоличествоСтоимость (руб.)Бумага0,43514Ручка10110Диск15115Картридж13535Итого74

;

;


10.4Расчет стоимости решения задачи вручную


Стоимость решения задачи вручную рассчитывается по формуле:


, где

- затраты времени на решение задачи вручную;

- часовая ставка решающего задачи (руб.);


;


;

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


10.5Расчет показателей экономической эффективности


10.5.1Расчет экономии труда за счет применения ПЭВМ


, где


- предлагаемое число обращений к программе;

- затраты времени на составление и отладку программы на ПЭВМ;

- время решения задачи на ПЭВМ;


10.5.2Расчет затрат времени на составление и отладку программы


, где


- средняя занятость в течение дня;

- количество дней на составление и отладку программы на ПЭВМ;

;

;


10.5.3Расчет времени решения задачи на ПЭВМ


, где


- время ввода исходной информации;

- машинное время;

- время вывода информации на печать;

;

;

;

;


10.5.4Расчет предполагаемого числа обращений к программе


10.6Расчет денежной экономической эффективности применения ПЭВМ


, где


- стоимость решения задачи вручную;

- стоимость решения задачи на ПЭВМ;

- затраты на работу программы;


10.6.1Расчет затрат на работу программы


, где


- стоимость одного часа работы ПЭВМ;

- время решения задачи на ПЭВМ;

;

;


10.6.2Расчет роста производительности труда от применения ПЭВМ


, где


- показатель экономии труда за счет применения ПЭВМ;

- затраты времени на решение задачи вручную;

- предлагаемое число обращений к программе;

;


ЗАКЛЮЧЕНИЕ


В данной дипломной работе я реализовал решение задачи линейного программирования Симплекс - методом в программе. Программа была написана на языке C++ в среде Borland C++ Builder 6.0. Программа предусматривает решение задач Симплекс - методом, условие которых приведено к стандартному виду.

Программа состоит из двух независимых модулей: модуля решения задачи «Symplex» и модуля системы тестового контроля знаний студентов «eTest».

Модуль «Symplex» представляет собой окно с элементами интерфейса, в которые вводятся исходные данные, с которыми производится решение задачи в данном модуле.

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

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

Достоинства программы:

·Не требует установки, что обеспечивает меньше затрат времени на подготовку к использованию;

·Простой интуитивно понятный интерфейс;

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

·Проверка правильности ввода всех данных сразу и вывод полной информации об ошибках, если такие обнаружены;

·Возможность вывода полноценного, отформатированного и понятного пользователю, отчета, содержащего все промежуточные расчеты;

·Возможность распечатки отчета;

·Возможность проводить тестовый контроль знаний;

·Возможность формировать банк тестовых заданий из двух типов вопросов;

·Возможность задавать «неограниченное» число вопросов с «неограниченным» количеством вариантов ответа;

·Возможность загрузки графических элементов, сопровождающих вопрос;

·Расширенная система управления модулем тестирования и формирования отчетности о проведении тестирования;

·Защищенность базы данных;

Недостатки программы:

·Возможность решения задач только одного типа;

·Работа только в одной операционной системе;

·Нет многопользовательского режима работы с базой;

СПИСОК ИСПОЛЬЗУЕМОЙ ЛИТЕРАТУРЫ


1.Волков И.К., Загоруйко Е.А., Исследование операций, Москва, издательство МГТУ им. Н.Э. Баумана, 2000

2.Кофман А., Анри-Лабордер А., Методы и модели исследования операций. Том3. Целочисленное программирование, изд. «МИР», Москва, 1977

3.Культин Н. Б. Самоучитель C++ Builder. - Санкт-Петербург.: БХВ -Петербург , 2004

.Архангельский А.Я., С++ Builder 6, «БИНОМ», 2002

.Пахомов Б.И., Borland C++ Builder для начинающих, Санкт-Петербург.: БХВ -Петербург , 2007

.Материалы с сайта #"justify">ПРИЛОЖЕНИЕ 1. ЛИСТИНГ ПРОГРАММЫ


Модуль Symplex

Unit1

//---------------------------------------------------------------------------


#include <vcl.h>

#include <vcl\math.hpp>

#pragma hdrstop


#include "Unit1.h"

#include "Unit2.h"

//---------------------------------------------------------------------------

#pragma package(smart_init)

#pragma link "CSPIN"

#pragma resource "*.dfm"*Form1;

//---------------------------------------------------------------------------

__fastcall TForm1::TForm1(TComponent* Owner)

: TForm(Owner)

{

}

//---------------------------------------------------------------------------__fastcall TForm1::FormCreate(TObject *Sender)

{i;->ColCount=CSpinEdit1->Value;(i=1;i<=StringGrid1->ColCount;i++)

{

StringGrid1->Cells[i-1][0]="X"+AnsiString(i);

}

(i=1;i<=StringGrid2->ColCount-3;i++)

{

StringGrid2->Cells[i][0]="X"+AnsiString(i);

}

->Cells[StringGrid2->ColCount-2][0]="Знак";->Cells[StringGrid2->ColCount-1][0]="Своб.член";

(i=1;i<=StringGrid2->RowCount;i++)

{

StringGrid2->Cells[0][i]=AnsiString(i);

}(i=1;i<=StringGrid2->RowCount-1;i++)

{

StringGrid2->Cells[StringGrid2->ColCount-2][i]="<=";

}->ItemIndex=0;

}

//---------------------------------------------------------------------------__fastcall TForm1::Button1Click(TObject *Sender)

{i;

->ColCount=CSpinEdit1->Value;


(i=1;i<=StringGrid1->ColCount;i++)

{

StringGrid1->Cells[i-1][0]="X"+AnsiString(i);

}

->ColCount=CSpinEdit1->Value+3;

(i=1;i<=StringGrid2->ColCount-3;i++)

{

StringGrid2->Cells[i][0]="X"+AnsiString(i);

}

->Cells[StringGrid2->ColCount-2][0]="Знак";->Cells[StringGrid2->ColCount-1][0]="Своб.член";(i=1;i<=StringGrid2->RowCount-1;i++)

{

StringGrid2->Cells[StringGrid2->ColCount-2][i]="<=";

}

}

//---------------------------------------------------------------------------__fastcall TForm1::CSpinEdit1KeyPress(TObject *Sender, char &Key)

{(((Key >= '0')&&(Key <= '9'))||(Key == VK_CLEAR)||(Key == VK_BACK))return;= 0;

}

//---------------------------------------------------------------------------__fastcall TForm1::CSpinEdit2KeyPress(TObject *Sender, char &Key)

{(((Key >= '0')&&(Key <= '9'))||(Key == VK_CLEAR)||(Key == VK_BACK))return;= 0;

}

//---------------------------------------------------------------------------__fastcall TForm1::Button2Click(TObject *Sender)

{i;

->RowCount=CSpinEdit2->Value+1;

(i=1;i<=StringGrid2->RowCount;i++)

{

StringGrid2->Cells[0][i]=AnsiString(i);

}(i=1;i<=StringGrid2->RowCount-1;i++)

{

StringGrid2->Cells[StringGrid2->ColCount-2][i]="<=";

}

}

//---------------------------------------------------------------------------__fastcall TForm1::StringGrid1KeyPress(TObject *Sender, char &Key)

{(((Key >= '0')&&(Key <= '9'))||(Key == ',')||(Key == '-')||(Key == VK_CLEAR)||(Key == VK_BACK))return;= 0;

}

//---------------------------------------------------------------------------__fastcall TForm1::StringGrid2KeyPress(TObject *Sender, char &Key)

{(((Key >= '0')&&(Key <= '9'))||(Key == ',')||(Key == '-')||(Key == VK_CLEAR)||(Key == VK_BACK))return;= 0;

}

//---------------------------------------------------------------------------__fastcall TForm1::Button5Click(TObject *Sender)

{->Close();

}

//---------------------------------------------------------------------------__fastcall TForm1::Button4Click(TObject *Sender)

{i,j;(i=0;i<StringGrid1->ColCount;i++)

{

StringGrid1->Cells[i][1]="";

}

(j=1;j<=StringGrid2->RowCount-1;j++)

{

for(i=1;i<=StringGrid2->ColCount-3;i++)

{

StringGrid2->Cells[i][j]="";

}

}(i=1;i<=StringGrid2->RowCount-1;i++)

{

StringGrid2->Cells[StringGrid2->ColCount-1][i]="";

}->Enabled=false;

}

//---------------------------------------------------------------------------__fastcall TForm1::StringGrid2SelectCell(TObject *Sender, int ACol,

int ARow, bool &CanSelect)

{(ACol==StringGrid2->ColCount-2)

{

CanSelect=false;

}

}

//---------------------------------------------------------------------------__fastcall TForm1::Button3Click(TObject *Sender)

{

//Проверка правильности ввода исходных данных

int i,j;

AnsiString Err, err1,err2;e1,e2;1=0;

e2=0;


Err="Не введены исходные данные:\n\n";



for(i=0;i<=StringGrid1->ColCount-1;i++)

{

if(StringGrid1->Cells[i][1]=="")

{

e1=1;

}

}


if(e1==1)

{

err1="в таблице коэффициентов,соответствующие полям:\n";

for(i=0;i<=StringGrid1->ColCount-1;i++)

if(StringGrid1->Cells[i][1]=="")

{

err1=err1+StringGrid1->Cells[i][0]+";\n";

}

Err=Err+err1;

}





for(i=0;i<=StringGrid2->ColCount-1;i++)

{

for(j=1;j<=StringGrid2->RowCount-1;j++)

if(StringGrid2->Cells[i][j]=="")

{

e2=1;

}

}


if(e2==1)

{

err2="\nв таблице системы ограничений, соответствующие полям:\n";

for(i=0;i<=StringGrid2->ColCount-1;i++)

{

for(j=1;j<=StringGrid2->RowCount-1;j++)

{

if(StringGrid2->Cells[i][j]=="")

{

err2=err2+StringGrid2->Cells[i][0]+" на строке № "+IntToStr(j)+";\n";

}

}

}

Err=Err+err2;

}



if(e1==1 || e2==1)

{

ShowMessage(Err);return;

}

if(ComboBox1->ItemIndex==-1)

{

ShowMessage("Не выбрано, к чему стремится функция");

return;

}->Clear();->Lines->SaveToFile("Report.html");->Lines->Add("<html>");->Lines->Add("<head>");->Lines->Add("<title>Отчет</title>");->Lines->Add("<meta http-equiv='Content-Type' content='text/html; charset=windows-1251'>");->Lines->Add("</head>");->Lines->Add("<body>");->Lines->Add("<center><h2><u>Отчет по решению</u></h2></center></br>");->Lines->Add("<center><b><u>Условия задачи:</u></b></center></br>");->Lines->Add("<left><b>Целевая функция:</b></left></br>");->Lines->Add("<I>f</I>=");(i=0;i<StringGrid1->ColCount;i++)

{

if(StrToFloat(StringGrid1->Cells[i][1])>0)

{

if(i==0)

{

Memo1->Lines->Add(StringGrid1->Cells[i][1]+"x<sub>"+(i+1)+"</sub>");

}

else

{

Memo1->Lines->Add("+"+StringGrid1->Cells[i][1]+"x<sub>"+(i+1)+"</sub>");

}

}

else

{

Memo1->Lines->Add(StringGrid1->Cells[i][1]+"x<sub>"+(i+1)+"</sub>");

}

}->Lines->Add("<th>&rarr;</th>");->Lines->Add(ComboBox1->Text);->Lines->Add("</left></br></br>");->Lines->Add("<left><b>Система ограничений:</b></left></br>");(j=1;j<=StringGrid2->RowCount-1;j++)

{

for(i=1;i<=StringGrid2->ColCount-3;i++)

{

if(StrToFloat(StringGrid2->Cells[i-1][j])>0)

{

if(i==1)

{

Memo1->Lines->Add(StringGrid2->Cells[i][j]+"x<sub>"+i+"</sub>");

}

else

{

Memo1->Lines->Add("+"+StringGrid2->Cells[i][j]+"x<sub>"+i+"</sub>");


}

}

else

{

Memo1->Lines->Add(StringGrid2->Cells[i-1][j]+"x<sub>"+i+"</sub>");

}


}

Memo1->Lines->Add(StringGrid2->Cells[StringGrid2->ColCount-2][j]);

Memo1->Lines->Add(StringGrid2->Cells[StringGrid2->ColCount-1][j]);

Memo1->Lines->Add("</br>");

}->Lines->Add("<center><b><u>Решение:</u></b></center></br></br>");1->Lines->Add("Задача представленна в общем виде. Необходимо преобразовать ее в вид ОЗЛП</br>");

double convert;//Переменная для конвертирования//

//если функция стремится к минимуму

Memo1->Lines->Add("В этом случае функция примет вид:</br>");

if(ComboBox1->Text=="Min")

{


for(i=0;i<StringGrid1->ColCount;i++)

{

convert=StrToFloat(StringGrid1->Cells[i][1]);

convert=convert*(-1);

StringGrid1->Cells[i][1]=convert;

}

ComboBox1->Text="Max";

}->Lines->Add("<I>f</I>=");(i=0;i<StringGrid1->ColCount;i++)

{

if(StrToFloat(StringGrid1->Cells[i][1])>0)

{

if(i==0)

{

Memo1->Lines->Add(StringGrid1->Cells[i][1]+"x<sub>"+(i+1)+"</sub>");

}

else

{

Memo1->Lines->Add("+"+StringGrid1->Cells[i][1]+"x<sub>"+(i+1)+"</sub>");

}

}

else

{

Memo1->Lines->Add(StringGrid1->Cells[i][1]+"x<sub>"+(i+1)+"</sub>");

}

}->Lines->Add("<th>&rarr;</th>");->Lines->Add(ComboBox1->Text+"</br>");1->Lines->Add("А система ограничений примет вид:</br>");

//Формирование матрицы 3->ColCount=CSpinEdit1->Value+2+CSpinEdit2->Value;->RowCount=StringGrid2->RowCount+1;

//Заполнение статических ячеек->Cells[0][0]="Базис";->Cells[1][0]="План";

(i=2;i<=StringGrid3->ColCount;i++)

{

StringGrid3->Cells[i][0]="X"+AnsiString(i-1);

}

(i=1;i<=StringGrid3->RowCount-2;i++)

{

StringGrid3->Cells[0][i]="X"+AnsiString(i+StringGrid1->ColCount);

}

->Cells[0][StringGrid3->RowCount-1]="F'";

//Перенос из матрицы 2 в матрицу 3

for(j=1;j<=StringGrid2->RowCount-1;j++)

{

for(i=1;i<=StringGrid2->ColCount-3;i++)

{

StringGrid3->Cells[i+1][j]=StringGrid2->Cells[i][j];

}

}

//Добавление единичной матрицы(j=1;j<=StringGrid3->RowCount-2;j++)

{

for(i=1;i<=StringGrid3->ColCount-1;i++)

{

if(i==j)

{

StringGrid3->Cells[i+1+StringGrid1->ColCount][j]=1;

}

else

{

StringGrid3->Cells[i+1+StringGrid1->ColCount][j]=0;

}

}

}

//Добавление столбца свободных членов(i=1;i<=StringGrid2->RowCount-1;i++)

{

StringGrid3->Cells[1][i]=StringGrid2->Cells[StringGrid2->ColCount-1][i];

}(j=1;j<=StringGrid3->RowCount-2;j++)

{

for(i=2;i<=StringGrid3->ColCount-1;i++)

{

if(StrToFloat(StringGrid3->Cells[i][j])>0)

{

if(i==2)

{

Memo1->Lines->Add(StringGrid3->Cells[i][j]+"x<sub>"+(i-1)+"</sub>");

}

else

{

Memo1->Lines->Add("+"+StringGrid3->Cells[i][j]+"x<sub>"+(i-1)+"</sub>");


}

}

else

{

Memo1->Lines->Add(StringGrid3->Cells[i][j]+"x<sub>"+(i-1)+"</sub>");

}


}

Memo1->Lines->Add("=");

Memo1->Lines->Add(StringGrid3->Cells[1][j]);

Memo1->Lines->Add("</br>");

}

//заполнение нулями нижней строки

for(i=1;i<=StringGrid3->ColCount-1;i++)

{

StringGrid3->Cells[i][StringGrid3->RowCount-1]=0;

}

//Заполнение нижней строки(i=1;i<=StringGrid1->ColCount;i++)

{

convert=StrToFloat(StringGrid1->Cells[i-1][1]);

convert=convert*(-1);

StringGrid3->Cells[i+1][StringGrid3->RowCount-1]=convert;

}

int NCC=0;

Memo1->Lines->Add("После всех преобразований можно стоставить Симплекс таблицу.</br>Исходная Симплекс - таблица:");

cc:;//Поиск отрицательных элементов в нижней строке

int OtrStr=0;(i=2;i<=StringGrid3->ColCount-1;i++)

{

if(StrToFloat(StringGrid3->Cells[i][StringGrid3->RowCount-1])<0)

{

OtrStr++;

}

}

if(OtrStr!=0)

{NCC++;

//Поиск минимального элемента в нижней строке

double MinStlb;

int NomStlb;

MinStlb=StrToFloat(StringGrid3->Cells[2][StringGrid3->RowCount-1]);

NomStlb=2;

for(i=2;i<=StringGrid3->ColCount-1;i++)

{

if(MinStlb>StrToFloat(StringGrid3->Cells[i][StringGrid3->RowCount-1]))

{

MinStlb=StrToFloat(StringGrid3->Cells[i][StringGrid3->RowCount-1]);

NomStlb=i;

}

}

//Поиск положительных элементов в минимальном столбце

int PolStlb=0;

for(i=1;i<=StringGrid3->RowCount-2;i++)

{

if(StrToFloat(StringGrid3->Cells[NomStlb][i])>0)

{

PolStlb++;

}

}

if(PolStlb!=0)

{

//Поиск минимального отношения в столбце

struct MinOt { double Val; int Numb;}; MinOt *Mss = new MinOt [10];

int k=1;

int NomStr;

double MinStr;

for(i=1;i<=StringGrid3->RowCount-2;i++)

{

if(StrToFloat(StringGrid3->Cells[NomStlb][i])>0)

{

Mss[k].Val=StrToFloat(StringGrid3->Cells[1][i])/StrToFloat(StringGrid3->Cells[NomStlb][i]);

Mss[k].Numb=i;

k++;

}

}

MinStlb=Mss[1].Val;

NomStr=Mss[1].Numb;

for(i=1;i<=PolStlb;i++)

{

if(MinStlb>Mss[i].Val)

{

MinStlb=Mss[i].Val;

NomStr=Mss[i].Numb;

}

}->Lines->Add("</br>Цикл "+AnsiString(NCC));->Lines->Add("<table border='1'>");(j=0;j<=StringGrid3->RowCount-1;j++)

{

Memo1->Lines->Add("<tr align='center'>");

for(i=0;i<=StringGrid3->ColCount-1;i++)

{

if(i==0 || j==0)

{

Memo1->Lines->Add("<td bgcolor='#d3d3d3'>"+StringGrid3->Cells[i][j]+"</td>");

}

else

{

if(i==NomStlb && j==NomStr)

{

Memo1->Lines->Add("<td bgcolor='#ff0000'><b>"+StringGrid3->Cells[i][j]+"</b></td>");

}

else

{

if(j==NomStr)

{

Memo1->Lines->Add("<td bgcolor='#ddadaf'>"+StringGrid3->Cells[i][j]+"</td>");

}

else

{

if(i==NomStlb)

{

Memo1->Lines->Add("<td bgcolor='#ccff00'>"+StringGrid3->Cells[i][j]+"</td>");

}

else

{

Memo1->Lines->Add("<td bgcolor='#ffffff'>"+StringGrid3->Cells[i][j]+"</td>");

}

}

}

}


}

Memo1->Lines->Add("</tr>");

}->Lines->Add("</table>");->Lines->Add("</br>");->Lines->Add("Из базиса выводится переменная "+StringGrid3->Cells[0][NomStr]+", а вводится - "+StringGrid3->Cells[NomStlb][0]+"</br>");->Lines->Add("Новое значение: F="+StringGrid3->Cells[1][StringGrid3->RowCount-1]+";</br>");1->Lines->Add("Новый опорный план: ");

for(i=1;i<=StringGrid3->RowCount-2;i++)

{

Memo1->Lines->Add(StringGrid3->Cells[0][i]+"="+StringGrid3->Cells[1][i]+"; ");

}


//Замена строки /-/ столбца

StringGrid3->Cells[0][NomStr]=StringGrid3->Cells[NomStlb][0];

//Деление всех элементов разрешающей строки на разрешающий элемент

double Rest;

double RazEl;

RazEl=StrToFloat(StringGrid3->Cells[NomStlb][NomStr]);

for(i=1;i<=StringGrid3->ColCount-1;i++)

{

convert=StrToFloat(StringGrid3->Cells[i][NomStr]);

Rest=convert/RazEl;

StringGrid3->Cells[i][NomStr]=RoundTo(Rest,-2);

}

//Преобразование столбца свободных счленов

double TekZn, RazZn, KonZn;

for(i=1;i<=StringGrid3->RowCount-1;i++)

{

if(i!=NomStr)

{

TekZn=StrToFloat(StringGrid3->Cells[1][i]);

RazZn=StrToFloat(StringGrid3->Cells[NomStlb][i]);

KonZn=StrToFloat(StringGrid3->Cells[1][NomStr]);

Rest=TekZn-RazZn*KonZn;

StringGrid3->Cells[1][i]=RoundTo(Rest,-2);

}

}

//Преобразование основного массива

for(j=1;j<=StringGrid3->RowCount-1;j++)

{

for(i=2;i<=StringGrid3->ColCount-1;i++)

{

if(j!=NomStr && i!=NomStlb)

{

TekZn=StrToFloat(StringGrid3->Cells[i][j]);

RazZn=StrToFloat(StringGrid3->Cells[NomStlb][j]);

KonZn=StrToFloat(StringGrid3->Cells[i][NomStr]);

Rest=TekZn-RazZn*KonZn;

StringGrid3->Cells[i][j]=RoundTo(Rest,-2);

}

}

}

//Преобразование разрешающего столбца

for(i=1;i<=StringGrid3->RowCount-1;i++)

{

if(i!=NomStr)

{

TekZn=StrToFloat(StringGrid3->Cells[NomStlb][i]);

RazZn=StrToFloat(StringGrid3->Cells[NomStlb][i]);

KonZn=StrToFloat(StringGrid3->Cells[NomStlb][NomStr]);

Rest=TekZn-RazZn*KonZn;

StringGrid3->Cells[NomStlb][i]=RoundTo(Rest,-2);

}

}

goto cc;

}

else

{

Memo1->Lines->Add("</br>Цикл "+AnsiString(NCC));

Memo1->Lines->Add("<table border='1'>");

for(j=0;j<=StringGrid3->RowCount-1;j++)

{

Memo1->Lines->Add("<tr align='center'>");

for(i=0;i<=StringGrid3->ColCount-1;i++)

{

if(i==0 || j==0)

{

Memo1->Lines->Add("<td bgcolor='#d3d3d3'>"+StringGrid3->Cells[i][j]+"</td>");

}

else

{

Memo1->Lines->Add("<td bgcolor='#ffffff'>"+StringGrid3->Cells[i][j]+"</td>");

}

}

Memo1->Lines->Add("</tr>");

}

Memo1->Lines->Add("</table>");

Memo1->Lines->Add("</br>");

Memo1->Lines->Add("</br>Нет решения</br>");

ShowMessage("Нет решения");

Memo1->Lines->SaveToFile("Report.html");

Button6->Enabled=true;

}

}

{

Memo1->Lines->Add("</br>Цикл "+AnsiString(NCC));

Memo1->Lines->Add("<table border='1'>");

for(j=0;j<=StringGrid3->RowCount-1;j++)

{

Memo1->Lines->Add("<tr align='center'>");

for(i=0;i<=StringGrid3->ColCount-1;i++)

{

if(i==0 || j==0)

{

Memo1->Lines->Add("<td bgcolor='#d3d3d3'>"+StringGrid3->Cells[i][j]+"</td>");

}

else

{

Memo1->Lines->Add("<td bgcolor='#ffffff'>"+StringGrid3->Cells[i][j]+"</td>");

}

}

Memo1->Lines->Add("</tr>");

}

Memo1->Lines->Add("</table>");

Memo1->Lines->Add("</br>");

Memo1->Lines->Add("Найден оптимальный план</br>");

Memo1->Lines->Add("Итоговое значение: F="+StringGrid3->Cells[1][StringGrid3->RowCount-1]+";</br>");

Memo1->Lines->Add("Итоговый опорный план: ");

for(i=1;i<=StringGrid3->RowCount-2;i++)

{

Memo1->Lines->Add(StringGrid3->Cells[0][i]+"="+StringGrid3->Cells[1][i]+"; ");

}

ShowMessage("Найден оптимальный план");

Memo1->Lines->SaveToFile("Report.html");

Button6->Enabled=true;

}

}

//---------------------------------------------------------------------------__fastcall TForm1::Button6Click(TObject *Sender)

{->Show();

}

//---------------------------------------------------------------------------

__fastcall TForm1::N2Click(TObject *Sender)

{(Handle,0,"eTest.exe",0,0,0);

}

//---------------------------------------------------------------------------

__fastcall TForm1::N3Click(TObject *Sender)

{->Close();

}

//---------------------------------------------------------------------------



//---------------------------------------------------------------------------


#include <vcl.h>

#pragma hdrstop


#include "Unit2.h"

//---------------------------------------------------------------------------

#pragma package(smart_init)

#pragma link "SHDocVw_OCX"

#pragma resource "*.dfm"*Form2;

//---------------------------------------------------------------------------

__fastcall TForm2::TForm2(TComponent* Owner)

: TForm(Owner)

{

}

//---------------------------------------------------------------------------

__fastcall TForm2::Button2Click(TObject *Sender)

{->Close();

}

//---------------------------------------------------------------------------__fastcall TForm2::Button1Click(TObject *Sender)

{->ExecWB(::OLECMDID_PRINT, ::OLECMDEXECOPT_DONTPROMPTUSER);

}

//---------------------------------------------------------------------------

__fastcall TForm2::FormCreate(TObject *Sender)

{buffer[MAX_PATH];(sizeof(buffer),buffer);dir=AnsiString(buffer);->Navigate(WideString(dir+"/Report.html"));

}

//---------------------------------------------------------------------------

__fastcall TForm2::FormActivate(TObject *Sender)

{buffer[MAX_PATH];(sizeof(buffer),buffer);dir=AnsiString(buffer);->Navigate(WideString(dir+"/Report.html"));

}


Модуль eTest



//---------------------------------------------------------------------------


#include <vcl.h>

#pragma hdrstop


#include "Unit1.h"

#include "Unit2.h"

#include "Unit3.h"

#include "Unit4.h"

#include "Unit5.h"

#include "Unit6.h"

#include "Unit7.h"

#include "Unit8.h"

#include "Unit9.h"

//---------------------------------------------------------------------------

#pragma package(smart_init)

#pragma resource "*.dfm"*Form1;

ID;Login;sName;SurName;Group;Status;DateOfRegist;TimeOfRegist;Lock;AVTORIZ="NO";


//---------------------------------------------------------------------------

__fastcall TForm1::TForm1(TComponent* Owner)

: TForm(Owner)

{

}

//---------------------------------------------------------------------------__fastcall TForm1::Button1Click(TObject *Sender)

{->Show();

}

//---------------------------------------------------------------------------__fastcall TForm1::Button2Click(TObject *Sender)

{->Show();

}

//---------------------------------------------------------------------------






__fastcall TForm1::N8Click(TObject *Sender)

{->Close();

}

//---------------------------------------------------------------------------

__fastcall TForm1::N4Click(TObject *Sender)

{->Show();

}

//---------------------------------------------------------------------------

__fastcall TForm1::N5Click(TObject *Sender)

{->Show();

}

//---------------------------------------------------------------------------

__fastcall TForm1::N6Click(TObject *Sender)

{(MessageDlg("Завершить сеанс ?", mtWarning, TMsgDlgButtons() <<mbYes << mbNo, 0)==mrYes)

{=0;="";="";="";="";="";="";="";=0;="NO";

->N4->Enabled=true;->N5->Enabled=true;->N6->Enabled=false;

Form1->N7->Enabled=false;->N9->Enabled=false;->N10->Enabled=false;


}

else

{return;}

}

//---------------------------------------------------------------------------

__fastcall TForm1::N7Click(TObject *Sender)

{->Show();

}

//---------------------------------------------------------------------------

__fastcall TForm1::N10Click(TObject *Sender)

{->Show();

}

//---------------------------------------------------------------------------

__fastcall TForm1::Button4Click(TObject *Sender)

{->Show();->Show();

}

//---------------------------------------------------------------------------

__fastcall TForm1::Button3Click(TObject *Sender)

{Type;(AVTORIZ=="NO")

{

ShowMessage("Пройдите процедуру авторизации");

Form5->Show();

}

{

DM3->ADOQuery1->Active=false;

DM3->ADOQuery1->SQL->Text="Select Type From Questions Where ID=1";

DM3->ADOQuery1->Active=true;


if(Form4->DBGrid1->Columns->Items[0]->Field->Value.IsNull())

{

ShowMessage("Нет вопросов в базе");

}

else

{

Type=Form4->DBGrid1->Columns->Items[0]->Field->Value;

}

Form9->Show();

}


}

//---------------------------------------------------------------------------

__fastcall TForm1::N9Click(TObject *Sender)

{->Show();

}

//---------------------------------------------------------------------------




//---------------------------------------------------------------------------

#include <vcl.h>

#include <md5.h>

#include <md5.cpp>

#include <DateUtils.hpp>

#pragma hdrstop


#include "Unit1.h"

#include "Unit2.h"

#include "Unit3.h"

#include "Unit4.h"

#include "Unit5.h"

//---------------------------------------------------------------------------

#pragma package(smart_init)

#pragma resource "*.dfm"*Form2;

//---------------------------------------------------------------------------

__fastcall TForm2::TForm2(TComponent* Owner)

: TForm(Owner)

{

}

//---------------------------------------------------------------------------

__fastcall TForm2::Button2Click(TObject *Sender)

{->Close();

}

//---------------------------------------------------------------------------

__fastcall TForm2::Button3Click(TObject *Sender)

{->Text="";->Text="";->Text="";->Text="";->Text="";->Text="";

}

//---------------------------------------------------------------------------

__fastcall TForm2::Button1Click(TObject *Sender)

{

//Проверка правильности заполнения полей

AnsiString Error="Регистрация не может бытьпроизведена:";

int err=0;

(Edit1->Text=="")

{

err++;

Error=Error+"\nНе заполнено поле 'Логин'";

}

(Edit2->Text=="")

{

err++;

Error=Error+"\nНе заполнено поле 'Пароль'";

}


if(Edit3->Text=="")

{

err++;

Error=Error+"\nНе заполнено поле 'Подтверждение пароля'";

}

(Edit4->Text=="")

{

err++;

Error=Error+"\nНе заполнено поле 'Имя'";

}

(Edit5->Text=="")

{

err++;

Error=Error+"\nНе заполнено поле 'Фамилия'";

}

(Edit6->Text=="")

{

err++;

Error=Error+"\nНе заполнено поле 'Группа'";

}

(Edit2->Text!=Edit3->Text)

{

err++;

Error=Error+"\nВведенные пароли не совпадают";

}

(err!=0)

{

ShowMessage(Error);

return;

}




//Проверка повтора логина->ADOQuery1->Active=false;->ADOQuery1->SQL->Text="SELECT * FROM Users Where Login='"+Edit1->Text+"'";3->ADOQuery1->Active=true;


//Определение текущих даты / времени

TDateTime DATE;

DATE=Now();MaxIDU;(Form4->DBGrid1->Columns->Items[1]->Field->Value.IsNull())

{

//Получаем максимальный ID пользователя

DM3->ADOQuery1->Active=false;

DM3->ADOQuery1->SQL->Text="Select Max(ID) From Users";

DM3->ADOQuery1->Active=true;

if(Form4->DBGrid1->Columns->Items[0]->Field->Value.IsNull())

{

MaxIDU=1;

}

else

{

MaxIDU=Form4->DBGrid1->Columns->Items[0]->Field->Value;

MaxIDU++;

}

DM3->ADOCommand1->CommandText="INSERT INTO Users VALUES("+IntToStr(MaxIDU)+",'"+Edit1->Text+"','"+MD5(Edit2->Text)+"','"+Edit4->Text+"','"+Edit5->Text+"','"+Edit6->Text+"','Student','"+DateToStr(DATE)+"','"+TimeToStr(DATE)+"','0')";

DM3->ADOCommand1->Execute();


}

{

ShowMessage("Логин "+Edit1->Text+" уже используется.\nПожалуйста, введите другой Логин.");

Edit1->Text="";

return;

}

("Регистрация успешно произведена.\nЛогин: "+Edit1->Text+"\nИмя: "+Edit4->Text+"\nФамилия: "+Edit5->Text+"\nГруппа: "+Edit6->Text);

->Text="";->Text="";->Text="";->Text="";->Text="";->Text="";

->Close();->Show();

}

//---------------------------------------------------------------------------__fastcall TForm2::FormCreate(TObject *Sender)

{


}

//---------------------------------------------------------------------------



//---------------------------------------------------------------------------


#include <vcl.h>

#pragma hdrstop


#include "Unit1.h"

#include "Unit2.h"

#include "Unit3.h"

#include "Unit4.h"

#include "Unit5.h"

#include "Unit6.h"

#include "Unit7.h"

#include "Unit8.h"

#include "Unit9.h"

#include "Unit10.h"

//---------------------------------------------------------------------------

#pragma package(smart_init)

#pragma resource "*.dfm"*Form4;

//---------------------------------------------------------------------------

__fastcall TForm4::TForm4(TComponent* Owner)

: TForm(Owner)

{

}

//---------------------------------------------------------------------------

__fastcall TForm4::RadioButton4Click(TObject *Sender)

{->ADOQuery1->Active=false;->ADOQuery1->SQL->Text="Select * From Users";->ADOQuery1->Active=true;

->Columns->Items[0]->Width=90;->Columns->Items[1]->Width=90;->Columns->Items[2]->Width=90;->Columns->Items[3]->Width=90;->Columns->Items[4]->Width=90;->Columns->Items[5]->Width=90;->Columns->Items[6]->Width=90;->Columns->Items[7]->Width=90;->Columns->Items[8]->Width=90;->Columns->Items[9]->Width=90;


}

//---------------------------------------------------------------------------__fastcall TForm4::RadioButton3Click(TObject *Sender)

{->ADOQuery1->Active=false;->ADOQuery1->SQL->Text="Select * From Questions";->ADOQuery1->Active=true;

->Columns->Items[0]->Width=90;->Columns->Items[1]->Width=90;->Columns->Items[2]->Width=90;->Columns->Items[3]->Width=90;

}

//---------------------------------------------------------------------------

__fastcall TForm4::RadioButton2Click(TObject *Sender)

{->ADOQuery1->Active=false;->ADOQuery1->SQL->Text="SELECT Questions.ID, Questions.Question, Ansvers.ID, Ansvers.IDQ, Ansvers.Ansver, Ansvers.[True] FROM Questions INNER JOIN Ansvers ON Questions.ID = Ansvers.IDQ;";->ADOQuery1->Active=true;

->Columns->Items[0]->Width=90;->Columns->Items[1]->Width=90;->Columns->Items[2]->Width=90;->Columns->Items[3]->Width=90;->Columns->Items[4]->Width=90;->Columns->Items[5]->Width=90;

}

//---------------------------------------------------------------------------__fastcall TForm4::RadioButton1Click(TObject *Sender)

{->ADOQuery1->Active=false;->ADOQuery1->SQL->Text="SELECT * FROM TestResult";->ADOQuery1->Active=true;

->Columns->Items[0]->Width=90;->Columns->Items[1]->Width=90;->Columns->Items[2]->Width=90;->Columns->Items[3]->Width=90;->Columns->Items[4]->Width=90;

}

//---------------------------------------------------------------------------__fastcall TForm4::Button2Click(TObject *Sender)

{i;D;(MaskEdit1->Text==" . . ")

{

ShowMessage("Введите дату");

return;

}

=MaskEdit1->Text;[3]='/';[6]='/';

->ADOQuery1->Active=false;->ADOQuery1->SQL->Text="SELECT Users.ID, Users.Login, Users.sName, Users.Surname, Users.Group, Users.Status, TestResult.DateOfTest, TestResult.OTC, TestResult.FileName FROM Users INNER JOIN TestResult ON Users.ID = TestResult.IDS Where DateOfTest = #"+D+"#";->ADOQuery1->Active=true;

->Columns->Items[0]->Width=90;->Columns->Items[1]->Width=90;->Columns->Items[2]->Width=90;->Columns->Items[3]->Width=90;->Columns->Items[4]->Width=90;->Columns->Items[5]->Width=90;->Columns->Items[6]->Width=90;->Columns->Items[7]->Width=90;->Columns->Items[8]->Width=90;

->Clear();->Lines->SaveToFile("AdminReport.html");

->Lines->Add("<html>");->Lines->Add("<head>");->Lines->Add("<title>Быстрый отчет</title>");->Lines->Add("<meta http-equiv='Content-Type' content='text/html; charset=windows-1251'>");->Lines->Add("</head>");->Lines->Add("<body>");->Lines->Add("<center><h2>Отчет за "+MaskEdit1->Text+"</h2></center>");

->Lines->Add("<table border='1'>");->Lines->Add("<tr bgcolor='#d3d3d3' align='center'><td>ID Пользователя</td><td>Логин</td><td>Имя</td><td>Фамилия</td><td>Группа</td><td>Статус</td><td>Дата тестирования</td><td>Оценка</td><td>Файл отчета</td></tr>");

->DataSource->DataSet->First();(!DBGrid1->DataSource->DataSet->Eof)

{


Memo1->Lines->Add("<tr align='center'><td>"+DBGrid1->Columns->Items[0]->Field->Value+"</td><td>"+DBGrid1->Columns->Items[1]->Field->Value+"</td><td>"+DBGrid1->Columns->Items[2]->Field->Value+"</td><td>"+DBGrid1->Columns->Items[3]->Field->Value+"</td><td>"+DBGrid1->Columns->Items[4]->Field->Value+"</td><td>"+DBGrid1->Columns->Items[5]->Field->Value+"</td><td>"+DBGrid1->Columns->Items[6]->Field->Value+"</td><td>"+DBGrid1->Columns->Items[7]->Field->Value+"</td><td>"+DBGrid1->Columns->Items[8]->Field->Value+"</td></tr>");

DBGrid1->DataSource->DataSet->Next();


}->Lines->Add("</table>");->Lines->SaveToFile("AdminReport.html");

->Show();

}

//---------------------------------------------------------------------------__fastcall TForm4::Button3Click(TObject *Sender)

{i;D1, D2;

(MaskEdit2->Text==" . . ")

{

ShowMessage("Введите дату 'C'");

return;

}(MaskEdit3->Text==" . . ")

{

ShowMessage("Введите дату 'По'");

return;

}

=MaskEdit2->Text;[3]='/';[6]='/';

=MaskEdit3->Text;[3]='/';[6]='/';

->ADOQuery1->Active=false;->ADOQuery1->SQL->Text="SELECT Users.ID, Users.Login, Users.sName, Users.Surname, Users.Group, Users.Status, TestResult.DateOfTest, TestResult.OTC, TestResult.FileName FROM Users INNER JOIN TestResult ON Users.ID = TestResult.IDS Where DateOfTest Between #"+D1+"# and #"+D2+"#";->ADOQuery1->Active=true;

->Columns->Items[0]->Width=90;->Columns->Items[1]->Width=90;->Columns->Items[2]->Width=90;->Columns->Items[3]->Width=90;->Columns->Items[4]->Width=90;->Columns->Items[5]->Width=90;->Columns->Items[6]->Width=90;->Columns->Items[7]->Width=90;->Columns->Items[8]->Width=90;->Clear();->Lines->SaveToFile("AdminReport.html");

->Lines->Add("<html>");->Lines->Add("<head>");->Lines->Add("<title>Быстрый отчет</title>");->Lines->Add("<meta http-equiv='Content-Type' content='text/html; charset=windows-1251'>");->Lines->Add("</head>");->Lines->Add("<body>");->Lines->Add("<center><h2>Отчет за период с "+MaskEdit2->Text+" по "+MaskEdit3->Text+"</h2></center>");

->Lines->Add("<table border='1'>");->Lines->Add("<tr bgcolor='#d3d3d3' align='center'><td>ID Пользователя</td><td>Логин</td><td>Имя</td><td>Фамилия</td><td>Группа</td><td>Статус</td><td>Дата тестирования</td><td>Оценка</td><td>Файл отчета</td></tr>");

->DataSource->DataSet->First();(!DBGrid1->DataSource->DataSet->Eof)

{


Memo1->Lines->Add("<tr align='center'><td>"+DBGrid1->Columns->Items[0]->Field->Value+"</td><td>"+DBGrid1->Columns->Items[1]->Field->Value+"</td><td>"+DBGrid1->Columns->Items[2]->Field->Value+"</td><td>"+DBGrid1->Columns->Items[3]->Field->Value+"</td><td>"+DBGrid1->Columns->Items[4]->Field->Value+"</td><td>"+DBGrid1->Columns->Items[5]->Field->Value+"</td><td>"+DBGrid1->Columns->Items[6]->Field->Value+"</td><td>"+DBGrid1->Columns->Items[7]->Field->Value+"</td><td>"+DBGrid1->Columns->Items[8]->Field->Value+"</td></tr>");

DBGrid1->DataSource->DataSet->Next();


}->Lines->Add("</table>");->Lines->SaveToFile("AdminReport.html");->Show();


}

//---------------------------------------------------------------------------

__fastcall TForm4::Button1Click(TObject *Sender)

{->Show();

}

//---------------------------------------------------------------------------

__fastcall TForm4::Button4Click(TObject *Sender)

{->Show();

}

//---------------------------------------------------------------------------

__fastcall TForm4::Button5Click(TObject *Sender)

{->Show();

}

//---------------------------------------------------------------------------__fastcall TForm4::Button6Click(TObject *Sender)

{->Show();

}

//---------------------------------------------------------------------------

__fastcall TForm4::Button7Click(TObject *Sender)

{->Show();

}

//---------------------------------------------------------------------------



//---------------------------------------------------------------------------


#include <vcl.h>

#include <md5.h>

#include <md5.cpp>

#pragma hdrstop


#include "Unit1.h"

#include "Unit2.h"

#include "Unit3.h"

#include "Unit4.h"

#include "Unit5.h"

#include "Unit6.h"

//---------------------------------------------------------------------------

#pragma package(smart_init)

#pragma resource "*.dfm"*Form5;int ID;AnsiString Login;AnsiString sName;AnsiString SurName;AnsiString Group;AnsiString Status;AnsiString DateOfRegist;AnsiString TimeOfRegist;AnsiString Lock;AnsiString AVTORIZ;


//---------------------------------------------------------------------------

__fastcall TForm5::TForm5(TComponent* Owner)

: TForm(Owner)

{

}

//---------------------------------------------------------------------------__fastcall TForm5::Button2Click(TObject *Sender)

{->Close();

}

//---------------------------------------------------------------------------__fastcall TForm5::Button1Click(TObject *Sender)

{Error;err=0;

(Edit1->Text=="")

{

err++;

Error=Error+"Вы не ввели Логин";

}

(Edit2->Text=="")

{

err++;

Error=Error+"\nВы не ввели Пароль";

}

(err!=0)

{

ShowMessage(Error);

return;

}


//Проверка наличия Логина в базе->ADOQuery1->Active=false;->ADOQuery1->SQL->Text="Select * From Users Where Login='"+Edit1->Text+"'";->ADOQuery1->Active=true;

(Form4->DBGrid1->Columns->Items[1]->Field->Value.IsNull())

{

ShowMessage("Пользователь с таким логином в базе не зарегистрирован");


Form2->Show();

}

{

DM3->ADOQuery1->Active=false;

DM3->ADOQuery1->SQL->Text="Select * From Users Where Login='"+Edit1->Text+"'";

DM3->ADOQuery1->Active=true;


if(MD5(Edit2->Text)==Form4->DBGrid1->Columns->Items[2]->Field->Value)

{

ID=Form4->DBGrid1->Columns->Items[0]->Field->Value;

Login=Form4->DBGrid1->Columns->Items[1]->Field->Value;

sName=Form4->DBGrid1->Columns->Items[3]->Field->Value;

SurName=Form4->DBGrid1->Columns->Items[4]->Field->Value;

Group=Form4->DBGrid1->Columns->Items[5]->Field->Value;

Status=Form4->DBGrid1->Columns->Items[6]->Field->Value;

DateOfRegist=Form4->DBGrid1->Columns->Items[7]->Field->Value;

TimeOfRegist=Form4->DBGrid1->Columns->Items[8]->Field->Value;

Lock=Form4->DBGrid1->Columns->Items[9]->Field->Value;

AVTORIZ="YES";


ShowMessage("Вход успешно выполнен \nID: "+AnsiString(ID)+"\nЛогин: "+Login+"\nИмя: "+sName+"\nФамилия: "+SurName+"\nГруппа: "+Group+"\nСтатус: "+Status+"\nАктивен: "+AVTORIZ);


Form1->N4->Enabled=false;

Form1->N5->Enabled=false;

Form1->N6->Enabled=true;

Form1->N7->Enabled=true;

Form1->N9->Enabled=true;

if(Status=="Admin")

{

Form1->N10->Enabled=true;

}

else

{

Form1->N10->Enabled=false;

}


Form6->Label10->Caption=AnsiString(ID);

Form6->Label11->Caption=sName;

Form6->Label12->Caption=SurName;

Form6->Label13->Caption=Group;

Form6->Label14->Caption=Status;

Form6->Label15->Caption=DateOfRegist;

Form6->Label16->Caption=TimeOfRegist;

if(Lock!=0){Form6->Label17->Caption="Незаблокирован";Form6->Label17->Color=clLime;}else{Form6->Label17->Caption="Заблокирован"; Form6->Label17->Color=clRed;};

if(AVTORIZ=="YES"){Form6->Label18->Caption="Активен";Form6->Label18->Color=clLime;}else{Form6->Label18->Caption="Неактивен";Form6->Label18->Color=clRed;}


}

else

{

ShowMessage("Введенные Логин и Пароль не соппадают");

return;

}

}

//ShowMessage(ID);ShowMessage(Login);ShowMessage(sName);ShowMessage(SurName);ShowMessage(Group);ShowMessage(DateOfRegist);ShowMessage(TimeOfRegist);ShowMessage(Lock);ShowMessage(AVTORIZ);

->Text="";->Text="";

->Close();

}

//---------------------------------------------------------------------------__fastcall TForm5::FormCreate(TObject *Sender)

{


}

//---------------------------------------------------------------------------



//---------------------------------------------------------------------------


#include <vcl.h>

#include <md5.h>

#include <md5.cpp>

#pragma hdrstop


#include "Unit3.h"

#include "Unit4.h"

#include "Unit7.h"

#include "Unit8.h"

//---------------------------------------------------------------------------

#pragma package(smart_init)

#pragma link "CSPIN"

#pragma resource "*.dfm"*Form7;

*Label[65536];*Edit[65536];*RadioButton[65536];


//---------------------------------------------------------------------------

__fastcall TForm7::TForm7(TComponent* Owner)

: TForm(Owner)

{

}

//---------------------------------------------------------------------------__fastcall TForm7::Button1Click(TObject *Sender)

{(int i=1;i<=CSpinEdit1->Value;i++)

{

if(i==1)

{

Label[i] = new TLabel(this);

Label[i]->Parent = this;

Label[i]->Name = "Label"+AnsiString(i);

Label[i]->Left = 8;

Label[i]->Top = 312;

Label[i]->Caption="Ответ "+AnsiString(i);

Label[i]->Font->Name="Arial";

Label[i]->Font->Size=10;


Edit[i] = new TEdit(this);

Edit[i]->Parent = this;

Edit[i]->Name = "Edit"+AnsiString(i);

Edit[i]->Width=596;

Edit[i]->Height=21;

Edit[i]->Left = 8;

Edit[i]->Top = 330;

Edit[i]->Text="";

Edit[i]->Font->Name="Arial";

Edit[i]->Font->Size=10;


RadioButton[i] = new TRadioButton(this);

RadioButton[i]->Parent = this;

RadioButton[i]->Name = "RadioButton"+AnsiString(i);

RadioButton[i]->Width=101;

RadioButton[i]->Height=17;

RadioButton[i]->Left = 610;

RadioButton[i]->Top = 332;

RadioButton[i]->Caption="Верный ответ";

RadioButton[i]->Font->Name="Arial";

RadioButton[i]->Font->Size=10;


}

else

{

Label[i] = new TLabel(this);

Label[i]->Parent = this;

Label[i]->Name = "Label"+AnsiString(i);

Label[i]->Left = 8;

Label[i]->Top = Edit[i-1]->Top+Edit[i-1]->Height+8;

Label[i]->Caption="Ответ "+AnsiString(i);

Label[i]->Font->Name="Arial";

Label[i]->Font->Size=10;


Edit[i] = new TEdit(this);

Edit[i]->Parent = this;

Edit[i]->Name = "Edit"+AnsiString(i);

Edit[i]->Width=596;

Edit[i]->Height=21;

Edit[i]->Left = 8;

Edit[i]->Top = Label[i]->Top+Label[i]->Height+3;

Edit[i]->Text="";

Edit[i]->Font->Name="Arial";

Edit[i]->Font->Size=10;


RadioButton[i] = new TRadioButton(this);

RadioButton[i]->Parent = this;

RadioButton[i]->Name = "RadioButton"+AnsiString(i);

RadioButton[i]->Width=101;

RadioButton[i]->Height=17;

RadioButton[i]->Left = 610;

RadioButton[i]->Top = Edit[i]->Top;

RadioButton[i]->Caption="Верный ответ";

RadioButton[i]->Font->Name="Arial";

RadioButton[i]->Font->Size=10;


}


}->Enabled=false;->Enabled=true;->Enabled=true;

}

//---------------------------------------------------------------------------__fastcall TForm7::Button3Click(TObject *Sender)

{

AnsiString Error;

int err;

Error = "Невозможно произвести сохранение вопроса в базе данных, т.к. не заполнены следующие поля:";

err=0;RBS;=0;

bul;


MaxIDQ;

int MaxIDA;


//Проверка правильности заполнения

if(Memo1->Text==""){Error=Error+"\nТекст вопроса;"; err++;}

(int i=1;i<=CSpinEdit1->Value;i++)

{

if(Edit[i]->Text=="")

{

Error=Error+"\nТекст ответа "+AnsiString(i)+";"; err++;

}

}

(int i=1;i<=CSpinEdit1->Value;i++)

{

if(RadioButton[i]->Checked==true)

{

RBS=1;

}

}

(RBS==0){Error=Error+"\nНевыбран правильный ответ;"; err++;}


(err!=0){ShowMessage(Error);RBS=0; err=0; return;}



//Конец проверки правильности заполнения


//Запись вопроса в базу

DM3->ADOQuery1->Active=false;->ADOQuery1->SQL->Text="Select Max(ID) from Questions";->ADOQuery1->Active=true;

(Form4->DBGrid1->Columns->Items[0]->Field->Value.IsNull())

{

MaxIDQ=1;

}

{

MaxIDQ=Form4->DBGrid1->Columns->Items[0]->Field->Value;

MaxIDQ++;

}->ADOCommand1->CommandText="INSERT INTO Questions VALUES("+IntToStr(MaxIDQ)+",'"+Memo1->Text+"','1',NULL)";3->ADOCommand1->Execute();

//Конец записи вопроса в базу


//Запись ответов в базу

DM3->ADOQuery1->Active=false;

DM3->ADOQuery1->SQL->Text="Select Max(ID) from Ansvers";->ADOQuery1->Active=true;

(Form4->DBGrid1->Columns->Items[0]->Field->Value.IsNull())

{

MaxIDA=1;

}

{

MaxIDA=Form4->DBGrid1->Columns->Items[0]->Field->Value;

MaxIDA++;

}

(int i=1;i<=CSpinEdit1->Value;i++)

{

if(RadioButton[i]->Checked==true){bul=Edit[i]->Text+"True";}else{bul=Edit[i]->Text+"False";}


DM3->ADOCommand1->CommandText="INSERT INTO Ansvers VALUES("+IntToStr(MaxIDA)+",'"+IntToStr(MaxIDQ)+"','"+Edit[i]->Text+"','"+MD5(bul+" Fastex")+"')";

DM3->ADOCommand1->Execute();

MaxIDA++;

}


ShowMessage("Запись в базу произведена успешно");

//Конец записи ответов в базу



for (int i=1;i<=CSpinEdit1->Value;i++)

{Label[i]->Free();

Edit[i]->Free();

RadioButton[i]->Free();}

CSpinEdit1->Value=1;->Enabled=true;->Enabled=false;


}

//---------------------------------------------------------------------------__fastcall TForm7::Button2Click(TObject *Sender)

{


if(MessageDlg("При правке ответов, текущая структура будет удалена. Придется создавать ее снова. Продолжить ?", mtWarning, TMsgDlgButtons() <<mbYes << mbNo, 0)==mrYes)

{

for (int i=1;i<=CSpinEdit1->Value;i++)

{

Label[i]->Free();

Edit[i]->Free();

RadioButton[i]->Free();

}

CSpinEdit1->Value=1;

Button1->Enabled=true;

Button2->Enabled=false;

Button3->Enabled=false;


}

else

{

return;

}

}

//---------------------------------------------------------------------------



__fastcall TForm7::R2adioButton2Click(TObject *Sender)

{->Top=Form7->Top;->Left=Form7->Left;->Show();->Close();->R2adioButton2->Checked=true;

}

//---------------------------------------------------------------------------

__fastcall TForm7::FormCreate(TObject *Sender)

{


}

//---------------------------------------------------------------------------


//---------------------------------------------------------------------------


#include <vcl.h>

#include <md5.h>

#include <md5.cpp>

#include <jpeg.hpp>

#pragma hdrstop


#include "Unit3.h"

#include "Unit4.h"

#include "Unit6.h"

#include "Unit7.h"

#include "Unit8.h"

//---------------------------------------------------------------------------

#pragma package(smart_init)

#pragma resource "*.dfm"*Form8;DBFName;

//---------------------------------------------------------------------------

__fastcall TForm8::TForm8(TComponent* Owner)

: TForm(Owner)

{

}

//---------------------------------------------------------------------------


__fastcall TForm8::R1adioButton1Click(TObject *Sender)

{->Top=Form8->Top;->Left=Form8->Left;->Show();->Close();->R1adioButton1->Checked=true;

}

//---------------------------------------------------------------------------__fastcall TForm8::Button1Click(TObject *Sender)

{FName, Dir, NewName;->Execute();->Text=OpenPictureDialog1->FileName;->Text=OpenPictureDialog1->FileName;=ExtractFileDir(Application->ExeName); // Извлечение адреса текущей директории запуска программы

FName=ExtractFileName(Edit1->Text);//Извлечение имени графического файла

NewName=Dir+"\\images\+FName; // Описание адреса копирования файла

DBFName=FName;

CopyFile(FName.c_str(),NewName.c_str(), false); // Копирование графического файла в собственную директорию

Image1->Picture->LoadFromFile(NewName);->Visible=true;->Visible=true;->Height=250;->Top=Image1->Top+Image1->Height+5;->Top=Label2->Top+Label2->Height+3;->Top=Memo1->Top+Memo1->Height+15;->Top=Label3->Top+Label3->Height+5;->Top=Edit2->Top+Edit2->Height+25;

}

//---------------------------------------------------------------------------

__fastcall TForm8::Button3Click(TObject *Sender)

{

AnsiString Error="Сохранение произвести невозможно";

int err=0;MaxIDQ;MaxIDA;

(Memo1->Text=="")

{

err++;

Error=Error+"\nНе введет текст вопроса";

}

(Edit2->Text=="")

{

err++;

Error=Error+"\nНе введет текст ответа";

}

(err!=0)

{

ShowMessage(Error); return;

}



->ADOQuery1->Active=false;->ADOQuery1->SQL->Text="Select Max(ID) from Questions";->ADOQuery1->Active=true;

(Form4->DBGrid1->Columns->Items[0]->Field->Value.IsNull())

{

MaxIDQ=1;

}

{

MaxIDQ=Form4->DBGrid1->Columns->Items[0]->Field->Value;

MaxIDQ++;

}(OpenPictureDialog1->FileName=="")

{

DM3->ADOCommand1->CommandText="INSERT INTO Questions VALUES("+IntToStr(MaxIDQ)+",'"+Memo1->Text+"','2',NULL)";

DM3->ADOCommand1->Execute();

}

{

DM3->ADOCommand1->CommandText="INSERT INTO Questions VALUES("+IntToStr(MaxIDQ)+",'"+Memo1->Text+"','2','"+DBFName+"')";

DM3->ADOCommand1->Execute();

}


->ADOQuery1->Active=false;->ADOQuery1->SQL->Text="Select Max(ID) from Ansvers";->ADOQuery1->Active=true;(Form4->DBGrid1->Columns->Items[0]->Field->Value.IsNull())

{

MaxIDA=1;

}

{

MaxIDA=Form4->DBGrid1->Columns->Items[0]->Field->Value;

MaxIDA++;

}


DM3->ADOCommand1->CommandText="INSERT INTO Ansvers VALUES("+IntToStr(MaxIDA)+",'"+IntToStr(MaxIDQ)+"','"+Memo1->Text+"','"+MD5(Edit2->Text+" Fastex")+"')";

DM3->ADOCommand1->Execute();


ShowMessage("Запись успешно завершена");

}

//---------------------------------------------------------------------------

__fastcall TForm8::FormCreate(TObject *Sender)

{


}

//---------------------------------------------------------------------------




//---------------------------------------------------------------------------


#include <vcl.h>

#include <md5.h>

#include <md5.cpp>

#pragma hdrstop


#include "Unit3.h"

#include "Unit4.h"

#include "Unit9.h"

//---------------------------------------------------------------------------

#pragma package(smart_init)

#pragma resource "*.dfm"*Form9;

*RadioButton[65536];

int ID;AnsiString Login;AnsiString sName;AnsiString SurName;AnsiString Group;AnsiString Status;AnsiString DateOfRegist;AnsiString TimeOfRegist;AnsiString Lock;AnsiString AVTORIZ;

NowIDQ=1;NowIDA=1;

MaxIDQ;MaxIDA;

Ans=0;TrAns=0;

CControl=0;


//---------------------------------------------------------------------------

__fastcall TForm9::TForm9(TComponent* Owner)

: TForm(Owner)

{

}

//---------------------------------------------------------------------------

__fastcall TForm9::Button1Click(TObject *Sender)

{i;=1;=1;=0;=0;

AnsiString Type;

//Заполнение полей идентификации

Label10->Caption=ID;->Caption=Login;->Caption=sName;->Caption=SurName;->Caption=Group;->Caption=Status;(AVTORIZ=="YES"){Label16->Caption="Да";Label16->Color=clLime;}else{Label16->Caption="Нет";Label16->Color=clRed;}

//Проверка наличия вопросов в базе

DM3->ADOQuery1->Active=false;

DM3->ADOQuery1->SQL->Text="Select * From Questions";->ADOQuery1->Active=true;

(Form4->DBGrid1->Columns->Items[0]->Field->Value.IsNull())

{

ShowMessage("В базе отсутствуют вопросы");

return;

}


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

DM3->ADOQuery1->Active=false;->ADOQuery1->SQL->Text="Select Max(ID) From Questions";->ADOQuery1->Active=true;

=Form4->DBGrid1->Columns->Items[0]->Field->Value;



//Дополнение идентификации->Caption=AnsiString(NowIDQ);->Caption=AnsiString(MaxIDQ);



//Очистка предыдущих вариантов

if(CControl==1)

{

for(i=1;i<=MaxIDA;i++)

{

RadioButton[i]->Free();

}

}



//Определение типа вопроса

DM3->ADOQuery1->Active=false;->ADOQuery1->SQL->Text="Select Type From Questions Where ID="+AnsiString(NowIDQ);->ADOQuery1->Active=true;

=Form4->DBGrid1->Columns->Items[0]->Field->Value;

(Type=="1")

{

//Расстановка элементов

Label1->Visible=true;

Memo1->Visible=true;

Label2->Visible=true;


Label1->Top=8;

Memo1->Top=32;


Label17->Visible=false;

Image1->Visible=false;

Label23->Visible=false;

Edit1->Visible=false;


//Загрузка вопроса на форму

DM3->ADOQuery1->Active=false;

DM3->ADOQuery1->SQL->Text="Select * From Questions Where ID="+AnsiString(NowIDQ);

DM3->ADOQuery1->Active=true;


Memo1->Text=Form4->DBGrid1->Columns->Items[1]->Field->Value;


//Получение количества ответов

DM3->ADOQuery1->Active=false;

DM3->ADOQuery1->SQL->Text="SELECT Count(Ansvers.ID) FROM Questions INNER JOIN Ansvers ON Questions.ID = Ansvers.IDQ Where IDQ="+AnsiString(NowIDQ);;

DM3->ADOQuery1->Active=true;


MaxIDA=Form4->DBGrid1->Columns->Items[0]->Field->Value;


//Формирование вариантов ответов

int i;

for(i=1;i<=MaxIDA;i++)

{

if(i==1)

{

DM3->ADOQuery1->Active=false;

DM3->ADOQuery1->SQL->Text="SELECT * From Ansvers where ID="+AnsiString(NowIDA);

DM3->ADOQuery1->Active=true;


RadioButton[i] = new TRadioButton(this);

RadioButton[i]->Parent = this;

RadioButton[i]->Name = "RadioButton"+AnsiString(i);

RadioButton[i]->Left = 8;

RadioButton[i]->Top = 165;

RadioButton[i]->Caption=Form4->DBGrid1->Columns->Items[2]->Field->Value;

RadioButton[i]->Font->Name="Arial";

RadioButton[i]->Font->Size=10;



CControl=1;

NowIDA++;

}

else

{

DM3->ADOQuery1->Active=false;

DM3->ADOQuery1->SQL->Text="SELECT * From Ansvers where ID="+AnsiString(NowIDA);

DM3->ADOQuery1->Active=true;


RadioButton[i] = new TRadioButton(this);

RadioButton[i]->Parent = this;

RadioButton[i]->Name = "RadioButton"+AnsiString(i);

RadioButton[i]->Left = 8;

RadioButton[i]->Top = RadioButton[i]->Height+RadioButton[i-1]->Top+2;

RadioButton[i]->Caption=Form4->DBGrid1->Columns->Items[2]->Field->Value;

RadioButton[i]->Font->Name="Arial";

RadioButton[i]->Font->Size=10;


CControl=1;

NowIDA++;

}

}->Enabled=false;->Enabled=true;3->Enabled=true;

}

else

{

//Определение наличия картинки

DM3->ADOQuery1->Active=false;

DM3->ADOQuery1->SQL->Text="Select * From Questions Where ID="+AnsiString(NowIDQ);

DM3->ADOQuery1->Active=true;


if(Form4->DBGrid1->Columns->Items[3]->Field->Value.IsNull())

{

Label1->Visible=false;

Label2->Visible=false;


Memo1->Visible=true;

Label17->Visible=true;

Image1->Visible=true;

Label23->Visible=true;

Edit1->Visible=true;



//Загрузка вопроса на форму

DM3->ADOQuery1->Active=false;

DM3->ADOQuery1->SQL->Text="Select * From Questions Where ID="+AnsiString(NowIDQ);

DM3->ADOQuery1->Active=true;

Memo1->Text=Form4->DBGrid1->Columns->Items[1]->Field->Value;


CControl=0;

NowIDA++;


Button1->Enabled=false;

Button2->Enabled=true;

Button3->Enabled=true;

}

else

{

//перемещение объектов;



Memo1->Visible=true;

Label17->Visible=true;

Image1->Visible=true;

Label23->Visible=true;

Edit1->Visible=true;


Label1->Visible=false;

Label2->Visible=false;


Label1->Top=288;

Memo1->Top=312;

Label23->Top=416;

Edit1->Top=440;


//Загрузка вопроса на форму

DM3->ADOQuery1->Active=false;

DM3->ADOQuery1->SQL->Text="Select * From Questions Where ID="+AnsiString(NowIDQ);

DM3->ADOQuery1->Active=true;


Memo1->Text=Form4->DBGrid1->Columns->Items[1]->Field->Value;


//Загрузка изображения на форму

AnsiString FName, Dir;

Dir=ExtractFileDir(Application->ExeName);


DM3->ADOQuery1->Active=false;

DM3->ADOQuery1->SQL->Text="Select * From Questions Where ID="+AnsiString(NowIDQ);

DM3->ADOQuery1->Active=true;


FName=Form4->DBGrid1->Columns->Items[3]->Field->Value;


Image1->Picture->LoadFromFile(Dir+"\\images\+FName);


CControl=0;

NowIDA++;


Button1->Enabled=false;

Button2->Enabled=true;

Button3->Enabled=true;

}

}


}

//---------------------------------------------------------------------------__fastcall TForm9::Button2Click(TObject *Sender)

{Type;i, NCheckAns;Error;err;=0;


//определяем тип вопроса->ADOQuery1->Active=false;->ADOQuery1->SQL->Text="Select Type From Questions Where ID="+AnsiString(NowIDQ);->ADOQuery1->Active=true;

=Form4->DBGrid1->Columns->Items[0]->Field->Value;

(Type=='1')

{

//Проверка ответа


for(i=1;i<=MaxIDA;i++)

{

if(RadioButton[i]->Checked==true)

{

err=1;

}

else

{

Error="Вы не выбрали вариант ответа !";

}

}

if(err==0)

{

ShowMessage(Error); return;

}



Ans++;

for(i=1;i<=MaxIDA;i++)

{

if(RadioButton[i]->Checked==true){NCheckAns=i;}

}


DM3->ADOQuery1->Active=false;

DM3->ADOQuery1->SQL->Text="Select * From Ansvers Where Ansvers.IDQ="+AnsiString(NowIDQ)+" and Ansvers.Ansver='"+AnsiString(RadioButton[NCheckAns]->Caption)+"'";

DM3->ADOQuery1->Active=true;


AnsiString T,F;

T=MD5(RadioButton[NCheckAns]->Caption+"True Fastex");

F=MD5("False Fastex");


if(Form4->DBGrid1->Columns->Items[3]->Field->Value==T){TrAns++;} else {TrAns=TrAns;}


}

else

{

err=0;

//Проверка наличия ответа

if(Edit1->Text=="")

{

err++;

Error="Вы не ввели текст ответа";

}

if(err!=0)

{ShowMessage(Error); return;}


Ans++;


DM3->ADOQuery1->Active=false;

DM3->ADOQuery1->SQL->Text="Select * From Ansvers Where Ansvers.IDQ="+AnsiString(NowIDQ);

DM3->ADOQuery1->Active=true;


if(Form4->DBGrid1->Columns->Items[3]->Field->Value==MD5(Edit1->Text+" Fastex")){TrAns++;} else {TrAns=TrAns;}

}



//Переход к следующему вопросу

NowIDQ++;

//Обновление поля->Caption=NowIDQ;(NowIDQ>MaxIDQ)

{

Button2->Enabled=false; return;

}

//определяем тип вопроса->ADOQuery1->Active=false;->ADOQuery1->SQL->Text="Select Type From Questions Where ID="+AnsiString(NowIDQ);->ADOQuery1->Active=true;

=Form4->DBGrid1->Columns->Items[0]->Field->Value;

(Type=='1')

{

//Расстановка элементов

Label1->Visible=true;

Memo1->Visible=true;

Label2->Visible=true;


Label1->Top=8;

Memo1->Top=32;


Label17->Visible=false;

Image1->Visible=false;

Label23->Visible=false;

Edit1->Visible=false;


//Загрузка вопроса на форму

DM3->ADOQuery1->Active=false;

DM3->ADOQuery1->SQL->Text="Select * From Questions Where ID="+AnsiString(NowIDQ);

DM3->ADOQuery1->Active=true;


Memo1->Text=Form4->DBGrid1->Columns->Items[1]->Field->Value;


//Очистка предыдущих вариантов

if(CControl==1)

{

for(i=1;i<=MaxIDA;i++)

{

RadioButton[i]->Free();

}

}

Edit1->Text="";

//Получение количества ответов

DM3->ADOQuery1->Active=false;

DM3->ADOQuery1->SQL->Text="SELECT Count(Ansvers.ID) FROM Questions INNER JOIN Ansvers ON Questions.ID = Ansvers.IDQ Where IDQ="+AnsiString(NowIDQ);;

DM3->ADOQuery1->Active=true;


MaxIDA=Form4->DBGrid1->Columns->Items[0]->Field->Value;


//Формирование вариантов ответов

int i;

for(i=1;i<=MaxIDA;i++)

{

if(i==1)

{

DM3->ADOQuery1->Active=false;

DM3->ADOQuery1->SQL->Text="SELECT * From Ansvers where ID="+AnsiString(NowIDA);

DM3->ADOQuery1->Active=true;


RadioButton[i] = new TRadioButton(this);

RadioButton[i]->Parent = this;

RadioButton[i]->Name = "RadioButton"+AnsiString(i);

RadioButton[i]->Left = 8;

RadioButton[i]->Top = 165;

RadioButton[i]->Caption=Form4->DBGrid1->Columns->Items[2]->Field->Value;

RadioButton[i]->Font->Name="Arial";

RadioButton[i]->Font->Size=10;


CControl=1;

NowIDA++;

}

else

{

DM3->ADOQuery1->Active=false;

DM3->ADOQuery1->SQL->Text="SELECT * From Ansvers where ID="+AnsiString(NowIDA);

DM3->ADOQuery1->Active=true;


RadioButton[i] = new TRadioButton(this);

RadioButton[i]->Parent = this;

RadioButton[i]->Name = "RadioButton"+AnsiString(i);

RadioButton[i]->Left = 8;

RadioButton[i]->Top = RadioButton[i]->Height+RadioButton[i-1]->Top+2;

RadioButton[i]->Caption=Form4->DBGrid1->Columns->Items[2]->Field->Value;

RadioButton[i]->Font->Name="Arial";

RadioButton[i]->Font->Size=10;


CControl=1;

NowIDA++;

}

}

}

{

//Определение наличия картинки

DM3->ADOQuery1->Active=false;

DM3->ADOQuery1->SQL->Text="Select * From Questions Where ID="+AnsiString(NowIDQ);

DM3->ADOQuery1->Active=true;


if(Form4->DBGrid1->Columns->Items[3]->Field->Value.IsNull())

{

Label1->Visible=false;

Label2->Visible=false;


Memo1->Visible=true;

Label17->Visible=true;

Image1->Visible=true;

Label23->Visible=true;

Edit1->Visible=true;


//Загрузка вопроса на форму

DM3->ADOQuery1->Active=false;

DM3->ADOQuery1->SQL->Text="Select * From Questions Where ID="+AnsiString(NowIDQ);

DM3->ADOQuery1->Active=true;


Memo1->Text=Form4->DBGrid1->Columns->Items[1]->Field->Value;

//Очистка предыдущих вариантов

if(CControl==1)

{

for(i=1;i<=MaxIDA;i++)

{

RadioButton[i]->Free();

}

}


CControl=0;

NowIDA++;

Edit1->Text="";



}

else

{

//перемещение объектов;

Memo1->Visible=true;

Label17->Visible=true;

Image1->Visible=true;

Label23->Visible=true;

Edit1->Visible=true;


Label1->Visible=false;

Label2->Visible=false;


Label1->Top=288;

Memo1->Top=312;

Label23->Top=416;

Edit1->Top=440;

//Загрузка вопроса на форму

DM3->ADOQuery1->Active=false;

DM3->ADOQuery1->SQL->Text="Select * From Questions Where ID="+AnsiString(NowIDQ);

DM3->ADOQuery1->Active=true;


Memo1->Text=Form4->DBGrid1->Columns->Items[1]->Field->Value;


//Загрузка изображения на форму

AnsiString FName, Dir;

Dir=ExtractFileDir(Application->ExeName);


DM3->ADOQuery1->Active=false;

DM3->ADOQuery1->SQL->Text="Select * From Questions Where ID="+AnsiString(NowIDQ);

DM3->ADOQuery1->Active=true;

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

FName=Form4->DBGrid1->Columns->Items[3]->Field->Value;


Image1->Picture->LoadFromFile(Dir+"\\images\+FName);


//Очистка предыдущих вариантов

if(CControl==1)

{

for(i=1;i<=MaxIDA;i++)

{

RadioButton[i]->Free();

}

}

CControl=0;

NowIDA++;

Edit1->Text="";


}

}




}

//---------------------------------------------------------------------------

__fastcall TForm9::Button3Click(TObject *Sender)

{

Dir;

Dir=ExtractFileDir(Application->ExeName);

(Ans<MaxIDQ)

{

if(MessageDlg("Вы ответили на не все вопросы.\nУверены, что хотите завершить тестирвоание?", mtConfirmation, TMsgDlgButtons() <<mbYes << mbNo, 0)==mbNo)

{

return;

}

else

{

ShowMessage("Всего вопросов: "+AnsiString(MaxIDQ)+"\nОтвечено: "+AnsiString(Ans)+"\nВерных: "+AnsiString(TrAns)+"\n\nОценка: "+AnsiString((TrAns*5.0/MaxIDQ)));

}

}

{

ShowMessage("Всего вопросов: "+AnsiString(MaxIDQ)+"\nОтвечено: "+AnsiString(Ans)+"\nВерных: "+AnsiString(TrAns)+"\n\nОценка: "+AnsiString((TrAns*5.0/MaxIDQ)));

}

ND;=Now();


->Lines->Add("<html>");->Lines->Add("<head>");->Lines->Add("<title>Результат тестирвоания</title>");->Lines->Add("<meta http-equiv='Content-Type' content='text/html; charset=windows-1251'>");->Lines->Add("</head>");->Lines->Add("<body>");->Lines->Add("<center><h2><u>Результат тестирования пользователя № "+AnsiString(ID)+"</u></h2></center></br>");->Lines->Add("<left><b>Логин: </b>"+Login+";</left></br>");->Lines->Add("<left><b>Имя: </b>"+sName+";</left></br>");->Lines->Add("<left><b>Фамилия: </b>"+SurName+";</left></br>");->Lines->Add("<left><b>Группа: </b>"+Group+";</left></br>");->Lines->Add("<left><b>Статус: </b>"+Status+";</left></br>");->Lines->Add("<left><b>Всего вопросов: </b>"+AnsiString(MaxIDQ)+";</left></br>");->Lines->Add("<left><b>Дано ответов: </b>"+AnsiString(Ans)+";</left></br>");->Lines->Add("<left><b><u>Оценка: </u></b>"+AnsiString((TrAns*5.0/MaxIDQ))+";</left></br>");->Lines->Add("<left><b>Дата тестирвоания: </b>"+DateToStr(ND)+";</left></br>");

->Lines->SaveToFile(Dir+"\\reports\+Login+"_"+AnsiString(DateToStr(ND))+".html");


//Запись в базу

int MaxIDT;


DM3->ADOQuery1->Active=false;

DM3->ADOQuery1->SQL->Text="Select MAX(ID) From TestResult";

DM3->ADOQuery1->Active=true;

(Form4->DBGrid1->Columns->Items[0]->Field->Value.IsNull())

{

MaxIDT=1;

}

{

MaxIDT=Form4->DBGrid1->Columns->Items[0]->Field->Value;

MaxIDT++;

}

->ADOCommand1->CommandText="INSERT INTO TestResult VALUES("+AnsiString(MaxIDT)+","+AnsiString(ID)+",'"+DateToStr(ND)+"','"+AnsiString((TrAns*5.0/MaxIDQ))+"','"+Login+"_"+AnsiString(DateToStr(ND))+".htm"+"')";->ADOCommand1->Execute();->Enabled=true;->Enabled=false;->Enabled=false;

}

//---------------------------------------------------------------------------

__fastcall TForm9::FormCreate(TObject *Sender)

{


}

//---------------------------------------------------------------------------




//---------------------------------------------------------------------------


#include <vcl.h>

#pragma hdrstop


#include "Unit10.h"

//---------------------------------------------------------------------------

#pragma package(smart_init)

#pragma link "SHDocVw_OCX"

#pragma resource "*.dfm"*Form10;

//---------------------------------------------------------------------------

__fastcall TForm10::TForm10(TComponent* Owner)

: TForm(Owner)

{

}

//---------------------------------------------------------------------------

__fastcall TForm10::Button2Click(TObject *Sender)

{->Close();

}

//---------------------------------------------------------------------------

__fastcall TForm10::FormCreate(TObject *Sender)

{buffer[MAX_PATH];(sizeof(buffer),buffer);dir=AnsiString(buffer);->Navigate(WideString(dir+"/AdminReport.html"));

}

//---------------------------------------------------------------------------

__fastcall TForm10::FormActivate(TObject *Sender)

{buffer[MAX_PATH];(sizeof(buffer),buffer);dir=AnsiString(buffer);->Navigate(WideString(dir+"/AdminReport.html"));

}

//---------------------------------------------------------------------------__fastcall TForm10::Button1Click(TObject *Sender)

{->ExecWB(::OLECMDID_PRINT, ::OLECMDEXECOPT_DONTPROMPTUSER);

}

//---------------------------------------------------------------------------


ПРИЛОЖЕНИЕ 2. РЕЗУЛЬТАТ РАБОТЫ ПРОГРАММЫ


Отчет по решению


Условия задачи:

Целевая функция:

f= 2x1 +3x2 ? Max

Система ограничений:

x1 +2x2 <= 12

x1 +3x2 <= 24

x1 +1x2 <= 30

Решение:


Задача представленна в общем виде. Необходимо преобразовать ее в вид ОЗЛП

В этом случае функция примет вид:

f= 2x1 +3x2 ? Max

А система ограничений примет вид:

x1 +2x2 +1x3 0x4 0x5 = 12

x1 +3x2 0x3 +1x4 0x5 = 24

x1 +1x2 0x3 0x4 +1x5 = 30

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

Исходная Симплекс - таблица:


Цикл 1

БазисПланX1X2X3X4X5X31212100X42413010X53011001F'0-2-3000

Из базиса выводится переменная X3, а вводится - X2

Новое значение: F=0;

Новый опорный план: X3=12; X4=24; X5=30;


Цикл 2

БазисПланX1X2X3X4X5X260,510,500X46-0,50-1,510X5240,50-0,501F'18-0,501,500

Из базиса выводится переменная X2, а вводится - X1

Новое значение: F=18;

Новый опорный план: X2=6; X4=6; X5=24;


Цикл 2

БазисПланX1X2X3X4X5X11212100X41201-110X5180-1-101F'2401200

Найден оптимальный план

Итоговое значение: F=24;

Итоговый опорный план: X1=12; X4=12; X5=18;


СОДЕРЖАНИЕ ВВЕДЕНИЕ .ПОСТАНОВКА ЗАДАЧИ .ОПИСАНИЕ СИМПЛЕКСНОГО МЕТОДА РЕШЕНИЯ ЗАДАЧИ ЛИНЕЙНОГОПРОГРАММИРОВАНИЯ .ОБОСНОВАНИЕ ВЫБОРА ЯЗЫКА ПРОГРАММ

Больше работ по теме:

КОНТАКТНЫЙ EMAIL: [email protected]

Скачать реферат © 2017 | Пользовательское соглашение

Скачать      Реферат

ПРОФЕССИОНАЛЬНАЯ ПОМОЩЬ СТУДЕНТАМ