問題
- 2つの配列の値を、順に別の配列に格納し、全体をプリントせよ。
- 2つの配列はプログラム中に与えることにする。
- 2つの配列の長さも確定させる。3つ目の配列も用意する。
- 方法はいくつかある。仲間の解答と比較するとよい。
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++; } } }