条件式の簡略化

フォーラム(掲示板)ルール
フォーラム(掲示板)ルールはこちら  ※コードを貼り付ける場合は [code][/code] で囲って下さい。詳しくはこちら
ライス
記事: 11
登録日時: 14年前
住所: 鹿児島県

条件式の簡略化

#1

投稿記事 by ライス » 14年前

条件式について質問があります。

a が b にも c にも d にも等しくないという条件式を…
b != a && c != a && d != a
としたのですが、 != a が何度もありなんだかスッキリしないと思いました。
なのでスマートにまとめようと思いいろいろ試してみたのですが、どうしても上手くいきませんでした。

b != a && c != a && d != a
という条件式を、もっとスマートにまとめる方法はないのでしょうか?
ご教授宜しくお願いします。

ちなみに…
! ( b == a || c == a || d == a )
としたいのではなく、 != a または == a というのを1回だけ書いて…
b != a && c != a && d != a
と同じ意味を持つ式にしたいです。
最後に編集したユーザー ライス on 2010年12月30日(木) 18:54 [ 編集 1 回目 ]

アバター
bitter_fox
記事: 607
登録日時: 14年前
住所: 大阪府

Re: 条件式の簡略化

#2

投稿記事 by bitter_fox » 14年前

強引にやるとこんな感じでしょうか・・・

if (b - c + d != a)
{
// anything;
}


多分これでいけるはずですが、可読性には優れてませんね・・・

[hr]もしかしたら、それ用の構文が用意されてるのかも・・・
[hr][修正]
== --> !=
間違ってたので修正。


[hr][修正]
よく考えたら、これじゃダメだったorz、
この投稿は無視してください・・・

ライス
記事: 11
登録日時: 14年前
住所: 鹿児島県

Re: 条件式の簡略化

#3

投稿記事 by ライス » 14年前

bitter_foxさん、ご返信ありがとうございます。
やはり他の方法はないんですかね?
一応正常に動作しないわけではないので、しばらくしても解決策が見つからなかった場合は最初にあげていた方法ですることにします。
もうしばらく解決はたてないので、もし他の方法が分かった方がいましたら教えていただけると嬉しいです。
宜しくお願いしますm(_ _)m

ー補足ー
最初にあげていた方法とは、
b != a && c != a && d != a
または、
! ( b == a || c == a || d == a )
の事です。(私は前者の方が好みですが)
説明不足で申し訳ありませんでしたm(_ _)m
最後に編集したユーザー ライス on 2010年12月30日(木) 18:53 [ 編集 1 回目 ]

アバター
bitter_fox
記事: 607
登録日時: 14年前
住所: 大阪府

Re: 条件式の簡略化

#4

投稿記事 by bitter_fox » 14年前

先ほどは素っ頓狂なことを書いて申し訳ありませんでした・・・

コード:

if ((a ^ b) + (b ^ c) + (c ^ d) != 0)
重複しそうだったり、もっと上手な書き方があるんじゃとも思ってしまいますが、とりあえずは、これで判断できます。。。

[hr]ちなみに、最初に挙げていた方法ってどんな方法ですか??

[hr]あれだと、if (b != a || c != a || d != a)になっちゃうのか・・・orz
最後に編集したユーザー bitter_fox on 2010年12月30日(木) 19:50 [ 編集 1 回目 ]

たいちう
記事: 418
登録日時: 14年前

Re: 条件式の簡略化

#5

投稿記事 by たいちう » 14年前

(1)
b != a && c != a && d != a

(2)
! ( b == a && c == a && d == a )

(3)
! ( b == a || c == a || d == a )

(4)
(b - a) * (c - a) * (d - a) != 0


(3)の書き間違いだと思いますが、(2)は(1)と等価ではないですよ。
何をもってスマートというかは人それぞれです。
おそらく(1)か(3)を選ぶ人が多数派でしょう。

アバター
a5ua
記事: 199
登録日時: 14年前

Re: 条件式の簡略化

#6

投稿記事 by a5ua » 14年前

条件式が3つ程度なら、そのまま書きますね
無理にまとめようとすると、こんな感じかな

コード:

int judge(int a, const int cond[], int n)
{
	int i;
	for (i = 0; i < n; ++i) {
		if (a == cond[i]) {
			return 0;
		}
	}
	return 1;
}

int main(void)
{
	int a = 4;
	int cond[] = {1, 3, 5};
	if (judge(a, cond, 3)) {
		// do something
	}
	return 0;
}
b, c, dに相当する値を配列に格納して、ループを使って判定しています。

ライス
記事: 11
登録日時: 14年前
住所: 鹿児島県

Re: 条件式の簡略化

#7

投稿記事 by ライス » 14年前

bitter_foxさん、たいちうさんご返信ありがとうございます。
てっきり、
b != a && c != a && d != a
を…
b , c , d != a
のように簡単にできる方法があるかと思っていましたが、そのような方法は無いという解釈でよろしいのでしょうか?
(b , c , d != a というのは間違っていると思いますが、このような感じでという事です。)

>>(3)の書き間違いだと思いますが、(2)は(1)と等価ではないですよ。
ご指摘ありがとうございます。
トピック内の ! ( b == a && c == a && d == a ) を、 ! ( b == a || c == a || d == a ) に書き換えさせていただきました。

a5uaさんご返信ありがとうございます。
3つ程度なら私もそのまま書くのですが、それが3つ程度じゃないんですよね^^;(分かりやすいように3つにしていましたが…)
>>b, c, dに相当する値を配列に格納して、ループを使って判定しています。
このような方法もあるのですね。
さっそく試してみます。

ライス
記事: 11
登録日時: 14年前
住所: 鹿児島県

Re: 条件式の簡略化

#8

投稿記事 by ライス » 14年前

皆さんありがとうございました!
おかげで大変勉強になりました。
今回はa5uaさんの方法がやりたいことにあっていたので、そちらの方法でやらさせていただきました。
おかげでソースが300行程短くなりました^^;
本当にありがとうございましたm(_ _)m

閉鎖

“C言語何でも質問掲示板” へ戻る