質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.35%
C

C言語は、1972年にAT&Tベル研究所の、デニス・リッチーが主体となって作成したプログラミング言語です。 B言語の後継言語として開発されたことからC言語と命名。そのため、表記法などはB言語やALGOLに近いとされています。 Cの拡張版であるC++言語とともに、現在世界中でもっとも普及されているプログラミング言語です。

Q&A

2回答

351閲覧

中央値の求め方を教えていただきたいです。

here_sure

総合スコア0

C

C言語は、1972年にAT&Tベル研究所の、デニス・リッチーが主体となって作成したプログラミング言語です。 B言語の後継言語として開発されたことからC言語と命名。そのため、表記法などはB言語やALGOLに近いとされています。 Cの拡張版であるC++言語とともに、現在世界中でもっとも普及されているプログラミング言語です。

0グッド

0クリップ

投稿2024/12/07 15:18

#include <stdio.h>
int main(void){
// Your code here!
int med, a[] ={-5, -1, 2};

if (a[0] <= a[ ]){ if (a[2] <= a[ ]){ med = a[ ]; }else{ if (a[ ] <= a[2]){ med = a[ ]; }else{ med = a[2]; } } }else{ if (a[2] <= a[ ]){ med = a[ ]; }else{ if (a[ ] <= a[2]){ med = a[ ]; }else{ med = a[2]; } } } printf("%d, %d, %dの中央値は%dです。\n", a[0], a[1], a[2], med); return 0;

}

基礎的な質問ですみません。
C言語で上記の9箇所の空白に適切な数値を入れて中央値を出力するのですが、どの数値が適切か分からず困っています。
回答と説明をいただけたらと思います。
よろしくお願いします。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

TakaiY

2024/12/08 05:52

> どの数値が適切か分からず わからないのはどういうところでしょうか? 中央値はどのような値か別りますか? たとえば{-5, -1, 2} の中央値は何でそれはどうしてだかわかりますか? これがわかれば、任意の3つの数値の中央値を求める手順を考えればわかると思うのですが。
meg_

2024/12/08 09:08

> C言語で上記の9箇所の空白に適切な数値を入れて中央値を出力するのですが、どの数値が適切か分からず困っています。 問題の引用元を明記された方が良いかと思います。書籍名などを質問に追記しましょう。
guest

回答2

0

要素が3個しかない(:各空白に入る候補は2つしかない)話なので,あまり深く考えずに力業で解けばよいのでは.

例えば最初の空白に着目すれば,ここに入る候補は 12 しかない.
そしたら 「よくわかんねぇけど,とりあえず 1 の側を入れてみたらどうなるのか見てやるぜ!」 っていう感じで.
その場合,こうなる↓

C

1if( a[0] <= a[1] ) //←とりあえず1を入れてみた 2{ 3 if( a[2] <= a[ ] ){ //←そしたら次はここを見てみる 4 med = a[ ]; 5 } 6 else 7 { /*略*/ } 8} 9else 10{ /*略*/ }

次の if を見てみると,a[2]a[?] 以下であれば答えが確定するという話になっている.
ここでの ? も候補は 01 の2つしか無いのだから,両方について考えてみればいい.

  • 0 を入れた場合:
    2つの if の条件を組み合わせると a[2] <= a[0] <= a[1] という話になる. この場合,答えは a[0] だと言えることになるので,辻褄は合ってる.
  • 1 を入れた場合:
    a[1] が最大の値だ」ということはわかるが, a[0]a[2] の間の大小関係は不明だから,これだと答えを言えない.

…ということは,この流れにおいては,ここに 1 は入れられないから 0 を入れるしかない:

C

1if( a[0] <= a[1] ) //←1を入れてみた 2{ 3 if( a[2] <= a[0] ){ //←0を入れることになった 4 med = a[0]; //←この場合,ここは0ってことになるね 5 } 6 else //次はこの else のところを見てみる 7 { 8 if( a[ ] <= a[2] ) 9 { med = a[ ]; } 10 else 11 { med = a[2]; } 12 } 13} 14else 15{ /*略*/ }

if のところの空白を埋めた結果として, else の側に来る場合というのは,(先の2の if の条件より)「 a[0] が最小の値である場合」ということになっている.
この場合,あとは a[1]a[2] との間の大小関係さえわかれば答えを確定できるよね.
そしたらもう,この else のブロック内にある if の条件である a[?] <= a[2] のところの ?1 にするしかないよね:

C

1if( a[0] <= a[1] ) //←1を入れてみた 2{ 3 if( a[2] <= a[0] ){ //←0を入れることになった 4 med = a[0]; //←この場合,ここは0ってことになる 5 } 6 else //次はこの else のところを見てみる 7 { 8 if( a[1] <= a[2] ) //←この流れではここは 1 しかないっしょ 9 { med = a[1]; } //←そしたらここは 1 になるし 10 else 11 { med = a[2]; } //←ここは 2 になるね. 12 } 13} 14else //以降,同様にこっち側もやってみればいい 15{ /*略*/ }

……と,ここまではとりあえず話の辻褄が合う形に穴を埋められている.

あとは残りも同様にやってみて,話の辻褄が合うパターンが見つかれば完了だし,そういうパターンが存在しないことがわかったならば,それはすなわち「一番最初の空白に 1 を入れることが間違いである」ということだから,最初の空白に入れるべき値は 2 に確定することができる(→以降はまた同様にやっていけばいい).


[追記]
もちろん,最初に値を仮定してみる場所というのはどこでもいい.

例えば,
「答えが { a[0], a[1], a[2] } のどれなのかを判断するぜ!」という話をやっているのだから,
ある処理の流れの中では

  • med = a[0];
  • med = a[1];
  • med = a[2];

という3つの結論に処理が分岐するハズだよね.
ということは, med = a[ ]; という形の空欄の部分について考えてみれば

C

1if (a[0] <= a[ ]){ 2 if (a[2] <= a[ ]){ 3 med = a[ 0 ]; //←ここを 0 とするならば, 4 }else{ 5 if (a[ ] <= a[2]){ 6 med = a[ 1 ]; //←こっちを 1 とするということになるよね 7 }else{ 8 med = a[2]; //(←これは元からある) 9 } 10 } 11} 12else 13{ /*略*/ }

という形か,あるいは

C

1if (a[0] <= a[ ]){ 2 if (a[2] <= a[ ]){ 3 med = a[ 1 ]; //←ここを 1 とするならば, 4 }else{ 5 if (a[ ] <= a[2]){ 6 med = a[ 0 ]; //←こっちを 0 とするということになるよね 7 }else{ 8 med = a[2]; //(←これは元からある) 9 } 10 } 11} 12else 13{ /*略*/ }

という形のいずれかだということになる.
(→で,とりあえずどっちかに仮定してみたら条件のところの穴をまともに埋められるのか否か? というのを見ていけば良い,と.)

投稿2024/12/09 02:17

編集2024/12/09 02:44
fana

総合スコア11996

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

Windows 11、Visual Studio 2022で確認しました。
解説は、ソースの通りです。逆に、ここが理解できないという点をコメントしてください。

#include <stdio.h> int main(void){ // Your code here! int med, a[] = {-5, -1, 2}; if (a[0] <= a[1]){ if (a[2] <= a[0]){ med = a[0]; }else{ if (a[1] <= a[2]){ med = a[1]; }else{ med = a[2]; } } }else{ if (a[2] <= a[1]){ med = a[1]; }else{ if (a[0] <= a[2]){ med = a[0]; }else{ med = a[2]; } } } printf("%d, %d, %dの中央値は%dです。\n", a[0], a[1], a[2], med); return 0; }

投稿2024/12/07 15:44

hiroki-o

総合スコア1117

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.35%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問