C言語

【C言語】変数の値の入れ替え処理を実装


プログラミング初心者向けの練習問題の一つとして、変数の値の入れ替えがあります。

本記事では、変数の値の入れ替え処理をプログラムに実装する方法について解説しています。

「変数の値の入れ替え」処理の実装方法

まずは変数の値の入れ替え処理をどのように実装するのかについて簡単に説明します。

入れ替え用の変数を一時利用する

変数の値の入れ替え処理は、「一方の変数の値で他方の変数の値を上書きする」操作を繰り返し行うことで実装します。

ただ、これは値の入れ替え処理の対象となる変数だけで行っても上手く行きません。

最初に一方の変数の値を上書きした時点で他方の変数の値が失われてしまうからです。

a = b; # aの値をbの値で上書き
b = a; # bの値をa(bの値で上書き済)の値で上書き
...
本来のaの値が失われてしまう

これを解決するためには、値の入れ替え処理の対象となる変数とは別にもう一つ変数を用意する必要があります。

最初に変数の値を上書きする操作を行う前に、上書きされる変数の値を別途用意した変数に退避させることで、どの変数の値も失わずに値の入れ替え処理を実行できるようになります。

temp = a; # aの値をtempへ退避
a = b;    # aの値をbの値で上書き
b = temp; # bの値をtemp(aの値で上書き済)の値で上書き
...
一方の値を失うことなく値の入れ替えが完了

実際にプログラムを作成してみる

それでは、前述した実装方法を参考にプログラムを作成していきます。

実装例① 2変数の値の入れ替え

以下に作成したサンプルプログラムを示します。使用する言語はC言語です。

#include 
int main(void){

  /* 変数の定義と初期化 */
  int a = 0;
  int b = 100;

  /* 入れ替え前の変数の値を表示 */
  printf("before\n -> a : %d\n -> b : %d\n", a, b);

  /* 変数の値の入れ替え処理 */
  int temp;
  temp = a;
  a = b;
  b = temp;

  /* 入れ替え後の変数の値を表示 */
  printf("after \n -> a : %d\n -> b : %d\n", a, b);

  return 0;
}

このプログラムを実行すると以下の出力結果が得られます。

before
 -> a : 0
 -> b : 100
after 
 -> a : 100
 -> b : 0

実装例② 3変数の値の入れ替え

以下に作成したサンプルプログラムを示します。使用する言語はC言語です。

#include 

int main(void){

  /* 変数の定義と初期化 */
  int a = 0;
  int b = 100;
  int c = 10000;

  /* 入れ替え前の変数の値を表示 */
  printf("before\n -> a : %d\n -> b : %d\n -> c : %d\n", a, b, c);

  /* 変数の値の入れ替え処理 */
  int temp;
  temp = a;
  a = b;
  b = c;
  c = temp;

  /* 入れ替え後の変数の値を表示 */
  printf("after \n -> a : %d\n -> b : %d\n -> c : %d\n", a, b, c);

  return 0;
}

このプログラムを実行すると以下の出力結果が得られます。

before
 -> a : 0
 -> b : 100
 -> c : 10000
after 
 -> a : 100
 -> b : 10000
 -> c : 0

実装例③ 変数の値の入れ替えを関数に実装

以下に作成したサンプルプログラムを示します。使用する言語はC言語です。

#include <stdio.h>

/* 対象の変数はポインタとして渡される */
void swap(int *a, int *b) {
  int temp;
  temp = *a;
  *a = *b;
  *b = temp;
}

int main(void){

  int a = 0;
  int b = 100;

  /* 入れ替え前の変数の値を表示 */
  printf("before\n -> a : %d\n -> b : %d\n", a, b);

  swap(&a, &b); /* 引数には変数のアドレスを渡す */

  /* 入れ替え後の変数の値を表示 */
  printf("after\n -> a : %d\n -> b : %d\n", a, b);

  return 0;
}

このプログラムを実行すると以下の出力結果が得られます。

before
 -> a : 0
 -> b : 100
after 
 -> a : 100
 -> b : 0