ページ 1 / 1
多次元配列に一次元配列を代入する
Posted: 2020年10月21日(水) 12:35
by JJJuto
5×5の多次元配列bの各要素に、要素数25の1次元配列aを代入するにはどうしたらよいですか?
コード:
for (i = 0; i < 5; i++) {
for (j = 0; j < 5; j++) {
for (m = 0; m < 25; m++) {
b[i][j] = a[m];
printf("%4d", b[i][j]);
}
}
}
と書いてみたのですが、25の要素がずっと繰り返され、また、5×5にならなかったです。
C言語歴がまだ数ヶ月もないため、何が違うかわからなず困っています。
何が違って、どう直せばいいのか教えていただけるとありがたいです。
Re: 多次元配列に一次元配列を代入する
Posted: 2020年10月21日(水) 17:33
by usao
「どう直す」じゃなくて,まずは実現するための手続きをまともに考えてみたらどうか.
5x5個の箱と,25個の何かが存在するときに,箱に1個ずつ入れるとしたらどうやるのか?
* あなたの提示したコードは3重のループが書かれているが,本当に3重ループになる手続きを考え付いたのだろうか?
例えば以下の2種類の手続きが考えられるとして,どちらでも良いから「その通りに」実装すればよい.
(1)aの25個の要素に関して,以下を行う.
aのm番目の要素に関して,これをbのどこに格納すれば良いのか(i,j)を判断する.
そして,bのその場所(i,j)に,aのm番目の要素の値を代入する.
(2)bの25個の要素に関して,以下を行う.
bの場所(i,j)に関して,ここにaのどの要素を格納すれば良いのかを判断する.
m番目だと判断したならば,このbの場所(i,j)に,aのm番目の要素の値を代入する.
* あなたの提示したコードには上記の「判断」に対応するような処理が見当たらないのが不思議だ.
Re: 多次元配列に一次元配列を代入する
Posted: 2020年10月22日(木) 12:57
by JJJuto
申し訳ありません。まだ、プログラミングの考え方にすら慣れていないような初心者ゆえ、このようなソースを書きました。
3重ループにした理由は、i,jのループで多次元配列を作って、そこにmを25まで繰り返して格納すればできると思ったからです。
返信いただいた手続きを自分なりに考えて見ましたが、どう書けば良いのか思い浮かびませんでした。すみません。
判断、というのはif文を使えば良いのでしょうか?
もう少しヒントをいただけるとありがたいです。
何もわからず、申し訳ありません。
Re: 多次元配列に一次元配列を代入する
Posted: 2020年10月22日(木) 21:29
by みけCAT
JJJuto さんが書きました: ↑3年前
5×5の多次元配列bの各要素に、要素数25の1次元配列aを代入するにはどうしたらよいですか?
「aの要素」ではなく「a」を代入するんですよね?
コード:
#include <string.h>
int main(void) {
int b[5][5][25]; /* 5x5の多次元配列 (各要素はint[25]) */
int a[25] = {0}; /* 要素数25の1次元配列 */
int i, j;
/* bの各要素にaを代入(コピー) */
for (i = 0; i < 5; i++) {
for (j = 0; j < 5; j++) {
memcpy(b[i][j], a, sizeof(a));
}
}
return 0;
}
Re: 多次元配列に一次元配列を代入する
Posted: 2020年10月22日(木) 21:33
by みけCAT
「aの要素」を代入したい場合は
コード:
int main(void) {
int b[5][5];
int a[25] = {0};
int i, j;
/* #2 の (1) */
for (i = 0; i < 25; i++) {
/* iに基づき、a[i]をbのどこに格納するかを求める (仮で(0, 0)) */
int y = 0;
int x = 0;
/* そこに格納する */
b[y][x] = a[i];
}
/* #2 の (2) */
for (i = 0; i < 5; i++) {
for (j = 0; j < 5; j++) {
/* (i, j)に基づき、b[i][j]にaのどれを格納するかを求める (仮で0) */
int idx = 0;
/* それを格納する */
b[i][j] = a[idx];
}
}
return 0;
}
Re: 多次元配列に一次元配列を代入する
Posted: 2020年10月22日(木) 21:37
by みけCAT
JJJuto さんが書きました: ↑3年前
判断、というのはif文を使えば良いのでしょうか?
効率は落ちますが、if文を使ってもいいです。
コード:
int main(void) {
int b[5][5];
int a[25] = {0};
int i, j, m;
for (i = 0; i < 5; i++) {
for (j = 0; j < 5; j++) {
for (m = 0; m < 25; m++) {
/* i,j,mの値からして、a[m]をb[i][j]に格納するべきか? (仮で全て偽) */
if (0) {
/* もし格納するべきなら、格納する */
b[i][j] = a[m];
}
}
}
}
return 0;
}
Re: 多次元配列に一次元配列を代入する
Posted: 2020年10月23日(金) 15:57
by JJJuto
ご丁寧にありがとうございます!
全部試して、完全にではありませんが、なんとなく理解できました!
ありがとうございます!