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

  • Вид работы:
    Дипломная (ВКР)
  • Предмет:
    Информационное обеспечение, программирование
  • Язык:
    Русский
    ,
    Формат файла:
    MS Word
    1,26 Mb
  • Опубликовано:
    2011-08-13
Вы можете узнать стоимость помощи в написании студенческой работы.
Помощь в написании работы, которую точно примут!

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

СОДЕРЖАНИЕ

 

ВВЕДЕНИЕ

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

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

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

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

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

.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.

Си++ (англ. <#"512044.files/image020.gif">

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, заполняются в соответствие с целевой функцией, но с противоположным знаком.

Базис

План

X1

X2

X3

X4

X5

X3

12

1

2

1

0

0

X4

24

1

6

0

1

0

X5

30

1

1

0

0

1

F’

0

-1

-3

0

0

0

Найден начальный опорный план:

0=0;

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

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

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

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

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

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

Базис

План

X1

X2

X3

X4

X5

X3

4

0,66

0

1

-0,34

0

X2

4

0,17

1

0

0,17

0

X5

26

0,83

0

0

-0,17

1

F’

12

-0,49

0

0

0,51

0

Найден новый опорный план:

1=12;

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

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

Базис

План

X1

X2

X3

X4

X5

X1

6,06

1

0

1,52

-0,52

0

X2

2,97

0

1

-0,26

0,26

0

X5

20,97

0

0

-1,26

0,26

1

F’

14,97

0

0

0,74

0,26

0

Найден новый опорный план:

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

Начальник УВЦ

5440

1

5440

2

Инженер - программист

5040

1

5040

3

Оператор ЭВМ

4430

1




Итого

14910


; , где

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

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

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

;

;

;

;

;

;

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

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

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

Государственные внебюджетные фонды

Ставка налога (%)

Пенсионный фонд РФ

20,0

Фонд социального страхования РФ

2,9

Фонд обязательного медицинского страхования РФ

3,1

Страховые взносы на социальное страхование от несчастных случаев на производстве и профзаболеваний

0,2

Итого

26,2


, где

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

;

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

, где

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

;

;

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

, где

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

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

;

;

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

Наименование оборудования

Цена за единицу (руб.)

Количество

Стоимость

Процессор

6000

3

18000

Материнская плата

4500

3

13500

Модуль памяти

1500

6

9000

Жесткий диск

5000

3

15000

Мышь

250

3

750

Устройство чтения CD - дисков

2000

3

6000

Накопитель на гибких дисках

300

3

900

Клавиатура

600

3

1800

Корпус

3000

3

9000

Монитор

5000

3

15000

Принтер лазерный

8550

1

8550


Итого

97500


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

, где

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

;

;

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

, где

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

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

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

, где

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

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

, где

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

;

, где

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

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

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

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

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

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

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

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

Наименование оборудования

Мощность единицы оборудования (кВт/ч)

Количество единиц оборудования

Суммарная мощность (кВт/ч)

Системный блок и монитор

0,48

3

1,29

Принтер

0,31

1

0,31



Итого

1,6


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

;

;

;

;

;

;

;

;

;

;

;

;

;

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

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

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

;

;

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

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

Элементы затрат

Сумма (руб.)

Удельный вес (%)

1

Заработная плата обслуживающему персоналу

2982

30,47%

2

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

781,284

7,98%

3

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

2564,52

26,20%

4

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

812,5

8,30%

5

Затраты на ремонт оборудования

975

9,96%

6

Затраты на электроэнергию

1001,8406

10,24%

7

Затраты на материалы

670

6,85%


Итого

9787,144

100%


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

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

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

, где

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

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

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

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

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

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

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

, где

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

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

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

;

;

;

;

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

, где

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

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

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

, где

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

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

;

;

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

;

;

;

;

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

, где

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

;

;

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

, где

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

;

;

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

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

Наименования материалов

Цена за единицу (руб.)

Количество

Стоимость (руб.)

Бумага

0,4

35

14

Ручка

10

1

10

Диск

15

1

15

Картридж

1

35

35



Итого

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

.        Материалы с сайта http://simplex-metod.narod.ru/

ПРИЛОЖЕНИЕ 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>");

}

{

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;

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

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");


}

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

Базис

План

X1

X2

X3

X4

X5

X3

12

1

2

1

0

0

X4

24

1

3

0

1

0

X5

30

1

1

0

0

1

F'

0

-2

-3

0

0

0


Из базиса выводится переменная X3, а вводится - X2

Новое значение: F=0;

Новый опорный план: X3=12; X4=24; X5=30;

Цикл 2

Базис

План

X1

X2

X3

X4

X5

X2

6

0,5

1

0,5

0

0

X4

6

-0,5

0

-1,5

1

0

X5

24

0,5

0

-0,5

0

1

F'

18

-0,5

0

1,5

0

0


Из базиса выводится переменная X2, а вводится - X1

Новое значение: F=18;

Новый опорный план: X2=6; X4=6; X5=24;

Цикл 2

Базис

План

X1

X2

X3

X4

X5

X1

12

1

2

1

0

0

X4

0

1

-1

1

0

X5

18

0

-1

-1

0

1

F'

24

0

1

2

0

0


Найден оптимальный план

Итоговое значение: F=24;

Итоговый опорный план: X1=12; X4=12; X5=18;

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

 

Не нашли материал для своей работы?
Поможем написать уникальную работу
Без плагиата!