1 条题解

  • 0
    @ 2025-5-4 12:34:01

    分析:

    1.对于输入的表达式,先进行预处理,去除其中的空格,同时标记表达式中出现的变量。

    2.处理表达式中的自增(++)和自减(--)运算符。如果自增或自减运算符后面紧跟字母(变量),则对该变量的值进行相应的增减操作;如果后面不是字母,则将其标记为后缀自增或自减操作(通过post数组记录)。

    3.对预处理后的表达式进行求值,采用递归的方式,根据运算符(+或-)计算表达式的值。

    4.计算完表达式的值后,根据之前记录的后缀自增或自减操作,更新变量的值并输出每个变量的最终值。

    解题原理

    1.预处理原理:利用isspace函数判断字符是否为空格,将表达式中的空格去除,从而简化后续处理。通过isalpha函数判断字符是否为字母,标记表达式中出现的变量,为后续变量值的处理做准备。

    2.自增自减处理原理:对于自增(++)和自减(--)运算符,根据其后面的字符类型进行不同处理。如果后面是字母,则直接对对应变量的值进行增减;如果不是字母,则记录为后缀操作,在表达式求值完成后再处理。

    3.表达式求值原理:使用递归的方式计算表达式的值。从表达式的开头开始,根据运算符(+或-)决定是将当前变量的值加到结果中还是从结果中减去,然后递归处理表达式的剩余部分。

    4.变量值更新原理:在表达式求值完成后,根据post数组中记录的后缀自增或自减操作,对相应变量的值进行更新并输出。

    实现步骤

    1.输入读取:使用getline函数循环读取输入的表达式,直到没有输入为止。

    2.预处理:调用preEval函数对输入的表达式进行预处理,包括去除空格、标记变量、处理自增自减运算符。

    3.表达式求值:调用eval函数对预处理后的表达式进行求值,采用递归的方式计算表达式的值。

    4.变量值更新与输出:调用postEval函数,根据后缀自增或自减操作更新变量的值,并输出每个变量的最终值。

    5.循环处理:重复以上步骤,处理每一个输入的表达式。

    c++代码

    #include <stdio.h>
    #include <cctype>
    #include <string>
    #include <iostream>
    using namespace std;
    
    int  value[26];
    char used[26], post[26];
    
    void preEval(string& exp)
    {
        string::size_type i = 0, len = exp.size();
        for(string::size_type k = 0; k < len; ++k){
            if(!isspace(exp[k])) exp[i++] = exp[k];
        }
        exp.resize(len = i);
        for(i = 0; i < 26; ++i){
            used[i] = 0;
            value[i] = i + 1;
            post[i] = 0;
        }
        for(i = 0; i < len; ++i){
            if(isalpha(exp[i])) used[exp[i] - 'a'] = 1;
        }
        for(i = 0; i < len && (i = exp.find("++", i)) != string::npos; ){
            if(i + 2 < len && isalpha(exp[i+2]))
                ++value[exp[i+2] - 'a'];
            else {
                if (i > 0) {
                    post[exp[i - 1] - 'a'] = 1;
                }
            }
            exp = exp.substr(0, i) + exp.substr(i + 2);
        }
        for(i = 0; i < len && (i = exp.find("--", i)) != string::npos; ){
            if(i + 2 < len && isalpha(exp[i+2]))
                --value[exp[i+2] - 'a'];
            else {
                if (i > 0) {
                    post[exp[i - 1] - 'a'] = -1;
                }
            }
            exp = exp.substr(0, i) + exp.substr(i + 2);
        }
        //    cout << "exp = " << exp << "\n";
    }
    
    int eval(const string& exp, int res = 0)
    {
        if(exp.empty()) return res;
    
        string::size_type i = 0;
        bool add = true;
        if(!isalpha(exp[i])){
            add = exp[i] == '+';
            ++i;
        }
        if (isalpha(exp[i])) {
            if(add) res += value[exp[i] - 'a'];
            else res -= value[exp[i] - 'a'];
        } else {
            std::cerr << "表达式中存在非法字符,无法求值" << std::endl;
            return res;
        }
        return eval(exp.substr(i+1), res);
    }
    
    void postEval()
    {
        for(int i = 0; i < 26; ++i){
            if(used[i]) cout << "    "
                             << char('a' + i) << " = "
                             << value[i] + post[i] << "\n";
        }
    }
    
    int main()
    {
        ios::sync_with_stdio(false);
        string exp;
        while(getline(cin, exp)){
            cout << "Expression: " << exp << "\n";
            preEval(exp);
            cout << "    " << "value = " << eval(exp) << "\n";
            postEval();
        }
        return 0;
    }
    
    • 1

    信息

    ID
    540
    时间
    1000ms
    内存
    256MiB
    难度
    10
    标签
    递交数
    14
    已通过
    1
    上传者