Cプログラミング
 Computer >> コンピューター >  >> プログラミング >> Cプログラミング

C言語で配列内の2番目に大きい数と2番目に小さい数を見つける方法

この記事では、配列の要素を入力し、入れ替え(スワップ)手法を使って数値を降順に並べ替えたうえで、インデックス位置を利用して配列内の2番目に大きい要素と2番目に小さい要素を表示するCプログラムを紹介します。

配列とは、共通の性質を持つ複数の要素を一つの名前のもとにまとめて格納できるデータ構造です。同じ型のデータを大量に扱う場合に非常に便利です。

C言語における配列の基本操作

C言語で配列に対して行える主な操作は以下のとおりです。

  • 挿入(Insert):配列に新しい要素を追加する
  • 削除(Delete):配列から既存の要素を取り除く
  • 検索(Search):配列内から目的の要素を探し出す

アルゴリズム

配列内の2番目に大きい数と2番目に小さい数を見つけるための手順は以下のとおりです。

  1. ステップ1:要素の個数Nを宣言し、入力として読み込む。
  2. ステップ2:実行時に必要なサイズの配列を宣言する。
  3. ステップ3:配列の要素をすべて入力する。
  4. ステップ4:入れ替え処理を繰り返して、数値を降順に並べ替える。
  5. ステップ5:インデックスを利用して、2番目に大きい数と2番目に小さい数を求める。
  6. ステップ6:それぞれの結果を画面に表示する。

サンプルプログラム

以下は、配列内の2番目に大きい数と2番目に小さい数を見つけるCプログラムです。

#include<stdio.h>
void main(){
    int i,j,a,n,counter,ave,number[30];
    printf("Nの値を入力してください\n");
    scanf("%d", &n);
    printf("数値を入力してください\n");
    for (i=0; i<n; ++i)
        scanf("%d",&number[i]);
    /* バブルソートで降順に並べ替え */
    for (i=0; i<n; ++i){
        for (j=i+1; j<n; ++j){
            if (number[i] < number[j]){
                a = number[i];
                number[i] = number[j];
                number[j] = a;
            }
        }
    }
    printf("降順に並べ替えた数値は以下のとおりです\n");
    for (i=0; i<n; ++i)
        printf("%10d\n",number[i]);
    printf("2番目に大きい数 = %d\n", number[1]);
    printf("2番目に小さい数 = %d\n", number[n-2]);
    /* 2つの平均が配列内に存在するか確認 */
    ave = (number[1] + number[n-2])/2;
    counter = 0;
    for (i=0; i<n; ++i){
        if (ave==number[i])
            ++counter;
    }
    if (counter==0)
        printf("2番目に大きい数と2番目に小さい数の平均は配列内に存在しません\n");
    else
        printf("2番目に大きい数と2番目に小さい数の平均は配列内に%d個存在します\n", counter);
}

実行結果

上記のプログラムをコンパイルして実行すると、次のような出力が得られます。

Nの値を入力してください
5
数値を入力してください
10
12
17
45
80

降順に並べ替えた数値は以下のとおりです
80
45
17
12
10
2番目に大きい数 = 45
2番目に小さい数 = 12
2番目に大きい数と2番目に小さい数の平均は配列内に存在しません

プログラムのポイント

このプログラムでは、二重ループによるバブルソートで配列を降順に並べ替えています。降順にソートした後の配列では、先頭のnumber[0]が最大値、次のnumber[1]が2番目に大きい数になります。同様に、末尾のnumber[n-1]が最小値、その手前のnumber[n-2]が2番目に小さい数となります。このように、ソート後のインデックス位置に直接アクセスすることで、簡単に目的の値を取得できます。

なお、この方法では要素に重複がある場合、正しい「2番目」という結果にならないことがあります。重複を除外したい場合は、ソート後に隣接する同一要素をスキップする処理を追加するとより堅牢になります。また、最後に2番目に大きい数と2番目に小さい数の平均値を計算し、その値が元の配列内に何個存在するかを確認する処理も行っています。

  1. Pythonで配列内の最大の要素を見つける方法を解説

    この記事では、「配列の中から最大の要素を求める」という問題の解決方法について詳しく解説します。 問題の概要 問題文:与えられた配列に対して、その中で最も大きい要素を計算して求める必要があります。 ここではブルートフォース(総当たり)アプローチを使用します。これは、配列全体を先頭から順番に走査しながら各要素を比較し、その時点での最大値を更新していくというシンプルかつ確実な手法です。 実装例 以下に具体的なコードを示します。 # 最大値を求める関数 def largest(arr, n): # 最大要素の初期値として最初の要素を設定 max = arr[0] # 配列全体を

  2. 【Python】リストから最大値・最小値・2番目に大きい値・2番目に小さい値を求める方法

    この記事では、Pythonを使ってリスト(配列)の中から最大値、最小値、2番目に大きい値(second largest)、2番目に小さい値(second smallest)を一度に見つけるプログラムを解説します。ソートを行わずに1回のループで処理できるのがポイントです。アルゴリズム全体の流れは以下の3ステップです。ステップ1:リストの要素を入力する ステップ2:各要素を取り出し、リスト内の他の数値と順に比較する ステップ3:最大値・最小値・2番目に大きい値・2番目に小さい値を取得して表示するサンプルコード# リスト内の最大値・最小値・2番目に大きい値・2番目に小さい値を求める def maxm