質問: 二番目に大きい数字を出力するプログラムを実装したいのですが、コンパイルはできるものの、コンパイル結果が入力した数字によっておかしくなってしまうケースがあります。 というのは、始めに端末に以下のように入力したところ、正常に結果が出たと思われたのですが、 ``` $ ./a.out データの個数入力: 4 1 番目? 1 2 番目? 4 3 番目? 7 4 番目? 6 二番目に大きい値は6です。 ``` データの数を増加させたところ、結果が期待しているのとは違うように出力されました。 ``` $ ./a.out データの個数入力: 6 1 番目? 2 2 番目? 3 3 番目? 10 4 番目? 4 5 番目? 5 6 番目? 1 二番目に大きい値は6です。 ``` おそらくは、関数`secondMax`の部分がおかしいのではないかとは思うのですが、どの部分がおかしいのかがわかりませんでした。 一番大きい数や、一番小さい数を出力させるプログラムは何度も作成したことがあるので、実装方法はわかるのですが、二番目に大きい数は初めてなので、変な箇所がありましたらご回答よろしくお願いします。 ``` #include void readIntArray(int a[], int size) { int i; for(i=0;imax) max=a[i]; } for(i=1;ia[i] && a[i]>max2)) max2=a[i]; } return max2; } int main() { int data[1024],num,second; printf("データの個数入力: "); scanf("%d",&num); readIntArray(data,num); second=secondMax(data,num); printf("二番目に大きい値は%dです。\n",second); return 0; } ```
回答: `secondMax`関数: * `for`文のループ変数`i`の初期値は0でしょう。 * `max`と`max2`とは初期値を持っていないまま、数値比較を行ってしまいました。入力データは全て正数限りですか。そうでしたら、二つも0に初期化しましょう。 最も汎用的な方法はソートです。