• ベストアンサー
※ ChatGPTを利用し、要約された質問です(原文:プログラミングで二番目に大きい数を表示する)

プログラミングで二番目に大きい数を表示する

このQ&Aのポイント
  • 指定された個数の整数を読み込んで、最大値と二番目に大きい値を表示するプログラムを作成します。
  • 最大値が複数入力された場合も正しく処理します。
  • 入力した数字が全部同じ場合は、二番目に大きい値は存在しないと表示します。

質問者が選んだベストアンサー

  • ベストアンサー
回答No.3

>二番目に大きい値はありません。と表示したい printf("二番目に大きい値は%dです。\n", sec); を printf("二番目に大きい値は"); printf(max!=sec?"%dです。\n":"ありません。\n", sec); に変える。 sec = max = kazu[0]; for(i=1; i<num; i++){ if(kazu[i]>max) max=kazu[i]; } for(i=0;i<num;i++){ if(kazu[i]>max){ sec=max; max=kazu[i]; }else if((max>kazu[i]) && (kazu[i]>sec)) sec=kazu[i]; } の部分は sec = max = kazu[0]; for(i=1; i<num; i++){ if(kazu[i]>=max) max=kazu[i]; else if(kazu[i]>sec) sec=kazu[i]; } で構わない。 あと「整数の個数」に0以下(0かマイナス)が入力された場合、未初期化のkazu[]配列を参照してしまう。 また「整数の個数」に101以上が入力された場合、kazu[]配列に数値を格納しようとしてメモリを破壊してしまう。 なので、numにマイナス、0、101以上が入力されたら、return 0;して中断する必要がある。 A.No1さんへ。 >先に配列変数を大小で全部並び変えてから、最大値 二番目 同じ値か判別したほうが簡単だと思います。 入力された数値が、 1 2 2 1 2 1 3 3 3 だった場合、ソートしても 3 3 3 2 2 2 1 1 1 となるので、最大値の「3」、二番目に大きい「2」を見付けるのは簡単ではない。 単純にソート後のkazu[0]とkazu[1]を表示しても、「3」と「3」が表示されてしまう。 A.No.2さんへ。 >・ソートしてしまう A.No1と同じ問題が起きる。 >・そもそも「同じ値が複数存在する」のが問題なんだからそうならないようにしてしまう 題意に沿わない。「同じ数が複数存在してはいけない」と言う条件は無い。 >・最後にチェック 最終的にsecとmaxが同値であれば「二番目は無い」事になるので、それが正解であろう。 >ところで, このプログラムにおいて「最後の for における最初の if」は何のためにあるんでしょうか? ですよね。何の為にあるのか判りませんね。

nogi4
質問者

お礼

わかりやすい説明ありがとうございます。 助かりました。

その他の回答 (5)

回答No.6

A.No4の訂正。 ○INT_MIN ×INT_NIN

nogi4
質問者

お礼

ありがとうございます。

回答No.5

追記。 A.No4のバグ修正を施した場合は printf(max!=sec?"%dです。\n":"ありません。\n", sec); を printf(INT_NIN!=sec?"%dです。\n":"ありません。\n", sec); に直すのも忘れないように。

nogi4
質問者

お礼

ありがとうございます。

回答No.4

あ、バグ発見。 sec = max = kazu[0]; ってやってるから、一番最初に「最大値」を入力しちゃうと、それ以降、maxとsecが同値のまま、secが変化しない。 1行目に #include <limits.h> を追加して、 sec = max = kazu[0]; を max = kazu[0]; sec = INT_MIN; に変更すると、バグが直る。

nogi4
質問者

お礼

ありがとうございます。

  • Tacosan
  • ベストアンサー率23% (3656/15482)
回答No.2

いろいろやり方はある. たとえば ・ソートしてしまう ・そもそも「同じ値が複数存在する」のが問題なんだからそうならないようにしてしまう ・最後にチェック くらいはできそう. ところで, このプログラムにおいて「最後の for における最初の if」は何のためにあるんでしょうか?

nogi4
質問者

お礼

ありがとうございます。

  • koujikuu
  • ベストアンサー率43% (429/993)
回答No.1

先に配列変数を大小で全部並び変えてから、最大値 二番目 同じ値か判別したほうが簡単だと思います。

nogi4
質問者

お礼

ありがとうございます。

関連するQ&A

専門家に質問してみよう