如何使用2个运算符计算3个操作数的结果?

时间:2019-02-20 13:47:24

标签: c

作为标题。 我遇到一个问题,有3个操作数,每个是随机的,有2个运算符也是随机的。

例如,它可以执行为:num1 [ops] num2 [ops] num3。用户可以输入“ 3 + 2/8”,“ 45 * 76 + 8”或“ 14-8-9”,...(“ *”和“ /”仍然具有运算符优先级)。

如果我使用“ if”来处理它,这并不明智。 但是如果我使用switch,它也需要4 * 4的情况,也不是很聪明。 那么,我该怎么办?

感谢您的光临,我为我的英语不好而感到抱歉。

这是我的代码:

void judge(char *);
int main()
{
    char string[]={};
    while(gets(string)!=EOF)
    {
        judge(string);
    }
    return 0;
}

void judge(char *string)
{
    int i=0;
    int sum=0;

    char string2[10];
    strcpy(string2, string);

    char ops[2]={};
    int nums[3]={};
    char *delim =" +-*/";
    char *delim2=" 0123456789";
    char * pch;
    char * pch2;

    pch = strtok(string,delim);
    while (pch != NULL)
    {
        nums[i]=atoi(pch);
        i++;
        pch = strtok (NULL, delim);
    }
    i=0;
    pch2 = strtok(string2,delim2);
    while (pch2 != NULL)
    {
        ops[i]=pch2[0];
        i++;
        pch2 = strtok (NULL, delim2);
    }
    for(i=0;i<3;i++)
    {
        if(i>0)
        {
            printf(" ");
        }
        printf("%d",nums[i]);
    }
    printf(" ");
    for(i=0;i<2;i++)
    {
        if(i>0)
        {
            printf(" ");
        }
        printf("%c",ops[i]);
    }


    /* here is what I confused. */
    switch(ops[0])
    {
        case '+':
            if(ops[1]=='+')
                sum=nums[0]+nums[1]+num[2];
            if(ops[1]=='-')
                sum=nums[0]+nums[1]-num[2];
            if(ops[1]=='*')
                sum=nums[0]+nums[1]*num[2];
            if(ops[1]=='/')
                sum=nums[0]+nums[1]/num[2];
    }
}

和编译器窗口: enter image description here

1 个答案:

答案 0 :(得分:1)

您的代码中有一些错别字,并且由于未包含所有必需的头文件,因此您会收到警告。

您不能定义没有大小的数组,例如char string[]

根据您的编译器和C库,您可能会收到有关不推荐使用的功能gets的警告。您应该使用fgets来避免缓冲区溢出。这两个函数都返回一个可能是NULL而不是EOF的指针。

您应该首先修复所有编译器警告。

我暂时不会编写完整的程序,但会提出一些可能的解决方案。

对于智能解决方案,您可以实现一个函数,该函数使用A op B进行4种情况的计算switch,并调用两次。该功能可以定义为

int calculate(int a, char op, int b)

通过计算A op1 B op2 C,您首先必须检查运算符op1op2的优先级,以确定是计算( A op1 B ) op2 C还是A op1 ( B op2 C)。为此,您可以实现一个返回运算符优先级的函数。我认为较低的值是较高的优先级。该功能可以定义为

int precedence(char op)

然后您可以执行以下操作:

if(precedence(ops[0]) < precedence(ops[1])) {
    return calculate( calculate(nums[0], ops[0], nums[1]),
                      ops[1], nums[2] );
} else {
    return calculate( nums[0], ops[0],
                      calculate(nums[1], ops[1], nums[2]) );
}

在问题程序中,您可能希望使用sum = calculate( ... )而不是return calculate( ... )