您的位置:首页 > 其它

表达式计算之五:方程求解

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;
    }
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  string include up
相关文章推荐