• 締切済み

C言語switch文のcase記述について

switch文のcaseがたくさんあるため、ソースファイルとして外だししたいと思っています。 ただ、switch文そのものはきちんと記述し、caseの部分だけを外だしできればと考えています。 例 switch (a) { case 1: case 2: : :(たくさん続く) 処理A; case 100; case 101; : : (これまたたくさん続く)  処理B; } を switch (a) { A_WO_SURU_JOUKEN  /* この記述を外だししたい */ 処理A; B_WO_SURU_JOUKEN /* 同じく */ 処理B; } といった具合にしてみたいということです。 ヘッダファイルを使う、defineでの記述で可能といったものを教えていただければ幸いです。

  • quoth
  • お礼率84% (65/77)

みんなの回答

  • vege-g49
  • ベストアンサー率100% (3/3)
回答No.5

defineを使用するのではなく、 分岐を判断する関数を作って 使用する方法はどうでしょうか? 以下 if文とswitch文を使用してみました。 -- 分岐を判断する関数 -- IsCaseA(int a) {  switch(a)  {  case 1:  case 2:  ・・・  return 1; }  return 0; } IsCaseB(int a) {  switch(a)  {  case 100;  case 101;  ・・・  return 1;  }  return 0; } -- 本文 -- if( IsCaseA(a) ) {  処理A; } else if( IsCaseB(a) ) {  処理B; } これだと本文が短くなりますし、 将来 case の追加する場合も、行追加で容易に対応できます。

  • Oh-Orange
  • ベストアンサー率63% (854/1345)
回答No.4

★アドバイス ・いろいろと分け方がありますが処理A、処理Bなどの部分をマクロ関数や普通に関数として  分離する方法が私が良く取る方法です。 例えば: switch ( a ){ case 1: case 2:  : 処理A;  : case 100; case 101;  : 処理B;  : } ならば #define ShoriA()\ {\  :\ 処理Aの本体;\  :\ } #define ShoriB()\ {\  :\ 処理Bの本体;\  :\ } switch ( a ){ case  1: case  2: ShoriA(); break; case 100: case 101: ShoriB(); break;  : 同様にする  : } その他: ・処理A、処理Bを関数にするよりは define で関数と同じような感じで定義します。  これを専用のヘッダファイルにでも保存するか、switch 文のある関数よりも上の方に  まとめて定義すればいいと思います。マクロ関数にする理由は変数スコープを考えて  関数よりも良いと思っただけです。C++ で『参照』を使えば関数やinline関数でも良い。 ・またマクロ関数にするときに行末に必ず『\』文字を追加します。  このマクロ関数内で変数を宣言して利用することも出来ます。  あとマクロ関数の終わりのブロックで『break』を記述して switch 文の break を  なくしても見やすくなります。私の場合は次のキーワードを定義して利用しています。  #define CASE   break;case  #define DEFAULT break;default  この2行を良く利用するヘッダに記述して include して次のように使っています。  switch ( a ){   CASE  1: case  2: ShoriA();   CASE 100: case 101: ShoriB();    :   CASE 200: case 201: ShoriZ();   DEFAULT: ShoriElse();  } ・switch文の case、default の多くは break を記述する分岐ですから break 付きの  CASE、DEFAULT を記号定数で定義して利用するわけです。ただ今回のような使い方は  CASE、case を2つ記述する事になるため case で統一した方が良いでしょう。 ・break付きのCASE、DEFAULTを使うときは条件式が1つの場合に限ります。  つまり  switch ( a ){   CASE 条件式1: 処理;   CASE 条件式2: 処理;   CASE 条件式3: 処理;    :   CASE 条件式n: 処理;   DEFAULT: 残りの処理;  }  こんな感じの分岐です。 ・以上。

quoth
質問者

お礼

defineにする時は\が必要なのですね。勉強になりました。 今回はcase文が多くなるパターンですので、もう少し見てみようと思います。

  • don_go
  • ベストアンサー率31% (336/1059)
回答No.3

a の値が連番になるのであれば関数ポインタを使えますが? 関数ポインタ http://wisdom.sakura.ne.jp/programming/c/c54.html #include <stdio.h> void kitty(void); void sakura(void); void hina(void); int main() { void (*po[])() = { kitty , sakura , hina }; int i; printf("実行する関数の番号を指定してください 0~2>"); scanf("%d" , &i); if ((i < 0) | (i > 2)) return 0; (*po[i])(); return 0; } void kitty() { printf("Kitty on your lap\n"); } void sakura() { printf("Card Captor SAKURA"); } void hina() { printf("LOVE HINA"); }

quoth
質問者

お礼

関数ポインタというのもあるのですね。 なかなか奥が深いです。 ただ今回は、上記であれば入力値が多くの種類があるので、どちらかといえば、iを用意する必要があるので、量は多くなりそうです。 勉強になりました。 ありがとうございます。

  • lesskey
  • ベストアンサー率33% (66/200)
回答No.2

-- #define A_WO_SURU_JOUKEN \ case 1: case 2: case 3: case 4: case 5: \ case 6: case 7: case 8: -- 上記でquothさんのしたいことは出来るかと・・・ A_WO_SURU_JOUKEN をソースコードに組み込むと case 1~8 で解釈されます。 因みにそんなにケースが大量にあるのならif文で範囲指定をする、 配列を使う・・・など別の方法を考えた方がスマートですね。

quoth
質問者

お礼

やはり大量にある場合は、if文か配列をつかった方が早い気がしてきました。(配列のほうがわかりやすいかな。) ただ、difineを\でつなげないといけないというのは勉強になりました。ありがとうございます。

  • koko_u_
  • ベストアンサー率18% (459/2509)
回答No.1

簡単に思い付くのは case 文を止めて if 文にするとか、 論理和で case (A_CASE | B_CASE | C_CASE): とできるように定数を定義するとか。

quoth
質問者

お礼

やはりif文のほうがよさそうでしょうか。 範囲指定だとロジックの変更になるので、できれば定義を変えるだけでできるようにしたいと思っております。 (どちらも一緒じゃないかと思うのですが、お客様がそういう人なもので。) 回答ありがとうございました。

関連するQ&A

  • switch文caseについて

    switchのcaseについてですが、数字を直接記述せずに、const変数に値を代入して使用出来ますか? 例) const int A = 1; const int B = 2; switch(suuti){ case A: 処理; break; case B: 処理; break; } コンパイルすると、「case 式は、整数型定数でなければなりません。」と出てきてしまうのですが、直接数値を記述しないといけないのでしょうか? よろしくお願いします。

  • C言語のswitch case文で、scanfでキーボードから読み込ん

    C言語のswitch case文で、scanfでキーボードから読み込んだ1~12の値によって画面に季節を、3~5は"春"、6~8は"夏"・・・というふうに表示させるプログラムなのですが、if文を使わずにswitch caseで作るには case 3: case 4: case 5:puts("春"); break; ・ ・ ・ と1個1個記述するしかないのでしょうか? もし比較演算子と論理演算子を使って 3<= && <=5 こんな感じに1行にまとめることができるなら教えてください。

  • C言語のswitch文について間違っているところを教えてください

    初めに初心者ですので間違っているところは説明つきの回答をしていただければありがたいです。 今回switch文を使って 「足し算、引き算、掛け算、割り算」のプログラムを作ったつもりなのですが、intを使うと割り算の小数点が出ないしfioat文を使うとswitch文には、使えないと出るしどのようにしたら良いのか御回答よろしくお願いします。 (今は、int文でプログラムを作っているつもりです。) #include <stdio.h> void main (void) { int a,b,k; printf("どのような計算をしたいか数字を選んでください。\n"); printf(" 1.足し算 (例 a+b)\n"); printf(" 2.引き算 (例 aーb)\n"); printf(" 3.掛け算 (例 a×b)\n"); printf(" 4.割り算 (例 a÷b)\n"); printf("計算したい番号を入力してください "); scanf("%d",&k); switch (k){ case 1: printf("aを入力してください "); scanf("%d",&a); printf("bを入力してください "); scanf("%d",&b); printf("\n答えは a+b で %d です\n",a+b); break; case 2: printf("aを入力してください "); scanf("%d",&a); printf("bを入力してください "); scanf("%d",&b); printf("\n答えは aーb で %d です\n",a-b); break; case 3: printf("aを入力してください "); scanf("%d",&a); printf("bを入力してください "); scanf("%d",&b); printf("\n答えは a×b で %d です\n",a*b); break; case 4: printf("aを入力してください "); scanf("%d",&a); printf("bを入力してください "); scanf("%d",&b); printf("\n答えは a÷b で %d です\n",a/b); break; default: printf("明記してあるどれかの数字を再入力してください"); } }

  • switch文の使い方について

    switch文で比較をさせたいのですが、その場合 switch()の括弧のなかはどうすれば良いのですか? int a,b; switch(){ case(a<b): break case(a>b): break } どなたか知っている方おしえてください。

  • phpのswitch文のcaseで

    phpのswitch文のcaseで switch ( $a ) case "1", "2", "a": のように、カンマで並べる事はできないのでしょうか?

    • ベストアンサー
    • PHP
  • switch文での変数の扱い方について

    以前の質問ではお世話になりました。今回もよろしくお願いいたします。 今日C言語の授業で小数点で平均点を入力して、平均点と5段階評価(A, B, C, D, E)を表示するプログラムの作成を作りました。 その際評価の判定にはswitch文を使い、評価の条件は以下の通りです。 90以上をA 85以上89以下をB--------2 80以上85以下をC--------3 70以上79以下をD それ以外(69以下)をE 最初に先生より上記の条件で「switch文で完成できる」と言われたのがずっと頭に引っかかっていて、なんとかswitch文で作ろうと思いずっと悩んでいましたが、switch文のdefaultをなくして2段階に分かれている部分とEの評価の部分をif文で処理するか、 switch文ですべての点数(case 80: case 81: ... case 84:)を直接switch文で打つかの2つしか思いつきませんでした。 そこで皆さんにお聞きしたいのが、こういう問題の際に評価の処理をswitch文を中心に行いたい場合、みなさんでしたらどのように処理なされていらっしゃいますか? 今後のプログラミングの勉強としてぜひとも知りたいです。 どうかお願いいたします。

  • C言語でヘッダファイルを自作する

    C言語で#defineを用いてヘッダファイルを作成したのですが、 作成したコンパイルするときにヘッダファイルがオープンできません。 参考にしている資料があるのですが、そこに書かれているサンプルプログラムを 丸ごとコピーして作ったプログラムも同様にヘッダファイルがオープンできない というエラーが出るので、ヘッダファイルを定義する方法そのものが間違っていると 思うのですが、どこが間違っているのでしょうか? よろしければ正しい記述方法もお教えください。 #include <stdio.h> #if !defined SAMPLE_H #define SAMPLE_H wa(int a, int b) { return a+b; } #endif #include "sample.h" int main(){ printf("%d\n",wa(40,70)); return 0; } ヘッダファイルの定義の方法は他にもあるとは思いますが、 今回は#defineを用いた方法でお願いします。

  • C言語 switch文について

    C言語初心者です。 以下のようにC言語でプログラムを書いてみたのですが、 一つの入力に対して、対応するcase文に加えてdefault部の内容も表示されてしまいます。 (aを入力すると day before yesterday と day after tomorrowが表示されるような感じです) i,j,k などを使ってどう実行されているかを調べると、どうやら一回の入力に対して二回switch部を回っているようです。 そうにしろなぜaに対してdefaultへ飛ぶのか理解できませんが・・ また、最初の宣言をchar から int にして(caseは、case 1とかに適当に変えて)やると、正常に動くのも不可解です。 どうなっているんでしょうか・・ どなたかご教授願えると幸いです。よろしくお願いいたします。 #include <stdio.h> int main(void) { char n; int i=0,j=0,k=0; k++; while(scanf("%c",&n),n!='E'){ i++; switch(n){ case 'a': puts("day before yesterday"); break; case 'b': puts("yesterday"); break; case 'c': puts("today"); break; case 'd': puts("tomorrow"); break; default: puts("day after tomorrow"); break; j++; } } printf("%d\n",i); printf("%d\n",j); printf("%d\n",k); return 0; }

  • switch文で文字を比較することは出来ませんか?

    switch文で文字を比較することは出来ませんか? 例えば… int main(void){ char buf[5]; buf = 'b'; switch(buf){ case 'a': ・  ・  ・  break; case 'b': ・  ・  ・  break; }

  • 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; }

専門家に質問してみよう