Hàm swap trong lập trình C/C++ – Hàm hoán vị giá trị 2 biến

Hàm swap hoán đổi giá trị của 2 biến cho nhau là hàm mà trong những bài toán trong thực tiễn ta sẽ cần vận dụng khá nhiều, ví dụ như trong bài toán sắp xếp. Vậy trong bài viết này tất cả chúng ta sẽ cùng tìm hiểu và khám phá tư tưởng bài toán hoán vị, cũng như cùng nhau đi viết hàm hoán vị với lập trình C / C + + nhé .

Tư tưởng bài toán hoán vị

Hàm swap trong lập trình C/C++ - Hàm hoán vị giá trị 2 biến

Giả sử bạn đang có 2 cốc nước, ta gọi là cốc A đang đựng nước lọc và cốc B đang đựng nước cam. Vậy làm sao để có thể hoán đổi cốc A đựng nước cam và ngược lại.

Để làm được việc đó chắc chắn ta sẽ cần tới một cốc phụ gọi là cốc C nữa.

  • Bước 1: Ta đổ cốc nước lọc A vào C.
  • Bước 2: Đổ cốc nước cam B vào A.
  • Bước 1: Đổ cốc nước lọc trong C vào cốc B.

Như vậy có phải lúc này cốc A sẽ đựng cốc nước cam, và cốc B sẽ đựng cốc nước lọc. Và trong lập trình ta cũng làm tương tự như vậy, ta khai báo 1 biến gọi là biến temp(tạm), sau đó gán temp = A, A = B, B = temp, như vậy là đã hoán đổi được giá trị của 2 biến A, B.

Hàm swap xây dựng sẵn trong thư viện C++

Trong thư viện iostream của C++, hàm swap đã được xây dựng sẵn với cấu trúc:

void swap(object A, object B)

Với A, B là bất kì một kiểu dữ liệu nào từ int, float…tới một struct hay thậm chí là một đối tượng class.

Mình sẽ có đoạn code minh họa hoán đổi 2 biến kiểu tài liệu int như bên dưới .

#include 

using namespace std;

int main()
{
    int a, b;
    cout<<"Nhap 2 so a, b:\n";
    cin>>a>>b; 
    cout<<"\nBan da nhap:\n a = "<Nhap 2 so a, b:
3
5
Ban da nhap:
a = 3
b = 5
Sau khi swap:
a = 5
b = 3

Một chương trình hoán vị không sử dụng hàm hoán vị con

Một chương trình hoán vị 2 biến không sử dụng tới hàm mà sẽ hoán đổi 2 biến trực tiếp trong main. Tất nhiên khi làm trong thực tiễn thì sẽ không ai viết thế này cả, điểm yếu kém là không viết hàm con thì cứ mỗi lần hoán đổi 2 thành phần ta sẽ viết lai lệnh hoán đổi nên code không tối ưu .

Code mẫu:

#include 

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 swap:\na = %d\nb = %d \n", a, b);
    return 0;
}

Kết quả khi chạy chương trình thì cũng sẽ như ví dụ trên .

Viết hàm hoán vị với C

Mình có 1 đoạn chương trình con như sau, bạn hãy thử Dự kiến trước hiệu quả xem tác dụng có giống khi chạy chương trình không nhé ! .

#include 

void Swap(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);
   
    Swap(a, b);
 
    printf("Sau khi swap:\na = %d\nb = %d \n", a, b);
    return 0;
}

Và đây chính là hiệu quả khi chạy chương trình .
Viết hàm hoán vị với C

Ủa ủa ủa…là sao ta?? tại sao chương trình lại không thể hoán đổi được giá trị của 2 biến.

Bởi vì khi ta viết hàm Swap như vậy tức là ta chỉ đang truyền tham trị tức là chỉ truyền vào 2 giá trị của a, b vào hàm swap chứ không phải truyền vào vị trí ô nhớ của 2 biến a, b. Vì vậy lúc này hàm swap sẽ tạo ra 2 bản sao tại vị trí ô nhớ khác và thao tác trên 2 ô nhớ mới đó, 2 biến a, b sau khi thoát khỏi hàm vẫn sẽ giữ nguyên giá trị ban đầu của nó.

Để khác phục tình trạng đó trong C ta sẽ sử dụng tham trỏ, ta sẽ truyền 2 đối số là int *a, int *b trong hàm swap.

Vì là 2 tham trỏ nên khi gọi hàm ta cũng sẽ phải truyền vào đó là địa chỉ biến, tức là truyền vào &a, &b(Dấu & để lấy địa chỉ biến).

Ta viết lại chương trình chạy đúng như sau:

#include 

void Swap(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);
   
    Swap(&a, &b);
 
    printf("Sau khi swap:\na = %d\nb = %d \n", a, b);
    return 0;
}

Và đây là tác dụng khi chạy chương trình .
Viết hàm hoán vị với C
Như vậy là chương trình của tất cả chúng ta đã chạy đúng với mong ước bắt đầu .

Viết hàm hoán vị với C++

Đối với C++ ta cũng sẽ viết hàm Swap tương tự, tuy nhiên trong C++ có tham chiếu(hoặc gọi tham biến) nên code sẽ nhìn đơn giản và dễ hiểu hơn một chút so với tham trỏ trong C.

#include 

using namespace std;

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

int main()
{
    int a, b;
    cout<<"Nhap 2 so a, b:\n";
    cin>>a>>b; 
    cout<<"\nBan da nhap:\n a = "<Nhap 2 so a, b:
2
5
Ban da nhap:
a = 2
b = 5
Sau khi swap:
a = 5
b = 2

Cuối cùng thì mình xin cảm ơn bạn đã đọc bài viết, chúc bạn học tốt! sớm trở thành một Pro Dev.

[Xem tất cả bài viết chủ đề C/C++ tại đây]

0
0
Phiếu bầu chọn

Xếp hạng bài viết