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

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

ただいまの
回答率

90.35%

  • C

    3967questions

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

配列の入れ替えについて

解決済

回答 1

投稿 編集

  • 評価
  • クリップ 0
  • VIEW 178

haruka-t

score 90

#include <stdio.h>

void move_array(int *s, int *d, int n );
void show_array( int *x, int n );

int main(void)
{
  int n = 0;
  int a[6];
  a[0] = 3;
  a[1] = 5;
  a[2] = 7;
  a[3] = 9;
  a[4] = 11;
  a[5] = 13;

  int b[6];

  b[0] = 0;
  b[1] = 0;
  b[2] = 0;
  b[3] = 0;
  b[4] = 0;
  b[5] = 0;

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

  return 0;
}

void move_array(int *s, int *d, int n )
{
    *s = *d;
  return;
}


void show_array( int *x, int n )
{
  printf("A:");
  for (int i = 0; i < n; i++)
  {
    printf("%d",*x);
  }
  putchar('\n');

  printf("B:");
  for (int i = 0; i < n; i++)
  {
    printf("%d",n);
  }
  putchar('\n');

}

 やりたい事

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

変更点

void move_array(int *s, int *d, int n )
{
  int tmp = 0;
  for (int i=0; i < n; i++)
  {
    tmp = *s;
    *s = *d;
    *d = tmp;
 }

  return;
}
void show_array( int *x, int n )
{
  printf("A:");
  printf("B:");
  for (int i = 0; i < n; i++)
  {
    printf("%d",x[i]);
  }

}
#include <stdio.h>

void move_array(int *s, int *d, int n );
void show_array( int *x, int n );

int main(void)
{
  int a[6];
  a[0] = 3;
  a[1] = 5;
  a[2] = 7;
  a[3] = 9;
  a[4] = 11;
  a[5] = 13;

  int b[6];

  b[0] = 0;
  b[1] = 0;
  b[2] = 0;
  b[3] = 0;
  b[4] = 0;
  b[5] = 0;


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

  return 0;
}

void move_array(int *s, int *d, int n )
{
  int tmp = 0;
  for (int i=0; i < n; i++)
  {
    tmp = s[i];
    s[i] = d[i];
    s[i] = tmp;
 }
  return;
}


void show_array( int *x, int n )
{
  printf("A:");
  printf("B:");
  for (int i = 0; i < n; i++)
  {
    printf("%d",x[i]);
  }

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

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

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

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

質問への追記・修正、ベストアンサー選択の依頼

  • mather

    2018/05/24 11:29

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

    キャンセル

回答 1

checkベストアンサー

0

配列の初期化について

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

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

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

int b[6] = {0};

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

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

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

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

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

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

move_arrayの実装について

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

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

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

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

show_arrayの使い方について

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

show_arrayの実装について

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

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

要素数の渡し方について

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

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

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/24 02:20

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

    キャンセル

  • 2018/05/24 02:22

    ご提示のコードでは*sと*dは常に先頭要素を指しているので、先頭が何度も入れ替わります。
    つまり偶数回ループを回したら元に戻ると言うことです。

    *sと*dではなく、s[i]とd[i]を入れ替えるようにしてください。

    キャンセル

  • 2018/05/24 02:38

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

    キャンセル

  • 2018/05/24 02:44

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

    キャンセル

  • 2018/05/24 02:58

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

    キャンセル

  • 2018/05/24 13:21

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

    キャンセル

  • 2018/05/24 14:38

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

    キャンセル

同じタグがついた質問を見る

  • C

    3967questions

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