switch文で範囲指定する方法とは?
- switch文を用いて特定の範囲を指定する方法について説明します。
- if文を使用せずにswitch文を使って範囲を指定する方法はありますか?
- 具体的な例を挙げながら、switch文で範囲指定する方法を理解していきましょう。
- ベストアンサー
switch の範囲指定
switch文で以下のように書いた時に処理はCを実行するのですが、 変数a が 0~9の時に こうしますよ と範囲がまだ狭い時はこのように書いても処理はできると思いますが 変数a の範囲が 0~99だった場合、いちいちcase を100回書いて(defaultを使えば処理は減るだろうけど) と数字を100回書かないといけないのはとても面倒だと思うのです。 そこで以下のようにifを使わずにswitchを使って範囲を指定する方法はありませんか? //ifを使った場合の範囲指定 if( ( 0 <= a ) && ( a < 25 ) ){ //略 } else if( ( 25 <= a ) && ( a < 50 ) ){ //略 } else if( ( 50 <= a ) && ( a < 75 ) ){ //略 } else if( ( 75 <= a ) && ( a < 100 ) ){ //略 } //ソース int a = 6; switch( a ){ case 0: case 1: //処理A break; case 2: case 3: case 4: //処理B break; case 5: case 6: //処理C break; case 7: case 8: case 9: //処理D break; }
- mana5867
- お礼率63% (58/92)
- C・C++・C#
- 回答数6
- ありがとう数5
- みんなの回答 (6)
- 専門家の回答
質問者が選んだベストアンサー
>そこで以下のようにifを使わずにswitchを使って範囲を指定する方法はありませんか? 結論からいうとありません。 但し、今回のケース限定ですが、if文を使用したものと、同等の機能が得られるようにするとすれば、 aを25で割った商についてswitch文を使用すればよいかと。 switch(a/25){ case 0: // 0 <= a && a < 25 のケース 省略 case 1: // 25 <= a && a < 50 のケース 省略 ・・・以下省略 }
その他の回答 (5)
- 麻野 なぎ(@AsanoNagi)
- ベストアンサー率45% (763/1670)
直接の回答ではありませんが、こういうロジックが必要な場合、処理A、処理B、処理Cが実は数字が少し違うだけで、実質的に同じ処理をしているというケースがよくあります。 その場合、各処理のほうを見直すと、実は、前段の分岐処理は不要になるというケースもそこそこあります。
お礼
四則演算をしてもう少し小さな数にしたりとかですね 1の回答者様のように今回の場合は25で割れば4っつの処理をするのは簡単ですからね
ifもswitchも使わない方法も、ここで一つ。 #include <stdio.h> #define x5(f) f,f,f,f,f #define x25(f) x5(f),x5(f),x5(f),x5(f),x5(f) typedef void (*jump)(int) ; void A(int a) { puts("処理A"); }; void B(int a) { puts("処理B"); }; void C(int a) { puts("処理C"); }; void D(int a) { puts("処理D"); }; jump cases[] = { x25(A), x25(B), x25(C), x25(D) }; int main(void) { for (int i = 0; i < 100; i++) cases[i](i); return 0; }
お礼
そんな使い方もあるのですか。 これは盲点ですね。 こういう処理の仕方もあるということは覚えておきますね。
- kmee
- ベストアンサー率55% (1857/3366)
switch 使う方法はいろいろ出ているので。 たとえばa が常に正だとして。 if( ( 0 <= a ) && ( a < 25 ) ){ //略 } が成立していたら else if( ( 25 <= a ) && ( a < 50 ) ){ //略 } ここは通りません。 前のifが成立、ということは a<25 ですから、不成立ということは、 25<=a はかならず成立する、ということになります。 必ず成立する条件を判定するのは無駄です。 と、無駄を省くと if( a < 0 ) { ... } else if ( a < 25 ) { //略 } else if ( a < 50 ) { //略 } else if ( a < 75 ) { //略 } else if ( a < 100 ) { //略 } となります。ちょっと長いですが、switch~caseとそれほど変わらないと思います。
お礼
あああ本当ですね。 すっごい省略できます。 今までは数値の範囲がわかりやすかったのであのように書いてましたが、今後はまねてみますね。 これくらいなら処理速度がそれほど変わらないのはわかるのですが、非常に大規模な処理を行いたいので処理速度に気をつけてるのですよ。 ですので、どうしてもifを使わなければいけないもの以外は、できる限りswitchを使いたいのです
- Tacosan
- ベストアンサー率23% (3656/15482)
#2 では関数を使ってるけど, 同じことを配列でやることも (場合によっては) 可能.
補足
配列でも可能ですか。 やり方を考えてみますね。
- Ogre7077
- ベストアンサー率65% (170/258)
面倒な条件で switch する場合、チャンと書くならこうでしょう #define CASE_A 1 #define CASE_B 2 int 自作関数(int a){ if (...) return CASE_A; if (...) return CASE_B; ... return 0; } (中略) switch (自作関数(a)) { case CASE_A: 処理A(); break; case CASE_B: 処理B(); break; default: 処理X(); }
お礼
すみません 関数を使った処理はいいと思います。 ですが、ifを使っている処理だとswitchだけを使った処理速度より遅くなってしまうため使うのをためらってしまいます。 せっかく教えていただいたのですが、申し訳ありませんね
関連するQ&A
- 変数の範囲によって場合わけしたいのですが、switchで可能でしょうか?
変数の範囲によって場合わけしたいのですが、switchで可能でしょうか?あるいは、ifでないとだめでしょうか?やりたいのは、変数を$aとすると、 0<a<1 なら、処理1 1<a<2 なら、処理2 というのが10個くらいあります。ifだと長くなるのでできればswitchでやりたいのですが、可能でしょうか?条件をどうやって書けばいいのでしょうか?リファレンスを見ても乗っていませんでした・・ <?php switch ($a) { case (0<$a<1): 処理1; case (1<$a<2): 処理2; ・ ・ ・ } ?> という書き方はできるのでしょうか?あるいは不可なら、簡単な方法はあるでしょうか?
- ベストアンサー
- PHP
- switchでの条件分岐の書き方を教えて下さい。
こんにちは。 いつもお世話になっております。 またわからない事が出てきてしまったので、どうか ご指導よろしくお願いいたします。 簡単な検索機能をつくりたくて、思考錯誤 しております。 フォームからPOSTで受け取る変数の数は 10個あります。 それぞれの変数が ””でなければ、受け取った 変数を元に、SQL文がかわってゆく。 という事がしたいのです。 10個もあるので、たとえば 変数が$_POST["a"]から$_POST["j"]まであった時に if文を使うとすると if($_POST["a"] != "" && $_POST["b"] == "" && $_POST["c"] != "" (略)){ $stt = "検索したい予定のSQL文1"; }elseif($_POST["a"] == "" && $_POST["b"] != "" && $_POST["c"] != "" (略)){ $stt = "SQL文2"; ・ ・ ・ と言う風に、ものすごいにはなると思うのですがifを つなげていけば良いのかな、と思うのです。 PHPの基礎HPなどを検索してみると、SWITCHを 使えば、多岐に分岐するIF文を、見やすくできる、 と書いてあったので、使ってみたいのですが、書き方の 説明によると switch(変数){ case 値1: 条件を満たす時の処理1 break; case 値2: 条件を満たす時の処理2 default: } と紹介してあったのですが、今回わたしがしたい場合の 条件分岐だと、変数は一つではなく、ある変数は空でこの変数は値が何か入っていて、またもう一つの変数は 空で・・・の時は、このSQL文、というように させたい場合には、switchでどうかけばよいのか わからないのです。 それとも、こういう条件分岐の場合は、switchを 使うべきではないのでしょうか・・・? どうかご指導よろしくお願いいたします。
- ベストアンサー
- PHP
- switch文について
お世話になります。switch文について教えてください。 分岐の条件を複数使用することは出来ますか。 たとえば switch(a) [ case "1": if (x == "0") { document.write(1x0); } else if (x == "1") { document.write(1x1); else { document.write(1x); break; } case "2": if (x == "0") { document.write(2x0); } else if (x == "1") { document.write(2x1); else if (y == "0") { document.write(2y0); else { document.write(2x); break; ] という構文は可能ですか。 case 2でx yの二分岐しても可能ですか。 教えてください。
- ベストアンサー
- Java
- 条件分岐 if(elseif) switchの実行速度
条件分岐に if switchがありますが、 ifパターン ============================== if ( $a = 1) { 処理A } elseif ($a = 2) { 処理B } ============================== switchパターン ============================== switch($a){ case '1': 処理A break; case '2': 処理B break; } ============================== 実際はもっと複雑ですが、どちらのほうが実行速度が速いのでしょうか。
- ベストアンサー
- PHP
- switch文caseについて
switchのcaseについてですが、数字を直接記述せずに、const変数に値を代入して使用出来ますか? 例) const int A = 1; const int B = 2; switch(suuti){ case A: 処理; break; case B: 処理; break; } コンパイルすると、「case 式は、整数型定数でなければなりません。」と出てきてしまうのですが、直接数値を記述しないといけないのでしょうか? よろしくお願いします。
- ベストアンサー
- C・C++・C#
- この(C言語)ダブルポインタのアルゴリズムを教えて!
main(int argc, char *argv[]) while(--argc > 0) { if(**(++agv) == '-') { switch(argv[0][1]){ case 'a'; オプションaに対する処理; break; case 'b'; オプションbに対する処理; break; case 'c'; オプションcに対する処理; break; default;; abc 以外のオプションが入力された時の処理; } } else break; } オプション以外のパラメータが入力されたときの処理; 特に ’**’の部分や argv[0][1]の意味が解かりません。 よろしくお願い致します。
- ベストアンサー
- C・C++・C#
- phpのswitch文で必ずdefault処理さる
phpでswitch文を使って変数の値に応じて処理を変えたいのですが、なぜか常にdefault処理をされてしまいます。 htmlの別ファイルから例えば"テスト,テスト2,テスト3"という文字列を受け取って strtok()を使って、$aに"テスト", $bに"テスト2", $cに"テスト3"と入るようにしました。 それで$aには"テスト"の文字列が入っているはずなので、 switch($a){ case "テスト":~~/処理 break; default:~~//処理 break; } と書いた場合、case "テスト" の処理がされるはずだと思うのですが、 なぜかdefaultの場合の処理がされてしまいます。 gettype($a); で$aの型を調べると、string型になっていおり、 $aの中身を echo "a: {$a}"; で確認すると 「a: テスト」と表示されます。 しかし、if文で if($a == "テスト"){ echo "a match テスト"; } else{ echo "not match"; } のように書いてみると、 「not match」が表示されます。 この理由が分かりません。 この理由が分かる方はいらっしゃいますか? 解決策を教えてください。 また、もしかしたら$aにはecho や print()では表示されない文字が 付属しているのかもしれないと考えていますが、 echoやprint()で表示されない文字を表示させる方法はありますか?
- ベストアンサー
- PHP
- templateにの指定に従ったswitch
以下のような感じで、template TTの種類によって処理を変えたいのですがうまくいきません。 どの様にすればいいのでしょうか? 宜しくお願いします。 template<class TT> void vector3<TT>::GetMemberList(char *str,const int bufsize,char *format=0){ int i,j; if(!format){ switch(TT){ case int: format=new char("%d"); break; case double: format=new char("%lf"); break; } } }
- ベストアンサー
- C・C++・C#
- switch文について
VC++6.0 SDIです。 CString型の変数に、コンボボックスのデータを所得し、 選択したコンボボックスの内容に応じて異なった処理をさせたいのですが、どうしたら良いでしょうか? 私は、下記コードで出来るかな??ってイメージしていたのですが・・。 下記コードを改造してなんとか・・・ という拘り無く、コンボボックスの内容によって違う処理をする分岐の一般的な方法が知りたいと思っています。 よろしくお願い致します。 CString A; GetWindowText(A); switch(A){ case '文字列1':{ 処理 break; } case '文字列2':{ 処理 break; } ・ ・ ・ default :{ 処理 break; } }
- ベストアンサー
- C・C++・C#
- switch文について
独学でjavaの勉強をしているのですが、switch文が本のとおりに入力しても エラーがでて困っています。どこが間違っているのかわかりません。 ちなみにプログラム内容は class bunki2{ public static void main(String args[]){ int a; a=1; switch (a) { case1:System.out.println("変数aの値は1です。"); break; case2:System.out.println("変数aの値は2です。"); break; case3:System.out.println("変数aの値は3です。"); break; } } } です。 これでコンパイルしようとすると’case’、’default’、または’}’がありません。とでます。 なぜできないのか教えてください。
- ベストアンサー
- Java
お礼
やっぱりないのですか・・。 あれば非常に便利なので皆さん使っているでしょうしね。 今回のケースは25で分けているので簡単だと思います。 本来なら0~10、10~15、15~40、40~70、70~100と言った具合にバラけて使いたかったのです。