PROG 4.3 (append ; 2つの配列を連結)

問題

[実行例]
a1[M]と a2[N]を、b[M+N]に順に格納する。


a1: 19  33  42  46  78

a2: 11  17  25  54  63

 b: 19  33  42  46  78  11  17  25  54  63

[コメント]
  • 配列の要素数(長さ)のマクロには、#define 文を使おう。
  • a1, a2, bの配列は大域変数(グローバル変数)としよう。
  • 配列は、大域変数。全体で共有される。
    • プログラム中のどこからでもアクセスできる。
    • 実行中、どこかで変更すると、変更が全域に影響する。
  • 関数も使ってみよう。
    • void append という関数を呼び出して、その後、bをプリントする。
[関連の例題]
例題集ページ
  • 0401 (配列要素にループ処理)(要素の合計)
  • 0102 (入力を配列に格納) (入力データの合計)
    • 配列の値をscanfで入力する場合は、こちらを参考に。一定数の長さの配列を用意し、入力値を順に格納する。この方法では用意した配列は余る/足りない場合もある。配列そのものを動的に確保する方法ではない。

[プログラム]

#include <stdio.h>

#define M 5 /* マクロ 読み替え ; はいりません */
#define N 5

int a1[M] = { 19, 33, 42, 46, 78 };   /* 初期化 */
int a2[N] = { 11, 17, 25, 54, 63 };

int b[M + N];   /* M+N個の要素 確保だけ */


void append(int, int);  /* 関数テンプレート宣言 作る関数を宣言 */

int main(void) {
    int i;

/* a1のプリント */
    printf("a1:");
    for (i = 0; i < M; i++) {  /* 定番 配列 for ループ */
        printf("%3d ", a1[i]);
    }
    printf("\n");
    printf("\n");

    printf("a2:");
    for (i = 0; i < N; i++) {
        printf("%3d ", a2[i]);
    }
    printf("\n");
    printf("\n");

    append(M, N); /* 関数呼び出し */

/* bのプリント */
    printf(" b:");
    for (i = 0; i < M + N; i++) {
        printf("%3d ", b[i]);
    }
    printf("\n");
    printf("\n");

    return (0);
}

/* 配列bから見るプログラム。まずはa1から、次はa2から代入 */
/* append 関数の定義 戻り値はなし void */
void append(int m, int n) {
    int i, j, k;

    i = 0;
    j = 0;

    /* bの側から、どちらを入れるのかというループ */
    for (k = 0; k < m + n; k++) {
        if (i < m) {  /* まず ai */
            b[k] = a1[i];
            i++;
        } else {
            b[k] = a2[j]; /* 次に a2 */
            j++;
        }
    }
}