71021


二番目に大きい数字を出力するプログラムを実装したいのですが、コンパイルはできるものの、コンパイル結果が入力した数字によっておかしくなってしまうケースがあります。

というのは、始めに端末に以下のように入力したところ、正常に結果が出たと思われたのですが、

[code]

    $ ./a.out
    データの個数入力:　4
    1 番目? 1
    2 番目? 4
    3 番目? 7
    4 番目? 6
    二番目に大きい値は6です。
    
[/code]

データの数を増加させたところ、結果が期待しているのとは違うように出力されました。

[code]

    $ ./a.out
    データの個数入力:　6
    1 番目? 2
    2 番目? 3
    3 番目? 10
    4 番目? 4
    5 番目? 5
    6 番目? 1
    二番目に大きい値は6です。
    
[/code]

おそらくは、関数`secondMax`の部分がおかしいのではないかとは思うのですが、どの部分がおかしいのかがわかりませんでした。  
一番大きい数や、一番小さい数を出力させるプログラムは何度も作成したことがあるので、実装方法はわかるのですが、二番目に大きい数は初めてなので、変な箇所がありましたらご回答よろしくお願いします。

[code]

    #include<stdio.h>
    
    void readIntArray(int a[], int size)
    {
        int i;
        for(i=0;i<size;i=i+1) {
            printf("%d 番目? ", i+1);
            scanf("%d", &a[i]);
        }
    }
    
    int secondMax(int a[],int size)
    {
        int i,max,max2;
        
        for(i=1;i<size;i++){
            if(a[i]>max)
                max=a[i];
        }
        for(i=1;i<size;i++){
            if((max>a[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;
    }   
    
[/code]


CC BY-SA 4.0
2020-10-08T13:28:17.447
71020
2020-10-08T16:27:31.517
2020-10-08T16:27:31.517
3060
41837
question
c
二番目に大きい数字を出力するプログラムの作成方法


`secondMax`関数：

  * `for`文のループ変数`i`の初期値は0でしょう。
  * `max`と`max2`とは初期値を持っていないまま、数値比較を行ってしまいました。入力データは全て正数限りですか。そうでしたら、二つも0に初期化しましょう。

最も汎用的な方法はソートです。


CC BY-SA 4.0
2020-10-08T13:53:50.543
71021
2020-10-08T13:53:50.543
41425
71020
answer