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で質問しましょう!
似たような質問が見つかりました
- C言語・C++・C# プログラミング 2つの整数を読み込んで、等しければ 「二つの値は同じです」と表示し、そうでなければ, 4 2023/05/15 16:03
- C言語・C++・C# プログラミング 2つの整数を読み込んで、等しければ 「二つの値は同じです」と表示し、そうでなければ, 5 2023/05/17 12:55
- 数学 整数問題7 3文字の整数問題 5 2023/04/09 09:56
- Java Java 南京錠 2 2023/02/04 11:46
- 数学 nは正の整数であり、偶数。 n(n+1)(n+2)(n+3)は素因数が3つ。 nを求めよ。 という問 8 2022/09/26 18:15
- 数学 【圏論】モノイドにおける恒等射について 8 2022/06/09 23:52
- 数学 x-2<x+1/3 という不等式は全ての実数xについて成り立ちますよね? 例えばx=0を代入したとき 3 2022/03/29 23:48
- Excel(エクセル) ExcelのIF関数について 4 2023/05/24 12:54
- IT・エンジニアリング 21歳の大学3年男です。 現在プログラミングを習得できるところに入ろうか悩んでます。 そのスクールは 3 2022/06/21 00:43
- バス・高速バス・夜行バス WILLERでバスの予約を3人分しようとしたのですが、3人とも微妙に値段が違いました。 どうして値段 1 2022/12/18 02:24
このQ&Aを見た人はこんなQ&Aも見ています
関連するカテゴリからQ&Aを探す
おすすめ情報
このQ&Aを見た人がよく見るQ&A
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
10個出力で改行したいのですが...
-
printf で二進表示を行いたい。
-
コマンドプロンプトがすぐ消える
-
C言語で四則演算を使って結果が...
-
CTRL+Dでループを抜けるには
-
switch分のケースを範囲数?に...
-
文字と数字の判定について
-
unsigned int型について
-
C言語で、「自然数nを入力し、n...
-
getcharの連続について
-
入力したお金の金額からお札の...
-
8人分のテストの点数を入力し、...
-
int型 00 を表示するのに0とな...
-
C言語で 選択肢: |?| |?| |?| 1...
-
数当てゲームを作っているのですが
-
【プログラム】2の倍数で表示非...
-
アドレスの比較について
-
C言語プログラミングで「コマン...
-
C言語の数値入力
-
改行について 1行に何個かづ...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
10個出力で改行したいのですが...
-
既約分数の表示プログラム
-
printf で二進表示を行いたい。
-
8人分のテストの点数を入力し、...
-
printf( " %2d", p * q );
-
strcmp
-
CTRL+Dでループを抜けるには
-
4の倍数を論理演算で表す。。
-
%P と %X の違い
-
【C言語教えてください】sin波...
-
c言語でAからZまでを表示する...
-
cshの文字列操作(0埋め)
-
万年カレンダーのC言語プログラ...
-
コマンドラインに出力した文字...
-
scanfに文字が入力されたときに...
-
ホームページをC言語で作りたい...
-
改行について 1行に何個かづ...
-
コンパイルエラーについて
-
台形の面積を求めるプログラム
-
なぜgccはstdio.hをインクルー...
おすすめ情報