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

📄 matrixdoc.cpp

📁 本程序能完成矩阵的输入、输出。具有相同行数和列数的矩阵间的加法、减法。符合矩阵乘法规则要求的矩阵间的乘法。方阵间的除法
💻 CPP
📖 第 1 页 / 共 2 页
字号:
				if(pt->GetName()==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;g<glen&&pVar[i][g]==TCHAR('~');g++) gnum++;
			if(glen==num) return FALSE;
			CString Var=pVar[i].Right(glen-gnum);
			int nVarNum=m_VariablePtrList.GetCount();
			POSITION pos=m_VariablePtrList.GetHeadPosition();
			POSITION tippos=NULL;
			for(int j=0;j<nVarNum;j++)
			{
				CArrayMatrix * pt=m_VariablePtrList.GetAt(pos);
				if(pt->GetName()==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;i<num;i++)
	{
		sdata.Replace(pVal[i],"@");
	}
	CString temp=sdata;
	num=0;
	for(int j=0;j<lstrlen(temp);j++)
	{
		if(temp[j]!=TCHAR(' ')) 
		{
			sdata.SetAt(num,temp[j]);
			num++;
		}
		else continue;
	}
	if(num<lstrlen(temp))
	{
		sdata.SetAt(num,'\0');
		sdata.GetBufferSetLength(lstrlen(sdata));
	}
	if(pVal!=NULL)	delete []pVal;
}

CArrayMatrix * CMatrixDoc::Operate(CArrayMatrix *a, TCHAR theta, CArrayMatrix *b, bool &ok)
{
	switch(theta)
	{
	case '+':
		{
			if(!(a->CanAddSub(*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;i<lstrlen(temp);i++)
		{
			if(temp[i]!=TCHAR('\n')&&temp[i]!=TCHAR(';')&&temp[i]!=TCHAR(' ')&&!IsOperator(temp[i]))
				number++;
		}
		if(number==0||temp.IsEmpty())
		{
			CArrayMatrix * p;
			if(!IsFood(sName,p)) IsError=1;
			else
			{
				if(!p->DisPlay(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;g<len;g++) *pGlobal++=DisplayData[g];
		GlobalUnlock(hGlobal);
		p->OpenClipboard();
		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;i<num;i++)
	{
		CArrayMatrix * ptItem=m_VariablePtrList.GetAt(pos);
		if(ptItem->GetName()==Name) {p=ptItem;return TRUE;}
		m_VariablePtrList.GetNext(pos);
	}
	p=NULL;
	return FALSE;
}

⌨️ 快捷键说明

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