zoukankan      html  css  js  c++  java
  • Uva 327 Evaluating Simple C Expressions

     Evaluating Simple C Expressions 

    The task in this problem is to evaluate a sequence of simple C expressions, buy you need not know C to solve the problem! Each of the expressions will appear on a line by itself and will contain no more than 110 characters. The expressions to be evaluated will contain only simple integer variables and a limited set of operators; there will be no constants in the expressions. There are 26 variables which may appear in our simple expressions, namely those with the names a through z (lower-case letters only). At the beginning of evaluation of each expression, these 26 variables will have the integer values 1 through 26, respectively (that is, a = 1b = 2, ..., n = 14o = 15, ..., z = 26). Each variable will appear at most once in an expression, and many variables may not be used at all.

    The operators that may appear in expressions include the binary (two-operand) + and -, with the usual interpretation. Thus the expression a + c - d + b has the value 2 (computed as 1 + 3 - 4 + 2). The only other operators that may appear in expressions are ++ and --. These are unary (one-operand) operators, and may appear before or after any variable. When the ++ operator appears before a variable, that variable's value is incremented (by one) before the variable's value is used in determining the value of the entire expression. Thus the value of the expression ++c - b is 2, with c being incremented to 4 prior to evaluating the entire expression. When the ++ operator appears after a variable, that variable is incremented (again, by one) after its value is used to determine the value of the entire expression. Thus the value of the expression c++ - b is 1, but c is incremented after the complete expression is evaluated; its value will still be 4. The -- operator can also be used before or after a variable to decrement (by one) the variable; its placement before or after the variable has the same significance as for the ++ operator. Thus the expression --c + b-- has the value 4, with variables c and b having the values 2 and 1 following the evaluation of the expression.

    Here's another, more algorithmic, approach to explaining the ++ and -- operators. We'll consider only the ++operator, for brevity:

    1. Identify each variable that has a ++ operator before it. Write a simple assignment statement that increments the value of each such variable, and remove the ++ operator from before that variable in the expression.
    2. In a similar manner, identify each variable that has a ++ operator after it. Write a simple assignment statement that increments the value of each of these, and remove the ++ operator from after that variable in the expression.
    3. Now the expression has no ++ operators before or after any variables. Write the statement that evaluates the remaining expression after those statements written in step 1, and before those written in step 2.
    4. Execute the statements generated in step 1, then those generated in step 3, and finally the one generated in step 2, in that order.

    Using this approach, evaluating the expression ++a + b++ is equivalent to computing

    • a = a + 1 (from step 1 of the algorithm)
    • expression = a + b (from step 3)
    • b = b + 1 (from step 2)

    where expression would receive the value of the complete expression.

    Input and Output

    Your program is to read expressions, one per line, until the end of the file is reached. Display each expression exactly as it was read, then display the value of the entire expression, and on separate lines, the value of each variable after the expression was evaluated. Do not display the value of variables that were not used in the expression. The samples shown below illustrate the desired exact output format.

    Blanks are to be ignored in evaluating expressions, and you are assured that ambiguous expressions like a+++b(ambiguous because it could be treated as a++ + b or a + ++b) will not appear in the input. Likewise, ++ or --operators will never appear both before and after a single variable. Thus expressions like ++a++ will not be in the input data.

    Sample Input

    a + b
    b - z
    a+b--+c++
    c+f--+--a
       f-- + c-- + d-++e

    Sample Output

    Expression: a + b
        value = 3
        a = 1
        b = 2
    Expression: b - z
        value = -24
        b = 2
        z = 26
    Expression: a+b--+c++
        value = 6
        a = 1
        b = 1
        c = 4
    Expression: c+f--+--a
        value = 9
        a = 0
        c = 3
        f = 5
    Expression:    f-- + c-- + d-++e
        value = 7
        c = 2
        d = 4
        e = 6
        f = 5

    #include<stdio.h>
    #include<string.h>
    #include<ctype.h>
    #define MAXN 150
    typedef struct letter{
        int flag, value;//flag 判断在运算中有无出现,value存储相应字母的值 
    }letter;
    int main()
    {
    
        int i, j, len, flag, sum, temp, symbol, t;
        letter alpha[26];
        char input[MAXN], ch0, ch1, ch2, ch3, ch4, ch5;
        while(fgets(input, MAXN, stdin) != NULL)
        {
            len = strlen(input);
            //处理fgets函数带来的副作用 
            if(input[len-1] == '\n') input[len-1] = '\0', len--;
            else input[len] = '\0', len++;        
            printf("Expression: %s\n", input);
            sum = 0;
            for(i=j=0; i<len; ++i)
                if(input[i] != ' ') input[j++] = input[i];
            input[j] = '\0', len = j;
            //处理输入的运算串中的空格 
            for(i=0; i<26; i++)
                alpha[i].value = i+1, alpha[i].flag = 0;
            ch0 = ch1 = ch2 = ch3 = ch4 = ch5 = '?';
            //初始化数组 
            for(i=0,flag=0; i<len; ++i)
            {
                ch0 = ch1, ch1 = ch2, ch2 = ch3, ch3 = input[i];
                if(len-i > 2) ch4 = input[i+1], ch5 = input[i+2];
                else ch4 = ch5 = '?';
                if(input[i] >= 'a' && input[i] <= 'z')
                {
                    t = 0;
                    temp = input[i] - 'a';
                    alpha[temp].flag = 1;
                    ch3 = ' ';
                    if(ch1 == ch2 && ch1 != '?')
                    {
                        t = 1;
                        symbol = ch0 == '-' ? -1 : 1;
                        if(ch1 == '-')
                            sum += (--alpha[temp].value)*symbol;
                        else
                            sum += (++alpha[temp].value)*symbol;
                    }
                    if(ch4 == ch5 && ch4 != '?')
                    {
                        symbol = ch2 == '-' ? -1 : 1;
                        if(t == 0)sum += alpha[temp].value*symbol;
                        else t = 0;
                        if(ch4 == '-') alpha[temp].value--;
                        else alpha[temp].value++;
                        input[i+1] = input[i+2] = ' ';
                    }
                    else if(ch1 != ch2 || (ch1 == ch2 && ch1 == '?'))
                    {
                        symbol = ch2 == '-' ? -1 : 1;
                        sum += alpha[temp].value*symbol;
                    }
                }
            }
            printf("    value = %d\n", sum);
            for(i=0; i<26; ++i)
            if(alpha[i].flag) printf("    %c = %d\n", 'a'+i, alpha[i].value);
        }
        return 0;
    } 

    解题思路:

    在运算的串中主要处理的是类似与 --c+--d--+++b--这种情况,算是一题水题

    因为一开始思路不清晰,所以代码成形的时候提交上去有WA,后来修修补补才AC,其中还有代码敲错行,0写成1的情况。

    【这样做题的态度和方式要避免才行!!】

  • 相关阅读:
    MySQL主从复制与读写分离
    使用PHPCMS搭建wap手机网站
    phpcms v9不用下插件自己做留言板
    css关于banner图轮播的实现
    MySql和Oracle的日期转换到底有哪些不同?我们来比较一下
    CSS---解决内容过多就会出文本溢出(显示在区域外面,不换行的情况)
    dedecms 后台发布后的文章不能编辑出现一片空白的解决办法
    python常识系列11-->python发送邮件基础
    python常识系列10-->python代码注释规范
    python常识系列09-->logging模块之handlers的使用
  • 原文地址:https://www.cnblogs.com/liaoguifa/p/2982473.html
Copyright © 2011-2022 走看看