Cでの置換関数

1. 思想の順列

実際、, 私たちは、プログラムを構築する必要があります, 順列関数は、要素の値を交換します, 例えばシーケンサプログラムが典型的です.

順列へ 2 数, 一つは、私たちのよう想像することができます 2 ガラス. レモネードコンテナのガラス, Bカップ農薬容器. どのように我々は、カップレモン汁Bに移動し、カップに殺虫剤を移動します? 単により多くを使用します 1 女性のカップCカップと移動を開始:

  • B1: CカップにレモンAのカップに注ぎます. =>中空, Cはレモンが含まれています
  • B2: カップA => B空に農薬Bカップを注ぎます, 殺虫剤
  • B3: => Bは、レモンが含まマグカップレモンC Bに注ぎます.
  • OK. 農薬時間, レモネードを含むB.

順列

どのようにスワップ 2 水のコップ

2. 置換コード

我々はの値を交換しますプログラミングで同じ操作を行います 2 変数.

// e.g about swap in C - code by nguyenvanquan7826
#include <stdio.h>

int main()
{
    int a, b;
    printf("Nhap 2 so a, b:\n");
    scanf("%d%d", &a, &b);

    printf("Ban da nhap:\na = %d \nb = %d\n", a, b);

    int temp = a;
    a = b;
    b = temp;

    printf("Sau khi hoan vi:\na = %d\nb = %d\n", a, b);
    return 0;
}

結果:

インポート 2 そう, B:
3
6

あなたが入力しました:
= 3
B = 6

順列の後:
= 6
B = 3

OK. 今置換関数を参照の星に分割してみてください:

3. Cでの置換関数

// e.g about swap in C - code by nguyenvanquan7826
#include <stdio.h>

void hoanvi(int a, int b) 
{
    int temp = a;
    a = b;
    b = temp;
}

int main()
{
    int a, b;
    printf("Nhap 2 so a, b:\n");
    scanf("%d%d", &a, &b);

    printf("Ban da nhap:\na = %d \nb = %d\n", a, b);

    hoanvi(a, b);

    printf("Sau khi goi ham hoanvi:\na = %d\nb = %d \n", a, b);
    return 0;
}

結果:

インポート 2 そう, B:
3
6

あなたが入力しました:
= 3
B = 6

コー​​ルhoanvi後、:
= 3
B = 6

ああ, 私たちは、結果の並べ替えを持っていないのはなぜ?

このプログラムでは、我々が構築 1 間の位置を変更するには、置換関数 2 端子aとb, しかし、我々は、の値をとるべき値を使用して、bは変化しない、即ち、それらは同じ順列ではない.

あなたは、関数呼び出しすなわち、参照によって渡された値を理解します Honvi(ザ·, B) aとbの値は、直ちに (3 と 6) 機能ではなく、変数aに含まれます, B有効にしてください, bの機能が終了したとき、私たちは変化しませんでした.

次のように正しいコードがあります:

// e.g about swap in C - code by nguyenvanquan7826
#include <stdio.h>

void hoanvi(int *a, int *b) 
{
    int temp = *a;
    *a = *b;
    *b = temp;
}

int main()
{
    int a, b;
    printf("Nhap 2 so a, b:\n");
    scanf("%d%d", &a, &b);

    printf("Ban da nhap:\na = %d \nb = %d\n", a, b);

    hoanvi(&a, &b);

    printf("Sau khi goi ham hoanvi:\na = %d\nb = %d \n", a, b);
    return 0;
}

結果:

インポート 2 そう, B:
3
6

あなたが入力しました:
= 3
B = 6

順列の後:
= 6
B = 3

我々は顎でビルド上記hoanvi 2 引数があります *a*b int型. *a*b すなわち、ポインタaとbのポインタ. 関数の本体では、書き込み *a, *b (最高経営責任者(CEO: int temp = *a) その後、看板 * ポインタAの値を表します.

すなわち、変数のアドレスを送信するために私たちを呼び出すときに関数ポインタを使用する必要がありますので hoanvi(&a, &b) , ここで記号 & 変数aと変数bのアドレスを取得するには.

4. C ++の関数の順列で

あなたがCを記述する場合++ (.cppファイルで終わるファイル) 次のように彼らは、コンテンツを少し簡単に順列を書くことができます.

// e.g about swap in C - code by nguyenvanquan7826
#include <stdio.h>

void hoanvi(int &a, int &b)  // only in C++, file .cpp
{
    int temp = a;
    a = b;
    b = temp;
}

int main()
{
    int a, b;
    printf("Nhap 2 so a, b:\n");
    scanf("%d%d", &a, &b);

    printf("Ban da nhap:\na = %d \nb = %d\n", a, b);

    hoanvi(a, b);

    printf("Sau khi goi ham hoanvi:\na = %d\nb = %d \n", a, b);
    return 0;
}

または関数を使用することができます スワップ 図書館で利用可能 アルゴリズム

#include <stdio.h>
#include <algorithm> // swap 

int main()
{
    int a, b;
    printf("Nhap 2 so a, b:\n");
    scanf("%d%d", &a, &b);

    printf("Ban da nhap:\na = %d \nb = %d\n", a, b);

    std::swap(a, b);

    printf("Sau khi goi ham hoanvi:\na = %d\nb = %d \n", a, b);
    return 0;
}