Курсовая работа по дисциплине «Математические методы» Тема: «Применение линейного программирования для оптимизации прибыли в издательском бизнесе»
Вид материала | Курсовая |
СодержаниеАлгоритм симплекс-метода Конец работы алгоритма Практическая задача Решение практической задачи Разработка программного обеспечения |
- План чтения лекции по учебной дисциплине «Математические методы» Раздел, 120.82kb.
- Темы курсовых работ «Методы оптимизации» Графический метод решения задачи линейного, 11.12kb.
- Рабочая программа по дисциплине Численные методы оптимизации для специальности 220400, 70kb.
- Кафедра «Прикладная математика» Экономические приложения линейного программирования, 27.15kb.
- Рабочая программа По дисциплине «Организация управления международной деятельностью, 223.24kb.
- Ф-рабочая программа по дисциплине утверждено ученый совет факультета математики и информационных, 193.23kb.
- Задачи математического и линейного программирования. Математическая модель задачи использования, 25.82kb.
- Задачи линейного программирования Геометрическая интерпретация задач линейного программирования, 132.4kb.
- Рабочая программа дисциплины математическое моделирование (Математические методы оптимизации), 521.88kb.
- Курс Методы визуального программирования при разработке системного программного обеспечения., 30.14kb.
Алгоритм симплекс-метода:
- Определить число и состав базисных и свободных переменных.
- Выразить базисные переменные через свободные переменные.
- Выразить целевую функцию через свободные переменные.
- Построить начальную симплекс-таблицу.
- Проверить решение на оптимальность: если в F-строке (кроме С0) все Сj0, то получено оптимальное решение: X=(B1,...,Bm,0,...,0), F=C0. Если же существует Cj<0, то решение можно улучшить, но предварительно надо проверить факт существования решения.
- Проверить существование решения: рассмотрим все столбцы, у которых Сj<0, если существует хотя бы один столбец, у которого все коэффициенты Ai,j<0, то задача решения не имеет, т.к. множество допустимых решений D не ограничено и целевая функция неограниченно возрастает. Если таких столбцов нет, то переходим к следующему этапу.
- Выбрать свободную переменную, которую надо ввести в базис (выбор разрешающего столбца): это столбец, с минимальным значением Сj (пусть это k-й столбец)
- Выбрать базисную переменную, которую надо вывести из базиса (выбор разрешающей строки): рассмотрим k-й столбец и все его элементы, которые больше нуля, т.е. Ai,k>0; для всех этих элементов находим отношение Bi/Ai,k и выбираем строку, которая соответствует минимальному значению этого отношения (пусть это i-я строка); соответствующая i-я переменная Xi выводится из базиса; при нескольких одинаковых отношениях берем любую строку; элемент Ai,k называется разрешающим элементом.
- Пересчитать симплекс-таблицу: составляем новую симплекс-таблицу заменив в составе базисных переменных Xi на Xk; заполняем сначала новую k-ю строку, записывая в нее элементы старой i-ой строки, поделенные на разрешающий элемент; после заполнения k-ой строки заполняем оставшиеся строки; для этого k-ю строку умножаем последовательно на такие числа, чтобы после сложения ее с каждой строкой старой таблицы в k-ом столбце получить везде ноль (кроме единицы в k-ой строке).
- После заполнения новой симплекс-таблицы алгоритм возвращается к 5-му пункту.
Конец работы алгоритма:
- либо когда в F-строке все коэффициенты (кроме С0) будут больше нуля, тогда получаем оптимальное решение,
- либо когда существует столбец , у которого Cj<<0 и все коэффициенты Ai,j<<0, в этом случае решения на существует.
- ^ Практическая задача
Постановка задачи
Компания производит большие и маленькие книги. Каждая книга должна быть напечатана и склеена. На печать маленькой книги уходит 1 час, а на склеивание 2 часа. На печать большой книги уходит 2 часа, на склеивание 2 часа. Печатный цех работает 90 часов в неделю, а склеивательный 80. Прибыль, получаемая с маленькой книги составляет 10$, а с большой 12$. Сколько книг каждого вида должна производить компания для максимизации прибыли?
^ Решение практической задачи
Пусть фирма производит X1-кол-во больших книг и Х2-кол-во маленьких. Тогда для решения задачи необходимо найти такие X1 и Х2, что:
10*X1 + 12*Х2 - > max
1*X1+2*X2<=90
2*X1+2*X2<=80
X1 , X2 > = 0
Введем переменные Х3, Х4 >= 0, тогда задача примет стандартный (канонический) вид:
10*X1 + 12*Х2+X3+X4- > max
1*X1+2*X2+X3<=90
2*X1+2*X2+X4<=80
X1 , X2 , X3, X4 > = 0
Рассмотрим решение этой задачи, используя симплекс таблицу. Данное решение подходит для всех случаев, когда правая часть уравнений ограничений неотрицательна (90 и 80 в нашем примере). Если правая честь уравнений ограничений, после приведения задачи к каноническому виду, содержит отрицательные числа, то используйте вариант решения, разобранный во втором примере.
Составим симплекс-таблицу:
Базисные переменные | Свободные члены | X1 | X2 | Bi/Ai,k |
X3 | 90 | 1 | 2 | 45 |
X4 | 80 | 2 | 2 | 40 |
L | 0 | -10 | -12 | |
Так как в столбце свободных членов нет отрицательных элементов, то найдено допустимое решение. Так как в строке L есть отрицательные элементы, то полученное решение не оптимально. Для определения ведущего столбца найдем максимальный по модулю отрицательный элемент в строке L (-12). А ведущая строка та, у которой наименьшее положительное отношение свободного члена к соответствующему элементу ведущего столбца.
Получим Симплекс-таблицу:
Базисные переменные | Свободные члены | X1 | X4 | Bi/Ai,k |
X3 | 10 | -1 | -1 | 45 |
X2 | 40 | 1 | 0.5 | 40 |
L | 480 | 2 | 6 | |
Найдено оптимальное решение.
Из таблицы получим значения переменных целевой функции:
x1 | x2 | x3 | x4 |
0 | 40 | 10 | 0 |
Целевая функция:
Lmax=10*0+12*40
И в результате:
Lmax=480
- ^ Разработка программного обеспечения
- Описание входных данных.
Входные данные вводятся пользователем. Далее выводится симплекс таблица для заполнения дополнительных данных.
- Описание выходных данных.
Получаем симплекс-таблицу для максимизации прибыли. Stringgrid 2 – таблица содерщая конечную симплекс таблицу.Memo1 – выводится результата.
- Описание основных функций программного обеспечения.
1)Ввод входных данных;
2)Составление таблицы;
3)Вывод выходных данных;
- Ход вычислений программы.
Ввод входных данных:
Расчет при нажатии “Решить”
Вывод ответа по симплекс –таблицы:
- Руководство пользователя по использованию ПО.
Запустить файл Money.exe .В появившимся окне будет предложено ввести данные. Добавить данные в таблицу надо нажать кнопку “Добавить”, а так же можно “Изменить” или “Удалить” выделенную запись. Далее нажимает кнопку далее – появляется симплекс таблица, которую надо дополнить не достающие данные. Заполнив ее нажимаем кнопку решить – Выводится таблицы на каждом шаге. Получив конечную таблицу нажимаем на кнопку “Ответ” – выводится ответ.
Приложения
Распечатка вычислительной программы
unit Unit1;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, Grids, StdCtrls, Buttons, ComCtrls, Menus;
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;
BitBtn11: TBitBtn;
GroupBox6: TGroupBox;
Memo1: TMemo;
RichEdit1: TRichEdit;
Button2: TButton;
RadioButton1: TRadioButton;
RadioButton2: TRadioButton;
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 Button2Click(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;
var
Form1: TForm1;
implementation
{$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])
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
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])
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)
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.Close;
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;
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;
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;
bitbtn11.Visible :=false;
bitbtn4.Caption := 'Дальше -->';
bitbtn4.Enabled :=true;
end;
if groupbox6.Visible = true then
begin
groupbox6.Visible := false;
groupbox5.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.Button2Click(Sender: TObject);
begin
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.
0>0>0>0>