📄 shuru.~pas
字号:
unit shuru;
interface
uses
Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
StdCtrls, ExtCtrls, Buttons;
const long=250;//定义常量控制数组长度
type
Tfrmshuru = class(TForm)
panel2: TPanel;
Panel1: TPanel;
Label1: TLabel;
Label2: TLabel;
Edit1: TEdit;
Edit2: TEdit;
RadioGroup1: TRadioGroup;
BitBtn1: TBitBtn;
Memo1: TMemo;
Label3: TLabel;
BitBtn2: TBitBtn;
procedure FormCreate(Sender: TObject);
procedure BitBtn1Click(Sender: TObject);
procedure BitBtn2Click(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
//function useman(opt:array of Integer):boolean;
end;
type myarray=array[1..long] of array[1..long] of real;
type myarray2=array[0..long] of array[0..long] of tedit;
{----------自定义两种类型,供输入数据和数组计算使用-------------}
var
frmshuru: Tfrmshuru;
m:Integer;//约束条件个数
n:Integer;//变量个数
leixing:string;//目标函数类型
ziyou:integer;//松弛变量个数
man:Integer;//人工变量个数
A:myarray;//系数矩阵
opt:array[1..long] of integer;//操作符 0、-1、1 表示等于、小于、大于
b,c,d:array[1..long] of real;
juece:array[1..long] of integer;
w:real;//人工目标函数值
z:real;//最终目标函数值
s,r:Integer;//主元列号和行号
//分别保存常数项、原目标函数、人工目标函数
{----定义几个全局变量,实现数据传递------------------------------}
implementation
{$R *.DFM}
uses jisuan1,jisuan2;
var shuru1:myarray2; //输入框
function useman:Boolean;
var i:Integer;
begin
Result:=False; //赋初值
for i:=1 to m do
if opt[i]>-1 then //判断有无非小于情况
begin
Result:=true;
break;
end;
end;
{-------------判断是否需要加入人工变量--------------------------}
procedure Tfrmshuru.BitBtn1Click(Sender: TObject);
var i,j:integer;
x0,y0:Integer;//定位输入框起点位置
begin
if (edit1.text<>'') and (edit2.text<>'') then
begin
try
for i:=1 to m+1 do
for j:=1 to n+2 do
shuru1[i,j].free;
//释放原有文本框
finally
m:=0;n:=0;
m:=strtoint(edit1.text);
n:=strtoint(edit2.text);//输入不等式约束条件个数m:
leixing:=RadioGroup1.Items[RadioGroup1.ItemIndex];
if m>6 then
panel2.Height:=panel2.Height+28*(m-6)
else panel2.Height:=290;
if n>6 then
panel2.Width:=panel2.Width+40*(n-6)
else panel2.Width:=359;
frmshuru.Height:=panel2.Height+Label3.Height+Memo1.Height;
frmshuru.Width:=panel2.Width+Panel1.Width;
frmshuru.Top:=(Screen.Height-frmshuru.Height) div 2;
frmshuru.Left:=(Screen.Width-frmshuru.Width) div 2;
{----------动态调整面板的高和宽,窗体的大小和位置--------------}
x0:=(panel2.Width-(n+2)*40) div 2;
y0:=(panel2.Height-(m+1)*28) div 2;
{----------控制输入框的位置,使其居于面板中间------------------}
frmshuru.AutoSize:=False;//防止窗体抖动
for i:=1 to m+1 do
for j:=1 to n+2 do
begin
shuru1[i,j]:=tedit.Create(self);
shuru1[i,j].parent:=panel2;
shuru1[i,j].Width:=40;
shuru1[i,j].left:=x0+(j-1)*shuru1[i,j].Width;
shuru1[i,j].top:=y0+(i-1)*shuru1[i,j].Height;
end;
end;
shuru1[1,1].SetFocus;
BitBtn2.Enabled:=true;
frmshuru.AutoScroll:=((Screen.Width-frmshuru.Width<20) or (Screen.Height-frmshuru.Height<50));
{----------控制界面--------------------------------------------------}
end
else showmessage('输入条件不完善,请补充');
end;
procedure Tfrmshuru.BitBtn2Click(Sender: TObject);
var i,j:integer;
begin
for i:=1 to long do
begin
for j:=1 to long do A[i,j]:=0;
b[i]:=0;
opt[i]:=0;
c[i]:=0;
d[i]:=0;
end;
{---------------初始化变量---------------------------------------}
for i:=1 to m do
begin
if shuru1[i,n+2].text<>'' then b[i]:=strtofloat(shuru1[i,n+2].text);
if shuru1[i,n+1].text<>'' then opt[i]:=strtoint(shuru1[i,n+1].text);
for j:=1 to n do
if shuru1[i,j].text<>'' then
A[i,j]:=strtofloat(shuru1[i,j].text);
end;
for j:=1 to n do
if shuru1[m+1,j].Text<>'' then
c[j]:=StrToFloat(shuru1[m+1,j].Text);
{------------给限定向量、操作符、系数矩阵、目标函数系数赋初值----}
if RadioGroup1.Items[RadioGroup1.ItemIndex] = 'Max' then
begin
for j:=1 to n do c[j]:=-c[j];
leixing:='Max';
end
else leixing:='Min';
for i:=1 to m do
if b[i]<0 then //使右边非负
begin
opt[i]:=-opt[i];
for j:=0 to n do A[i,j]:=-A[i,j];
end;
{------------------------标准化处理------------------------------}
if useman then //需要加入人工变量、调用第一阶段程序
begin
ShowMessage('需要加入人工变量,进入第一阶段求解');
frmjisuan1.Show;
frmjisuan1.BitBtn3.Enabled:=true;
end
else //不需要加入人工变量、直接调用第二阶段程序
begin
ShowMessage('不需要加入人工变量,直接进入第二阶段求解');
for j:=1 to n do
d[j]:=c[j];
frmjisuan2.show;
frmjisuan2.BitBtn1.Enabled:=True;
end;
end;
procedure Tfrmshuru.FormCreate(Sender: TObject);
begin
BitBtn2.Enabled:=false;
//将下一步按钮的可操作性设为false
end;
end.
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -