No.5ベストアンサー
- 回答日時:
こんな感じで。
さっき書いたのは、分岐個数が抜けてました。どれにも一致しなかったらデフォルト値が返ると言うことで。
x = switchcase(式0, 分岐個数, 定数1, 式1, 定数2, 式2, 定数3, 式3, デフォルト値);
#include <stdio.h>
#include <stdarg.h>
int switchcase(int expr, int count, ...){
va_list args;
int i;
int c, v;
va_start(args, count);
for(i=0; i<count; i++){
c = va_arg(args, int);
v = va_arg(args, int);
if(expr==c){
return v;
}
}
return va_arg(args, int);
}
main(){
printf("Enter 0-9:");
printf("%d\n",
switchcase(getchar(),
10,
'0',0,
'1',1,
'2',2,
'3',3,
'4',4,
'5',5,
'6',6,
'7',7,
'8',8,
'9',9,
-1));
}
No.11
- 回答日時:
そもそも switch だって「あらかじめ分岐の個数がわかっている場合」なんだけどなぁと思いつつついでに.
「分岐がわからない場合」というのが「どれだけあるのかプログラムを書いている時点ではわからない場合」というのであれば配列を使うのが自然かな. もちろん線形リストとか B木とかをがんばって作っても構わんけど.
No.10
- 回答日時:
1つ名称について提案したい.
結果的に「ある式の値を評価しそれが x1 なら y1 を, x2 なら y2 を, (以下同様) を返す」ということになるのであれば
selectvalue
のような名前の方が体を表していると思う. 少なくとも switch文のような汎用的な動作は不可能なのだから, 「switch文を思い起こさせるような名前」は避けるべきではないだろうか.
なお, #5 の関数は規格上未定義動作になります (va_start を使った場合, その同じ関数内で va_end を使う必要がある). そのことを合わせると
int selectvalue(int expr, int count, int defaultvalue, ...);
というプロトタイプの方が安全かもしれません (count は unsigned int なり size_t なりにすべきなのかもしれんがとりあえず無視).
No.9
- 回答日時:
>>C言語にあるSwitch case文を、Switch Case を使わずに、SwitchCase関数を作りたいのですが
どうして、このようなことを思いつかれたのでしょうか?
No.7の方が言われているように、No.7のケースではSwitchCase関数は実装できません。
従って、汎用的なSwitchCase関数は作れません。というのが、私の回答になりますが、
どうして、このようなSwitchCase関数を作りたくなったのかということに、非常に興味があります。
差し支えなければ、その理由を教えていただけませんでしょうか。
No.8
- 回答日時:
>このswitchcaseを、サブルーチンのようにして使いたかったのです。
Cにはサブルーチンがないので、関数が他の言語でのサブルーチンの働きをします。
Cの基本文法は一通りご存じかと思っていましたが、そうではないのでしょうか?
>ご指示してくださった書き方だと、あらかじめ分岐の個数がわかっている場合になりますよね。
呼び出す時点では、分岐の個数は分かっていますよね?
個数がわからないと引数を書けないですが。
あるいは、Cをあまりご存じないということで、可変個引数の関数という物をご存じないですか?
printfのように引数の数を何個ででも自由に呼び出せる関数です。
可変個引数の関数でも、個数を示す引数は可変個引数部分の前に必要です。
No.6
- 回答日時:
プロトタイプ宣言は、関数定義のあたまの部分を書けばいいです。
C言語の基本ですが、ご存じないでしょうか。
この場合は、
int switchcase(int expr, int count, ...);
です。
No.4
- 回答日時:
補足の、「分岐の条件式」と「各分岐での演算の結果」というのが意味不明です。
switch(式0){
case 定数1:
x = 式1;
break;
case 定数2:
x = 式2;
break;
case 定数3:
x = 式3;
break;
}
を、
x = switchcase(式0, 定数1, 式1, 定数2, 式2, 定数3, 式3);
と書きたいと言うことだとすると、似たものは出来ると思いますが、すべての式は関数呼び出し時に評価されることが大きな違いです。
No.3
- 回答日時:
C言語をはじめとする殆どの言語は静的コンパイル言語ですから、この場合caseの個数は静的。
これをcaseを使わずにということですから、if に続いて else if をどんどんつなげればよいだけでは?そういう意味ではなくてですか?
分岐の個数を渡すのであれば、その時点でSwitch文とは異なる機能を求めていることになります。
で、分岐の個数を渡すだけでなくcaseの値に相当する物も配列で渡す必要があるでしょう。場合によっては以上、以下、未満、より大きい、の条件も。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- TOEFL・TOEIC・英語検定 This has not yet been proven to be the case for an 2 2022/06/20 13:56
- C言語・C++・C# C++のcinの動作 5 2023/02/26 00:13
- JavaScript switch文のswitch(n)の部分を複数の値にするか、if文に変えてほしいです。 1 2022/07/27 17:18
- JavaScript jsで、switch文で書かれた分をif文にできませんか。 1 2022/07/28 15:10
- Visual Basic(VBA) いつもお世話になります 下記のコード実行すると エラーになります わかるかた教えてくれませんでしょう 6 2022/12/17 15:01
- C言語・C++・C# C++のcase文の書き方 4 2023/02/24 20:50
- Visual Basic(VBA) ワークシートチェンジで曜日を表示する方法 1 2023/03/04 21:51
- UNIX・Linux bash環境でのエラー対応をお願い致します。 1 2022/11/26 17:41
- Visual Basic(VBA) Excelのマクロについて教えてください。 3 2022/06/30 09:36
- その他(プログラミング・Web制作) Rでのスクリプトのご相談 3 2022/12/08 16:22
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
C言語での引数の省略方法
-
【C++】関数ポインタの使い方
-
「指定されたキャストは有効で...
-
卒業研究でよく分からないとこ...
-
複数桁10進数の*桁目だけを抽出...
-
c言語
-
#define _CRT_SECURE_NO_WARNIN...
-
if と配列の組み合わせ
-
C言語 エラーの原因がわからな...
-
int型の変数値をバイト列として...
-
std::set<int> で、ある値が何...
-
return 1L
-
C++ でカンマ "," で区切られた...
-
CでBAモデルを作りたいのですが
-
構造体の勉強中です 合計点の高...
-
VS2010C#からのDLL使用について
-
式は定数値が必要です」という...
-
因数分解を行うプログラムについて
-
ラップ関数とはどんなものですか?
-
「{ } で囲むだけ」は正しい?
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
C言語での引数の省略方法
-
「指定されたキャストは有効で...
-
複数桁10進数の*桁目だけを抽出...
-
ラップ関数とはどんなものですか?
-
【C++】関数ポインタの使い方
-
#define _CRT_SECURE_NO_WARNIN...
-
C言語 エラーの原因がわからな...
-
実数の整数部,小数部の取得
-
system関数がうまくいかない
-
(int *)の意味
-
acceptをalarmでタイムアウトさ...
-
if と配列の組み合わせ
-
C言語初心者です、、、お助けく...
-
std::set<int> で、ある値が何...
-
PowerShellがうまくいかない
-
read関数をノンブロッキングで...
-
ColorをRGBで指定する方法
-
(マルチスレッド)_beginthrea...
-
数字列を3桁ごとにカンマで区切...
-
C言語で分からないところがあり...
おすすめ情報
情報不足すいませんでした。
理想を言えば、オリジナルのSwitch Case文と同じなのが理想ですが、引数は、分岐の個数と分岐の条件式。返り値は、各分岐での演算の結果。でどうでしょうか?分岐の条件式は、分岐の個数に応じて設定します。
また不備があれば、ご指摘願います。
よろしくお願いいたします
回答くださりありがとうございます。
同等ではなくてもいいので、似たものでということです。
よろしくお願いいたします
情報不足すいませんでした。
引数は、分岐の個数と分岐の条件式。返り値は、各分岐での演算の結果。でどうでしょうか?分岐の条件式は、分岐の個数に応じて設定します。
また不備があれば、ご指摘願います。
よろしくお願いいたします
Caseは、使わないのではなく、引数がいるのでつけたもので、caseを実装可能でしたらお願いします。
回答くださりありがとうございます。
x = switchcase(式0, 定数1, 式1, 定数2, 式2, 定数3, 式3);
⇒この形にこだわっているわけではありません。ただ、オリジナルと同機能のものが不可能とのコメントをいただいたので、そういう表現をしました。この形でもいいので、実装できれば、どのようにすればいいのかご教授願います。
回答くださりありがとうございます。
ソースコード助かります。本当にありがとうございます。
1つだけ質問させてください。
プロトタイプ宣言は、この場合どう書けばいいでしょうか?
x = switchcase(式0, 分岐個数, 定数1, 式1, 定数2, 式2, 定数3, 式3, デフォルト値);
と書けばいいでしょうか?お願いいたします。
No5.の回答の補足に抜けていました。一般化したい場合の、プロトタイプ宣言です。つまり、分岐個数がn個の場合をお願いいたします。すると、定数n・式n・・・ということになります。
よろしくお願いいたします。
誤解を招く書き方をしてしまい申し訳ありません。
このswitchcaseを、サブルーチンのようにして使いたかったのです。ご指示してくださった書き方だと、あらかじめ分岐の個数がわかっている場合になりますよね。分岐がわからない場合でも対応できるといいなと思っていました。私の最初の書き方がわかっていなかったので、申し訳ありません。こういう場合はどうなるのか(話が変わってしまっているように思います。すいません)、たびたびすいませんがご教授願います。
回答くださりありがとうございます。
実は、switch caseがない言語で開発しています。すると必然的に、if else の連発になります。コードが長くなり、非常にわかりにくく、かつ重いのです。そこで、switchcaseを作ろうと思いました。
本当はマイナーな言語を出して質問したかったですが、社外秘のところもあるのでかけませんでした。そこである程度知っているC言語の場合、として質問をしました。これが理由です。