表达式计算之五:方程求解
2006-02-02 20:32
387 查看
#include <string>
#include "EquaType.h"
#include "DataType.h"
using namespace std;
equas normal(string sInfix)
{
string sSuffix;
sSuffix.clear();
stack<char>aChar;
int iL=sInfix.length(),iI=0;
while (iI<iL)
{
if ((sInfix.at(iI))=='x')
{
while (sInfix.at(iI)!=']')
{
sSuffix.append(1,sInfix.at(iI));
iI++;
}
sSuffix.append(1,']');
}
if ((isdigit(sInfix.at(iI)))||(sInfix.at(iI)=='.'))
{
while ((iI<iL)&&((isdigit(sInfix.at(iI)))||(sInfix.at(iI)=='.')))
{
sSuffix.append(1,sInfix.at(iI++));
}
iI--;
sSuffix.append(1,',');
}
if (sInfix.at(iI)=='(')
{
aChar.push('(');
}
if (sInfix.at(iI)==')')
{
while (aChar.top()!='(')
{
sSuffix.append(1,aChar.pop());
}
aChar.pop();
}
if ((sInfix.at(iI)=='-')&&((iI==0)||((!isdigit(sInfix.at(iI-1)))&&(sInfix.at(iI-1)!=']'))))
{
sSuffix.append(1,'_');
}
else if ((sInfix.at(iI)=='+')||(sInfix.at(iI)=='-')||(sInfix.at(iI)=='*')||(sInfix.at(iI)=='/'))
{
while (vs(sInfix.at(iI))<=vs(aChar.top()))
{
sSuffix.append(1,aChar.pop());
}
aChar.push(sInfix.at(iI));
}
iI++;
}
while (!aChar.empty())
{
sSuffix.append(1,aChar.pop());
}
iI=0;
iL=sSuffix.length();
stack <equas> aEquas;
while (iI<iL)
{
if (sSuffix.at(iI)=='x')
{
iI+=2;
int iNum=0;
while (isdigit(sSuffix.at(iI)))
{
iNum=iNum*10+sSuffix.at(iI)-'0';
iI++;
}
equas nT;
nums nE;
nE.irecord(1,1);
nT.set(iNum,nE);
aEquas.push(nT);
}
if (isdigit(sSuffix.at(iI)))
{
long iJ=0,iAt=iI,iT=1,iNum=0,iFlag=0;
nums nE;
while (sSuffix.at(iI)!=',')
{
if (isdigit(sSuffix.at(iI)))
{
if (iFlag==0)
{
iNum=iNum*10+sSuffix.at(iI++)-'0';
}
else
{
iNum=iNum*10+sSuffix.at(iI++)-'0';
iJ++;
}
}
else if (sSuffix.at(iI)=='.')
{
iFlag=1;
iI++;
}
}
if (iAt>0)
{
if (sSuffix.at(iAt-1)=='_')
{
iNum=-iNum;
}
}
if (iJ>0)
{
for (iAt=1;iAt<=iJ;iAt++)
{
iT*=10;
}
}
nE.record(iNum,iT);
equas nT;
nT.set(0,nE);
aEquas.push(nT);
}
if (sSuffix.at(iI)=='+')
{
equas nT1,nT2,nT3;
nT1=aEquas.pop();
nT2=aEquas.pop();
nT3=nT1+nT2;
aEquas.push(nT3);
}
if (sSuffix.at(iI)=='-')
{
equas nT1,nT2,nT3;
nT1=aEquas.pop();
nT2=aEquas.pop();
nT3=nT2-nT1;
aEquas.push(nT3);
}
if (sSuffix.at(iI)=='*')
{
equas nT1,nT2,nT3;
nT1=aEquas.pop();
nT2=aEquas.pop();
nT3=nT1*nT2;
aEquas.push(nT3);
}
if (sSuffix.at(iI)=='/')
{
equas nT1,nT2,nT3;
nT1=aEquas.pop();
nT2=aEquas.pop();
nT3=nT2/nT1;
aEquas.push(nT3);
}
iI++;
}
return aEquas.pop();
}
int main()
{
cin>>equas::iEquas;
int iI,iJ,iK,iH,iPnt;
string sInput;
equas aEquas[equas::iEquas],nT1,nT2;
for (iI=0;iI<equas::iEquas;iI++)
{
cin>>sInput;
iPnt=sInput.find('=');
nT1=normal(sInput.substr(0,iPnt));
nT2=normal(sInput.subst
4000
r(iPnt+1,sInput.length()-iPnt-1));
for (iJ=1;iJ<=equas::iEquas;iJ++)
{
aEquas[iI].set(iJ,nT1.get(iJ)-nT2.get(iJ));
}
aEquas[iI].set(0,nT2.get(0)-nT1.get(0));
}
nums nD,aD[equas::iEquas],nT;
equas aVec,aTemp;
for (iI=0;iI<(equas::iEquas-1);iI++)
{
if (aEquas[iI].get(iI+1).return_Up()!=0)
{
nT=aEquas[iI].get(iI+1);
aVec=aEquas[iI]/nT;
for (iJ=iI+1;iJ<equas::iEquas;iJ++)
{
if (aEquas[iJ].get(iI+1).return_Up()!=0)
{
aTemp=aVec*aEquas[iJ].get(iI+1);
aEquas[iJ]=aEquas[iJ]-aTemp;
}
}
}
else
{
iH=0;
for (iJ=iI+1;iJ<equas::iEquas;iJ++)
{
if (aEquas[iJ].get(iI+1).return_Up()!=0)
{
aTemp=aEquas[iJ];
aEquas[iJ]=aEquas[iI];
aEquas[iI]=aTemp;
iH=1;
break;
}
}
if (iH==1)
{
nT=aEquas[iI].get(iI+1);
aVec=aEquas[iI]/nT;
for (iJ=iI+1;iJ<equas::iEquas;iJ++)
{
if (aEquas[iJ].get(iI+1).return_Up()!=0)
{
aTemp=aVec*aEquas[iJ].get(iI+1);
aEquas[iJ]=aEquas[iJ]-aTemp;
}
}
}
}
}
for (iI=equas::iEquas-1;iI>=0;iI--)
{
aEquas[iI]=aEquas[iI]/aEquas[iI].get(iI+1);
for (iJ=iI-1;iJ>=0;iJ--)
{
aTemp=aEquas[iI]*aEquas[iJ].get(iI+1);
aEquas[iJ]=aEquas[iJ]-aTemp;
}
}
for (iJ=0;iJ<equas::iEquas;iJ++)
{
cout<<"x["<<iJ+1<<"]:";
aEquas[iJ].get(0).display();
cout<<endl;
}
}
#include "EquaType.h"
#include "DataType.h"
using namespace std;
equas normal(string sInfix)
{
string sSuffix;
sSuffix.clear();
stack<char>aChar;
int iL=sInfix.length(),iI=0;
while (iI<iL)
{
if ((sInfix.at(iI))=='x')
{
while (sInfix.at(iI)!=']')
{
sSuffix.append(1,sInfix.at(iI));
iI++;
}
sSuffix.append(1,']');
}
if ((isdigit(sInfix.at(iI)))||(sInfix.at(iI)=='.'))
{
while ((iI<iL)&&((isdigit(sInfix.at(iI)))||(sInfix.at(iI)=='.')))
{
sSuffix.append(1,sInfix.at(iI++));
}
iI--;
sSuffix.append(1,',');
}
if (sInfix.at(iI)=='(')
{
aChar.push('(');
}
if (sInfix.at(iI)==')')
{
while (aChar.top()!='(')
{
sSuffix.append(1,aChar.pop());
}
aChar.pop();
}
if ((sInfix.at(iI)=='-')&&((iI==0)||((!isdigit(sInfix.at(iI-1)))&&(sInfix.at(iI-1)!=']'))))
{
sSuffix.append(1,'_');
}
else if ((sInfix.at(iI)=='+')||(sInfix.at(iI)=='-')||(sInfix.at(iI)=='*')||(sInfix.at(iI)=='/'))
{
while (vs(sInfix.at(iI))<=vs(aChar.top()))
{
sSuffix.append(1,aChar.pop());
}
aChar.push(sInfix.at(iI));
}
iI++;
}
while (!aChar.empty())
{
sSuffix.append(1,aChar.pop());
}
iI=0;
iL=sSuffix.length();
stack <equas> aEquas;
while (iI<iL)
{
if (sSuffix.at(iI)=='x')
{
iI+=2;
int iNum=0;
while (isdigit(sSuffix.at(iI)))
{
iNum=iNum*10+sSuffix.at(iI)-'0';
iI++;
}
equas nT;
nums nE;
nE.irecord(1,1);
nT.set(iNum,nE);
aEquas.push(nT);
}
if (isdigit(sSuffix.at(iI)))
{
long iJ=0,iAt=iI,iT=1,iNum=0,iFlag=0;
nums nE;
while (sSuffix.at(iI)!=',')
{
if (isdigit(sSuffix.at(iI)))
{
if (iFlag==0)
{
iNum=iNum*10+sSuffix.at(iI++)-'0';
}
else
{
iNum=iNum*10+sSuffix.at(iI++)-'0';
iJ++;
}
}
else if (sSuffix.at(iI)=='.')
{
iFlag=1;
iI++;
}
}
if (iAt>0)
{
if (sSuffix.at(iAt-1)=='_')
{
iNum=-iNum;
}
}
if (iJ>0)
{
for (iAt=1;iAt<=iJ;iAt++)
{
iT*=10;
}
}
nE.record(iNum,iT);
equas nT;
nT.set(0,nE);
aEquas.push(nT);
}
if (sSuffix.at(iI)=='+')
{
equas nT1,nT2,nT3;
nT1=aEquas.pop();
nT2=aEquas.pop();
nT3=nT1+nT2;
aEquas.push(nT3);
}
if (sSuffix.at(iI)=='-')
{
equas nT1,nT2,nT3;
nT1=aEquas.pop();
nT2=aEquas.pop();
nT3=nT2-nT1;
aEquas.push(nT3);
}
if (sSuffix.at(iI)=='*')
{
equas nT1,nT2,nT3;
nT1=aEquas.pop();
nT2=aEquas.pop();
nT3=nT1*nT2;
aEquas.push(nT3);
}
if (sSuffix.at(iI)=='/')
{
equas nT1,nT2,nT3;
nT1=aEquas.pop();
nT2=aEquas.pop();
nT3=nT2/nT1;
aEquas.push(nT3);
}
iI++;
}
return aEquas.pop();
}
int main()
{
cin>>equas::iEquas;
int iI,iJ,iK,iH,iPnt;
string sInput;
equas aEquas[equas::iEquas],nT1,nT2;
for (iI=0;iI<equas::iEquas;iI++)
{
cin>>sInput;
iPnt=sInput.find('=');
nT1=normal(sInput.substr(0,iPnt));
nT2=normal(sInput.subst
4000
r(iPnt+1,sInput.length()-iPnt-1));
for (iJ=1;iJ<=equas::iEquas;iJ++)
{
aEquas[iI].set(iJ,nT1.get(iJ)-nT2.get(iJ));
}
aEquas[iI].set(0,nT2.get(0)-nT1.get(0));
}
nums nD,aD[equas::iEquas],nT;
equas aVec,aTemp;
for (iI=0;iI<(equas::iEquas-1);iI++)
{
if (aEquas[iI].get(iI+1).return_Up()!=0)
{
nT=aEquas[iI].get(iI+1);
aVec=aEquas[iI]/nT;
for (iJ=iI+1;iJ<equas::iEquas;iJ++)
{
if (aEquas[iJ].get(iI+1).return_Up()!=0)
{
aTemp=aVec*aEquas[iJ].get(iI+1);
aEquas[iJ]=aEquas[iJ]-aTemp;
}
}
}
else
{
iH=0;
for (iJ=iI+1;iJ<equas::iEquas;iJ++)
{
if (aEquas[iJ].get(iI+1).return_Up()!=0)
{
aTemp=aEquas[iJ];
aEquas[iJ]=aEquas[iI];
aEquas[iI]=aTemp;
iH=1;
break;
}
}
if (iH==1)
{
nT=aEquas[iI].get(iI+1);
aVec=aEquas[iI]/nT;
for (iJ=iI+1;iJ<equas::iEquas;iJ++)
{
if (aEquas[iJ].get(iI+1).return_Up()!=0)
{
aTemp=aVec*aEquas[iJ].get(iI+1);
aEquas[iJ]=aEquas[iJ]-aTemp;
}
}
}
}
}
for (iI=equas::iEquas-1;iI>=0;iI--)
{
aEquas[iI]=aEquas[iI]/aEquas[iI].get(iI+1);
for (iJ=iI-1;iJ>=0;iJ--)
{
aTemp=aEquas[iI]*aEquas[iJ].get(iI+1);
aEquas[iJ]=aEquas[iJ]-aTemp;
}
}
for (iJ=0;iJ<equas::iEquas;iJ++)
{
cout<<"x["<<iJ+1<<"]:";
aEquas[iJ].get(0).display();
cout<<endl;
}
}
相关文章推荐
- 表达式计算之四:方程的数据结构
- [数值计算]1,线性方程的三角分解法求解
- 宏定义函数指针类型&函数返回左值类值 1。宏定义不分配内存,变量定义分配内存。 2。宏名和参数的括号间不能有空格 3。宏替换只作替换,不做计算,不做表达式求解 //下面是正确的标准的写法 typedef int(FUNC1)(int in); ty
- 数值计算——一维非线性方程求解
- 求解方程的根计算窗口
- 数值计算方程求解实现
- HDU4793 2013 长沙 C (计算几何—点和圆的位置关系—解法①列方程求解[时间作自变量] —解法②向量积和sin角度求解长度再除以有方向的速度)
- 1、编写程序,分别用二分法和牛顿迭代法求解方程x3 – 3x – 1 = 0在x = 2附近的实根,要求计算精确到小数点后七位数字为止,并将求出的近似结果与理论值2cos20 相比较,二分法的初始迭代
- LA3485二分+求解积分方程+辛普森算法计算积分
- 数值计算方法:二分法求解方程的根(伪代码 python c/c++)
- 利用matlab的PDE工具箱求解Neumann边界的Poisson方程
- 中缀表达式转化为后缀表达式,并计算后缀表达式
- AtCoder Beginner Contest 085 C Otoshidama(计算机整数乘法问题+方程求解)
- sql server 返回计算表达式的函数
- 用循环控制语句编写程序,完成表达式的计算
- 算法学习之递归--表达式计算(简单计算器)
- [各种面试题] 简单表达式计算
- 利用STL计算后缀表达式
- 数据结构实践——用二叉树求解代数表达式
- 关于java 的科学计算算法(前,中,后缀表达式的转换)——计算器制作的心得