📜  C |运营商|问题26(1)

📅  最后修改于: 2023-12-03 15:13:47.667000             🧑  作者: Mango

C | 运营商 | 问题26

本问题需要完成一个C语言程序,程序要求实现一个函数int eval(char* expr),该函数接收一个字符串参数expr,返回表达式的结果。

表达式中含有以下3种操作符:+、-、*,以及数字字符0-9。表达式中没有括号。

表达式的值遵循以下规则:

  1. 表达式可以是一个单独的数字字符。
  2. 表达式可以是两个表达式以一个操作符连接而成,形如expr1'操作符'expr2的形式。
  3. 表达式可以带有空格,但空格不参与运算。

需要注意的是,本问题涉及到数学运算,需要注意数据类型的精度问题。

下面是本问题的一个示例程序:

#include<stdio.h>
#include<stdlib.h>
#include<ctype.h>

int eval(char*);

int main() {
    char expr[100];
    scanf("%[^\n]", expr); //读入一个带空格的字符串
    getchar(); //读取一个换行符
    printf("%d\n", eval(expr)); //输出表达式的值
    return 0;
}

int eval(char* expr) {
    int val = 0, num = 0; //val表示表达式的值,num表示当前操作数的值
    char op = '+'; //op表示当前操作符的值,默认为+
    while (*expr) {
        if (isdigit(*expr)) { //如果是数字,则加入当前操作数中
            num = num * 10 + *expr - '0'; //将字符转换为整型数字
        }
        else if (*expr == '+' || *expr == '-' || *expr == '*' || *expr == '\0') { //如果是操作符或字符串结束符,则进行运算
            switch (op) {
                case '+': val += num; break; //运算符为+,则加上num
                case '-': val -= num; break; //运算符为-,则减去num
                case '*': val *= num; break; //运算符为*,则乘上num
            }
            op = *expr; //更新当前操作符
            num = 0; //当前操作数清零
        }
        expr++; //移动指针至下一个字符
    }
    return val;
}

解释一下上述程序的实现思路:

首先,程序通过scanf读入一个带有空格的字符串expr,并通过getchar读入一个空格。

然后,我们定义了一个eval函数,该函数接收一个字符串参数expr,并返回表达式的值。该函数的实现逻辑如下:

  1. 定义三个变量val、num、op,分别表示表达式的值、当前操作数的值以及当前操作符的值。val、num默认值均为0,op默认值为+。
  2. 在while循环中,我们通过移动指针的方法逐个读取表达式中的字符,根据字符种类的不同进行不同的操作。
  3. 如果当前读入的字符是数字字符,则将该字符转换为整型数字,加入到当前操作数num中。如果后面还有数字,则继续将数字加入num中。
  4. 如果当前读入的字符是操作符字符或字符串结束符,则进行一次运算。具体的运算操作由当前操作符op决定。
  5. 更新当前操作符op的值,将num清零。
  6. 继续while循环,直到整个表达式被处理完毕。
  7. 返回表达式的值val。

在main函数中,我们调用了eval函数,并输出表达式的值。

此外,需要注意的是,由于本问题中的数学运算可能涉及到大数问题(如乘法),因此需要选择较高精度的数据类型(如long long)进行存储和运算。

这样,我们就完成了本问题的代码实现。