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

📄 matrixop.cpp

📁 这是一个求解线性规划问题的程序
💻 CPP
字号:
//---------------------------------------------------------------------------
#include <vcl\vcl.h>
#pragma hdrstop

#include "MatrixOp.h"

#include "MatrixOP_Assign.h"
#include "MatrixOP_Tranfer.h"
#include "reset.h"
//---------------------------------------------------------------------------
#pragma link "Grids"
#pragma resource "*.dfm"
Tfrm_MatrixOp *frm_MatrixOp;

//---------------------------------------------------------------------------
__fastcall Tfrm_MatrixOp::Tfrm_MatrixOp(TComponent* Owner)
	: TForm(Owner)
{
   fMatA = new TMatrix(ROWCOUNT,COLCOUNT);
   fMatB = new TMatrix(ROWCOUNT,COLCOUNT);
   fMatC = new TMatrix(ROWCOUNT,COLCOUNT);

//   glb_SetGrid(fMatA,sg_A);
//   glb_SetGrid(fMatB,sg_B);
//   glb_SetGrid(fMatC,sg_C);
}
//---------------------------------------------------------------------------
void __fastcall Tfrm_MatrixOp::FormDestroy(TObject *Sender)
{
   delete fMatA;
   delete fMatB;
   delete fMatC;
}
//---------------------------------------------------------------------------
void __fastcall Tfrm_MatrixOp::btn_AResetClick(TObject *Sender)
{
   frm_reset->fRowCount = fMatA->GetRowCount();
   frm_reset->fColCount = fMatA->GetColCount();
   if (frm_reset->ShowModal() == mrOk) {
       fMatA->Reset(frm_reset->fRowCount,frm_reset->fColCount);
       glb_SetGrid(fMatA,sg_A);
   }
}
//---------------------------------------------------------------------------
void __fastcall Tfrm_MatrixOp::btn_BResetClick(TObject *Sender)
{
   frm_reset->fRowCount = fMatB->GetRowCount();
   frm_reset->fColCount = fMatB->GetColCount();
   if (frm_reset->ShowModal() == mrOk) {
       fMatB->Reset(frm_reset->fRowCount,frm_reset->fColCount);
       glb_SetGrid(fMatB,sg_B);
   }
}
//---------------------------------------------------------------------------
void __fastcall Tfrm_MatrixOp::btn_plusClick(TObject *Sender)
{
   if (fMatA->GetRowCount() != fMatB->GetRowCount() || fMatA->GetColCount() != fMatB->GetColCount()) {
      glb_UserInfo("A和B的维数不相等,不能相加!");
      return;
   }

   if (!glb_GetData(fMatA,sg_A,"A"))
      return;

   if (!glb_GetData(fMatB,sg_B,"B"))
      return;

   delete fMatC;
   fMatC = new TMatrix(fMatA->GetRowCount(),fMatA->GetColCount());

   *fMatC = *fMatA + *fMatB;
   glb_SetGrid(fMatC,sg_C);
}
//---------------------------------------------------------------------------
void __fastcall Tfrm_MatrixOp::btn_minusClick(TObject *Sender)
{
   if (fMatA->GetRowCount() != fMatB->GetRowCount() || fMatA->GetColCount() != fMatB->GetColCount()) {
      glb_UserInfo("A和B的维数不相等,不能相减!");
      return;
   }

   if (!glb_GetData(fMatA,sg_A,"A"))
      return;

   if (!glb_GetData(fMatB,sg_B,"B"))
      return;

   delete fMatC;
   fMatC = new TMatrix(fMatA->GetRowCount(),fMatA->GetColCount());

   *fMatC = *fMatA - *fMatB;
   glb_SetGrid(fMatC,sg_C);
}
//---------------------------------------------------------------------------
void __fastcall Tfrm_MatrixOp::btn_timesClick(TObject *Sender)
{
   if (fMatA->GetColCount() != fMatB->GetRowCount()) {
      glb_UserInfo("A的列数和B的行数不相等,不能相乘!");
      return;
   }

   if (!glb_GetData(fMatA,sg_A,"A"))
      return;

   if (!glb_GetData(fMatB,sg_B,"B"))
      return;

   delete fMatC;
   fMatC = new TMatrix(fMatA->GetRowCount(),fMatB->GetColCount());

   *fMatC = *fMatA * *fMatB;
   glb_SetGrid(fMatC,sg_C);
}
//---------------------------------------------------------------------------
void __fastcall Tfrm_MatrixOp::btn_inverseClick(TObject *Sender)
{
   //先取得数据
   if (!glb_GetData(fMatA,sg_A,"A"))
     return;

   if (fMatA->GetColCount() != fMatA->GetRowCount()) {
      glb_UserInfo("A的列数和行数不相等,不能计算逆!");
      return;
   }

   if (!glb_GetData(fMatA,sg_A,"A"))
      return;

   if (!glb_GetData(fMatB,sg_B,"B"))
      return;

   delete fMatC;
   fMatC = new TMatrix(fMatA->GetRowCount(),fMatA->GetColCount());

   try {
      *fMatC = *fMatA^-1;
   }
   catch (...) {
      glb_UserInfo("A不满秩,不能计算逆!");
      return;
   }

   glb_SetGrid(fMatC,sg_C);
}
//---------------------------------------------------------------------------
void __fastcall Tfrm_MatrixOp::btn_turnClick(TObject *Sender)
{
   //先取得数据
   if (!glb_GetData(fMatA,sg_A,"A"))
     return;

   try {
       delete fMatC;
       fMatC = new TMatrix(fMatA->GetColCount(),fMatA->GetRowCount());
      *fMatC = ~*fMatA;
   }
   catch (...) {
      glb_UserInfo("操作失败!");
      return;
   }

   glb_SetGrid(fMatC,sg_C);
}
//---------------------------------------------------------------------------
void __fastcall Tfrm_MatrixOp::btn_ladderClick(TObject *Sender)
{
   //先取得数据
   if (!glb_GetData(fMatA,sg_A,"A"))
     return;

   try {
      delete fMatC;
      fMatC = new TMatrix(fMatA->GetRowCount(),fMatA->GetColCount());
      *fMatC = *fMatA;
      fMatC->Ladder();
   }
   catch (...) {
      glb_UserInfo("操作失败!");
      return;
   }

   glb_SetGrid(fMatC,sg_C);
}
//---------------------------------------------------------------------------
void __fastcall Tfrm_MatrixOp::btn_rankClick(TObject *Sender)
{
   //先取得数据
   if (!glb_GetData(fMatA,sg_A,"A"))
     return;

   glb_UserInfo("矩阵A的秩为'"+IntToStr(fMatA->Rank())+"'");
}
//---------------------------------------------------------------------------
void __fastcall Tfrm_MatrixOp::btn_assignClick(TObject *Sender)
{
   //先取得数据
   if (!glb_GetData(fMatA,sg_A,"A"))
     return;
   if (!glb_GetData(fMatB,sg_B,"B"))
     return;
   if (!glb_GetData(fMatC,sg_C,"C"))
     return;

   if (frm_MatrixOP_Assign->ShowModal()==mrOk) {
      int i1 =frm_MatrixOP_Assign->CB1->ItemIndex;
      int i2 =frm_MatrixOP_Assign->CB2->ItemIndex;

      if (i1==i2)
        return;

      //注意,这里使用了指针的指针  
      TMatrix** tA = (TMatrix**)frm_MatrixOP_Assign->CB1->Items->Objects[i1];
      TMatrix** tB = (TMatrix**)frm_MatrixOP_Assign->CB2->Items->Objects[i2];
      delete *tA;
      *tA = new TMatrix((*tB)->GetRowCount(),(*tB)->GetColCount());
      **tA = **tB;

      if (i1 == 0)
         glb_SetGrid(fMatA,sg_A);
      else if(i1 == 1)
         glb_SetGrid(fMatB,sg_B);
      else if(i1 == 2)
         glb_SetGrid(fMatC,sg_C);
   }
}
//---------------------------------------------------------------------------
void __fastcall Tfrm_MatrixOp::btn_tranferClick(TObject *Sender)
{
   //先取得数据
   if (!glb_GetData(fMatA,sg_A,"A"))
     return;

   if (frm_MatrixOp_Tranfer->rb_row->Checked && frm_MatrixOp_Tranfer->Count != fMatA->GetRowCount())
      frm_MatrixOp_Tranfer->rb_rowClick(frm_MatrixOp_Tranfer->rb_row);
   else if (!frm_MatrixOp_Tranfer->rb_row->Checked && frm_MatrixOp_Tranfer->Count != fMatA->GetColCount())
      frm_MatrixOp_Tranfer->rb_rowClick(frm_MatrixOp_Tranfer->rb_col);   

   if (frm_MatrixOp_Tranfer->ShowModal()==mrOk) {
      //某行(列)乘于n倍
      if (frm_MatrixOp_Tranfer->RB1->Checked) {
         if (frm_MatrixOp_Tranfer->rb_row->Checked)
            fMatA->RScale(StrToInt(frm_MatrixOp_Tranfer->CB1->Text),frm_MatrixOp_Tranfer->fTimesNum);
         else
            fMatA->CScale(StrToInt(frm_MatrixOp_Tranfer->CB1->Text),frm_MatrixOp_Tranfer->fTimesNum);
      }
      //交换两行(列)
      if (frm_MatrixOp_Tranfer->RB2->Checked) {
         if (frm_MatrixOp_Tranfer->rb_row->Checked)
            fMatA->RExchange(StrToInt(frm_MatrixOp_Tranfer->CB2->Text),StrToInt(frm_MatrixOp_Tranfer->CB3->Text));
         else
            fMatA->CExchange(StrToInt(frm_MatrixOp_Tranfer->CB2->Text),StrToInt(frm_MatrixOp_Tranfer->CB3->Text));
      }      
      //某行(列)加上另一行(列)的n倍
      if (frm_MatrixOp_Tranfer->RB3->Checked) {
         if (frm_MatrixOp_Tranfer->rb_row->Checked)
            fMatA->RAddition(StrToInt(frm_MatrixOp_Tranfer->CB4->Text),StrToInt(frm_MatrixOp_Tranfer->CB5->Text),frm_MatrixOp_Tranfer->fPlusNum);
         else
            fMatA->CAddition(StrToInt(frm_MatrixOp_Tranfer->CB4->Text),StrToInt(frm_MatrixOp_Tranfer->CB5->Text),frm_MatrixOp_Tranfer->fPlusNum);
      }

      glb_SetGrid(fMatA,sg_A);
   }            
}
//---------------------------------------------------------------------------
void __fastcall Tfrm_MatrixOp::btn_closeClick(TObject *Sender)
{
   Close();	
}
//---------------------------------------------------------------------------

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -