⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 unit1.cpp

📁 lp求解的单纯形算法
💻 CPP
📖 第 1 页 / 共 2 页
字号:
//本程序的主体运行环境,是主体窗口

#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 + -