プロが教えるわが家の防犯対策術!

3つの整数値を読み込んでそれらの値が全て等しかったら「3つ等しい」どれか2つ同じなら「2つだけ等しい」で全て違ってたら「3つ異なる」ようなプログラミングをつくりたいんですけどどうにもつくれません。よければ教えてください。

A 回答 (12件中1~10件)

初の回答投稿です(汗


こんな感じではいかがですか??

#include <stdio.h>

void main( void )
{
int a[3];

for ( int i=0; i<3; i++ ){
printf("%d番目入力:", i+1);
scanf("%d", &a[i]);
}

if( a[0] == a[1] && a[0] == a[2] && a[1] == a[2] ){
printf("3つ等しい\n");

} else if ( a[0] == a[1] || a[0] == a[2] || a[1] == a[2] ){
printf("2つ等だけしい\n");

} else {
printf("全部違う\n");
}

}

かなり強引ですが・・・
    • good
    • 1

#8です。



#9~#11さん、いろいろ調べていただいてありがとうございます。
一応ちゃんとK&R本で確認してから書いたんですけどね、ANSI準拠の第2版でしたので。。。たしかに、ANSI-C策定前がどうだったかまでは確認してませんでした。
とはいえ、もともと比較演算が真の場合の値は1と決まっていたっぽいですけど、、、規格に厳密にしたがってないコンパイラがあっても当たり前ですからね。用心するに越したことはないですね。

、、、脱線して、質問者さまにはちょっと難しい話になってしまいましたね。お分かりにならなければひとまず読み流してくださいませ。
    • good
    • 0

ANo.9さらに補足です。



aとbが等しいときa==bの値は「ANSI-C」ではintの1が返りますね。規格書はそうなってました。
昔、-1を返すようなコードをはくコンパイラがいたような記憶があって。。。今でも用心してしまいます。
    • good
    • 0

ANo.9補足です。



メッセージ表示ではなかったんですね。
void (*func[4])(void) = {func1,func2,NULL,func3};
と関数ポインタの配列を使って、
func[((a==b)?1:0)+((b==c)?1:0)+((c==a)?1:0)]();
としましょう。
    • good
    • 0

ANo.8さんの回答ですが、aとbが等しいときa==bが1を返すかどうかは処理系依存だと思います。

確実にするには、
((a==b)?1:0)+((b==c)?1:0)+((c==a)?1:0)
のように書いた方がいいでしょう。
さらに、
char *mes[4]={"3つ異なる","2つだけ等しい","","3つ等しい"};
としておいて、
printf("%s\n",mes[
((a==b)?1:0)+((b==c)?1:0)+((c==a)?1:0)]);
という手もあります。
    • good
    • 0

少し変わった方法を紹介します。



3つの値が入っているのがそれぞれ a,b,c とした場合

switch ( ( a == b ) + ( b == c ) + ( c == a ) ) {
 case 3:
  /* 3つとも等しい */
  break ;
 case 1:
  /* 2つが等しい */
  break ;
 case 0:
  /* すべて異なる */
  break ;
 default:
  /* ありえない */
  break ;
}

なぜこれでよいのか考えてみると、勉強になると思います。

他にもいろいろな方法があると思いますが、、、3つしかないのにわざわざソートまでしてやるのは非常に無駄だと思います。
    • good
    • 0

mk7193hsさん、ご指摘ありがとうございます。



私もそこがなんとなく曖昧だったんです。
やっぱり普通に&&演算子を使えば良かったですね。

よく考えれば、
(a == b && b == c)
で全部等しいですね。

何を勘違いしたのか、
(a == b && b == c && c == a)
と言う長いのを考えてしまって、
長すぎて嫌だな~。
こうしたら短くならないかな~?

なんて都合の良いこと考えてしまいました。
ごめんなさい。
    • good
    • 0

mk7193hsです。



my_namae_ue様へ
ソートが出来る技術をお持ちの方なら、このような質問はこないと思います。

ac-sakura様へ
if(a == b == c)では、3つが等しいことにはなりません。
    • good
    • 0

補足要求です。



> つくりたいんですけどどうにもつくれません。

"つくれない"というのは、どのような状況ですか?

(a) 3つの数字が与えられたとき、それらが、「3つ等しい」のか、「2つだけ等しい」のか、「3つ異なる」のかを判定する方法が分からない。(プログラミングではなく、あくまで判定する手順という意味においてです。)

(b) 判定する方法は分かるのだが、それをどのようにc言語のコードにするのか分からない。

どちらのレベルで分からないかによって、回答の内容も変わります。
    • good
    • 0

3つの整数をa,b,cとすると



if(a == b && b == c)
{
/* 3つ等しい処理 */
}
else
if(a == b || b == c || c == a)
{
/* 2つ等しい処理 */
}
else
{
/* 3つ異なる処理 */
}
    • good
    • 0

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!