先頭へ戻る

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

Programming Place Plus トップページアルゴリズムとデータ構造編

先頭へ戻る

問題①

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


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

#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 が一致しています。


参考リンク


更新履歴

’2015/12/27 SIZE_OF_ARRAYマクロの定義を修正。

≪さらに古い更新履歴を展開する≫



第1章のメインページへ

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

Programming Place Plus のトップページへ



はてなブックマーク に保存 Pocket に保存 Facebook でシェア
Twitter でツイート Twitter をフォロー LINE で送る
rss1.0 取得ボタン RSS 管理者情報 プライバシーポリシー