ページ 11

switch文の使い方を教えてください

Posted: 2015年7月31日(金) 10:01
by 貝田
今までswitch文を使うときは

コード:

switch( 変数名 ){
 case 0:
    実行処理
    break;
 case 1:
    実行処理
    break;
 case 2:
    実行処理
    break;
 case 3:
    実行処理
    break;
  default:
    実行処理
    break;
}
の様な感じでした。switch文の解説にも
この様な方法で記載されてますのでなんら間違っていないと思います。

でもswitch文を使っていくうちに、
「このcaseに当てはめる変数の値を、一定の範囲に出来ないの?」と
疑問に思い始めました。
イメージではこうです。

コード:

switch( 変数名 ){
 case 0から3なら:
    実行処理
    break;
 case 4:
    実行処理
    break;
 case 5から11なら:
    実行処理
    break;
  default:
    実行処理
    break;
}
初心者なので理解が及んでいませんが、
上記のようにすることは、出来ますか?
だとすれば、caseの部分にどう記載すればいいのでしょうか?

Re: switch文の使い方を教えてください

Posted: 2015年7月31日(金) 10:07
by 貝田
あ、ちなみに

コード:

  case 1:
  case 2:
  case 3:
    実行処理
    break;
  case 4:
    実行処理
    break;
とかはわかっていますが、僕が求めているのはこうではないです。
なぜなら、変数の値の振り分けは、かなりの幅になっている場合の話ですので。
例えば、case 1から100まで:としたい場合に
case 1からcase 100までいちいち羅列してられませんよね。

Re: switch文の使い方を教えてください

Posted: 2015年7月31日(金) 10:35
by usao
オフトピック
>switch( 変数名 )

のところの変数を別の値に変換する処理 を1段かませばよいのではないでしょうか.
(そしてその変換処理がif~else~的なものになるのであれば,
 最初から switch ではなく if~else~ で書けば良いような気もする)

Re: switch文の使い方を教えてください

Posted: 2015年7月31日(金) 10:41
by みけCAT
C言語およびC++のgcc拡張

コード:

#include <stdio.h>

int main(void) {
  int n = 3;
  switch(n) {
    case 0 ... 3:
      puts("1");
      break;
    case 4:
      puts("2");
      break;
    case 5 ... 11:
      puts("3");
      break;
    default:
      puts("4");
      break;
  }
  return 0;
}
D言語

コード:

import std.stdio;

void main() {
  int n = 3;
  switch(n) {
    case 0 : .. case 3 :
      writeln("1");
      break;
    case 4 :
      writeln("2");
      break;
    case 5 : .. case 11 :
      writeln("3");
      break;
    default :
      writeln("4");
      break;
  }
}

Re: switch文の使い方を教えてください

Posted: 2015年7月31日(金) 10:43
by 貝田
usao さんが書きました: 最初から switch ではなく if~else~ で書けば良いような気もする)
ですよね、結局そうなりますよね。
予想はしてました。

とりあえず、今回のケースだと
switch単体ではどうにもならんということですね。
ありがとうございました。

Re: switch文の使い方を教えてください

Posted: 2015年7月31日(金) 10:46
by みけCAT
貝田 さんが書きました:とりあえず、今回のケースだと
switch単体ではどうにもならんということですね。
いいえ。
言語が指定されていないので、前述の通りD言語を使えばできるはずです。

Re: switch文の使い方を教えてください

Posted: 2015年7月31日(金) 10:48
by 貝田
みけCATさん

あれ?出来るんですか?
というか、gcc拡張のページが文字化けページで読めませんが、、
拡張ってなにかする必要があるんでしょうか
しかし「そんな方法は無い」ばりに回答くださったusaoさんは
まだ知識が足りなかったということですかね。

Re: switch文の使い方を教えてください

Posted: 2015年7月31日(金) 10:49
by usao
なんだかなぁ…

コード:

//
void Test( int val )
{
	std::cout << val << " --> ";

	unsigned char SwitchVar =
		( val==0 )
		| ( (val==1)<<1 )
		| ( (val==2)<<2 )
		| ( (10<=val && val<=100)<<3 );

	switch( SwitchVar )
	{
	case 0x01:
		std::cout << "val==0 case" << std::endl;
		break;

	case 0x02:
		std::cout << "val==1 case" << std::endl;
		break;

	case 0x04:
		std::cout << "val==2 case" << std::endl;
		break;

	case 0x08:
		std::cout << "10<=val<=100 case" << std::endl;
		break;

	default:
		std::cout << "default case" << std::endl;
		break;
	}
}

//
int main( void )
{
	Test( 0 );
	Test( 1 );
	Test( 2 );
	Test( 10 );
	Test( 50 );
	Test( 100 );
	Test( 101 );

	//
	std::cin.ignore();
	return 0;
}

Re: switch文の使い方を教えてください

Posted: 2015年7月31日(金) 10:51
by usao
>しかし「そんな方法は無い」ばりに回答くださったusaoさんは
>まだ知識が足りなかったということですかね。

はい.

Re: switch文の使い方を教えてください

Posted: 2015年7月31日(金) 10:53
by 貝田
みけCAT さんが書きました: 言語が指定されていないので、前述の通りD言語を使えばできるはずです。
こちらはC言語、C++です。
D言語は使いません。

ということは、無理ということですかね

Re: switch文の使い方を教えてください

Posted: 2015年7月31日(金) 10:54
by みけCAT
貝田 さんが書きました:gcc拡張のページが文字化けページで読めませんが、、
ブラウザのメニューで、文字コードを日本語(EUC-JP)にしてください。
貝田 さんが書きました:拡張ってなにかする必要があるんでしょうか
gccを-pedantic系のオプションを付けずに使うだけで、特別なことをする必要はなさそうです。

Re: switch文の使い方を教えてください

Posted: 2015年7月31日(金) 10:56
by 貝田
usaoさん

いや~、さすがにそこまで無理矢理作るくらいなら
あなたの最初のコメント通り、if文でいいでしょう。
すみません、お手間かけさせてしまって。

Re: switch文の使い方を教えてください

Posted: 2015年7月31日(金) 10:57
by みけCAT
貝田 さんが書きました:こちらはC言語、C++です。
D言語は使いません。

ということは、無理ということですかね
C言語、C++の標準では無理そう(きちんと調べてはいない)ですが、前述の通りgcc拡張を使えばできます。