Есть ли хитрость, чтобы использовать переменную, которая читается раньше, в операторе переключения регистра? - PullRequest
0 голосов
/ 24 марта 2020

Я работаю над практическим вопросом, который задал нам наш учитель, и он вычисляет корни квадратного уравнения c. Говорят, что не использовать if в нем и использовать вместо него switch_case. в этом коде я прошу пользователя ввести три целочисленных значения, и после некоторой математической операции результатом будет дельта, которую необходимо определить, если она положительна, отрицательна или равна 0, а затем выполнить соответствующую операцию над ней , как показано ниже:

int opt=0,a,b,c,delta;
double x1,x2,real,img;
printf("Enter the integer coefficients a, b and c respectively: ");
scanf("%i%i%i",&a,&b,&c);
delta = b*b - 4*a*c;

Теперь, чтобы связать правильную операцию со знаком дельты, мне нужно использовать switch_case следующим образом:

switch(delta){
    case delta>0:
        x1=(-b+sqrt(delta))/(2*a);
        x2=(-b-sqrt(delta))/(2*a);
        printf("the roots of the quadratic equation you entered are x1=%.3lf & x2=%.3lf",x1,x2);
    break;
    case 0:
        x1=(-b)/(2*a);
        printf("the roots of the quadratic equation you entered are the same and equal to x=%.3lf",x1);
    break;
    case delta<0:
        real=(-b)/(2*a);
        img=sqrt(-delta)/(2*a);
        printf("the roots of the quadratic equation you entered is x1=%.3lf+i%.3lf & x2=%.3lf-i%.3lf",real,img,real,img);
    break;
    default:
        printf("an error accured during operation");
}

, но поскольку дельта не предопределена и вычисляется во время выполнения кода кейсы не работают, и я сталкиваюсь с ошибкой «метка кейса не сводится к целочисленной константе». Есть ли какой-нибудь трюк или обычный способ использования switch_case с такими переменными (не предопределено) ??

Ответы [ 2 ]

4 голосов
/ 24 марта 2020

Попробуйте следующее:

int sign = (0 < delta) - (0 > delta);
switch(sign)
{
  case -1: /* 0 > delta */
    ...

    break;

  case 0: /* 0 = delta */
    ...

    break;

  case 1: /* 0 < delta */
    ...

    break;

  default:
    /* Should never arrive here. */
}
0 голосов
/ 24 марта 2020

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

Но, учитывая, что логическая операция даст целое число со значениями 1 или 0 для true и false соответственно, Вы можете попробовать:

switch (delta > 0)
{
    case 1:
        x1 = (-b + sqrt(delta)) / (2 * a);
        x2 = (-b - sqrt(delta)) / (2 * a);
        printf("the roots of the quadratic equation you entered are x1=%.3lf & x2=%.3lf", x1, x2);
        break;
    case 0:
        switch (delta == 0)
        {
            case 1:
                x1 = (-b) / (2 * a);
                printf("the roots of the quadratic equation you entered are the same and equal to x=%.3lf", x1);
                break;
            case 0: //delta < 0
                real = (-b) / (2 * a);
                img = sqrt(-delta) / (2 * a);
                printf("the roots of the quadratic equation you entered is x1=%.3lf+i%.3lf & x2=%.3lf-i%.3lf", real, img, real, img);
                break;
        }
}
...