📄 unit1.cpp
字号:
//本程序的主体运行环境,是主体窗口
#include <vcl.h>
#pragma hdrstop
#include "Unit1.h"
#include "Unit2.h"
#include "Unit3.h"
#include "Unit4.h"
#include "math.h"
//-------------------------------------------------------------
#pragma package(smart_init)
#pragma resource "*.dfm"
TMainForm *MainForm;
//-----------------初始化主窗体-------------------------------------------------
__fastcall TMainForm::TMainForm(TComponent* Owner)
: TForm(Owner)
{
ChildCount=0; //没有子窗体
HaveHelp=false;
}
//-----------------创建一个子窗体-----------------------------------------------
void __fastcall TMainForm::CreateMDIChild(const String Name)
{
TChildForm *Child;
Child=new TChildForm(Application);
ChildCount+=1;
Child->Caption=Name;
Child->HaveName=false;
if(FileExists(Name))
{
Child->Memo1->Lines->LoadFromFile(Name);
Child->HaveName=true;
}
}
//------------------新建文件----------------------------------------------------
void __fastcall TMainForm::FileNewExecute(TObject *Sender)
{
CreateMDIChild("工程"+IntToStr(ChildCount+1)+".txt");
}
// ------------------打开文件---------------------------------------------------
void __fastcall TMainForm::FileOpenExecute(TObject *Sender)
{
if(OpenDialog1->Execute())
CreateMDIChild(OpenDialog1->FileName);
}
//------------------下拉菜单中的新建操作----------------------------------------
void __fastcall TMainForm::NewClick(TObject *Sender)
{
FileNewExecute(Sender);
}
//------------------下拉菜单中的打开操作----------------------------------------
void __fastcall TMainForm::OpenClick(TObject *Sender)
{
FileOpenExecute(Sender);
}
//------------------保存--------------------------------------------------------
void __fastcall TMainForm::SaveClick(TObject *Sender)
{
TChildForm *NowChild=(TChildForm *)ActiveMDIChild;
if(ActiveMDIChild)
{
if(NowChild->HaveName==true)
{
NowChild->Memo1->Lines->SaveToFile(NowChild->Caption);
NowChild->Memo1->Modified=false;
}
else
{
SaveAsClick(Sender);
}
}
}
//------------------另存为------------------------------------------------------
void __fastcall TMainForm::SaveAsClick(TObject *Sender)
{
TChildForm *NowChild=(TChildForm *)ActiveMDIChild;
if(ActiveMDIChild)
{
SaveDialog1->FileName=NowChild->Caption;
if(SaveDialog1->Execute())
{
NowChild->Caption=SaveDialog1->FileName+".txt";
NowChild->HaveName=true;
SaveClick(Sender);
}
}
}
//-----------------关闭当前子窗体-----------------------------------------------
void __fastcall TMainForm::Close1Click(TObject *Sender)
{
TChildForm *NowChild=(TChildForm *)ActiveMDIChild;
if(ActiveMDIChild)
NowChild->Close();
}
//-----------------是否数字-----------------------------------------------------
bool __fastcall TMainForm::IsNumber( char c)
{
if(c>='0'&&c<='9')
return(true);
else
return(false);
}
//-----------------是否字母-----------------------------------------------------
bool __fastcall TMainForm::IsLetter( char c)
{
if((c>='a'&&c<='z')||(c>='A'&&c<='Z'))
return(true);
else
return(false);
}
//------------------返回向量中最大值的下标--------------------------------------
int __fastcall TMainForm::Max_Index(const Double_Vector &V,const int n)
{
double max=V[0];
int index=0;
for(int i=1;i<n;i++)
if(V[i]>max)
{ index=i; max=V[i]; }
return(index);
}
//------------ 返回矩阵的k列向量中前t个分量的最大值-----------------------------
double __fastcall TMainForm::Max(const Matrix &M,const int k,const int t)
{
double max=M[0][k];
for(int i=1;i<t;i++)
if(M[i][k]>max)
max=M[i][k];
return(max);
}
//------------------运行--------------------------------------------------------
void __fastcall TMainForm::RunClick(TObject *Sender)
{
if(ChildCount==0)//当前没有工程
{
MessageDlg("对不起!当前没有任何工程!",mbOK,TMsgDlgButtons()<<mbOK,0);
return;
}
TChildForm *NowChild=(TChildForm *)ActiveMDIChild; //指向当前活动的工程
int total=NowChild->Memo1->Text.Length(); //文本长度
int Row=NowChild->Memo1->Lines->Count-1; //约束行数
char* text=new char[ NowChild->Memo1->Text.Length() + 1 ] ;
strcpy( text, NowChild->Memo1->Text.c_str() );//把文本复制给text
char NameTemp[200][10]; //变量名临时存储空间
int i=0, type; //标志求最大还是最小
//判断问题求最大还是最小
while( !IsLetter(text[i]) ) i+=1;
if((text[i]=='m'||text[i]=='M')&&(text[i+1]=='a'||text[i+1]=='A')&&
(text[i+2]=='x'||text[i+2]=='X'))
type=1;//求最大
else if((text[i]=='m'||text[i]=='M')&&(text[i+1]=='i'||text[i+1]=='I')&&
(text[i+2]=='n'||text[i+2]=='N'))
type=0;//求最小
else
{ //无法识别最大还是最小
MessageDlg("对不起!输入错误!",mbOK,TMsgDlgButtons()<<mbOK,0);
return;
}
//提取文本出现的所有变量名
i=i+3;
int k=i;
int start=0;
int s;
while(!IsLetter(text[i])) i+=1;
while(i<total)
{
s=0;
while( (IsNumber(text[i])||IsLetter(text[i]) )&&i<total)
{ NameTemp[start][s]=text[i]; s+=1; i+=1; }
NameTemp[start][s]='\0';
while(!IsLetter(text[i])&&i<total) i+=1;
start+=1;
}
//NameTemp记录了变量名,其中有重复
//以下删去重复的变量名
int j;
for(i=0;i<start;i++)
for(j=i+1;j<start;j++)
if(NameTemp[j][0]!='@')
if(strcmp(NameTemp[j],NameTemp[i])==0)
NameTemp[j][0]='@';//标记
char * *Name=(char * *)malloc(40*sizeof(char *));//Name记录变量名
int Col=0; //动态分配内存一定要释放
for(i=0;i<start;i++)
if(NameTemp[i][0]!='@')
{ Name[Col]=(char *)malloc((strlen(NameTemp[i])+1)*sizeof(char));
strcpy(Name[Col],NameTemp[i]);
Col+=1;
}
//得到变量名的记录Name ,Col记录了原始LP问题的约束矩阵的列数
//******************************************************************************
//处理价值向量
C.Length=Col+2*Row;
for(i=0;i<Col+2*Row;i++)
C[i]=0.0;
char NumberWork[10];
char NameWork[10];
i=k;
char sign;
while((text[i]==' '||text[i]=='+'||text[i]=='-')&&i<total)
{
while(text[i]==' '&&i<total) i+=1;
sign='+';
if(text[i]=='-')
sign='-';
while ((!IsNumber(text[i]))&&(!IsLetter(text[i]))&&i<total)
i+=1;
if(IsNumber(text[i]))//系数不是1
{
k=0;
s=0;
while((IsNumber(text[i])||text[i]=='.')&&i<total)
{ NumberWork[s]=text[i]; s+=1; i+=1; }
NumberWork[s]='\0';
}
else if(IsLetter(text[i])) k=1;//系数是1
s=0; //记录系数所属变量
while(!IsLetter(text[i])) i+=1;
while((IsNumber(text[i])||IsLetter(text[i]))&&i<total)
{ NameWork[s]=text[i]; s+=1; i+=1;}
NameWork[s]='\0';
for(j=0;j<Col;j++)//匹配变量
if(strcmp(NameWork,Name[j])==0)
break;
if(k==0)
C[j]=StrToFloat(NumberWork);
else C[j]=1.0;
if(sign=='-') C[j]*=-1;
while(text[i]==' ') i+=1;
}
//价值向量已经处理完毕
//******************************************************************************
//处理约束条件
Char_Vector signs;//记录每个约束行的>,<,=号的情况
signs.Length=Row;
RHS.Length=Row;
A.Length=Row;
//初始化
for(k=0;k<Row;k++)
{
RHS[k]=0.0;
A[k].Length=Col+2*Row;
for(s=0;s<Col+2*Row;s++)
A[k][s]=0.0;
}
//Row个约束行
for(int p=0;p<Row;p++)
{ //约束矩阵的处理
while(text[i]!='>'&&text[i]!='<'&&text[i]!='=')
{
while(!IsNumber(text[i])&&!IsLetter(text[i])
&&text[i]!='+'&&text[i]!='-')
i+=1;
sign='+';
if(text[i]=='-')
sign='-';
while ((!IsNumber(text[i]))&&(!IsLetter(text[i]))&&i<total)
i+=1;
if(IsNumber(text[i]))//系数不是1
{
k=0;
s=0;
while((IsNumber(text[i])||text[i]=='.')&&i<total)
{ NumberWork[s]=text[i]; s+=1; i+=1; }
NumberWork[s]='\0';
}
else if(IsLetter(text[i])) k=1;//系数是1
s=0; //记录系数所属变量
while(!IsLetter(text[i])) i+=1;
while((IsNumber(text[i])||IsLetter(text[i]))&&i<total)
{ NameWork[s]=text[i]; s+=1; i+=1;}
NameWork[s]='\0';
for(j=0;j<Col;j++)//匹配变量
if(strcmp(NameWork,Name[j])==0)
break;
if(k==0)
A[p][j]= StrToFloat(NumberWork);
else A[p][j]=1.0;
if(sign=='-') A[p][j]*=-1;
while(text[i]==' ') i+=1;
}
signs[p]=text[i];//记录符号
//右端向量的处理
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -