web-dev-qa-db-ja.com

switchステートメントCの大なり小

私は多くの比較があるコードを書こうとしています

数値を「定量化」する「QUANT.C」でプログラムを作成します。整数「x」を読み取ってテストし、
次の出力を生成します。
 
 xは1000以上、「巨大な正」を印刷します
 xは999から100を含む(100を含む)「非常にポジティブ」を印刷
 x 100〜0を印刷「ポジティブ」
 x正確に0を印刷「ゼロ」
 xを0〜-100を印刷 "ネガティブ」
 x -100〜-999(-100を含む)は、「非常にネガティブ」を印刷します
 x以下は-1000以下「巨大なネガティブ」を印刷します
 
したがって、-10は「ネガティブ」、-100は「非常にネガティブ」、458は「非常にポジティブ」を出力します。

それから私はスイッチを使用して解決しようとしましたが、うまくいきませんでした、ifステートメントを使用して解決する必要がありますか、スイッチを使用して解決する方法がありますか?

#include <stdio.h>

int main(void)
{
int a=0;
printf("please enter a number : \n");

scanf("%i",&a);

switch(a)
{
case (a>1000):
    printf("hugely positive");
   break;
case (a>=100 && a<999):
    printf("very positive");
   break;
case (a>=0 && a<100):
    printf("positive");
   break;
case 0:
    printf("zero");
   break;
case (a>-100 && a<0):
    printf("negative");
   break;
case (a<-100 && a>-999):
    printf("very negative");
   break;
case (a<=-1000):
    printf("hugely negative");
   break;

return 0;
}
15
Salahuddin

ケースを整数型にする必要があるため、スイッチでこれを解決する明確な方法はありません。 if-else if-elseをご覧ください。

6
Eric Fortin

スイッチレスand if-else-lessメソッド:

#include <stdio.h>

int main(void)
{
    int a=0, i;
    struct {
        int value;
        const char *description;
    } list[] = {
        { -999, "hugely negative" },
        { -99, "very negative" },
        { 0, "negative" },
        { 1, "zero" },
        { 100, "positive" },
        { 1000, "very positive" },
        { 1001, "hugely positive" }
    };

    printf("please enter a number : \n");
    scanf("%i",&a);

    for (i=0; i<6 && a>=list[i].value; i++) ;
    printf ("%s\n", list[i].description);

    return 0;
}

Forループにはコードが含まれていません(空のステートメント;)ただし、入力された値aが配列内のvalue要素以上の場合、値を使用して配列を実行し、終了します。その時点で、iは、印刷するdescriptionのインデックス値を保持します。

7
usr2564301

Gccを使用している場合、言語拡張機能を使用することで必要なものを正確にサポートするため、「幸運」が得られます。

#include <limits.h>
...

switch(a)
{
case 1000 ... INT_MAX: // note: cannot omit the space between 1000 and ...
    printf("hugely positive");
   break;
case 100 ... 999:
    printf("very positive");
   break;
...
}

ただし、これは非標準であり、他のコンパイラーはコードを理解しません。標準機能(「移植性」)のみを使用してプログラムを作成する必要があるとよく言われます。

そのため、「合理化された」if-elseif-elseコンストラクト:

if (a >= 1000)
{
    printf("hugely positive");
}
else if (a >= 100)
{
    printf("very positive");
}
else if ...
...
else // might put a helpful comment here, like "a <= -1000"
{
    printf("hugely negative");
}
5
anatolyg

(a>1000)は1 [true]または0 [false]に評価されます。

コンパイルしてエラーを取得します

test_15.c:12: error: case label does not reduce to an integer constant

つまり、caseラベルにinteger constant値を使用する必要があります。この場合、If-else if-elseループは正常に機能するはずです。

2
Sourav Ghosh

これは少し遅すぎるかもしれませんが:

switch( option(a) ){
    case (0): ...
    case (1): ...
    case (2): ...
    case (n): ...

ここで、option()関数は単純にif elseを持つ関数です。これにより、スイッチの外観をきれいに保つことができ、ロジック部分は他の場所にあります。

1
Souza

スイッチを使用する設定があるのはなぜですか?

これは「宿題の質問」のように聞こえるからです。コンパイラは、if/else構文をスイッチと同じくらい効率的に処理する必要があります(範囲を処理していなくても)。

スイッチは示されているように範囲を処理できませんが、最初に入力を分類し(if/elseを使用)、switchステートメントを使用して回答を出力することにより、スイッチを含める方法を見つけることができます。

0
rolinger