CODEVS 1015 计算器的改良

题目 http://codevs.cn/problem/1015/

热身题,很直接的写法,直观易理解,代码结构可以自己整理一下

基本思想

    一旦遇到运算符就一定将缓冲区的数据转储

    一旦遇到等号,则正负号相反对待

    一旦遇到字母,就认为当前缓冲区的数是一次项的系数

    一次项和零次项系数分开存储

/*
作者:FUNCO_小风
题目:p1015 计算器的改良
*/
#include<stdio.h>
#include<string.h>
int main()
{
    // 系数 整数 负号标识
    int coe=0, cnt=0, minus=0, i=0;
    char in=0,tmp=0,left=1, none=0;
    char s[100] = {0};
    scanf("%s", s);
    for (i=0; i<strlen(s)+1; i++)
    {
        in = s[i];
        if (in == '-')
        {
    	    if (minus)
    	    {
                    cnt -= tmp;
            }
    	    else
    	    {
    		cnt += tmp;
    	    }
            minus = left ? 1 : 0;tmp = 0;
        }
        else if (in == '+')
        {
    	    if (minus)
    	    {
                    cnt -= tmp;
            }
    	    else
    	    {
    		    cnt += tmp;
    	    }
            minus = left ? 0 : 1;tmp = 0;
        }
    	else if (in == '=' || in == 0)
    	{
    	    if (minus)
    	    {
                    cnt -= tmp;
                }
    	    else
    	    {
    		    cnt += tmp;
    	    }
            minus = 1;
    	    left = 0;tmp = 0;
    	}
    	else if (in>='0' && in<='9')
    	{
                tmp = tmp*10+(in-'0');
    	}
        else if (in>='a' && in<='z')
        {
    	    if (minus)
    	    {
    	        coe -= tmp > 0 ? tmp : 1;tmp = 0;
    	    }
    	    else
            {
    	        coe += tmp > 0 ? tmp : 1;tmp = 0;
    	    }
    	    none = in;
        }
        if (in == 0)
        {
            break;
        }
    }
    printf("%c=%.3f\n", none, (-1.0*cnt)/coe);
    return 0;
}

猜你喜欢

转载自blog.csdn.net/qq_23937195/article/details/79599853