多次元配列に一次元配列を代入する

フォーラム(掲示板)ルール
フォーラム(掲示板)ルールはこちら  ※コードを貼り付ける場合は [code][/code] で囲って下さい。詳しくはこちら
JJJuto
記事: 29
登録日時: 3年前

多次元配列に一次元配列を代入する

#1

投稿記事 by JJJuto » 3年前

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言語歴がまだ数ヶ月もないため、何が違うかわからなず困っています。

何が違って、どう直せばいいのか教えていただけるとありがたいです。

アバター
usao
記事: 1887
登録日時: 11年前

Re: 多次元配列に一次元配列を代入する

#2

投稿記事 by usao » 3年前

「どう直す」じゃなくて,まずは実現するための手続きをまともに考えてみたらどうか.
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番目の要素の値を代入する.

* あなたの提示したコードには上記の「判断」に対応するような処理が見当たらないのが不思議だ.

JJJuto
記事: 29
登録日時: 3年前

Re: 多次元配列に一次元配列を代入する

#3

投稿記事 by JJJuto » 3年前

申し訳ありません。まだ、プログラミングの考え方にすら慣れていないような初心者ゆえ、このようなソースを書きました。
3重ループにした理由は、i,jのループで多次元配列を作って、そこにmを25まで繰り返して格納すればできると思ったからです。
返信いただいた手続きを自分なりに考えて見ましたが、どう書けば良いのか思い浮かびませんでした。すみません。
判断、というのはif文を使えば良いのでしょうか?
もう少しヒントをいただけるとありがたいです。
何もわからず、申し訳ありません。

アバター
みけCAT
記事: 6734
登録日時: 13年前
住所: 千葉県
連絡を取る:

Re: 多次元配列に一次元配列を代入する

#4

投稿記事 by みけCAT » 3年前

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;
}
複雑な問題?マシンの性能を上げてOpenMPで殴ればいい!(死亡フラグ)

アバター
みけCAT
記事: 6734
登録日時: 13年前
住所: 千葉県
連絡を取る:

Re: 多次元配列に一次元配列を代入する

#5

投稿記事 by みけCAT » 3年前

「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;
}
複雑な問題?マシンの性能を上げてOpenMPで殴ればいい!(死亡フラグ)

アバター
みけCAT
記事: 6734
登録日時: 13年前
住所: 千葉県
連絡を取る:

Re: 多次元配列に一次元配列を代入する

#6

投稿記事 by みけCAT » 3年前

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;
}
複雑な問題?マシンの性能を上げてOpenMPで殴ればいい!(死亡フラグ)

JJJuto
記事: 29
登録日時: 3年前

Re: 多次元配列に一次元配列を代入する

#7

投稿記事 by JJJuto » 3年前

ご丁寧にありがとうございます!
全部試して、完全にではありませんが、なんとなく理解できました!
ありがとうございます!

返信

“C言語何でも質問掲示板” へ戻る