计算器的改良

特别考验细节的模拟。(绕晕!)

主要是移项,y=kx

  • 坑1:未知数系数为1或-1。
  • 坑2:最后一个常数项漏存。
  • 坑3:-0.000。(0/负数=-0)
    正在做的人主要以下几点
    1.a和1a是等价的….-1和-a也是
    2.如果你要改符号的时候,要把没有符号的项加上’+’
    3.可以在字符串末尾加上如’#’之类的符号表示是否已经读完

Code

#include<cstdio>
#include<cstring>
int main()
{
    char c,s[505];
    int x=0,y=0,a=0,f=1,f1=1,i;
//x为未知数系数(=左),y为常数项(=右),a为正在读入的常数值,f为a的符号,f1为a是否在等号左边。 
    double ans;
    scanf("%s",s);
    for (i=0;i<strlen(s);i++)
    {
        if (s[i]>='0'&&s[i]<='9') 
        a=a*10+s[i]-48;//是数字就存 
        if (s[i]=='-')
        {
            y+=-1*f*f1*a;  //常数项保存,如果前面是未知数此时a为0。 
            f=-1;
            a=0;
        }
        if (s[i]=='+')
        {
            y+=-1*f*f1*a;  //同上。 
            f=1;
            a=0;
        }
        if (s[i]=='=')
        {
            y+=-1*f*f1*a;  //同上。 
            f1=-1;
            f=1;
            a=0;
        }
        if (s[i]>='a'&&s[i]<='z')
        {
            c=s[i];
            if (a) x+=f*a*f1; else x+=f*f1; //未知数系数保存。 
            f=1;
            a=0;
        }
    }
    y+=-1*f*f1*a;  //最后一个常数项。 
    ans=1.0*y/x;   //计算结果。 
    if (ans<=0.000&&ans>-0.0005) printf("%c=0.000",c);
    //最后一个点会卡掉a=-0.000,注意(-0.0005,0.000]的区间。 
    else printf("%c=%.3lf",c,ans);
    return 0;
    }

猜你喜欢

转载自blog.csdn.net/qq_39984146/article/details/79162598