Поможем написать учебную работу
Если у вас возникли сложности с курсовой, контрольной, дипломной, рефератом, отчетом по практике, научно-исследовательской и любой другой работой - мы готовы помочь.
Если у вас возникли сложности с курсовой, контрольной, дипломной, рефератом, отчетом по практике, научно-исследовательской и любой другой работой - мы готовы помочь.
СОДЕРЖАНИЕ
ВВЕДЕНИЕ………………………………………………………………..….
1 ОБЩАЯ ЧАСТЬ…………………………………………………..………..
1.1 Описание предметной области……………………………..………..
1.2 Обоснование выбора языка программирования….…………………
2 СПЕЦИАЛЬНАЯ ЧАСТЬ…………………………………………...……….
2.1 Экономическая и математическая постановка задачи……………..
2.2 Реализация модели математическим методом ...……………………
2.3 Структурная и функциональная схемы программы…………..……
2.4 Описание процедур, функций и модулей...…..…………..…………
2.5 Таблица идентефикаторов…...……………………………………….
ЗАКЛЮЧЕНИЕ…………………………………………………….……...….
СПИСОК ИСПОЛЬЗОВАННЫХ ИСТОЧНИКОВ…………………………..
ПРИЛОЖЕНИЯ
ПРИЛОЖЕНИЕ А Техническое задание ……………………..….…………..
ПРИЛОЖЕНИЕ Б Руководство пользователя…………………….………….
ПРИЛОЖЕНИЕ В Листинг программы……………………………………….
ПРИЛОЖЕНИЕ Г Контрольный пример……………………………………...
Методология моделирования долгое время развивалась независимо отдельными науками. Отсутствовала единая система понятий, единая терминология. Лишь постепенно стала осознаваться роль моделирования как универсального метода научного познания. Термин "модель" широко используется в различных сферах человеческой деятельности и имеет множество смысловых значений. Модель - это такой материальный или мысленно представляемый объект, который в процессе исследования замещает объект-оригинал так, что его непосредственное изучение дает новые знания об объекте-оригинале.
Под моделирование понимается процесс построения, изучения и применения моделей. Оно тесно связано с такими категориями, как абстракция, аналогия, гипотеза и др. Процесс моделирования обязательно включает и построение абстракций, и умозаключения по аналогии, и конструирование научных гипотез.
Процесс моделирования включает три элемента:
Симплекс-метод является основным в линейном программировании. Решение задачи начинается с рассмотрений одной из вершин многогранника условий. Если исследуемая вершина не соответствует максимуму (минимуму), то переходят к соседней, увеличивая значение функции цели при решении задачи на максимум и уменьшая при решении задачи на минимум. Таким образом, переход от одной вершины к другой улучшает значение функции цели. Так как число вершин многогранника ограничено, то за конечное число шагов гарантируется нахождение оптимального значения или установление того факта, что задача неразрешима.
Этот метод является универсальным, применимым к любой задаче линейного программирования в канонической форме. Система ограничений здесь - система линейных уравнений, в которой количество неизвестных больше количества уравнений. Если ранг системы равен r, то мы можем выбрать r неизвестных, которые выразим через остальные неизвестные. Для определенности предположим, что выбраны первые, идущие подряд, неизвестные X1, X2, ..., Xr.
Тогда наша система уравнений может быть записана как:
Базисное решение называется допустимым базисным решением или опорным решением, если в нем значения переменных неотрицательны. Если в качестве базисных взяты переменные X1, X2, ..., Xr, то решение {b1, b2,..., br, 0, ..., 0} будет опорным при условии, что b1, b2,..., br ≥ 0.
Математическая модель данной задачи имеет вид
Z(X) = c1 x1 + c2x2 + ... + сnхn → max
Xj>0, j = 1, 2, ..., n.
Двойственный симплекс-метод, как и симплекс-метод, используется при нахождении решения задачи линейного программирования, записанной в форме основной задачи, для которой среди векторов , составленных из коэффициентов при неизвестных в системе уравнений, имеется m единичных. Вместе с тем двойственный симплексметод можно применять при решении задачи линейного программирования, свободные члены системы уравнений которой могут быть любыми числами (при решении задачи симплексным методом эти числа предполагались неотрицательными).
1 ОБЩАЯ ЧАСТЬ
1.1 Описание предметной области
Теоремы двойственности позволяют установить взаимосвязь между оптимальными решениями пары двойственных задач. Решив одну из пары двойственных задач, можно или найти оптимальное решение другой задачи, не решая ее, или установить его отсутствие. Возможны следующие случаи: 1) обе задачи из пары двойственных имеют оптимальные решения; 2) одна из задач не имеет решения ввиду неограниченности целевой функции, а другая - ввиду несовместности системы ограничений.
Двойственный симплекс-метод можно применять при решении задачи линейного программирования, свободные члены системы уравнений которой могут быть любыми числами. В обычном симплексном алгоритме план всегда должен быть допустимым. Допустимый план это такой план, который удовлетворяет всем ограничениям задачи при обязательном условии неотрицательности неизвестных, то есть любые числа в итоговом столбце положительны. План называется недопустимым (или условно-оптимальным), если в итоговом столбце имеются отрицательные числа, зато оценки целевой строки соответствуют целевой функции, то есть являются положительными при решении на максимум и отрицательными при решении на минимум. В процессе решения двойственным методом план является недопустимым. При использовании двойственного метода сначала применяют обычную симплекс-процедуру и добиваются того, чтобы все оценки соответствовали цели решения задачи, причем пока не обращают внимания на знаки чисел в итоговом столбце. Только когда такой условно-допустимый план достигнут, смотрят на эти знаки. Если в итоговом столбце оказались отрицательные числа, план изменяется так, чтобы недопустимость уменьшилась, а затем и исчезла, но чтобы двойственные оценки продолжали соответствовать при этом цели решения задачи. Возможность придавать в процессе решения отрицательные значения неизвестным, входящим в план, в случае, если ограничения заданы неравенствами, позволяет избавиться от искусственных неизвестных, это сокращает размеры задачи, а значит, и вычислений
Алгоритм двойственного симплексного метода таков, что, как только почти допустимое опорное решение становится допустимым, оно становится также оптимальным.
Составление двойственной задачи включает в себя следующие пункты:
1. Тип оптимума меняется на противоположный, т. е. максимум на минимум, и наоборот.
2. Вектор коэффициентов целевой функции с и столбец ограничений b меняются местами.
3. Матрица ограничений задачи A транспонируется.
4. Множество индексов переменных, на которые наложено условие неотрицательности в прямой задаче (например, хj ≥ 0 или uj ≥ 0), определяют номера ограничений, имеющих форму неравенств в двойственной задаче (aju ≥ сj или aix ≤ bj).
5. Множество номеров ограничений, имеющих форму неравенств в прямой задаче (например, aix ≤ bj или aju ≥ сj), определяют множество индексов переменных, на которые накладывается условие неотрицательности, в двойственной задаче (ui ≥ 0 или xi ≥ 0).
Общей задачей линейного программирования называется задача, которая состоит в определении максимального (минимального) значения функции
При условиях: |
|
где - заданные постоянные величины и .
Функция (9.1) называется целевой функцией (или линейной формой) задачи (9.1)-(9.4), а условия (9.2)-(9.4) ограничениями данной задачи.
Канонической или основной задачей линейного программирования называется задача, которая состоит в определении максимального значения функции
При выполнении условий:
Где:
.
Если в опорном плане существует хотя бы одна отрицательная координата xi0 и при этом не существует ни одного отрицательного коэффициентах xij разложений векторов-условий Aj, j=1,2, …, n, то задача не имеет решения ввиду несовместности системы ограничений.
Пусть в результате эквивалентных преобразований системы уравнений-ограничений задачи некоторое уравнение приняло вид:
xi0 = xl1x1 + xl2x2 + … + xinxn, где xi0 < 0, a xij ≥ 0 Vj.
Ввиду того, что оптимальное решение задачи является допустимым, его координаты должны быть неотрицательными, и оно не может удовлетворять данному уравнению, так как левая и правая части уравнения принимают значения разных знаков.
Для того чтобы решить задачу линейного программирования двойственным симплексным методом, необходимо выполнить следующее.
1. Привести задачу к каноническому виду.
2. Найти ПДОР с базисом из единичных векторов, вычислить оценки векторов-условий по базису этого решения, и если они согласуются с признаком оптимальности, то задачу можно решить двойственным симплексным методом.
3. Если ПДОР не имеет отрицательных координат, то оно является допустимым и оптимальным (по теореме 1.3). Решение задачи заканчивается.
4. Если ПДОР имеет отрицательную координату хi0 < 0, для которой соответствующие коэффициенты разложений всех векторов-условий неотрицательны (хij > 0 Vy), то задача не имеет решения ввиду несовместности системы ограничений. Решение задачи прекращается.
5. Если хотя бы одна координата ПДОР отрицательна, т.е. хi0 < 0, и при этом найдется хотя бы один отрицательный коэффициент хij разложений векторов-условий Аj по базису решения, то переходят к новому решению, на котором значение целевой функции будет ближе к оптимальному. Номер вектора Аk, вводимого в базис, определяется с использованием параметра
Ө0i = min{|Δj/xij|} = |Δk/xik| ,
xij < 0
Номер вектора Аi, выводимого из базиса, находится из условия min{xi0 Ө0i} в задаче на максимум или из условия max{-хi0 Ө0i} в задаче на минимум.
Далее возвращаются к пункту 3 данного алгоритма.
Оптимальные значения переменных двойственной задачи линейного программирования как объективно обусловленные оценки позволяют сопоставлять затраты на выпуск продукции и доход от ее реализации.
Постоптимальный анализ одна из важных сторон линейного программирования, потому что часто на практике экономическая информация, составляющая большую часть параметров задач линейного программирования, точно не известна, известны лишь пределы, в которых значения параметров могут изменяться.
Поэтому очень важен анализ поведения оптимального решения в пределах изменения параметров задачи. Обычно исследуют влияние изменения коэффициентов линейной формы cj и компонент вектора ограничений bi.
1.2 Обоснование выбора языка программирования
Мечта программистов о среде программирования, в которой бы простота и удобство сочетались с мощью и гибкостью, стала реальностью с появлением среды Delphi. Она обеспечивала визуальное проектирование пользовательского интерфейса, имела развитый объектно-ориентированный язык Object Pascal (позже переименованный в Delphi) и уникальные по своей простоте и мощи средства доступа к базам данных. Язык Delphi по возможностям значительно превзошел язык Basic и даже в чем-то язык C++, но при этом он оказался весьма надежным и легким в изучении (особенно в сравнении с языком C++). В результате, среда Delphi позволила программистам легко создавать собственные компоненты и строить из них профессиональные программы. Среда оказалась настолько удачной, что по запросам любителей C++ была позже создана среда C++Builder клон среды Delphi на основе языка C++ (с расширенным синтаксисом).
Среда Delphi стала, по сути, лучшим средством программирования для операционной системы Windows, но программистов ждало разочарование, если возникало желание перенести программу в другую операционную систему, в частности, в операционную систему Unix.
Алфавит языка Delphi. Язык совокупность символов, соглашений и правил, используемых для общения. При записи алгоритма решения задачи на языке программирования необходимо четко знать правила написания и использования языковых единиц. Основой любого языка является алфавит (набор знаков, состоящий из букв, десятичных и шестнадцатеричных цифр, специальных символов).
Алфавит Delphi составляют:
Словарь Delphi можно разделить на три группы слов:
Зарезервированные слова имеют фиксированное написание и навсегда определенный смысл. Они не могут изменяться программистом и их нельзя
использовать в качестве имен для обозначения величин.
Идентификатор имя ( установление соответствия объекта некоторому набору символов). Для обозначения определенных разработчиками языка функций, констант и т.д. служат стандартные идентификаторы. Идентификаторы пользователя это те имена, которые дает сам программист.
2 СПЕЦИАЛЬНАЯ ЧАСТЬ
2.1 Экономическая и математическая постановка задачи
Компания производит полки для ванных комнат двух размеров - А и В. Агенты по продаже считают, что в неделю на рынке может быть реализовано до 550 полок. Для каждой полки типа А требуется 2 м2 материала, а для полки типа В - 3 м2 материала. Компания может получить до 1200 м материала в неделю. Для изготовления одной полки типа А требуется 12 мин машинного времени, а для изготовления одной полки типа В - 30 мин; машину можно использовать 160 час в неделю. Если прибыль от продажи полок типа А составляет 3 денежных единицы, а от полок типа В - 4 ден. ед., то сколько полок каждого типа следует выпускать в неделю?
Исходные данные представлены в таблице 1.
Таблица 2.1.1 Исходные данные
Базис |
План |
x1 |
x2 |
x3 |
x4 |
x5 |
х3 |
550 |
1 |
1 |
1 |
0 |
0 |
х4 |
1200 |
2 |
3 |
0 |
1 |
0 |
х5 |
9600 |
12 |
30 |
0 |
0 |
1 |
f |
0 |
-3 |
-4 |
0 |
0 |
0 |
Нахождение элементов симплекс-таблицы производится методом прямоугольника.
Математическая формулировка задачи включает:
Переменные, подлежащие оптимизации:
xa виды выпускаемой продукции (полок),
xb виды затрат на производство продукции (Время, сырье, работа),
Целевую функцию:
f = 3х1 + 4х2 ^ max, х1 + х2 < 550,
2х1+ 3х2 < 1200,
12х1+ 30х2 < 9600, х1> 0, х2>0.
Ограничения:
х1 + х2 < 550 - в неделю на рынке может быть реализовано до 550 полок.
2х1 + 3х2 < 1200 - Затраты материала
12х1 + 30х2 < 9600 - Затраты машинного времени
2.2 Реализация модели математическим методом
Для построения общего метода решения задачи ЛП все модели должны быть представлены в канонической (стандартной) форме, которая удовлетворяет следующим условиям:
1) все ограничения и целевая функция должны быть записаны в виде равенств с неотрицательной правой частью;
2) значения всех переменных модели должны быть неотрицательны;
3) целевая функция подлежит максимизации или минимизации, где
xj - вспомогательные переменные, включаемые в уравнения ограничений
(остаточные для неравенства типа ≤ и избыточные для неравенства типа ≥) для приведения неравенств к виду равенств.
Соответствующая линейная модель, приведенная к стандартной (канонической) форме имеет следующий вид:
3х1 + 4х2 -> max.
х1 + х2 < 550
2х1 + 3х2 < 1200
12х1 + 30х2 < 9600.
х3, х4, х5 дополнительные переменные.
Таким образом, приходим к задаче линейного программирования.
f = 3х1 + 4х2 ^ max, х1 + х2 < 550,
2х1+ 3х2 < 1200,
12х1+ 30х2 < 9600, х1> 0, х2>0 , х3>0, х4>0, х5>0.
Общее решение данной целочисленной задачи включает этапы получения оптимального в общем случае нецелочисленного решения прямым симплекс-методом; введение ограничений - отсечений и, наконец, использование двойственного симплекс-метода для окончательного отыскания допустимого (целочисленного) решения.
Решение:
F=3x1+4x2->max
x1+x2<=550
2x1+3x2<=1200
12x1+30x2<=9600
F=3x1+4x2+0x3+0x4+0x5->max
550/1=550
1200/3=400
9600/30=320
В качестве опорного плана выберем X0=(0, 0, 550, 1200, 9600). Произведем вычисления:
Составим симплекс-таблицу (Таблица 2.2.1).
Таблица 2.2.1- Таблица результатов
Базис |
План |
x1 |
x2 |
x3 |
x4 |
x5 |
х3 |
230 |
3/5 |
0 |
1 |
0 |
-1/30 |
х4 |
240 |
4/5 |
0 |
0 |
1 |
-1/10 |
х2 |
320 |
2/5 |
1 |
0 |
0 |
1/30 |
f |
1280 |
-7/5 |
0 |
0 |
0 |
2/15 |
В последней оценочной строке есть отрицательные оценки, поэтому нужно делать шаг симплекс-метода. Выбираем столбец с наименьшей оценкой, а затем разрешающий элемент
- по наименьшему отношению свободных членов к коэффициентам столбца (последний столбец). Результат шага запишем в таблицу (разрешающий элемент будем выделять жирным). Аналогично будем повторять шаги, пока не придем к таблице с неотрицательными оценками.
Составим симплекс-таблицу (Таблица 2.2.2).
Таблица 2.2.2- Таблица результатов
Базис |
План |
x1 |
x2 |
x3 |
x4 |
x5 |
x3 |
50 |
0 |
0 |
1 |
-3/4 |
1/24 |
x1 |
300 |
1 |
0 |
0 |
5/4 |
-1/8 |
x2 |
200 |
0 |
1 |
0 |
-1/2 |
1/12 |
f |
1700 |
0 |
0 |
0 |
7/4 |
-1/24 |
В нижней строчке по прежнему присутствуют отрицательные значения, что говорит о неоптимальности плана, поэтому продолжим расчет по алгоритму:
Составим симплекс-таблицу (Таблица 2.2.3).
Таблица 2.2.3- Таблица результатов
Базис |
План |
x1 |
x2 |
x3 |
x4 |
x5 |
x5 |
1200 |
0 |
0 |
24 |
-18 |
1 |
x1 |
450 |
1 |
0 |
3 |
-1 |
0 |
x2 |
100 |
0 |
1 |
-2 |
1 |
0 |
f |
1750 |
0 |
0 |
1 |
1 |
0 |
Т.к. в нижней строчке больше нет отрицательных значений, мы можем утверждать об оптимальности плана.
Решение двойственной задачи необходимо для проверки правильности решения ЗЛП. В нашем случае для проверки на правильность решения нахождения оптимального плана, подставим найденный базис в целевую функцию. Т.е. условие оптимальности соответствует найденному решению следовательно план оптимален выбранным методом.
Fmax=3*450+4*100+x3*0+x4*0+x5=1750 Таблица результатов
2.3 Структурная и функциональная схемы программы
Структурная схема это совокупность элементарных звеньев объекта и связей между ними, один из видов графической модели. Под элементарным звеном понимают часть объекта, системы управления и т. д., которая реализует элементарную функцию. На рис. 2. 1 представлена структурная схема разработанной программы.
Рисунок 2.1 Структурная схема программы
Функциональная схема документ, разъясняющий процессы, протекающие в отдельных функциональных цепях изделия (установки) или изделия в целом. Функциональная схема является экспликацией отдельных видов процессов, протекающих в целостных функциональных блоках и цепях устройства. На рис.2.2 представлена функциональная схема разработанной программы.
Рисунок 2.2 Функциональная схема программы
2.4 Описание процедур, функций и модулей
Каждый исходный файл должен содержать объявление модуля. Слово unit является ключевым, поэтому оно должно быть написано в нижнем регистре. Имя модуля может содержать символы, как в верхнем, так и в нижнем регистре и должно быть таким же, как и имя используемое для этого файла операционной системой.
Стандартные модули языка Delphi. В состав среды Delphi входит великолепный набор модулей, возможности которых удовлетворят даже самого привередливого программиста. Все модули можно разбить на две группы: системные модули и модули визуальных компонентов.
К системным модулям относятся System, SysUtils, ShareMem, Math. В них содержатся наиболее часто используемые в программах типы данных, константы, переменные, процедуры и функции. Модуль System - это сердце среды Delphi; содержащиеся в нем подпрограммы обеспечивают работу всех остальных модулей системы. Модуль System подсоединяется автоматически к каждой программе и его не надо указывать в операторе uses.
Модули визуальных компонентов (VCL - Visual Component Library) используются для визуальной разработки полнофункциональных GUI-приложений - приложений с графическим пользовательским интерфейсом (Graphical User Interface). Эти модули в совокупности представляют собой высокоуровневую объектно-ориентированную библиотеку со всевозможными элементами пользовательского интерфейса: кнопками, надписями, меню, панелями и т.д. Кроме того, модули этой библиотеки содержат простые и эффективные средства доступа к базам данных. Данные модули подключаются автоматически при помещении компонентов на форму.
Описание процедур:
procedure TForm2.Button1Click(Sender: TObject);
Эта процедура осуществляет закрытие титульного и листа и выход из программы.
procedure TForml.Button2Click(Sender: TObject);
Эта процедура открывает главное меню программы и убирает с экрана титульный лист.
procedure TForm2.Button1Click(Sender: TObject);
Эта процедура открывает окно с выбором метода решения транспортной задачи и убирает с экрана окно меню.
procedure TForm2.Button2Click(Sender: TObject);
Эта процедура открывает окно содержащие информацию о разработанной программе и убирает с экрана окно меню.
procedure TForm2.Button3Click(Sender: TObject);
Эта процедура открывает окно с информацией о справке данной программы, которая позволяет облегчить работу пользователя и убирает окно меню.
procedure TForm2.Button4Click(Sender: TObject);
Эта процедура открывает окно о разработчике, и убирает окно меню.
procedure TForm2.Button5Click(Sender: TObject);
Эта процедура закрывает окно меню и выходит из программы.
procedure TForm3.Button1Click(Sender: TObject);
Эта процедура осуществляет выход в главное меню, и закрывает окно с выбором метода решения транспортной задачи
procedure TForm3.Button3Click(Sender: TObject);
Эта процедура закрывает окно с решениями транспортной задачи тремя методами и выводит на экран форму с решением задачи методом минимальной стоимости
procedure TForm3.Button4Click(Sender: TObject);
Эта процедура закрывает окно с решениями транспортной задачи тремя методами и выводит на экран форму с решением задачи методом двойного предпочтения
procedure TForm2.Button2Click(Sender: TObject);
procedure TForm2.Button3Click(Sender: TObject);
procedure TForm2.Button4Click(Sender: TObject);
Эти процедуры позволяют пользователю отправиться из главного меню в любой пункт программы: «Форма решения», «Руководство пользователя», «Сведения о разработчике», «Выход».
procedure STEP-BY-STEP;
Это процедура пошагового выполнения расчета в программе можно отследить каждый этап заполнения таблицы. После произведения одного расчета процедура прерывает выполнение расчета и ждет комадны от пользователя.
procedure TForm4.Label2Click(Sender: TObject);
procedure TForm4.Label3Click(Sender: TObject);
procedure TForm4.Label4Click(Sender: TObject);
procedure TForm4.Label5Click(Sender: TObject);
Эти процедуры загружают в текстовое поле Memo содержимое текстового документа, в зависимости от выбранного пункта меню. В текстовых документах находится информация о пользовании приложением.
procedure TForm1.Button8Click(Sender: TObject);
Эта процедура выполняет расчет по формулам, подставляет введенные значения и в итоге выполнения записывает результат в переменную.
procedure TForm1.Button9Click(Sender: TObject);
Эта процедура выводит ответ в текстовом поле.
procedure TForm1.Button2Click(Sender: TObject);
Эта процедура заполняет поля ввода исходными данными в соответствии с заданием на курсовой проект.
procedure TForm3.Button4Click(Sender: TObject);
procedure TForm4.Button1Click(Sender: TObject);
Эти процедуры закрывают окно с и выводит на экран форму с выбором пункта меню.
procedure ochistka;
Эта процедура очищает поля ввода и вывода, освобождает переменные от значения, которое в них хранится.
2.5 Таблица идентификаторов
Идентификатор имя для обозначения определенных разработчикам
языка функций, констант и т.д. служат стандартные идентификаторы.
Идентификаторы пользователя это те имена, которые дает сам программист.
Таблица 2.5.1 - Таблица идентификаторов
Название |
Назначение |
Тип |
i |
Счетчики циклов |
Integer |
zna4,zna4TMP,zna4TMP2 |
Промежуточные переменные. |
Integer |
MinEl |
Минимальное значение |
Double |
Summ |
Сумма |
Integer |
Boo ,reshil,dv |
Переменные логического типа |
Boolean |
K, m, a, b, с |
Вспомогательные переменные |
Integer |
Count,Count2 |
Размер таблицы |
Integer |
ЗАКЛЮЧЕНИЕ
Данная курсовая работа несет в себе не только приобретение навыков по программированию в среде Delphi, а так же приобретение и закрепление практических навыков по предмету «Моделирование экономических и производственных процессов»
В ходе курсового проектирования мною были приобретены и закреплены навыки:
- Нахождение оптимального плана симплексным методом;
- Освоение библиотек (Delphi) с поддержкой математических функций и процедур;
- Написание приложения для расчета и нахождения оптимального плана;
- Подключение справочной информации к программе.
Данное приложение работает не только с исходными значениями, взятыми из задачи к курсовому проектированию, но и с любыми данными вводимыми пользователем.
СПИСОК ИСПОЛЬЗОВАННЫХ ИСТОЧНИКОВ
ПРИЛОЖЕНИЕ А
Техническое задание
1 Введение
Настоящее техническое задание распространяется на разработку программы, реализующей решение задачи линейного программирования с двумя неизвестными графическим методом. При этом программа должна показывать значения целевой функции и ограничения. По результатам вычислений составляется таблица и осуществляется построение графика функции. Разрабатываемая программа позволит студентам облегчить усвоение решений задач графическим методом по предмету «Моделирование производственных и экономических процессов».
2 Основание для разработки
2.1 Программа разрабатывается на основе учебного плана ЦМК в соответствии с заданием по курсовому проектированию от 04.01.2013года
3 Назначение
Основным назначением программы является помощь студентам при решении задач в курсе моделирование производственных и экономических процессов, облегчение расчета и нахождения оптимального плана.
4 Требования к программе и программному изделию
4.1 Требование к функциональным характеристикам
4.1.1 Программа должна обеспечивать возможность выполнения следующих функций:
4.1.2 Исходные данные:
4.2 Требования к надежности
Предусмотреть контроль вводимой информации;
Предусмотреть блокировку некорректных действий пользователя при работе с системой.
4.3 Требования к составу и параметрам технических средств
Система должна работать на IBM-совместимых персональных компьютерах.
Минимальная конфигурация:
4.4 Требование к информационной и программной совместимости.
Программа должна работать под управлением семейства операционных систем Win32.
5 Требование к программной документации
5.1 Разрабатываемые программные модули должны быть самодокументированы .
5.2 Разрабатываемая программа должна включать справочную информацию о работе программы, описания решения задачи и подсказки учащимся.
5.3 В состав сопровождающей документации должны входить:
5.3.1 Пояснительная записка на 25-30 листах, содержащая описание разработки;
5.3.2 Руководство пользователя.
ПРИЛОЖЕНИЕ Б
Руководство пользователя
Для запуска данной программы необходимо открыть файл с именем «Project1».
После открытия данного файла появиться главное меню с 4 кнопками, для начала работы необходимо нажать на кнопку с соответствующим названием. (Рисунок Б.1)
Рисунок Б.1 Главное меню.
Меню «Руководство пользователя содержит» в себе подробную информацию, доступную пользователю, по пользованию приложением.(Рисунок Б.2)
Рисунок Б.2 Руководство пользователя.
Нажав кнопку «Сведения о разработчике» Вы получите информацию о разработчике данного программного продукта. (Рисунок Б.3)
Рисунок Б.3 Сведения о разработчике.
Форма решения задач симплексным методом. Содержит в себе (в первоначальном виде) поля ввода исходных данных, кнопки "Добавить","Удалить","Изменить" и кнопки выбора "Максимизации" или "Минимизации" прибыли . (Рисунок Б.4)
Рисунок Б.4 Форма решения задач.
Для начал работы с программой введите наименование ресурса и его значения, после чего нажмите кнопку добавить. В правой части окна, в таблице данных будут отображаться данные по мере их заполнения, которые возможно в дальнейшем: редактировать, или удалить.
Кнопка "Решить тестовый пример" заполнит программу исходными данными в соответствии с заданием на курсовой проект. После заполнения таблицы данными необходимо нажать кнопку "Далее".
В следуещем пункте необходимо ввести наименование продукта и стоимость 1 еденицы продукции. После ввода нажмите кнопку "Добавить". Введенные данные возможно редактировать или удалять. (Рисунок Б.5)
Рисунок Б.5-Форма решения задач (ввод данных)
Дальше отобразится таблица с введенными значениями, при необходимости можно добавить дополнительные данные. И нажать кнопку "Далее". (Рисунок Б.6)
Рисунок Б.6 Таблица результатов.
Вам отобразится таблица с решенными результатами вычислений, для получения более подробной информации о результате выполнения нажмите кнопку "Ответ". Вам выведется сообщение с подробным описанием ответов. (Рисунок Б.7)
Рисунок Б.7 Вывод ответа.
Кнопка "Step-by-step" позволяет поэтапно проследить ход решения задачи,при нажатии поочерёдно будет выводиться результат. Когда найдется ответ, Вам выведется сообщение в нижней части окна "Решение найдено!", после чего вы можите просмотреть ответ.
Кнопка "Решить"- альтернатива кнопке "Step-by-step". Она позволяет сразу произвести все вычисления по формулам и найти ответ. Вам выведется сообщение в нижней части окна "Решение найдено!", после чего вы можите просмотреть ответ.
Если в ходе ввода исходных данных, Вам понадобится исправить некоторые велечины, Вы всегда сможите вернуться нажав кнопку "Назад".
ПРИЛОЖЕНИЕ В
Листинг программы
unit Unit1;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, Grids, StdCtrls, Buttons, ComCtrls, Menus, jpeg, ExtCtrls;
type
TForm1 = class(TForm)
GroupBox1: TGroupBox;
Edit1: TEdit;
Edit2: TEdit;
BitBtn1: TBitBtn;
BitBtn2: TBitBtn;
Label1: TLabel;
Label2: TLabel;
StringGrid1: TStringGrid;
Label3: TLabel;
GroupBox2: TGroupBox;
BitBtn4: TBitBtn;
BitBtn5: TBitBtn;
BitBtn6: TBitBtn;
BitBtn7: TBitBtn;
GroupBox3: TGroupBox;
BitBtn3: TBitBtn;
BitBtn8: TBitBtn;
BitBtn9: TBitBtn;
Edit3: TEdit;
Label6: TLabel;
Edit4: TEdit;
Label7: TLabel;
StringGrid2: TStringGrid;
Label9: TLabel;
Label5: TLabel;
GroupBox4: TGroupBox;
StringGrid3: TStringGrid;
Label10: TLabel;
GroupBox5: TGroupBox;
StringGrid4: TStringGrid;
BitBtn10: TBitBtn;
BitBtn11: TBitBtn;
GroupBox6: TGroupBox;
Memo1: TMemo;
RichEdit1: TRichEdit;
Button1: TButton;
Button2: TButton;
RadioButton1: TRadioButton;
RadioButton2: TRadioButton;
Image1: TImage;
procedure BitBtn6Click(Sender: TObject);
procedure Edit1KeyPress(Sender: TObject; var Key: Char);
procedure BitBtn1Click(Sender: TObject);
procedure StringGrid1Click(Sender: TObject);
procedure BitBtn7Click(Sender: TObject);
procedure FormCreate(Sender: TObject);
procedure BitBtn2Click(Sender: TObject);
procedure Edit2KeyPress(Sender: TObject; var Key: Char);
procedure BitBtn4Click(Sender: TObject);
procedure BitBtn5Click(Sender: TObject);
procedure Edit3KeyPress(Sender: TObject; var Key: Char);
procedure Edit4KeyPress(Sender: TObject; var Key: Char);
procedure BitBtn3Click(Sender: TObject);
procedure BitBtn9Click(Sender: TObject);
procedure BitBtn8Click(Sender: TObject);
procedure StringGrid2Click(Sender: TObject);
procedure StringGrid3KeyPress(Sender: TObject; var Key: Char);
procedure BitBtn11Click(Sender: TObject);
procedure BitBtn10Click(Sender: TObject);
procedure Button1Click(Sender: TObject);
procedure Button2Click(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;
var
Form1: TForm1;
implementation
uses Unit2;
{$R *.dfm}
procedure Otchistka();
begin
form1.stringgrid1.RowCount :=2;
form1.stringgrid1.Cells [0,form1.stringgrid1.RowCount - 1] := '';
form1.stringgrid1.Cells [1,form1.stringgrid1.RowCount - 1] := '';
form1.stringgrid2.RowCount :=2;
form1.stringgrid2.Cells [0,form1.stringgrid2.RowCount - 1] := '';
form1.stringgrid2.Cells [1,form1.stringgrid2.RowCount - 1] := '';
form1.stringgrid3.RowCount :=2;
form1.stringgrid2.Cells [0,form1.stringgrid2.RowCount - 1] := '';
form1.stringgrid2.Cells [1,form1.stringgrid2.RowCount - 1] := '';
form1.stringgrid3.ColCount :=2;
form1.stringgrid3.RowCount :=2;
end;
procedure Otvet();
var count,count2:integer;
boo:boolean;
begin
form1.Memo1.Lines.Add('Выгодно производить/использовать следующую продукцию:');
for count:=1 to form1.StringGrid4.RowCount -1 do
for count2:=0 to form1.StringGrid2.RowCount -1 do
if form1.StringGrid4.Cells[0,count] = form1.StringGrid2.Cells[0,count2] then
begin
form1.Memo1.Lines.Add (form1.StringGrid4.Cells[0,count]+ ' в количестве ' + form1.StringGrid4.Cells[1,count]+' ед.');
end;
boo:=false;
for count:=1 to form1.StringGrid4.RowCount -1 do
for count2:=0 to form1.StringGrid1.RowCount -1 do
if form1.StringGrid4.Cells[0,count] = form1.StringGrid1.Cells[0,count2] then
begin
boo:=true;
break;
end;
if boo then
begin
form1.Memo1.Lines.Add('');
form1.Memo1.Lines.Add('При этом будут такие излишки ресурсов:');
for count:=1 to form1.StringGrid4.RowCount -1 do
for count2:=0 to form1.StringGrid1.RowCount -1 do
if form1.StringGrid4.Cells[0,count] = form1.StringGrid1.Cells[0,count2] then
begin
form1.Memo1.Lines.Add (form1.StringGrid4.Cells[0,count]+ ' в количестве ' + form1.StringGrid4.Cells[1,count]+' ед.');
end;
end;
form1.Memo1.Lines.Add('');
if form1.RadioButton2.Checked then
form1.Memo1.Lines.Add('Затраты при таком плане использования составят ' + floattostr((-1)*strtofloat(form1.StringGrid4.Cells[1,1]))+' у.е.')
else
form1.Memo1.Lines.Add('Прибыль при таком плане производства составит ' + form1.StringGrid4.Cells[1,1]+' у.е.');
end;
procedure zapolni();
var Count:integer;
begin
form1.StringGrid3.Cells[1,0]:='ОФР';
for Count:=1 to form1.stringgrid1.RowCount-1 do
begin
form1.StringGrid3.RowCount :=form1.StringGrid3.RowCount +1;
form1.StringGrid3.Cells[0,Count+1]:=form1.StringGrid1.Cells[0,Count];
end;
form1.StringGrid3.Cells[0,1]:='Прибыль';
form1.StringGrid3.Cells[1,1]:='0';
for Count:=1 to form1.stringgrid2.RowCount-1 do
begin
form1.StringGrid3.ColCount := form1.StringGrid3.ColCount+1;
form1.StringGrid3.Cells[Count+1,0]:=form1.StringGrid2.Cells[0,Count];
end;
for Count:=1 to form1.StringGrid1.RowCount -1 do
form1.StringGrid3.Cells[1,Count+1]:=form1.StringGrid1.Cells[1,Count];
for Count:=1 to form1.StringGrid2.RowCount -1 do
form1.StringGrid3.Cells[Count+1,1]:=form1.StringGrid2.Cells[1,Count];
end;
procedure ZapEnd();
var Count,count2,tmp,k:integer;
begin
k:=1;
if form1.RadioButton2.Checked then k:=-1;
form1.StringGrid4.RowCount :=form1.StringGrid3.RowCount;
form1.StringGrid4.ColCount := form1.StringGrid3.ColCount;
for count:=0 to form1.StringGrid3.RowCount-1 do
for count2:=0 to form1.StringGrid3.ColCount-1 do
form1.StringGrid4.Cells [Count2,count] :=form1.StringGrid3.Cells [Count2,count];
for count:=1 to form1.StringGrid3.RowCount-1 do
for count2:=1 to form1.StringGrid3.ColCount-1 do
form1.StringGrid4.Cells [Count2,count] :=floattostr(k*strtofloat(form1.StringGrid3.Cells [Count2,count]));
for count:=1 to form1.StringGrid4.ColCount -1 do
form1.StringGrid4.Cells[count,1]:=floattostr(strtofloat(form1.StringGrid4.Cells[count,1])*(-1));
tmp:=form1.StringGrid4.ColCount;
form1.StringGrid4.ColCount := tmp + form1.StringGrid3.RowCount -2;
for Count:=2 to form1.StringGrid3.RowCount -1 do
begin
form1.StringGrid4.Cells [count+tmp-2,0]:=form1.StringGrid3.Cells [0,count];
end;
for count:=tmp to form1.StringGrid4.ColCount-1 do
for count2:=1 to form1.StringGrid4.RowCount - 1 do
if form1.StringGrid4.Cells [count,0]= form1.StringGrid4.Cells [0,count2] then
form1.StringGrid4.Cells [count,count2]:='1'
else
form1.StringGrid4.Cells [count,count2]:='0';
end;
function Proverka():boolean;
var Count,Count2:integer;
boo:boolean;
begin
boo:=true;
form1.StringGrid3.Cells [1,1]:='0';
for Count:=1 to form1.StringGrid3.RowCount -1 do
for Count2:=1 to form1.StringGrid3.ColCount -1 do
if form1.StringGrid3.Cells [Count2,Count]='' then
begin
boo:=false;
form1.Label5.Caption :='Ошибка заполнения таблицы. Найдено пустое поле!';
end;
proverka:=boo;
end;
procedure SimplexMetod(n:boolean);
var Count,Count2,MinC,MinR:integer;
MinEl,zna4,zna4TMP,zna4TMP2:double;
boo,reshil:boolean;
begin
reshil:=false;
repeat
boo:=false;
for count:=1 to form1.StringGrid4.ColCount -1 do
if strtofloat(form1.StringGrid4.Cells [count,1])<0 then boo:=true;
if boo then
begin
MinC:=2;
zna4:=strtofloat(form1.StringGrid4.Cells [2,1]);
for count:=2 to form1.StringGrid4.ColCount -1 do
if strtofloat(form1.StringGrid4.Cells [count,1])<zna4 then
begin
zna4:=strtofloat(form1.StringGrid4.Cells [count,1]);
MinC:=count;
end;
zna4TMP:=strtofloat(form1.StringGrid4.Cells [1,2]);
zna4TMP2:=strtofloat(form1.StringGrid4.Cells [MinC,2]);
MinEl:=zna4TMP/zna4TMP2;
MinR:=2;
for Count:=2 to form1.StringGrid4.RowCount -1 do
begin
zna4TMP:=strtofloat(form1.StringGrid4.Cells [1,count]);
zna4TMP2:=strtofloat(form1.StringGrid4.Cells [MinC,count]);
if zna4TMP2>0 then
begin
zna4:=zna4TMP/zna4TMP2;
if zna4<MinEl then
begin
MinEl:=zna4;
MinR:=Count;
end;
end;
end;
MinEl:=strtofloat(form1.StringGrid4.Cells[MinC,MinR]);
for count:=1 to form1.StringGrid4.ColCount -1 do
Form1.StringGrid4.Cells[count,MinR]:=floattostr(strtofloat(form1.StringGrid4.Cells[count,MinR])/MinEl) for count:=1 to form1.StringGrid4.ColCount -1 do
for Count2:=1 to form1.StringGrid4.RowCount -1 do
if (count<>MinC)and(count2<>MinR) then
form1.StringGrid4.Cells [count,count2]:=floattostr(strtofloat(form1.StringGrid4.Cells [count,count2])-strtofloat(form1.StringGrid4.Cells [count,MinR])*strtofloat(form1.StringGrid4.Cells [MinC,count2]));
form1.StringGrid4.Cells[0,MinR]:=form1.StringGrid4.Cells[MinC,0];
for count:=1 to form1.StringGrid4.RowCount - 1 do
if form1.StringGrid4.Cells [MinC,0]= form1.StringGrid4.Cells [0,count] then
form1.StringGrid4.Cells [MinC,count]:='1'
else
form1.StringGrid4.Cells [MinC,count]:='0';
end
else
begin
form1.Label5.Caption :='Решение найдено!!!';
reshil:=true;
end;
until reshil or n;
end;
procedure DvSimplexMetod(n:boolean);
var Count,Count2,MinC,MinR:integer;
MinEl,zna4,zna4TMP,zna4TMP2:double;
boo,reshil,dv:boolean;
begin
reshil:=false;
dv:=form1.RadioButton2.Checked;
repeat
boo:=false;
for count:=2 to form1.StringGrid4.ColCount -1 do
if strtofloat(form1.StringGrid4.Cells [count,1])<0 then boo:=true;
for count:=2 to form1.StringGrid4.RowCount -1 do
if strtofloat(form1.StringGrid4.Cells [1,count])<0 then boo:=true;
if boo then
begin
MinR:=2;
zna4:=strtofloat(form1.StringGrid4.Cells [1,2]);
for count:=2 to form1.StringGrid4.RowCount -1 do
if strtofloat(form1.StringGrid4.Cells [1,count])<zna4 then
begin
zna4:=strtofloat(form1.StringGrid4.Cells [1,count]);
MinR:=count;
end;
zna4TMP:=strtofloat(form1.StringGrid4.Cells [2,1]);
zna4TMP2:=strtofloat(form1.StringGrid4.Cells [2,MinR]);
MinEl:=zna4TMP/zna4TMP2;
MinC:=2;
for Count:=2 to form1.StringGrid4.ColCount -1 do
begin
zna4TMP:=strtofloat(form1.StringGrid4.Cells [count,1]);
zna4TMP2:=strtofloat(form1.StringGrid4.Cells [count,MinR]);
if (zna4TMP>0) and (zna4TMP2<0) then
begin
zna4:=zna4TMP/zna4TMP2;
if abs(zna4)<abs(MinEl) then
begin
MinEl:=zna4;
MinC:=Count;
end;
end;
end;
MinEl:=strtofloat(form1.StringGrid4.Cells[MinC,MinR]);
for count:=1 to form1.StringGrid4.ColCount -1 do
form1.StringGrid4.Cells[count,MinR]:=floattostr(strtofloat(form1.StringGrid4.Cells[count,MinR])/MinEl);
for count:=1 to form1.StringGrid4.ColCount -1 do
for Count2:=1 to form1.StringGrid4.RowCount -1 do
if (count<>MinC)and(count2<>MinR) then
form1.StringGrid4.Cells [count,count2]:=floattostr(strtofloat(form1.StringGrid4.Cells [count,count2])-strtofloat(form1.StringGrid4.Cells [count,MinR])*strtofloat(form1.StringGrid4.Cells [MinC,count2]));
form1.StringGrid4.Cells[0,MinR]:=form1.StringGrid4.Cells[MinC,0];
for count:=1 to form1.StringGrid4.RowCount - 1 do
if form1.StringGrid4.Cells [MinC,0]= form1.StringGrid4.Cells [0,count] then
form1.StringGrid4.Cells [MinC,count]:='1'
else
form1.StringGrid4.Cells [MinC,count]:='0';
end
else
begin
form1.Label5.Caption :='Решение найдено!!!';
reshil:=true;
end;
until reshil or n;
end;
procedure TForm1.BitBtn6Click(Sender: TObject);
begin
Form1.Visible:=false;
Form2.Visible:=True;
end;
procedure TForm1.Edit1KeyPress(Sender: TObject; var Key: Char);
begin
case key of
#8: ;
#13: edit2.SetFocus ;
'a'..'z': ;
'A'..'Z': ;
'а'..'я': ;
'А'..'Я': ;
'0'..'9': ;
else key:=#0;
end;
end;
procedure TForm1.BitBtn1Click(Sender: TObject);
var Count:integer;
boo:boolean;
begin
boo:=true;
if (edit1.Text ='')or(edit2.Text ='') then
begin
boo:=false;
label5.Caption :='Заполните все поля ввода.';
end;
for Count := 1 to stringgrid1.RowCount do
begin
if (edit1.Text = stringgrid1.Cells [0,Count]) then
boo:=false;
end;
if boo then
begin
if (stringgrid1.RowCount = 2) and (stringgrid1.Cells[0,1]='') then
stringgrid1.RowCount := stringgrid1.RowCount
else
stringgrid1.RowCount := stringgrid1.RowCount + 1;
stringgrid1.Cells [0,stringgrid1.RowCount - 1] := edit1.Text;
stringgrid1.Cells [1,stringgrid1.RowCount - 1] := edit2.Text;
label5.Caption :='Ресурс добавлен!';
edit1.SetFocus();
end
else
label5.Caption :='Такой ресурс уже есть';
end;
procedure TForm1.StringGrid1Click(Sender: TObject);
var i :integer;
begin
i:=stringgrid1.Row;
edit1.Text := stringgrid1.Cells [0,i];
edit2.Text := stringgrid1.Cells [1,i];
label5.Caption := '';
end;
procedure TForm1.BitBtn7Click(Sender: TObject);
var Count,i:integer;
boo:boolean;
begin
boo:=true;
for Count := 1 to stringgrid1.RowCount do
begin
if (edit1.Text = stringgrid1.Cells [0,Count]) then
begin
i:=Count;
boo:=false;
end;
end;
if boo then
begin
label5.Caption :='Такого ресурса нет в списке!';
end
else
begin
stringgrid1.Cells [0,i] := edit1.Text;
stringgrid1.Cells [1,i] := edit2.Text;
label5.Caption :='Ресурс изменен.';
end;
end;
procedure TForm1.FormCreate(Sender: TObject);
begin
stringgrid1.Cells [0,0]:='Наименование';
stringgrid1.Cells [1,0]:='ОФР';
stringgrid2.Cells [0,0]:='Наименование';
stringgrid2.Cells [1,0]:='Стоимость';
end;
procedure TForm1.BitBtn2Click(Sender: TObject);
var Count,i:integer;
boo:boolean;
begin
boo:=true;
for Count := 1 to stringgrid1.RowCount do
begin
if (edit1.Text = stringgrid1.Cells [0,Count]) then
begin
i:=Count;
boo:=false;
end;
end;
if boo then
begin
label5.Caption :='Такого ресурса нет в списке!';
end
else
begin
stringgrid1.Rows[i].Clear ;
for Count := i to stringgrid1.RowCount-1 do
begin
stringgrid1.Cells [0,Count]:=stringgrid1.Cells [0,Count+1];
stringgrid1.Cells [1,Count]:=stringgrid1.Cells [1,Count+1];
end;
stringgrid1.RowCount := stringgrid1.RowCount -1;
label5.Caption :='Ресурс стерт.';
end;
end;
procedure TForm1.Edit2KeyPress(Sender: TObject; var Key: Char);
begin
case key of
#8: ;
#13: bitbtn1.SetFocus;
'0'..'9': ;
#110:;
#46:;
else key:=#0;
end;
end;
procedure TForm1.BitBtn4Click(Sender: TObject);
begin
label5.Caption :='';
if groupbox5.Visible = true then
begin
groupbox5.Visible := false;
groupbox6.Visible := true;
bitbtn10.Visible :=false;
bitbtn11.Visible :=false;
memo1.Clear();
bitbtn4.Enabled :=false;
if form1.RadioButton2.Checked then
dvSimplexMetod(False)
else
SimplexMetod(False);
Otvet();
end;
if groupbox4.Visible = true then
begin
if Proverka() then
begin
groupbox4.Visible := false;
groupbox5.Visible := true;
bitbtn10.Visible :=true;
bitbtn11.Visible :=true;
bitbtn4.Caption := '<Ответ>';
zapend();
end;
end;
if groupbox3.Visible = true then
begin
if stringgrid2.Cells[0,1]<>'' then
begin
groupbox3.Visible := false;
groupbox4.Visible := true;
stringgrid3.ColCount :=2;
stringgrid3.RowCount :=2;
zapolni();
end
else label5.Caption :='Подуктов нет?!';
end;
if groupbox1.Visible = true then
begin
if stringgrid1.Cells[0,1]<>'' then
begin
bitbtn5.Enabled := true;
groupbox1.Visible := false;
groupbox3.Visible := true;
end
else label5.Caption :='Ресурсы не могут отсутствовать!';
end;
end;
procedure TForm1.BitBtn5Click(Sender: TObject);
begin
label5.Caption :='';
if groupbox3.Visible = true then
begin
bitbtn5.Enabled := false;
groupbox3.Visible := false;
groupbox1.Visible := true;
end;
if groupbox4.Visible = true then
begin
groupbox4.Visible := false;
groupbox3.Visible := true;
end;
if groupbox5.Visible = true then
begin
groupbox5.Visible := false;
groupbox4.Visible := true;
bitbtn10.Visible :=false;
bitbtn11.Visible :=false;
bitbtn4.Caption := 'Дальше -->';
bitbtn4.Enabled :=true;
end;
if groupbox6.Visible = true then
begin
groupbox6.Visible := false;
groupbox5.Visible := true;
bitbtn10.Visible :=true;
bitbtn11.Visible :=true;
bitbtn4.Enabled :=true;
end;
end;
procedure TForm1.Edit3KeyPress(Sender: TObject; var Key: Char);
begin
case key of
#8: ;
#13: edit4.SetFocus ;
'a'..'z': ;
'A'..'Z': ;
'а'..'я': ;
'А'..'Я': ;
'0'..'9': ;
else key:=#0;
end;
end;
procedure TForm1.Edit4KeyPress(Sender: TObject; var Key: Char);
begin
case key of
#8: ;
#13: bitbtn3.SetFocus;
'0'..'9': ;
#110:;
#46:;
else key:=#0;
end;
end;
procedure TForm1.BitBtn3Click(Sender: TObject);
var Count:integer;
boo:boolean;
begin
boo:=true;
if (edit3.Text ='')or(edit4.Text ='') then
begin
boo:=false;
label5.Caption :='Заполните все поля ввода.';
end;
for Count := 1 to stringgrid2.RowCount do
begin
if (edit3.Text = stringgrid2.Cells [0,Count]) then
boo:=false;
end;
if boo then
begin
if (stringgrid2.RowCount = 2) and (stringgrid2.Cells[0,1]='') then
stringgrid2.RowCount := stringgrid2.RowCount
else
stringgrid2.RowCount := stringgrid2.RowCount + 1;
stringgrid2.Cells [0,stringgrid2.RowCount - 1] := edit3.Text;
stringgrid2.Cells [1,stringgrid2.RowCount - 1] := edit4.Text;
label5.Caption :='Продукт добавлен!';
edit3.SetFocus();
end
else
label5.Caption :='Такой продукт уже есть';
end;
procedure TForm1.BitBtn9Click(Sender: TObject);
var Count,i:integer;
boo:boolean;
begin
boo:=true;
for Count := 1 to stringgrid2.RowCount do
begin
if (edit3.Text = stringgrid2.Cells [0,Count]) then
begin
i:=Count;
boo:=false;
end;
end;
if boo then
begin
label5.Caption :='Такого продукта нет в списке!';
end
else
begin
stringgrid2.Rows[i].Clear ;
for Count := i to stringgrid2.RowCount-1 do
begin
stringgrid2.Cells [0,Count]:=stringgrid2.Cells [0,Count+1];
stringgrid2.Cells [1,Count]:=stringgrid2.Cells [1,Count+1];
end;
stringgrid2.RowCount := stringgrid2.RowCount -1;
label5.Caption :='Продукт стерт.';
end;
end;
procedure TForm1.BitBtn8Click(Sender: TObject);
var Count,i:integer;
boo:boolean;
begin
boo:=true;
for Count := 1 to stringgrid2.RowCount do
begin
if (edit3.Text = stringgrid2.Cells [0,Count]) then
begin
i:=Count;
boo:=false;
end;
end;
if boo then
begin
label5.Caption :='Такого продукта нет в списке!';
end
else
begin
stringgrid2.Cells [0,i] := edit3.Text;
stringgrid2.Cells [1,i] := edit4.Text;
label5.Caption :='Продукт изменен.';
end;
end;
procedure TForm1.StringGrid2Click(Sender: TObject);
var i :integer;
begin
i:=stringgrid2.Row;
edit3.Text := stringgrid2.Cells [0,i];
edit4.Text := stringgrid2.Cells [1,i];
label5.Caption := '';
end;
procedure TForm1.StringGrid3KeyPress(Sender: TObject; var Key: Char);
begin
case key of
#8: ;
#13:;
'0'..'9': ;
#110:;
',': ;
#46:;
else key:=#0;
end;
end;
procedure TForm1.BitBtn11Click(Sender: TObject);
begin
if form1.RadioButton2.Checked then
dvSimplexMetod(True)
else
SimplexMetod(True);
end;
procedure TForm1.BitBtn10Click(Sender: TObject);
begin
if form1.RadioButton2.Checked then
dvSimplexMetod(False)
else
SimplexMetod(False);
end;
procedure TForm1.Button1Click(Sender: TObject);
begin
Otchistka();
//Добавляем ресурсы
stringgrid1.Cells [0,stringgrid1.RowCount - 1] := 'Возможное количество реализации полок';
stringgrid1.Cells [1,stringgrid1.RowCount - 1] := '550';
stringgrid1.RowCount := stringgrid1.RowCount + 1;
stringgrid1.Cells [0,stringgrid1.RowCount - 1] := 'Количество получаемого материала';
stringgrid1.Cells [1,stringgrid1.RowCount - 1] := '1200';
stringgrid1.RowCount := stringgrid1.RowCount + 1;
stringgrid1.Cells [0,stringgrid1.RowCount - 1] := 'Время работы над полками(в мин)';
stringgrid1.Cells [1,stringgrid1.RowCount - 1] := '9600';
//добавляем продукты
stringgrid2.Cells [0,stringgrid2.RowCount - 1] := 'x1';
stringgrid2.Cells [1,stringgrid2.RowCount - 1] := '3';
stringgrid2.RowCount := stringgrid2.RowCount + 1;
stringgrid2.Cells [0,stringgrid2.RowCount - 1] := 'x2';
stringgrid2.Cells [1,stringgrid2.RowCount - 1] := '4';
//заполняем затраты
zapolni();
stringgrid3.Cells [2,2] := '1';
stringgrid3.Cells [2,3] := '2';
stringgrid3.Cells [2,4] := '12';
stringgrid3.Cells [3,2] := '1';
stringgrid3.Cells [3,3] := '3';
stringgrid3.Cells [3,4] := '30';
//заполняем и выполняем
bitBtn5.Enabled:=true;
if Proverka() then
begin
groupbox1.Visible := false;
groupbox5.Visible := true;
bitbtn10.Visible :=true;
bitbtn11.Visible :=true;
bitbtn4.Caption := '<Ответ>';
zapend();
end;
end;
procedure TForm1.Button2Click(Sender: TObject);
begin
bitbtn10.Visible :=false;
bitbtn11.Visible :=false;
bitbtn4.Caption := 'Дальше -->';
bitbtn4.Enabled :=true;
groupbox1.Visible := true;
groupbox3.Visible := false;
groupbox4.Visible := false;
groupbox5.Visible := false;
groupbox6.Visible := false;
label5.Caption:='';
Otchistka();
end;
end.
unit Unit2;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls, jpeg, ExtCtrls;
type
TForm2 = class(TForm)
Image1: TImage;
Label1: TLabel;
Label2: TLabel;
Label3: TLabel;
Label4: TLabel;
Label5: TLabel;
Image2: TImage;
procedure Label2MouseEnter(Sender: TObject);
procedure Label2MouseLeave(Sender: TObject);
procedure Label3MouseEnter(Sender: TObject);
procedure Label3MouseLeave(Sender: TObject);
procedure Label4MouseEnter(Sender: TObject);
procedure Label4MouseLeave(Sender: TObject);
procedure Label5MouseEnter(Sender: TObject);
procedure Label5MouseLeave(Sender: TObject);
procedure Label2Click(Sender: TObject);
procedure Label3Click(Sender: TObject);
procedure Label4Click(Sender: TObject);
procedure Label5Click(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;
var
Form2: TForm2;
implementation
uses Unit1, Unit3;
{$R *.dfm}
procedure TForm2.Label2MouseEnter(Sender: TObject);
begin
Label2.Font.Color:=255;
end;
procedure TForm2.Label2MouseLeave(Sender: TObject);
begin
Label2.Font.Color:=16777215;
end;
procedure TForm2.Label3MouseEnter(Sender: TObject);
begin
Label3.Font.Color:=255;
end;
procedure TForm2.Label3MouseLeave(Sender: TObject);
begin
Label3.Font.Color:=16777215;
end;
procedure TForm2.Label4MouseEnter(Sender: TObject);
begin
Label4.Font.Color:=255;
end;
procedure TForm2.Label4MouseLeave(Sender: TObject);
begin
Label4.Font.Color:=16777215;
end;
procedure TForm2.Label5MouseEnter(Sender: TObject);
begin
Label5.Font.Color:=255;
end;
procedure TForm2.Label5MouseLeave(Sender: TObject);
begin
Label5.Font.Color:=16777215;
end;
procedure TForm2.Label2Click(Sender: TObject);
begin
Form1.visible:=true;
Form2.visible:=false;
end;
procedure TForm2.Label3Click(Sender: TObject);
begin
Form3.visible:=true;
Form2.Visible:=false;
end;
procedure TForm2.Label4Click(Sender: TObject);
begin
application.MessageBox('Данный программный продукт был разработан Студентом АФ КПТК группы ВТП-09с Панчуриным Олегом.'+ #13 +' Использование данного продукта разрешено только в учебных целях.','О программе.');
end;
procedure TForm2.Label5Click(Sender: TObject);
begin
Close;
end;
end.
unit Unit3;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls, jpeg, ExtCtrls;
type
TForm3 = class(TForm)
Image1: TImage;
Label1: TLabel;
Label2: TLabel;
Label3: TLabel;
Label4: TLabel;
Label5: TLabel;
Memo1: TMemo;
Button1: TButton;
procedure Label2MouseEnter(Sender: TObject);
procedure Label2MouseLeave(Sender: TObject);
procedure Label3MouseEnter(Sender: TObject);
procedure Label3MouseLeave(Sender: TObject);
procedure Label4MouseEnter(Sender: TObject);
procedure Label4MouseLeave(Sender: TObject);
procedure Label5MouseEnter(Sender: TObject);
procedure Label5MouseLeave(Sender: TObject);
procedure Label2Click(Sender: TObject);
procedure Label3Click(Sender: TObject);
procedure Label4Click(Sender: TObject);
procedure Label5Click(Sender: TObject);
procedure Button1Click(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;
var
Form3: TForm3;
implementation
uses Unit2;
{$R *.dfm}
procedure TForm3.Label2MouseEnter(Sender: TObject);
begin
Label2.Font.Color:=255;
end;
procedure TForm3.Label2MouseLeave(Sender: TObject);
begin
Label2.Font.Color:=0;
end;
procedure TForm3.Label3MouseEnter(Sender: TObject);
begin
Label3.Font.Color:=255;
end;
procedure TForm3.Label3MouseLeave(Sender: TObject);
begin
Label3.Font.Color:=0;
end;
procedure TForm3.Label4MouseEnter(Sender: TObject);
begin
Label4.Font.Color:=255;
end;
procedure TForm3.Label4MouseLeave(Sender: TObject);
begin
Label4.Font.Color:=0;
end;
procedure TForm3.Label5MouseEnter(Sender: TObject);
begin
Label5.Font.Color:=255;end;
procedure TForm3.Label5MouseLeave(Sender: TObject);
begin
Label5.Font.Color:=0;end;
procedure TForm3.Label2Click(Sender: TObject);
begin
Memo1.lines.loadFromFile('1.txt');end;
procedure TForm3.Label3Click(Sender: TObject);
begin
Memo1.Lines.LoadFromFile('2.txt');end;
procedure TForm3.Label4Click(Sender: TObject);
begin
Memo1.Lines.LoadFromFile('3.txt');
end;
procedure TForm3.Label5Click(Sender: TObject);
begin
Memo1.Lines.LoadFromFile('4.txt');end;
procedure TForm3.Button1Click(Sender: TObject);
begin
Form2.visible:=true;Form3.Visible:=false;end;end.
ПРИЛОЖЕНИЕ Г
Контрольный пример
Контрольный пример включает вычисления не только по исходным значениям, но и по другим значениям введенными пользователем.
Для контрольной проверки программы попробуем изменить значения задачи:
Таблица Г.1 Исходные данные
Базис |
План |
x1 |
x2 |
x3 |
x4 |
x5 |
х3 |
230 |
3/5 |
0 |
1 |
0 |
-1/30 |
х4 |
240 |
4/5 |
0 |
0 |
1 |
-1/10 |
х2 |
320 |
2/5 |
1 |
0 |
0 |
1/30 |
f |
1280 |
-7/5 |
0 |
0 |
0 |
2/15 |
Введём данные из таблицы в программу (рисунок Г.1) и нажмём кнопку "Решить" и получим:
Рисунок Г.1- Вычисления
После заполнения нажмем кнопку «Ответ» для вывода ответа в текстовом поле.
Рисунок Г.2 Получение результата.
Нахождение результата по введенным пользователем значениям, говорит о том что программа способна работать не только с исходными данными но и с произвольными значениями.
Стр.
6
8
8
12
14
14
16
18
19
22
24
25
26
28
33
55