今回は、「三つの整数を昇順にソートするプログラム」をご紹介する。
なお、本プログラムは、Windows 11 Home(23H2)上で、 Visual Studio Code(1.89.1)を使用して作成し、gcc (Ubuntu 9.4.0-1ubuntu1~20.04.2) 9.4.0でコンパイルしている。
三つの整数を昇順に並べるプログラム
//三つの整数を昇順に並べるプログラム
#include <stdio.h>
//xとyが指すオブジェクトの値を交換する
void swap(int *x,int *y)
{
int temp = *x;
*x = *y;
*y = temp;
}
//*n1≦*n2≦*n3となるようにソートする
void sort3(int *n1,int *n2,int *n3)
{
if (*n1 > *n2) swap(n1,n2);
if (*n2 > *n3) swap(n2,n3);
if (*n1 > *n2) swap(n1,n2);
}
int main(void)
{
int a,b,c;
puts("三つの整数を入力してください。");
printf("整数a:"); scanf("%d",&a);
printf("整数b:"); scanf("%d",&b);
printf("整数c:"); scanf("%d",&c);
printf("整数aのアドレス:%p\n",&a);
printf("整数bのアドレス:%p\n",&b);
printf("整数cのアドレス:%p\n",&c);
sort3(&a,&b,&c);
puts("昇順にソートしました");
printf("最小の数は%dです。\n",a);
printf("2番目の数は%dです。\n",b);
printf("最大の数は%dです。\n",c);
return 0;
}
実行結果
三つの整数を入力してください。
整数a:78
整数b:12
整数c:45
整数aのアドレス:0x7ffd4516602c
整数bのアドレス:0x7ffd45166030
整数cのアドレス:0x7ffd45166034
昇順にソートしました
最小の数は12です。
2番目の数は45です。
最大の数は78です。
main関数内の関数sort3(&a,&b,&c)に着目しよう。実引数として、&a,&b,&cを与えることで、3個の変数のソートを関数sort3に依頼している。
呼び出された関数sort3が行うのは、仮引数n1,n2,n3に受け取ったポインタが指す変数の値*n1,*n2,*n3を昇順にソートすることである。
(1)左側の*n1と右側の*n2の値を比べ、*n1が*n2より大きければ、それらを交換する。
(2)次のif文では、同じ処理を*n2と*n3に対して行う。
ここまでの2段階の処理によって、最も大きい値が*n3に格納される。
(3)次に行うのは、2番目に大きい値を決定することである。
最初と同じif文の実行によって、*n1と*n2の大きい方の値が*n2に格納される。
これで、ソートは完了である。
なお、この3つのステップでは、2値の交換を関数swapに依頼している。
その際に与えている実引数n1,n2,n3にはアドレス演算子&が適用されていない。
これは、関数sort3の仮引数n1,n2には、aとbへのポインタがコピーされており、n1はaのアドレス、n2はbアドレスとなっている。
関数swapに渡すのはポインタなので、受け取ったアドレスをそのまま渡せばよい。
例えば、最初の関数swapでは、
「02c番地に入っている整数と030番地に入っている整数の値を交換してください。」
と依頼することになる。
(参考)新・解きながら学ぶC言語 第2版 柴田望洋 (監修・著)、 由梨かおる(著)SBクリエイティブ
コメント