poj 1467 Symbolic Derivation

poj 1467 Symbolic Derivation,第1张

poj 1467 Symbolic Derivation
#include<stdio.h>#include<string.h>#include<iostream>#include<stack>using namespace std;class String{public:    char s[105];    String(){s[0]=0;}    String(String& s1){strcpy(s,s1.s);}    bool isnum();};char ans[105];ostream& operator<<(ostream& out,String &s1){    cout<<s1.s;    return out;}bool String::isnum(){    int i=0;    if(s[0]=='-') i++;    for(;s[i];i++)    {        if(s[i]=='.'||(s[i]>='0'&&s[i]<='9')) ;        else break;    }    if(!s[i]) return true;    else return false;}void qiudao(String s1);void jia(String s1,String s2){    qiudao(s1);    strcat(ans,"+");    qiudao(s2);}void jian(String s1,String s2){    qiudao(s1);    strcat(ans,"-");    qiudao(s2);}void cheng(String s1,String s2){    strcat(ans,"(");    qiudao(s1);    strcat(ans,"*");    strcat(ans,s2.s);    strcat(ans,"+");    strcat(ans,s1.s);    strcat(ans,"*");    qiudao(s2);    strcat(ans,")");}void chu(String s1,String s2){    strcat(ans,"(");    qiudao(s1);    strcat(ans,"*");    strcat(ans,s2.s);    strcat(ans,"-");    strcat(ans,s1.s);    strcat(ans,"*");    qiudao(s2);    strcat(ans,")/");    strcat(ans,s2.s);    strcat(ans,"^2");}void ln(String s1){    strcat(ans,"(");    qiudao(s1);    strcat(ans,")/(");    strcat(ans,s1.s);    strcat(ans,")");}void qiudao(String s1){    int i;    if(s1.isnum()) {strcat(ans,"0");return ;}//如果字符串表示一个数字,则求导结果为 0    if(strcmp(s1.s,"x")==0) {strcat(ans,"1");return ;}//如果字符串是一个x,则求导结果为 1    int len=strlen(s1.s);    //下面用于计算优先级最低的一个运算符。    int n=-1,you=3;    for(i=0;s1.s[i];i++)    {        if(i!=0&&((s1.s[i]=='+'||s1.s[i]=='-')&&you>=1)) {n=i;you=1;break;}        if(i!=0&&((s1.s[i]=='*'||s1.s[i]=='/')&&you>=2)) {n=i;you=2;}        if(s1.s[i]=='(')        { int n=1; while(n) {     i++;     if(s1.s[i]=='(')n++;     if(s1.s[i]==')')n--; }        }    }    if(you!=3)    {        String ss1,ss2;        strncpy(ss1.s,s1.s,n);        ss1.s[n]=0;        strncpy(ss2.s,&s1.s[n+1],len-n-1);        ss2.s[len-n-1]=0;        switch(s1.s[n])        { case '+':jia(ss1,ss2);break; case '-':jian(ss1,ss2);break; case '*':cheng(ss1,ss2);break; case '/':chu(ss1,ss2);break;        }        return ;    }    if(s1.s[0]=='('&&s1.s[len-1]==')')    {        String s2;        strncpy(s2.s,s1.s+1,len-2);        s2.s[len-2]=0;        strcat(ans,"(");        qiudao(s2);        strcat(ans,")");        return ;    }    if(strncmp(s1.s,"ln(",3)==0&&s1.s[len-1]==')')    {        String ss1;        strncpy(ss1.s,s1.s+3,len-4);        ss1.s[len-4]=0;        ln(ss1);    }}int main(){    String s1;    int i;    while(cin>>s1.s)    {        ans[0]=0;        qiudao(s1);        for(i=0;ans[i];i++)        { if(ans[i+1]=='-') {     if(ans[i]=='+') {cout<<'-';i++;continue;}     if(ans[i]=='-') {cout<<'+';i++;continue;} } cout<<ans[i];        }        cout<<endl;    }    return 0;}

欢迎分享,转载请注明来源:内存溢出

原文地址:https://54852.com/zaji/4907292.html

(0)
打赏 微信扫一扫微信扫一扫 支付宝扫一扫支付宝扫一扫
上一篇 2022-11-12
下一篇2022-11-12

发表评论

登录后才能评论

评论列表(0条)

    保存