www.pudn.com > metrix3.zip > 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;iGetName()==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 tpVarList;
if(!StringsToMatrixs(pVar,tpVarList,VarNum))
{
if(pVar!=NULL) delete []pVar;
return FALSE;
}
TurnString(sDataString);
//表达式求值
{
sDataString=sDataString+"#";
CStack OPTR;
CStack 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&&iTrimLeft();
pVar->TrimRight();
return 1;
}
for(int i=0;i1)
{
pVar[tpnum-1]=temp;
}
temp=_T("");
slen=1;
temp.GetBufferSetLength(slen);
temp.SetAt(0,m[i]);
if(i & m_List,int num)
{
for(int i=0;iGetName()==sVarName) {tippos=pos;break;}
m_VariablePtrList.GetNext(pos);
}
if(tippos==NULL) return FALSE;
else
{
CArrayMatrix *pMatrix=new CArrayMatrix;
*pMatrix=*(m_VariablePtrList.GetAt(tippos));
//对多次求转置的处理,比如A''''的求值
{
int len=lstrlen(pVar[i]);
int index=len-1;
if(pVar[i][index]==TCHAR('\''))
{
while(pVar[i][index]==TCHAR('\'')&&index>0)
{
(*pMatrix)=pMatrix->T();
index--;
}
}
}
m_List.AddTail(pMatrix);
}
}
else if(pVar[i][0]==TCHAR('~'))//处理~~~A的值
{
int glen=lstrlen(pVar[i]);
int gnum=0;
for(int g=0;gGetName()==Var) {tippos=pos;break;}
m_VariablePtrList.GetNext(pos);
}
if(tippos==NULL) return FALSE;
else
{
CArrayMatrix *pMatrix=new CArrayMatrix;
*pMatrix=*(m_VariablePtrList.GetAt(tippos));
int k=gnum%2;
if(k==1)
{
if(!(*pMatrix).CanContrary()) {delete pMatrix;return FALSE;}
(*pMatrix)=~(*pMatrix);
}
m_List.AddTail(pMatrix);
}
}
else
{
if(IsCharAlphaNumeric(pVar[i][0])||(IsOperator(pVar[i][0])&&IsCharAlphaNumeric(pVar[i][1])))
{
CString sName="hyx=";
sName=sName+pVar[i];
sName=sName+";";
CArrayMatrix * Ptr=new CArrayMatrix;
if(!Ptr->ProcessInput(sName)) {delete Ptr;return FALSE;}
m_List.AddTail(Ptr);
}
else return FALSE;
}
}
return TRUE;
}
int CMatrixDoc::Precede(TCHAR m, TCHAR n)
{
switch(m)
{
case '+':
{
switch(n)
{
case '+':
return 1;
case '-':
return 1;
case '*':
return -1;
case '/':
return -1;
case '(':
return -1;
case ')':
return 1;
case '#':
return 1;
default: return 100;
}
}
case '-':
{
switch(n)
{
case '+':
return 1;
case '-':
return 1;
case '*':
return -1;
case '/':
return -1;
case '(':
return -1;
case ')':
return 1;
case '#':
return 1;
default:return 100;
}
}
case '*':
{
switch(n)
{
case '+':return 1;
case '-':return 1;
case '*':return 1;
case '/':return 1;
case '(':return -1;
case ')':return 1;
case '#':return 1;
default:return 100;
}
}
case '/':
{
switch(n)
{
case '+':return 1;
case '-':return 1;
case '*':return 1;
case '/':return 1;
case '(':return -1;
case ')':return 1;
case '#':return 1;
default:return 100;
}
}
case '(':
{
switch(n)
{
case '+':return -1;
case '-':return -1;
case '*':return -1;
case '/':return -1;
case '(':return -1;
case ')':return 0;
default:return 100;
}
}
case ')':
{
switch(n)
{
case '+':return 1;
case '-':return 1;
case '*':return 1;
case '/':return 1;
case ')':return 1;
case '#':return 1;
default:return 100;
}
}
case '#':
{
switch(n)
{
case '+':return -1;
case '-':return -1;
case '*':return -1;
case '/':return -1;
case '(':return -1;
case '#':return 0;
default:return 100;
}
}
default:return 100;
}
}
void CMatrixDoc::TurnString(CString &sdata)
{
CString * pVal=NULL;
int num=GetVariableNum(sdata,pVal);
int debug=num;
for(int i=0;iCanAddSub(*b))) ok=false;
else (*a)=(*a)+(*b);
break;
}
case '-':
{
if(!(a->CanAddSub(*b))) ok=false;
else (*a)=(*a)-(*b);
break;
}
case '*':
{
if(!(a->CanMutiply(*b))) ok=false;
else (*a)=(*a)*(*b);
break;
}
case '/':
{
if(!(b->CanContrary()&&(a->CanMutiply(*b)))) ok=false;
else (*a)=(*a)/(*b);
break;
}
default:
{
ok=false;
}
}
return a;
}
void CMatrixDoc::ProcInput(const CString &all)
{
CString DisplayData=_T("");
CString temp=all;//包含了';'号
CString sName=_T("");
int IsError=100;//1代表无此变量;2代表变量显示错误
//3代表赋值有误;4代表字符串变量信息输入有误
//5格式输入不合法
if(CArrayMatrix::SetStringName(temp,sName)) //输入的第一个数组
{
CArrayMatrix::ProcString(temp);
CString result=temp;
temp=temp+";";
int number=0;
for(int i=0;iDisPlay(DisplayData)) IsError=2;
else IsError=-1;
}
}
else
{
CArrayMatrix *pt;
if(IsFood(sName,pt))
{
CArrayMatrix tp;
if(GetResult(result,tp))
{
*pt=tp;
IsError=0;
}
else
{
IsError=3;
}
}
else
{
pt=new CArrayMatrix;
if(!(pt->SetName(sName)&&GetResult(result,*pt))) {IsError=4;delete pt;}
else
{
m_VariablePtrList.AddTail(pt);
IsError=0;
}
}
}
}
else IsError=5;
//打开剪贴板
if(IsError!=0)
{
switch(IsError)
{
case 1:
{
DisplayData="\n!!!变量未定义,不存在此变量!;";
break;
}
case 2:
{
DisplayData="\n!!!变量未初始化,或则变量内无数据!;";
break;
}
case 3:
{
DisplayData="\n!!!变量赋值错误,赋值格式不合法!;";
break;
}
case 4:
{
DisplayData="\n!!!初始化新变量时,字符输入不合法!;";
break;
}
case 5:
{
DisplayData="\n!!!变量名输入有误!;";
break;
}
case -1:
{
CString tpok="\n";
tpok=tpok+sName;
tpok=tpok+"=\n";
DisplayData.TrimLeft("\n");
DisplayData.TrimLeft("\xd\xa");
DisplayData=tpok+DisplayData;
break;
}
default:
{
DisplayData="\n系统出错,请马上推出程序!;";
}
}
}
//获得视图的指针
POSITION pos=GetFirstViewPosition();
CView *p=GetNextView(pos);
//
if(IsError!=0)
{
DisplayData.Replace("\n","\xd\xa");
int len=lstrlen(DisplayData);
HGLOBAL hGlobal;
PTSTR pGlobal;
hGlobal=GlobalAlloc(GHND|GMEM_SHARE,len*sizeof(TCHAR)+1);
pGlobal=(PTSTR)GlobalLock(hGlobal);
for(int g=0;gOpenClipboard();
EmptyClipboard();
SetClipboardData(CF_TEXT,hGlobal);
CloseClipboard();
}
else
{
p->OpenClipboard();
EmptyClipboard();
CloseClipboard();
}
}
BOOL CMatrixDoc::IsFood(const CString &Name, CArrayMatrix *&p)
{
int num=m_VariablePtrList.GetCount();
POSITION pos=m_VariablePtrList.GetHeadPosition();
for(int i=0;iGetName()==Name) {p=ptItem;return TRUE;}
m_VariablePtrList.GetNext(pos);
}
p=NULL;
return FALSE;
}