Неожиданный вывод с использованием оператора switch для этой сложной логики - PullRequest
1 голос
/ 25 мая 2011

Я пытаюсь использовать оператор switch для 3 условий.Условия были:

  1. Когда a, b и c равны нулю, любое значение x является решением.Печать: любое значение x является решением.
  2. Когда a и b равны нулю, а c - нет, решения не существует.Печать: решения не существует.
  3. Когда a равно нулю, а b не равно нулю, единственным решением является x = -c / b.Вычислите значение x и распечатайте решение.

Когда я попытался запустить мою программу, она показала неверные результаты.Мои данные были

a = 0
b = 0
c = 0

Так что предполагалось вывести «Любое значение x - это решение», но это не так.

Моя программа:

#include <stdio.h>

//Function declarations
void getData (int* a, int* b, int* c);
float calculateX (int a, int b, int c);

//===================================================
int main (void)
{
    //Local declarations
    int a;
    int b;
    int c;
    float x;

    //Statements
    getData (&a, &b, &c);
    calculateX (a, b, c);

    int temp;
    printf("\nEnter an integer and press enter to exit the program: ");
    scanf("%d", &temp);

    return 0;
}

//----------------------------------------------------
void getData (int* a, int* b, int* c)
{
    printf("Enter three integers: ");
    scanf("%d %d %d", a, b, c);
    return;
}

//----------------------------------------------------
float calculateX (int a, int b, int c)
{
    float x;

    printf("Input is: %d %d %d\n", a, b, c);
    switch(a, b, c)
    {
        case 1: (a, b, c == 0);
                printf("Any value of x is a solution.");
                break;
        case 2: (a, b == 0 && c!= 0);
                printf("No solution exists.");
                break;
        case 3: (a == 0 && b!= 0);
                x = (float)(-c/b);
                printf("The value of x is: %.1f", x);
                break;
        default: printf("Cannot calculate.");
    }
    return a, b, c;
}

И мой вывод был:

Enter three integers: 0 0 0
Input is: 0 0 0
Cannot calculate.
Enter an integer and press enter to exit the program:

Ответы [ 3 ]

7 голосов
/ 25 мая 2011

Это не то, как работает оператор switch. Он компилируется, но по очень непонятным причинам. Очевидно, он не делает то, что вы ожидаете, когда он работает.

В общем случае вы используете оператор switch в выражении single , и каждая из меток case представляет одно возможное значение этого выражения. e.g.:

switch (x)
{
case 1:
    // Code here runs when x == 1
    break;
case 2:
    // Code here runs when x == 2
    break;
default:
    // Code here runs for all other values of x
    break;
}

В вашем приложении вы хотите протестировать несколько переменных и комбинировать их сложным образом. Нет простого способа сделать это с switch. Вместо этого вы должны рассмотреть набор if операторов.

2 голосов
/ 25 мая 2011

Есть ли причина, по которой вы должны использовать switch?Просто сделай

if (a == 0 && b == 0 && c == 0)
  ...
else if (a == 0 && b == 0 && c != 0)
  ....
...
1 голос
/ 25 мая 2011

На самом деле, вот правильный способ использовать оператор switch для этой проблемы:

switch ((a != 0) * 4 + (b != 0) * 2 + (c != 0))
{
case 0: // a, b, c == 0
    printf("Any value of x is a solution.");
    break;

case 1: // a, b == 0 && c!= 0
    printf("No solution exists.");
    break;

case 2: // a == 0 && b!= 0
case 3:
    x = (float)(-c/b);
    printf("The value of x is: %.1f", x);
    break;

default:
    printf("Cannot calculate.");
}

Я основал это на вашем коде, за исключением того, что я использую условные выражения (которые оцениваются в 0 или 1) для кодирования состояния каждой переменной (нуля или нет соответственно) в выражении, присваивая каждому отдельный бит. switch затем декодирует его - интересная часть для вас, как для новичка, в том, что case 2 падает до case 3, потому что нам все равно, равен ли c нулю.

В вашем коде есть другие проблемы, но я ограничиваюсь switch, о котором вы спрашивали. Желаем удачи.

...