配列 解答ページ | Programming Place Plus アルゴリズムとデータ構造編【データ構造】 第1章

トップページアルゴリズムとデータ構造編【データ構造】第1章

問題① 🔗

問題① 配列の中身を逆順にするプログラムを作成してください。このとき、対象となる配列自身を書き換えるタイプと、対象は書き換えずに新たな配列を作り出すタイプとを実装してください。


対象の配列を書き換えて良いのならば、以下のようになります。

#include <stdio.h>

#define SIZE_OF_ARRAY(array)    (sizeof(array)/sizeof(array[0]))
#define SWAP(type,a,b)          do{ type work = a; a = b; b = work; }while(0)

int main(void)
{
    int array[] = { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9 };
    size_t size = SIZE_OF_ARRAY(array);


    // array を逆順にする
    for( size_t i = 0; i < size / 2; ++i ){
        SWAP(int, array[i], array[size - i - 1]);
    }

    // 配列の全要素を出力する
    for( size_t i = 0; i < size; ++i ){
        printf( "%d\n", array[i] );
    }

    return 0;
}

実行結果:

9
8
7
6
5
4
3
2
1
0

配列の複製を作らずに逆順にするには、要素を先頭と末尾とで交換します。これを1つずつ中心の要素へ向かって行っていけば、逆順になります。

配列の複製を作る場合は、先頭の要素を、複製先の末尾へコピーしていきます。この操作を、複製元の配列の末尾に行き着くまで行えば、要素が逆順になった配列が複製できます。

#include <stdio.h>
#include <stdlib.h>

#define SIZE_OF_ARRAY(array)    (sizeof(array)/sizeof(array[0]))

int main(void)
{
    int array[] = { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9 };
    size_t size = SIZE_OF_ARRAY(array);


    // array を逆順にした配列を作る
    int* rev_array = malloc( sizeof(int) * size );
    for( size_t i = 0; i < size; ++i ){
        rev_array[size - i - 1] = array[i];
    }

    // 配列の全要素を出力する
    for( size_t i = 0; i < size; ++i ){
        printf( "%d\n", rev_array[i] );
    }

    free( rev_array );

    return 0;
}

実行結果:

9
8
7
6
5
4
3
2
1
0

問題② 🔗

問題② 整数が格納された配列から、偶数の値を持つ要素数を数えるプログラムを作成してください。


基本的には、要素を先頭から順番に調べていき、条件に一致する要素数をカウントしていくだけです。「偶数であるか」以外にどんな条件であっても、基本的な考え方に違いはありません。if文の条件式が変わるだけです。

#include <stdio.h>

#define SIZE_OF_ARRAY(array)    (sizeof(array)/sizeof(array[0]))

int main(void)
{
    int array[] = { 0, 5, 10, 13, 16, 19 };

    // 偶数の個数を数える
    int count = 0;
    for( size_t i = 0; i < SIZE_OF_ARRAY(array); ++i ){
        if( array[i] % 2 == 0 ){
            ++count;
        }
    }

    printf( "%d個見つかりました。\n", count );

    return 0;
}

実行結果:

3個見つかりました。

問題③ 🔗

問題③ 2つの配列に、共通して含まれている値を探し出すプログラムを作成してください。


二重ループをつくり、それぞれが1つの配列を走査し、互いの要素を比較します。

#include <stdio.h>

#define SIZE_OF_ARRAY(array)    (sizeof(array)/sizeof(array[0]))

int main(void)
{
    int array[] = { 0, 10, 5, 13, 16, 19 };
    int array2[] = { 11, 13, 19, 17, 12 };

    // 2つの配列に共通して存在する要素を調べる
    int count = 0;
    for( size_t i = 0; i < SIZE_OF_ARRAY(array); ++i ){
        for( size_t j = 0; j < SIZE_OF_ARRAY(array2); ++j ){
            if( array[i] == array2[j] ){
                printf( "%d が一致しています。\n", array[i] );
                ++count;
            }
        }
    }

    if( count == 0 ){
        puts( "一致する要素はありません。" );
    }

    return 0;
}

実行結果:

13 が一致しています。
19 が一致しています。


参考リンク 🔗


更新履歴 🔗

 SIZE_OF_ARRAYマクロの定義を修正。

≪さらに古い更新履歴≫

 Perl版のサンプルを削除。

 各サンプルの Perl版を作成。

 新規作成。



第1章のメインページへ

アルゴリズムとデータ構造編のトップページへ

Programming Place Plus のトップページへ



はてなブックマーク に保存 Pocket に保存 Facebook でシェア
X で ポストフォロー LINE で送る noteで書く
rss1.0 取得ボタン RSS 管理者情報 プライバシーポリシー
先頭へ戻る