No.5ベストアンサー
- 回答日時:
初の回答投稿です(汗
こんな感じではいかがですか??
#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");
}
}
かなり強引ですが・・・
No.12
- 回答日時:
#8です。
#9~#11さん、いろいろ調べていただいてありがとうございます。
一応ちゃんとK&R本で確認してから書いたんですけどね、ANSI準拠の第2版でしたので。。。たしかに、ANSI-C策定前がどうだったかまでは確認してませんでした。
とはいえ、もともと比較演算が真の場合の値は1と決まっていたっぽいですけど、、、規格に厳密にしたがってないコンパイラがあっても当たり前ですからね。用心するに越したことはないですね。
、、、脱線して、質問者さまにはちょっと難しい話になってしまいましたね。お分かりにならなければひとまず読み流してくださいませ。
No.11
- 回答日時:
ANo.9さらに補足です。
aとbが等しいときa==bの値は「ANSI-C」ではintの1が返りますね。規格書はそうなってました。
昔、-1を返すようなコードをはくコンパイラがいたような記憶があって。。。今でも用心してしまいます。
No.10
- 回答日時:
ANo.9補足です。
メッセージ表示ではなかったんですね。
void (*func[4])(void) = {func1,func2,NULL,func3};
と関数ポインタの配列を使って、
func[((a==b)?1:0)+((b==c)?1:0)+((c==a)?1:0)]();
としましょう。
No.9
- 回答日時:
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)]);
という手もあります。
No.8
- 回答日時:
少し変わった方法を紹介します。
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つしかないのにわざわざソートまでしてやるのは非常に無駄だと思います。
No.7
- 回答日時:
mk7193hsさん、ご指摘ありがとうございます。
私もそこがなんとなく曖昧だったんです。
やっぱり普通に&&演算子を使えば良かったですね。
よく考えれば、
(a == b && b == c)
で全部等しいですね。
何を勘違いしたのか、
(a == b && b == c && c == a)
と言う長いのを考えてしまって、
長すぎて嫌だな~。
こうしたら短くならないかな~?
なんて都合の良いこと考えてしまいました。
ごめんなさい。
No.6
- 回答日時:
mk7193hsです。
my_namae_ue様へ
ソートが出来る技術をお持ちの方なら、このような質問はこないと思います。
ac-sakura様へ
if(a == b == c)では、3つが等しいことにはなりません。
No.4
- 回答日時:
補足要求です。
> つくりたいんですけどどうにもつくれません。
"つくれない"というのは、どのような状況ですか?
(a) 3つの数字が与えられたとき、それらが、「3つ等しい」のか、「2つだけ等しい」のか、「3つ異なる」のかを判定する方法が分からない。(プログラミングではなく、あくまで判定する手順という意味においてです。)
(b) 判定する方法は分かるのだが、それをどのようにc言語のコードにするのか分からない。
どちらのレベルで分からないかによって、回答の内容も変わります。
No.3
- 回答日時:
3つの整数をa,b,cとすると
if(a == b && b == c)
{
/* 3つ等しい処理 */
}
else
if(a == b || b == c || c == a)
{
/* 2つ等しい処理 */
}
else
{
/* 3つ異なる処理 */
}
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
配列プログラムのバグ
-
C言語でマウス入力(クリックや...
-
C言語について。 同じ年内で経...
-
構造体メンバの個数
-
C言語で五目並べを作成している...
-
プログラムの修正お願いします。
-
c言語 成績表示のプログラムで...
-
プログラミング言語C
-
コンパイルエラーについて
-
2の累乗を計算するプログラム...
-
scanfに文字が入力されたときに...
-
BMI値から体型を判定するプログ...
-
WM_CLOSEで閉じれないウィンド...
-
10個出力で改行したいのですが...
-
srand(time(NULL))の使い方
-
C言語プログラム
-
C言語のじゃんけんゲームのプロ...
-
C言語で、「自然数nを入力し、n...
-
error C2143: 構文エラー : ';'...
-
中学生で数学です。 √84nが自然...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
10個出力で改行したいのですが...
-
printf で二進表示を行いたい。
-
コンパイルエラーについて
-
CTRL+Dでループを抜けるには
-
【C言語教えてください】sin波...
-
三角形の判別
-
4の倍数を論理演算で表す。。
-
strcmp
-
%P と %X の違い
-
入力したお金の金額からお札の...
-
LU分解法のピボット選択機能実...
-
コマンドラインに出力した文字...
-
LU分解法のピボッティングにつ...
-
テキストカーソル位置の取得
-
c言語でAからZまでを表示する...
-
C言語での、年複利の計算方法...
-
C言語 プログラミング
-
改行について 1行に何個かづ...
-
printfの出力内の文字をdefine...
-
C言語です このプログラミング...
おすすめ情報