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

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

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

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

Q&A

解決済

1回答

1069閲覧

配列の入れ替えについて

退会済みユーザー

退会済みユーザー

総合スコア0

C

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

0グッド

0クリップ

投稿2018/05/23 16:13

編集2018/05/24 04:11

c

1#include <stdio.h> 2 3void move_array(int *s, int *d, int n ); 4void show_array( int *x, int n ); 5 6int main(void) 7{ 8 int n = 0; 9 int a[6]; 10 a[0] = 3; 11 a[1] = 5; 12 a[2] = 7; 13 a[3] = 9; 14 a[4] = 11; 15 a[5] = 13; 16 17 int b[6]; 18 19 b[0] = 0; 20 b[1] = 0; 21 b[2] = 0; 22 b[3] = 0; 23 b[4] = 0; 24 b[5] = 0; 25 26 move_array(&a[6], &b[6], 6); 27 show_array(&a[6], n); 28 29 return 0; 30} 31 32void move_array(int *s, int *d, int n ) 33{ 34 *s = *d; 35 return; 36} 37 38 39void show_array( int *x, int n ) 40{ 41 printf("A:"); 42 for (int i = 0; i < n; i++) 43 { 44 printf("%d",*x); 45 } 46 putchar('\n'); 47 48 printf("B:"); 49 for (int i = 0; i < n; i++) 50 { 51 printf("%d",n); 52 } 53 putchar('\n'); 54 55}

やりたい事

main関数の二つの配列をmobe_arrayに渡し、関数内で入れ替えたのを今度はshow_arrayに渡してshow_array内で入れ替えた配列を表示させたい。

変更点

c

1void move_array(int *s, int *d, int n ) 2{ 3 int tmp = 0; 4 for (int i=0; i < n; i++) 5 { 6 tmp = *s; 7 *s = *d; 8 *d = tmp; 9 } 10 11 return; 12}

c

1void show_array( int *x, int n ) 2{ 3 printf("A:"); 4 printf("B:"); 5 for (int i = 0; i < n; i++) 6 { 7 printf("%d",x[i]); 8 } 9 10}

c

1#include <stdio.h> 2 3void move_array(int *s, int *d, int n ); 4void show_array( int *x, int n ); 5 6int main(void) 7{ 8 int a[6]; 9 a[0] = 3; 10 a[1] = 5; 11 a[2] = 7; 12 a[3] = 9; 13 a[4] = 11; 14 a[5] = 13; 15 16 int b[6]; 17 18 b[0] = 0; 19 b[1] = 0; 20 b[2] = 0; 21 b[3] = 0; 22 b[4] = 0; 23 b[5] = 0; 24 25 26 move_array(&a[6],&b[6], 6); 27 show_array(a, 6); 28 show_array(b, 6); 29 30 return 0; 31} 32 33void move_array(int *s, int *d, int n ) 34{ 35 int tmp = 0; 36 for (int i=0; i < n; i++) 37 { 38 tmp = s[i]; 39 s[i] = d[i]; 40 s[i] = tmp; 41 } 42 return; 43} 44 45 46void show_array( int *x, int n ) 47{ 48 printf("A:"); 49 printf("B:"); 50 for (int i = 0; i < n; i++) 51 { 52 printf("%d",x[i]); 53 } 54 55}

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

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

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

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

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

mather

2018/05/24 02:29

変更した現段階のコードを質問に追記すると何が問題か判断しやすいです。追記するときは元のコードを書き換えてしまうのではなく、「## 追記 (2018-05-24 11:30)」のように一区切り入れて追加していくと後で見直した時にどんな修正をしたのかわかりやすいですよ。
guest

回答1

0

ベストアンサー

配列の初期化について

バグというわけではないですが、非常に冗長に見えるので。
次のように初期化可能です。

C

1int a[] = {3, 5, 7, 9, 11, 13}; 2int b[] = {0, 0, 0, 0, 0, 0};

なお、0で初期化する場合は次のように書くことも可能です。

C

1int b[6] = {0};

これは別に特殊な記法ではなく、足りない部分が0で補完されるだけです。
(註:必ず0です。{1}で初期化したら{1, 1, ...}になるわけではありません。)

関数へ配列を渡す方法について

実引数の文脈では、配列名は先頭要素のポインタに置き換えられます。
よって、次のように書けます。

C

1move_array(a, b, 6); 2// move_array(&a[0], &b[0], 6); 明示的に書いても可

ご提示のコードのように書くと、『6番目の要素のアドレス』を渡そうとしてしまいます。
要素は0番目から5番目までしか存在せず、範囲外アクセスに当たるのでまずいです。

C

move_array(&a[6], &b[6], 6);

move_arrayの実装について

あくまで仮引数aとbは配列の先頭要素のアドレスを指しています。
ご提示のコードの場合、最初の要素だけしか書き換わらないはずです。

せっかく要素数を一緒に渡しているので、forでぶん回しましょう。

C

1for(int i = 0; i < n; ++i) { 2 a[i] と b[i] をスワップ; 3}

スワップ処理に関しては、検索すればすぐ見つかるはずです。
べた書きしても良いですし、swap関数を用意してもかまいません。マクロは取扱注意です。

show_arrayの使い方について

インターフェースを見る限り、どうやら一つの配列の値を出力する関数のように見えます。
配列a、配列b、それぞれを出力したい場合、二回呼び出す必要があります。

show_arrayの実装について

C

for (int i = 0; i < n; i++)
{
printf("%d",*x);
}

*xはこの場合やはり先頭要素の値を解決します。
書き方はいろいろありますが、x[i]を利用するのが素直でしょう。

要素数の渡し方について

これもバグではありませんが、sizeof演算子を上手に利用すると簡潔に書けます。
関心があるようでしたら調べてみてください。

変数nの取り扱いについて

C

int n = 0;

...

move_array(&a[6], &b[6], 6);

show_array(&a[6], n);

これだとnが初期値0のまま変わりませんね。
move_arrayの第3仮引数の名前がnですが、これはmain関数スコープの変数nとは無関係です。

投稿2018/05/23 16:36

編集2018/05/23 16:50
LouiS0616

総合スコア35660

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

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

退会済みユーザー

退会済みユーザー

2018/05/23 17:20

スワップさせて見ましたが入れ変われていませんでした。 関数内のコードがいけないのでしょうか?
LouiS0616

2018/05/23 17:22

ご提示のコードでは*sと*dは常に先頭要素を指しているので、先頭が何度も入れ替わります。 つまり偶数回ループを回したら元に戻ると言うことです。 *sと*dではなく、s[i]とd[i]を入れ替えるようにしてください。
退会済みユーザー

退会済みユーザー

2018/05/23 17:38

mobe_arrayの関数は解決できましたがどうしてもshow_arrayに値を渡せないのですがどうすればいいのでしょうか? 問題文追記しました。
LouiS0616

2018/05/23 17:44

show_arrayについては、一つの配列の要素を順に表示するように実装し、二回呼び出すのが良いでしょう。 show_array(a, 6); show_array(b, 6);
退会済みユーザー

退会済みユーザー

2018/05/23 17:58

試して見たのですがshow_arrayにて値が入れ替わっていませんでした。 それと表示させ方が質問欄のようなイメージに出来ないのですが何がいけないんでしょうか?
LouiS0616

2018/05/24 04:21

move_arrayの呼び出し方を誤っていませんか。
LouiS0616

2018/05/24 05:38

あとmove_arrayの実装もちょっと変ですね。 tmp = s[i]; s[i] = d[i]; s[i] = tmp; // ←誤り。d[i] = tmp;
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問