📄 matrixdoc.cpp
字号:
// MatrixDoc.cpp : implementation of the CMatrixDoc class
//
#include "stdafx.h"
#include "Matrix.h"
#include "MatrixDoc.h"
#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif
/////////////////////////////////////////////////////////////////////////////
// CMatrixDoc
IMPLEMENT_DYNCREATE(CMatrixDoc, CDocument)
BEGIN_MESSAGE_MAP(CMatrixDoc, CDocument)
//{{AFX_MSG_MAP(CMatrixDoc)
// NOTE - the ClassWizard will add and remove mapping macros here.
// DO NOT EDIT what you see in these blocks of generated code!
//}}AFX_MSG_MAP
END_MESSAGE_MAP()
/////////////////////////////////////////////////////////////////////////////
// CMatrixDoc construction/destruction
CMatrixDoc::CMatrixDoc()
{
// TODO: add one-time construction code here
}
CMatrixDoc::~CMatrixDoc()
{
}
BOOL CMatrixDoc::OnNewDocument()
{
if (!CDocument::OnNewDocument())
return FALSE;
((CEditView*)m_viewList.GetHead())->SetWindowText(NULL);
// TODO: add reinitialization code here
// (SDI documents will reuse this document)
return TRUE;
}
/////////////////////////////////////////////////////////////////////////////
// CMatrixDoc serialization
void CMatrixDoc::Serialize(CArchive& ar)
{
// CEditView contains an edit control which handles all serialization
((CEditView*)m_viewList.GetHead())->SerializeRaw(ar);
}
/////////////////////////////////////////////////////////////////////////////
// CMatrixDoc diagnostics
#ifdef _DEBUG
void CMatrixDoc::AssertValid() const
{
CDocument::AssertValid();
}
void CMatrixDoc::Dump(CDumpContext& dc) const
{
CDocument::Dump(dc);
}
#endif //_DEBUG
/////////////////////////////////////////////////////////////////////////////
// CMatrixDoc commands
void CMatrixDoc::DeleteContents()
{
// TODO: Add your specialized code here and/or call the base class
int num=m_VariablePtrList.GetCount();
POSITION pos=m_VariablePtrList.GetHeadPosition();
for(int i=0;i<num;i++)
{
CArrayMatrix * tp=(CArrayMatrix *)m_VariablePtrList.GetAt(pos);
delete tp;
m_VariablePtrList.GetNext(pos);
}
if(num!=0) m_VariablePtrList.RemoveAll();
CDocument::DeleteContents();
}
void CMatrixDoc::ProcOpenDocText(const CString sDataString)
{
DeleteContents();
CString temp=sDataString;
temp.GetBufferSetLength(temp.GetLength()+1);
int num=0;
for(int i=0;i<sDataString.GetLength();i++)//把多个邻接的分号和并为一个
{
if(sDataString[i]==TCHAR(';'))
{
if((i+1)!=sDataString.GetLength()&&sDataString[i+1]==TCHAR(';'))
continue;
else
{
temp.SetAt(num,sDataString[i]);
num++;
}
}
else
{
temp.SetAt(num,sDataString[i]);
num++;
}
}
temp.SetAt(num,'\0');
temp.GetBufferSetLength(lstrlen(temp));
num=temp.Replace(';',';');
if(num==0) return;
CString *p=new CString[num];
for(i=0;i<num;i++) p[i]=_T("");
CString tpRS=temp;
int nlen=0;
int len=lstrlen(temp);
for(i=0;i<num;i++)
{
tpRS=temp.Right(len-nlen);
p[i]=tpRS.SpanExcluding(";");
nlen=lstrlen(p[i])+1+nlen;
}
//现在每个数据项保存着每个字符串中
for(i=0;i<num;i++)
{
ProcOneString(p[i]);
}
delete []p;
}
BOOL CMatrixDoc::ProcOneString(const CString & sData)
{
CString temp=sData;
CString sName=_T("");
bool IsExisted=false;
CArrayMatrix *PtrNew=NULL;
if(!CArrayMatrix::SetStringName(temp,sName)) return FALSE;
CArrayMatrix::ProcString(temp);
POSITION pos=m_VariablePtrList.GetHeadPosition();
for(int i=0;i<m_VariablePtrList.GetCount();i++)
{
CArrayMatrix *Ptr=(CArrayMatrix *)m_VariablePtrList.GetAt(pos);
if(Ptr->GetName()==sName) {IsExisted=true;PtrNew=Ptr;break;}
m_VariablePtrList.GetNext(pos);
}
if(!IsExisted)
{
PtrNew=new CArrayMatrix;
pos=m_VariablePtrList.AddTail(PtrNew);
}
//现在PtrNew指向新的目标变量
CArrayMatrix tpMatrix;
if(!GetResult(temp,tpMatrix))
{
if(!IsExisted)
{
delete PtrNew;
m_VariablePtrList.RemoveAt(pos);
return FALSE;
}
}
*PtrNew=tpMatrix;
return true;
}
BOOL CMatrixDoc::IsOperator(TCHAR ch)
{
switch(ch)
{
case '+':
case '-':
case '*':
case '/':
case '(':
case ')':
case '#':
{
return TRUE;
}
default: return FALSE;
}
}
BOOL CMatrixDoc::GetResult(const CString &data,CArrayMatrix & matrix)
{
//在这可以通过修改data字符串和m_VariablePtrList变量链表来实现
//具体方法是首先假如data是包含多个运算符的
CString sDataString=data;
sDataString.TrimLeft("\n");
sDataString.TrimRight("\n");
CString *pVar;
CArrayMatrix result;
bool ok;
int VarNum=GetVariableNum(sDataString,pVar);
if(VarNum==0) return FALSE;
CTypedPtrList<CObList,CArrayMatrix *> tpVarList;
if(!StringsToMatrixs(pVar,tpVarList,VarNum))
{
if(pVar!=NULL) delete []pVar;
return FALSE;
}
TurnString(sDataString);
//表达式求值
{
sDataString=sDataString+"#";
CStack<TCHAR> OPTR;
CStack<CArrayMatrix *> OPND;
OPTR.Push('#');
int index=0;
TCHAR c=sDataString[index];
int nVarIndex=0;
while(c!=TCHAR('#')||OPTR.GetTop()!=TCHAR('#'))
{
if(!IsOperator(c))
{
POSITION pos=tpVarList.GetHeadPosition();
CArrayMatrix * pt=NULL;
for(int i=0;i<=nVarIndex&&i<tpVarList.GetCount();i++)
{
pt=tpVarList.GetAt(pos);
tpVarList.GetNext(pos);
}
if(pt==NULL) return FALSE;
OPND.Push(pt);
nVarIndex++;
index++;
c=sDataString[index];
}
else
{
switch(Precede(OPTR.GetTop(),c))
{
case -1:
{
OPTR.Push(c);
index++;
c=sDataString[index];
break;
}
case 0:
{
TCHAR x;
OPTR.Pop(x);
index++;
c=sDataString[index];
break;
}
case 1:
{
TCHAR theta;
OPTR.Pop(theta);
CArrayMatrix * b=NULL;
CArrayMatrix * a=NULL;
OPND.Pop(b);
OPND.Pop(a);
OPND.Push(Operate(a,theta,b,ok));
break;
}
}
}
}
result=*(OPND.GetTop());
}
//销毁tpvarlist变量里面的东西
{
POSITION pos=tpVarList.GetHeadPosition();
int len=tpVarList.GetCount();
for(int i=0;i<len;i++)
{
CArrayMatrix * tp=tpVarList.GetAt(pos);
delete tp;
tpVarList.GetNext(pos);
}
tpVarList.RemoveAll();
}
if(pVar!=NULL) delete []pVar;
if(!ok) return FALSE;
matrix=result;
return TRUE;
}
int CMatrixDoc::GetVariableNum(const CString &m,CString * & pVar)
{
pVar=NULL;
int CharNum=0;
bool bSign=true;
int num=0;
int len=lstrlen(m);
{
for(int pos=0;pos<len;pos++)
{
if(IsCharAlpha(m[pos])) CharNum++;
}
}
if(CharNum==0)
{
pVar=new CString[1];
*pVar=m;
pVar->TrimLeft();
pVar->TrimRight();
return 1;
}
for(int i=0;i<len;i++)
{
if(!IsOperator(m[i]))
{
if(bSign)
{
num++;
bSign=false;
}
else continue;
}
else bSign=true;
}
if(num==0) return num;
else
{
int tpnum=0;
pVar=new CString[num];
CString temp;
int slen=0;
bSign=true;
for(int i=0;i<len;i++)
{
if(!IsOperator(m[i]))
{
if(bSign)
{
tpnum++;
if(tpnum==num)
{
int j=i;
int number=0;
CString stp;
while(j<len&&!IsOperator(m[i]))
{
stp.GetBufferSetLength(number+1);
stp.SetAt(number,m[j]);
number++;
j++;
}
pVar[num-1]=stp;
}
else if(tpnum>1)
{
pVar[tpnum-1]=temp;
}
temp=_T("");
slen=1;
temp.GetBufferSetLength(slen);
temp.SetAt(0,m[i]);
if(i<len-1&&IsOperator(m[i+1])) pVar[tpnum-1]=temp;
bSign=false;
}
else
{
slen++;
temp.GetBufferSetLength(slen);
temp.SetAt(slen-1,m[i]);
}
}
else bSign=true;
}
}
return num;
}
BOOL CMatrixDoc::StringsToMatrixs(CString * pVar,CTypedPtrList<CObList,CArrayMatrix *> & m_List,int num)
{
for(int i=0;i<num;i++)
{
pVar[i].TrimLeft();
pVar[i].TrimRight();
if(pVar[i]==_T("")) return FALSE;
if(IsCharAlpha(pVar[i][0]))//pVar[i]是变量
{
int nVarNum=m_VariablePtrList.GetCount();
POSITION pos=m_VariablePtrList.GetHeadPosition();
POSITION tippos=NULL;
for(int j=0;j<nVarNum;j++)
{
CString sVarName=pVar[i];
sVarName.TrimRight("\'");
sVarName.TrimLeft("~");
CArrayMatrix * pt=m_VariablePtrList.GetAt(pos);
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -