Как рассчитать результат 3 операндов с 2 операторами? - PullRequest
0 голосов
/ 20 февраля 2019

как заголовок.У меня проблема с 3 операндами, каждый из которых является случайным, а с 2 операторами также случайными.

Например, это может быть выполнено как: num1 [ops] num2 [ops] num3.Пользователь может ввести как «3 + 2/8», «45 * 76 + 8» или «14-8-9», ... («*» и «/» по-прежнему имеют операторный приоритет).

Если я использую «если», чтобы справиться с этим, это не умно.Но если я использую переключатель, он также нуждается в 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];
    }
}

и компиляторокно: введите описание изображения здесь

1 Ответ

0 голосов
/ 20 февраля 2019

В вашем коде есть несколько опечаток, и вы получите предупреждения, потому что вы не включили все необходимые заголовочные файлы.

Невозможно определить массив без размера, например char string[].

В зависимости от вашего компилятора и библиотеки C вы можете получить предупреждение об устаревшей функции gets.Вы должны использовать fgets вместо этого, чтобы избежать переполнения буфера.Обе функции возвращают указатель, который может быть NULL, но не EOF.

Сначала вы должны исправить все предупреждения компилятора.

Я не буду писать полную программу (пока),но предложите несколько возможных решений.

Для интеллектуального решения вы можете реализовать функцию, которая выполняет вычисление A op B, используя switch с 4 случаями, и вызывать ее дважды.Функция может быть определена как

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

. С вашим вычислением A op1 B op2 C вам сначала нужно проверить приоритет операторов op1 и op2, чтобы решить, будете ли вы вычислять ( A op1 B ) op2 C или * 1025.*.Для этого вы можете реализовать функцию, которая возвращает приоритет оператора.Я полагаю, чем ниже значение, тем выше приоритет.Функция может быть определена как

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( ... ).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...