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; 
}