📄 matrixdoc.cpp
字号:
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 + -