- PR -

論理演算子・・・

1
投稿者投稿内容
さるば
会議室デビュー日: 2005/02/03
投稿数: 16
投稿日時: 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文の条件式の中に直接書きたかったのです。
H2
ぬし
会議室デビュー日: 2001/09/06
投稿数: 586
お住まい・勤務地: 港
投稿日時: 2005-02-09 17:48

while ( (!A && B && !C) || (!A && !B) ) {
  ....
}

では?
H2
ぬし
会議室デビュー日: 2001/09/06
投稿数: 586
お住まい・勤務地: 港
投稿日時: 2005-02-09 17:54
他にも
while( !( A || (!A && B && C) ) ) {
  ...
}
ともできます。
らぶま
常連さん
会議室デビュー日: 2004/10/21
投稿数: 32
投稿日時: 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 ]
ピゴナダ
会議室デビュー日: 2004/08/19
投稿数: 12
お住まい・勤務地: 東京都
投稿日時: 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 ]
YOU@IT
ぬし
会議室デビュー日: 2002/03/29
投稿数: 284
お住まい・勤務地: 大阪
投稿日時: 2005-02-09 21:14
引用:

さるばさんの書き込み (2005-02-09 17:37) より:
別に@やAのようなメゾッドをつくり、boolean値の戻り値を返す
ようにし、それをwhile文の条件式として呼び出せばよいだけの話なのですが、
出来ればwhile文の条件式の中に直接書きたかったのです。


そうしたくない、と言うことなのでそれはそれでいいと思いますが、
適切な名前を持つメソッドに切り出すのがベストだと思います。

複雑な演算子で条件を記述しても、後々何の為に何を判断したいのか
わかりにくくなりがちですから。。。
山本 裕介
ぬし
会議室デビュー日: 2003/05/22
投稿数: 2415
お住まい・勤務地: 恵比寿
投稿日時: 2005-02-10 02:23
なにはともあれロジックが複雑なときは JUnit などでテストプログラムを書いておくことです。
テストケースが十分用意されているならば頭が混乱してもひたすらテストが通るように演算子を書き換えていけば良いです
インプットと、期待するアウトプットが明らかになっていれば他の人がコードを触るときも、自分が忘れた頃にいじるのも楽ですし。
さるば
会議室デビュー日: 2005/02/03
投稿数: 16
投稿日時: 2005-02-10 08:40
みなさん考えてくださってありがとうございます。
ピゴナダさんの表を使った考え方、とても分かりやすかったです。
自分でも書き、だいぶ考えてみたのですが・・・

どんな論理式を立てても、1ヵ月後ぐらいに自分再びこのコードを読んでも
コメントでも書いておかない限り分からないよな〜
という結論に達しました。。
色々な式を出していただいたのにスミマセン。

結局、YOU@ITさんのおっしゃるように、
一部を外のメゾッドに切り出すことにします。

JUnit、初めて聞いた名前です。
何やら便利そうなツールですね!

どうもありがとうございました〜


1

スキルアップ/キャリアアップ(JOB@IT)