とりあえずnull

プログラミングの勉強日記

配列の要素を逆順にする

参考書見ながら手取り足取り教えてもらってコード書くと考えるチカラ自体は付きにくいなぁと思ったので、問題だけみてゼロから書いてみることに。 するとなんということでしょう。すごい汚いコードになってしまった。ってことで、とりあえず動けばいいや精神で動作したものを載せておく。 今度、参考書の例も載せようと思います。

考え方と流れ:

  • まずは要素の詰まった配列を用意する
  • デバッグ用にとりあえず出力
  • 要素を逆順にしてあげる
  • 逆順にする際、一時保管するための変数tを用意して、上書きされた時に元の値が消えないようtに保管してあげる
  • あとは入れ替えるのみ
  • 入れ替えるときに繰り返す回数は要素数の半分だけ。でないと、さらに逆順の逆順処理が始まり元に戻ってしまうから

コード:

#include <stdio.h>
#define NUMBER 5

int main(void){
  
  int a[NUMBER];

  printf("要素に数値を入力してください。\n");
  
  for(int i = 0; i <= NUMBER; i++){
    printf("a[%d]:", i);
    scanf("%d", &a[i]);
  };

  //初期の状態で出力
  printf("入力した順に出力\n");
  for(int h = 0; h < NUMBER; h++){
    printf("a[%d]の値は%d\n", h, a[h]);
  }

  // 配列を逆順にする
  for(int j = 0; j < NUMBER/2; j++){
    int t = a[j];
    a[j] = a[NUMBER - j - 1];
    a[NUMBER - j - 1] = t;
  }

  printf("逆順にするこうなりました。\n");
  for(int k = 0; k < NUMBER; k++){
    printf("a[%d]:%d\n", k, a[k]);
  }
  
  return 0;
}

出力結果:

$ ./sample
要素に数値を入力してください。
a[0]:100
a[1]:200
a[2]:300
a[3]:400
a[4]:500
a[5]:600
入力した順に出力
a[0]の値は100
a[1]の値は200
a[2]の値は300
a[3]の値は400
a[4]の値は500
逆順にするこうなりました。
a[0]:500
a[1]:400
a[2]:300
a[3]:200
a[4]:100

メモ:

最初、要素数の分、逆順に代入処理していて意図しない結果が返ってきて戸惑った。入れ替える際は要素に対して前半分の回数だけ入れ替えてあげれば全要素が入れ替わり逆順になる、という当たり前のことに気づくのに時間がかかった。