web-dev-qa-db-ja.com

C-複数のケース番号を持つスイッチ

そこで、教授は私たちにswitchステートメントを作成するように頼みました。 「SWITCH」のみステートメントを使用してプログラムを実行できます。彼は、数字を入力し、それが数字の範囲にある場合は表示し、次に示すようにどのブリーフケース番号を取得するかを望んでいます。さて...このタイプのプログラムでは、IFステートメントを使用する方が簡単です。ケース1の実行:ケース2:ケース3 ...ケース30は機能しますが、番号の範囲のために時間がかかりすぎます。

#include <stdio.h>
main()
{
      int x;
      char ch1;
      printf("Enter a number: ");
      scanf("%d",&x);
      switch(x)
      {
                 case 1://for the first case #1-30
                 case 30:
                      printf("The number you entered is >= 1 and <= 30");
                      printf("\nTake Briefcase Number 1");
                      break;         
                 case 31://for the second case #31-59
                 case 59:
                      printf("The number you entered is >= 31 and <= 59");
                      printf("\nTake Briefcase Number 2");
                      break;                 
                 case 60://for the third case #60-89
                 case 89:
                      printf("The number you entered is >= 60 and <= 89");
                      printf("\nTake Briefcase Number 3");
                      break;                 
                 case 90://for the fourth case #90-100
                 case 100:
                      printf("The number you entered is >= 90 and <= 100");
                      printf("\nTake Briefcase Number 4");
                      break;      
                 default:
                     printf("Not in the number range");
                     break;

                 }
      getch();
      }

私の教授は、これを行う方法にはもっと短い方法があると言ったが、その方法は教えない。私はそれを短縮することを考えることができる唯一の方法はIFを使用することですが、私たちは許可されていません。これをどのように実現できるかについてのアイデアはありますか?

14
user2649696

GCCとCLangでは、次のようにケース範囲を使用できます。

_switch (x){

case 1 ... 30:
    printf ("The number you entered is >= 1 and <= 30\n");
    break;
}
_

唯一のクロスコンパイラソリューションは、次のようなcaseステートメントを使用することです。

_switch (x){

case 1:
case 2:
case 3:
case 4:
case 5:
case 6:
    printf ("The number you entered is >= 1 and <= 6\n");
    break;
}
_

編集:switch (x / 10)の効果に何かを使用することは、これを行うもう1つの良い方法です。範囲が_10_の差ではない場合、GCCのケース範囲を使用する方が簡単かもしれませんが、一方で、教授は答えとしてGCC拡張を受け取らないかもしれません。

37
tay10r

範囲に一貫性がある場合は、一部のデータを破棄できます。

switch (x / 10 )
{
   case 0:
   case 1:
   case 2:  // x is 0 - 29
     break ;

   // etc ...
}

それ以外の場合は、エッジの周りに少しハッカーをする必要があります。

9
woolstar
   Try this ...

#include <stdio.h>
main()
{
      int x;
      char ch1;
      printf("Enter a number: ");
      scanf("%d",&x);
      int y=ceil(x/30.0);
      switch(y)
      {

                 case 1:
                      printf("The number you entered is >= 1 and <= 30");
                      printf("\nTake Briefcase Number 1");
                      break;         

                 case 2:
                      printf("The number you entered is >= 31 and <= 60");
                      printf("\nTake Briefcase Number 2");
                      break;                 

                 case 3:
                      printf("The number you entered is >= 61 and <= 90");
                      printf("\nTake Briefcase Number 3");
                      break;                 

                 case 4:
                      printf("The number you entered is >= 91 and <= 100");
                      printf("\nTake Briefcase Number 4");
                      break;      
                 default:
                     printf("Not in the number range");
                     break;

                 }
      getch();
      }
3
uhs