問題
- 2つの配列データa1とa2を、配列データbへマージせよ
a1[] = {19, 33, 42, 46, 78} a2[] = {11, 17, 25, 54, 63} とするとき、マージ結果は b[] = {11,17,19,25,33,42,46,54,63,78}
(a1とa2は、プログラム中に書いておくことにする) a1: 19 33 42 46 78 a2: 11 17 25 54 63 b: 11 17 19 25 33 42 46 54 63 78
- a1から代入する場合とa2から代入する場合の場合分けを、しっかりまとめること。
- 上の例では、先にa2の要素がbに全て代入される。
- いろいろな表現方法があってよい。自分の解答だけでなく、教科書や参考書にある標準的な解答も確認すること。
- 自分と異なるプログラムは読んで比較しよう。「これなら、j自分の方がいいよ」ってこともある。
- 以下、この例題では扱わない。
- 要素数を入力し、配列用メモリを動的に確保する方法 (calloc関数)
- 大域変数ではなく、配列のアドレスを引数に使う方法 (例題集を)
例題集ページ
- 0403 (今日のウーミングアップ1問目;後でリンクします)
解答例
[プログラムテンプレート(未完)]
#include <stdio.h> /* 配列のサイズを決めておく */ #define M 5 #define N 5 /* 大域変数 よくわかるC (p.46) */ int a1[M] = {19, 33, 42, 46, 78}; int a2[N] = {11, 17, 25, 54, 63}; int b[M+N]; /* 関数の宣言 (p.43) */ void merge(int, int); int main (void) { int i; /* 配列a1のプリント 配列とforループの定番プログラム*/ printf("a1:"); for(i=0; i < M; i++) { printf("%3d ",a1[i]); } printf("\n"); printf("\n"); /* 配列a2のプリント */ printf("a2:"); for(i=0; i < N; i++) { printf("%3d ",a2[i]); } printf("\n"); printf("\n"); /* マージして */ merge(M, N); /* 配列bのプリント */ printf(" b:"); for(i=0; i < M+N; i++) { printf("%3d ",b[i]); } printf("\n"); printf("\n"); return (0); } void merge(int m, int n) { }