Я не могу понять, почему этот код дает мне неправильные результаты для умножения, деления и вычитания? - PullRequest
0 голосов
/ 26 февраля 2020

Я не могу понять, почему этот код дает мне неправильные результаты для умножения, деления и вычитания ?? где это дает мне, что результат любой операции умножения равен нулю, а результат любой ошибки деления, наконец, результат вычитания всегда равен 1


#include <stdio.h>
long operations(char x,int num1 ,int num2 );

int main(void) {
    char x;
    int num1 , num2;
    long result;
    setbuf(stdout,NULL);
    result=operations(x,num1 ,num2 );

}
long operations(char x,int num1 ,int num2 )
{
    printf("please enter your operation sum (1) ,subtrcation(2),mul(3),div(4) :");
    scanf("%d",&x);

    if (x==(1||2||3||4))
    {
    printf("please enter the first and second numbers : \n ");
    scanf ("%d%d" ,&num1 ,&num2);
    }
    else
    {
        printf("error ") ;
    }

    switch (x)
    {
    case 1:
    {
        return  printf("the result  sum is  :%d ",(num1+num2)) ;

    }
    case 2:
    {
        return  printf("the result of subtraction  is :%d ",(num1-num2)) ;

    }
    case 3:
        {
            return  printf("the result multiblication is :%d ",(num1*num2)) ;

        }
    case 4:
        {
            return  printf("the result division  is :%d ",(num1/num2)) ;

        }




    }
}

Ответы [ 2 ]

5 голосов
/ 26 февраля 2020

Вы не можете «рефакторировать» ваше условие x==(1||2||3||4)

Вместо этого вам нужно явно указать x == 1 || x == 2 || x == 3 || x == 4.

Ваш компилятор понимает, «если x равно 1 ИЛИ если x равно 2, et c. "
Он не понимает," если x равно 1, 2, 3 или 4 "

Любое число, отличное от нуля, считается true, поэтому 1||2||3||4 совпадает с 1.

Если хотите, можете написать x >= 1 && x <= 4. Вы проверяете только нижнюю и верхнюю границы.

Кроме того, не забудьте проверить, что num2 отличается от 0 в случае деления. В противном случае ваша программа взломает sh.

0 голосов
/ 26 февраля 2020

Как уже упоминалось @chux, это if утверждение всегда верно, потому что true означает != 0. Поэтому каждое число, не равное 0, будет соответствовать условию.

Еще один способ для уже предложенного решения @Haltarys - это другой switch - который может улучшить читаемость:

switch(x)
{
case 1: // fallthrough
case 2: // fallthrough
case 3: // fallthrough
case 4:
    printf("please enter the first and second numbers : \n ");
    scanf ("%d%d" ,&num1 ,&num2);
    break;
default:
    printf("error ");
    // consider returning here instead of break because you have no return below for this case
    break;
}

Поскольку это те же случаи, что и в вашем switch, можно подумать об их объединении.

Некоторые другие советы, касающиеся вашего кода:

  • рассмотрим, что произойдет, если ваше начальное состояние не будет выполнено ( x == 5 например) - Затем вы напечатаете сообщение об ошибке, но в нем отсутствует оператор default для вашего switch и, следовательно, отсутствует значение return. Ваш компилятор должен был жаловаться на это.
  • Ваше подразделение не будет печатать желаемый результат, поскольку вы печатаете %d, что означает, что значение будет приведено, и вы не будете печатать десятичные числа - вместо этого используйте %.2f например, чтобы получить 2 цифры после десятичной точки и привести num1, чтобы не получить int как результат: (double)num1 / num2
  • Вы не возвращаете результат своей математической операции, но возвращаете значение вызываемого printf, который является количеством напечатанных символов.
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...