質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.35%
C

C言語は、1972年にAT&Tベル研究所の、デニス・リッチーが主体となって作成したプログラミング言語です。 B言語の後継言語として開発されたことからC言語と命名。そのため、表記法などはB言語やALGOLに近いとされています。 Cの拡張版であるC++言語とともに、現在世界中でもっとも普及されているプログラミング言語です。

多次元配列

1次元配列内にさらに配列を格納している配列を、多次元配列と呼びます。

配列

配列は、各データの要素(値または変数)が連続的に並べられたデータ構造です。各配列は添え字(INDEX)で識別されています。

Q&A

2回答

1524閲覧

shuffle 多次元配列の入れ替える

BRUCER

総合スコア4

C

C言語は、1972年にAT&Tベル研究所の、デニス・リッチーが主体となって作成したプログラミング言語です。 B言語の後継言語として開発されたことからC言語と命名。そのため、表記法などはB言語やALGOLに近いとされています。 Cの拡張版であるC++言語とともに、現在世界中でもっとも普及されているプログラミング言語です。

多次元配列

1次元配列内にさらに配列を格納している配列を、多次元配列と呼びます。

配列

配列は、各データの要素(値または変数)が連続的に並べられたデータ構造です。各配列は添え字(INDEX)で識別されています。

0グッド

0クリップ

投稿2020/04/22 13:24

編集2020/04/22 13:30

前提・実現したいこと

二次元配列、乱数を使って、縦横の項目を入れ替える

以下のような初期化して、その後はどうすればいいでしょうか?

該当のソースコード

C言語

1#define M 40 2 3void map(char map[M][M]){ 4 int i; 5 for (i=0;i<M;M++){ 6 map[0][i] = i; 7 map[i][0] = i; 8} 9}

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

jimbe

2020/04/22 13:30

「縦横の項目を入れ替える」とは例えばどういう感じにしたいのでしょうか.
BRUCER

2020/04/22 13:33

コメントありがとうございます。 以下のようなイメージで、横と縦の数字をランダムにしてたいです。重複しないこと。 0 1 2 3 4 5 6 7 8... ------------------------ 1 2 3 4 5 6 7 8 . . .
jimbe

2020/04/22 13:38

その縦横の[0]列の数値がランダムに, 例えば列方向なら 7,2,4,6,3,1,0,8,5... 的になるということですか?
BRUCER

2020/04/22 13:40

ご返事ありがとうございました。 はい、そうですね。
jimbe

2020/04/22 13:41

[0][0] は 0 のままで良いのでしょうか.
BRUCER

2020/04/22 13:42

shuffleを使いたいです。
BRUCER

2020/04/22 13:43

はい、0のまま大丈夫です
jimbe

2020/04/22 13:45

shuffle とはどのライブラリの関数のことでしょうか.
BRUCER

2020/04/22 13:49

c言語初心者です。例えば単に void shuffle(char map[M][M]){ この中に、質問に提示された初期化のものを乱数化したいです。 }
BRUCER

2020/04/22 14:19 編集

自分は、一次元の配列のshuffle関数ができたが、二次元なら、わかりません。一次元のshuffle関数はこのようなものです。 void shuffle(char map[M]){ int cnt,tmp,rnd; srand(unsigned)time(NULL)); for (cnt = 0; cnt < M; cnt ++){ tmp = tbl[rnd]; tbl[rnd] = tbl[cnt]; tbl[cnt] = tmp; } }
jimbe

2020/04/22 14:16

なるほど. まず, 「shuffleを使いたい」と言われると何処かに既存の shuffle関数があるものと考えてしまいます. ご自分で作成された関数でしたら, その旨仰って頂かないと分かりません. また, コードは出来るだけ動かしているもの/コンパイルエラーの無いものをコピペしてください. 例えばその shuffle 関数は見ただけでも, cha→char, srandの'('不足,tmp→temp 等の間違いが多いです. 今は「このようなもの」ということでイメージは分かりましたが, 単に転記間違いで回答があらぬ方向に向かってしまう場合がありますので. そして, 1次元の配列で出来たのでしたら, それが2次元の列方向となりますので, それを行方向にも同じようにすれば出来ます.
BRUCER

2020/04/22 14:20

ご指摘いただき、ありがとうございます。やってみます。
episteme

2020/04/22 20:06

R: a行とb行の入れ替え C: a列とb列の入れ替え を用意し、 a, b をデタラメに選んで何度かRまたはCをやればいいんですかね?
guest

回答2

0

M=40 では確認が面倒ですので 10 で書いています.

c

1#include <stdio.h> 2#include <stdlib.h> 3#include <time.h> 4 5#define M 10 6 7void shufflemap(char map[M][M]){ 8 int i, j, t; 9 srand((unsigned int)time(0)); 10 for(i=M-1; i>3; i--) { 11 j = rand() % (i-2) + 1; 12 t = map[0][i]; map[0][i] = map[0][j]; map[0][j] = t; 13 j = rand() % (i-2) + 1; 14 t = map[i][0]; map[i][0] = map[j][0]; map[j][0] = t; 15 } 16} 17void map(char map[M][M]){ 18 int i; 19 for(i=0; i<M; i++) { 20 map[0][i] = i; 21 map[i][0] = i; 22 } 23 shufflemap(map); 24} 25 26int main(void) { 27 int i; 28 char m[M][M]; 29 map(m); 30 for(i=0; i<M; i++) printf("%d%s",m[0][i], i==M-1?"\n":" "); 31 for(i=1; i<M; i++) printf("%d\n",m[i][0]); 32}

plain

10 4 5 6 9 7 3 8 2 1 27 35 43 56 62 79 88 94 101

投稿2020/04/22 14:20

jimbe

総合スコア13209

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

どういう初期化したいのかわからないけど

#define M 40 void map(char map[M][M]){ int i; for (i=0;i<M*M;i++) map[0][i] = i; }

で、とりあえず 0~ 1599 まで埋められると思いますが。

質問の回答とは違いますが
void map(char map[M][M]){
は、
void map(char map[][M]){
と書いた方がいいと思います。
どうせ最初の添え字の方は無視されるので。

投稿2020/04/22 14:10

PingHermit

総合スコア478

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

BRUCER

2020/04/22 14:16

回答いただき、ありがとうございます。 縦の方がなさそうですね、map[0][i]は横項目でしょう?
PingHermit

2020/04/22 14:27 編集

map[0][40] は、 map[1][0] の位置に当たるので、 全部埋まりますが。 map[0][1599] は、 map[39][39] の位置です。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.35%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問