C言語のきほん「ポインタの基本(6)三つの整数値をソートする」

スポンサーリンク
プログラミング C言語

今回は、「三つの整数を昇順にソートするプログラム」をご紹介する。

なお、本プログラムは、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クリエイティブ

コメント

タイトルとURLをコピーしました