3番目に大きい数

フォーラム(掲示板)ルール
フォーラム(掲示板)ルールはこちら  ※コードを貼り付ける場合は [code][/code] で囲って下さい。詳しくはこちら
しょしん

3番目に大きい数

#1

投稿記事 by しょしん » 14年前

いくつか(3以上)の数字データを入力し、最大の数を大きい順に3つ出力するプログラムをかこうと思いましたが、うまくいきません。
if文で最大の数を求めるプログラムはわかるのですが、2番目、3番目になるとわかりません。
考え方がよくないのでしょうか。改善点教えていただきたいです。
#include<stdio.h>

int main(void)
{
int a;
int count;
int total;
int a1,a2,a3;
count=0;
total=0;
while(scanf("%d",&a)==1)
{
if(count==0){
a1=a2=a3=a;
}else if(a1<a){
a1=a;
}else if(a2<a<a1){
a2=a;
}else if(a3<a<a2){
a3=a;
}
total+=a;
count++;
}
printf(" a1=%3d a2=%3d a3=%3d",a1,a2,a3);
return 0;
}

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

Re: 3番目に大きい数

#2

投稿記事 by bitter_fox » 14年前

初めに、コードタグを使用してください。インデントが反映され、シンタックスハイライトされるのでソースコードが読みやすくなります。
また、正しくインデントしてください。
しょしん さんが書きました: if文で最大の数を求めるプログラムはわかるのですが、2番目、3番目になるとわかりません。
考え方がよくないのでしょうか。改善点教えていただきたいです。
考え方はものすごくいいところまで行っています。
しょしん さんが書きました:

コード:

   int a1,a2,a3;

      if(count==0){
          a1=a2=a3=a;
      }else if(a1<a){
	a1=a;
      }else if(a2<a<a1){
          a2=a;
      }else if(a3<a<a2){
          a3=a;
}
まず、if文内でa2 < a < a1と書いても数学で言うa2 < a < a1の意味にはなりません。
数学で言うa2 < a < a1の意味にするにはa2 < a && a < a1と表記します。
http://www.bk.tsukuba.ac.jp/~makimura/J ... 0000000000 (複雑な条件式)
http://www.geocities.jp/ky_webid/c/012.html
オフトピック
else if (a2 < a && a < a1)が評価されているということは、一つ前のif文(a1 < a)が偽の時でありa <= a1を満たすので単にa2 < aだけで良かったりもします。
次に、a3を更新するときは良いですがa1, a2を更新するときはひと手間かける必要があります。
a1を更新するときは、a2をa3に、a1をa2に、
a2を更新するときは、a2をa3に、ずらしていかないとうまく大きい順になりません。

最後に、このアルゴリズムはaがa1, a2, a3の初期値以上でないとうまく動きません。
つまり、a1, a2, a3の初期値を最初の入力とすると最初の入力より小さい入力があると正常に動作しません。
なので、a1, a2, a3をint型の最小値にする必要があります。(入力される値の範囲が定まっているのであればそれの最小値でも良いですが・・・)
int型の最小値はlimits.hに定義されているINT_MINを利用してください。
http://simd.jugem.jp/?eid=21

しょしん

Re: 3番目に大きい数

#3

投稿記事 by しょしん » 14年前

丁寧な解答ありがとうございます。
コードタグ、以後気を付けます。

a1を更新するときは、a2をa3に、a1をa2に、
a2を更新するときは、a2をa3に、ずらしていく

という作業がよく理解できませんでした。
「a1を更新する」とは、

if(a1<a)

のときのことでしょうか。

コード:

      if(a1<a){
          a2=a3,a1=a2;
      }else if(a2<a){
          a2=a3;
      }else if((a3<a)&&(a<a2)){
          a3=a;
}      
おそらく私の解釈の仕方が違うのだと思いますが
詳しくお願いします。

non
記事: 1097
登録日時: 15年前

Re: 3番目に大きい数

#4

投稿記事 by non » 14年前

考え方は良いですが代入の順番がおかしい。
a1>a2>a3の順番にしたいとき
2行目の
a2=a3,a1=a2;
では、a3をa2に入れた後、a2をa1に入れますから、3つともa3になっちゃいます。
a2をa3に入れて、a1をa2に入れて、aをa1に入れましょう。
同様に他の場合も代入の順番を考えてください。

なお、初期値は正の数しか入れないのなら、全部0にした方が考えやすいでしょう。
また、繰り返しの回数はどこまでやるか(何が入力されるまでやるか)仕様を決めましょう。
non

しょしん

Re: 3番目に大きい数

#5

投稿記事 by しょしん » 14年前

無事解決しました。
詳しくありがとうございました!

閉鎖

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