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

ポインタを使って配列内の要素を検索するCプログラムの作り方


問題の概要

本記事では、実行時にユーザーが入力した値を配列から検索し、その結果を画面に表示するCプログラムを紹介します。検索対象の要素が配列内に存在しない場合は、「その要素は見つかりません」というメッセージを表示します。

解決のポイント

配列とは、同じ型の複数のデータを1つの名前でまとめて扱えるデータ構造です。C言語では、配列名は式の中で先頭要素へのポインタとして扱われるため、ポインタを使った柔軟な操作が可能です。

配列に対して行える主な操作は次のとおりです。

  • 挿入(Insert)
  • 削除(Delete)
  • 検索(Search)

アルゴリズム

ポインタを使って配列内の要素を検索する手順は以下のとおりです。

ステップ1 − 配列のサイズを表す変数を宣言し、ユーザーからの入力として読み込みます。

ステップ2 − 入力されたサイズで配列を宣言します(C99以降では可変長配列(VLA)により、実行時にサイズを指定できます)。

ステップ3 − 配列の各要素を順番に入力します。

ステップ4 − 検索したい要素を読み込みます。

ステップ5 − 配列の先頭アドレスをポインタ引数として受け取る関数を定義します。

ステップ6 − ポインタ演算を使って配列を先頭から末尾まで走査し、目的の要素が存在するかどうかを確認します。

ステップ7 − 要素が見つかった場合は「○○は配列内に存在します」、見つからなかった場合は「○○は配列内に存在しません」を表示します。

サンプルプログラム

以下は、ポインタを使って配列内の要素を検索するCプログラムです。

#include<stdio.h>

/* 配列の先頭アドレスをポインタで受け取り、線形探索で要素を探す */
int search(int n, int *a, int m){
    for(int i = 0; i < n; i++){
        if(m == *(a + i)){ /* ポインタ演算によるa[i]へのアクセス */
            return 1;
        }
    }
    return 0;
}

int main(void){
    int n, m;
    printf("配列のサイズを入力してください:");
    scanf("%d", &n);
    int a[n];
    printf("要素を入力してください:\n");
    for(int i = 0; i < n; i++){
        scanf("%d", &a[i]);
    }
    printf("検索する要素を入力してください:");
    scanf("%d", &m);
    if(search(n, a, m)){
        printf("%d は配列内に存在します\n", m);
    }else{
        printf("%d は配列内に存在しません\n", m);
    }
    return 0;
}

実行結果

上記のプログラムを実行すると、次のような出力が得られます。

実行例1:
配列のサイズを入力してください:5
要素を入力してください:
14
12
11
45
23
検索する要素を入力してください:11
11 は配列内に存在します

実行例2:
配列のサイズを入力してください:3
要素を入力してください:
12
13
14
検索する要素を入力してください:45
45 は配列内に存在しません

解説:ポインタと配列の関係

C言語では、配列名は式の中で「先頭要素へのポインタ」に自動的に変換されます。そのため、関数へ配列を渡す際には、実際には先頭要素のアドレスが渡されます。サンプルプログラムのsearch関数では、仮引数 int *a がこのアドレスを受け取っています。

また、a[i] は *(a + i) と完全に等価です。これは「aが指すアドレスからi個分進んだ位置にある値を参照する」という意味で、これがポインタ演算による配列アクセスの仕組みです。本プログラムではこの性質を利用し、ポインタ経由で各要素を比較しています。

なお、この検索処理は先頭から順に調べる「線形探索(リニアサーチ)」であり、計算量はO(n)です。要素数が多い場合は、あらかじめソートした配列に対して二分探索(O(log n))を用いることで、より高速に検索できます。

  1. C言語の線形探索で配列内の最小値を見つける方法を徹底解説

    C言語の探索アルゴリズムの種類C言語で使われる代表的な探索手法は、大きく分けて以下の2つです。線形探索(リニアサーチ)二分探索(バイナリサーチ)線形探索とは線形探索は、配列の先頭から順番に要素を一つずつ比較しながら目的のキーを探す、最も基本的な探索アルゴリズムです。データがソート(整列)されていなくても使用できる実装が非常にシンプルで理解しやすい欠点:データ数が多いほど処理時間が長くなり、システムの効率を低下させる可能性がある入出力のイメージは以下の通りです。入力:ソートされていない要素のリスト、探索キー出力:・成功 … キーが見つかった場合・失敗 … キーが見つからなかった場合例1:線形探索

  2. C言語で配列の全要素の積を求めるプログラム

    n個の要素を含む配列 arr[n] が与えられたとき、その配列内のすべての要素の積を求めることが課題となります。例えば、7つの要素からなる配列 arr[7] の場合、積は以下のように計算されます。例入力: arr[] = { 10, 20, 3, 4, 8 } 出力: 19200 説明: 10 × 20 × 3 × 4 × 8 = 19200 入力: arr[] = { 1, 2, 3, 4, 3, 2, 1 } 出力: 144解き方のアプローチ配列を入力として受け取る。配列のサイズを求める。配列を反復処理しながら、各要素を掛け合わせる。結果を表示する。アルゴリズム開始 関数 int pro