- - PR -
論理演算子・・・
1
投稿者 | 投稿内容 | ||||
---|---|---|---|---|---|
|
投稿日時: 2005-02-09 17:37
A・B・Cの3つの式があるとします。
以下の@orAで <<OK>> にきたときだけtrueを返すように 論理演算子を使って一文であらわしたいのですが、 自分ではどうにもこうにも思いつきません。 どなたか分かる方がいらっしゃったら教えてください。 尚、@とAは同じことを書き換えただけですので、 どちらか片方だけ分かれば大丈夫です。 @ if(A==false){ if(B==true){ if(C==true){ <<NG>> } else{ <<OK>> } } else{ <<OK>> } } else{ <<NG>> } A if(A==false){ if(C==true){ if(B==false){ <<OK>> } else{ <<NG>> } } else{ <<OK>> } } else{ <<NG>> } ちなみに、なぜこんな面倒なことをしたいのかというと・・・ while文の条件式にしたかったからです。 別に@やAのようなメゾッドをつくり、boolean値の戻り値を返す ようにし、それをwhile文の条件式として呼び出せばよいだけの話なのですが、 出来ればwhile文の条件式の中に直接書きたかったのです。 | ||||
|
投稿日時: 2005-02-09 17:48
while ( (!A && B && !C) || (!A && !B) ) { .... } では? | ||||
|
投稿日時: 2005-02-09 17:54
他にも
while( !( A || (!A && B && C) ) ) { ... } ともできます。 | ||||
|
投稿日時: 2005-02-09 17:57
while( !A && (!B || !C))
{ } は? 間違えたのでさらに修正・・ [ メッセージ編集済み 編集者: らぶま 編集日時 2005-02-09 18:05 ] ブール代数を使うとこんな感じです。 &&→乗算, ||→加算に置き換えて表現。 @(!AB!C + !A!B) A(!A!BC + !A!C) @ || Aとすれば、 (!AB!C + !A!B)+(!A!BC + !A!C) =!A!B(1+C) + !A!C(1+B) =!A!B+!A!C =!A(!B + !C) [ メッセージ編集済み 編集者: らぶま 編集日時 2005-02-09 18:20 ] | ||||
|
投稿日時: 2005-02-09 18:00
あまりマジメに検証していませんが...
while ( ( !A && !C ) || ( !A && !B ) ) { : } こんな表にしてみるといいです。 (if文から起こしました、間違っていたらごめんなさい) A B C result ------------------------------- true true true NG true true false NG true false true NG true false false NG false true true NG false true false OK false false true OK false false false OK ------------------------------- 表を整理するとこうなるかな? A B C result ------------------------------- true ? ? NG false true true NG false true false OK false false ? OK ------------------------------- これもいけるかな? while ( !( A || ( B && C ) ) ) { : } [ メッセージ編集済み 編集者: ピゴナダ 編集日時 2005-02-09 18:19 ] | ||||
|
投稿日時: 2005-02-09 21:14
そうしたくない、と言うことなのでそれはそれでいいと思いますが、 適切な名前を持つメソッドに切り出すのがベストだと思います。 複雑な演算子で条件を記述しても、後々何の為に何を判断したいのか わかりにくくなりがちですから。。。 | ||||
|
投稿日時: 2005-02-10 02:23
なにはともあれロジックが複雑なときは JUnit などでテストプログラムを書いておくことです。
テストケースが十分用意されているならば頭が混乱してもひたすらテストが通るように演算子を書き換えていけば良いです ![]() インプットと、期待するアウトプットが明らかになっていれば他の人がコードを触るときも、自分が忘れた頃にいじるのも楽ですし。 | ||||
|
投稿日時: 2005-02-10 08:40
みなさん考えてくださってありがとうございます。
ピゴナダさんの表を使った考え方、とても分かりやすかったです。 自分でも書き、だいぶ考えてみたのですが・・・ どんな論理式を立てても、1ヵ月後ぐらいに自分再びこのコードを読んでも コメントでも書いておかない限り分からないよな〜 という結論に達しました。。 色々な式を出していただいたのにスミマセン。 結局、YOU@ITさんのおっしゃるように、 一部を外のメゾッドに切り出すことにします。 JUnit、初めて聞いた名前です。 何やら便利そうなツールですね! どうもありがとうございました〜 |
1