Thứ Tư, 30 Tháng Mười Một 2022
Trang chủLập trìnhLập trình C/C++Hàm swap trong lập trình C/C++ - Hàm hoán vị giá trị...

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 các bài toán thực tế ta sẽ cần áp 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 chúng ta sẽ cùng tìm hiểu 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 dữ liệu int như bên dưới.

#include <iostream>

using namespace std;

int main()
{
    int a, b;
    cout<<"Nhap 2 so a, b:\n";
    cin>>a>>b; 
    cout<<"\nBan da nhap:\n a = "<<a <<"\n b = "<< b;
 
    swap(a, b);
 
     cout<<"\n\nSau khi swap:\n a =  "<< a<<"\n b = "<< b;
    return 0;
}

Kết quả chạy chương trình:

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 thực tế thì sẽ không ai viết thế này cả, nhược điểm là không viết hàm con thì cứ mỗi lần hoán đổi 2 phần tử ta sẽ viết lai lệnh hoán đổi nên code không tối ưu.

Code mẫu:

#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 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ự đoán trước kết quả xem kết quả có giống khi chạy chương trình không nhé!.

#include <stdio.h>

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à kết 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 <stdio.h>

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à kết quả 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 chúng ta đã chạy đúng với mong muốn ban đầ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.

CODE MẪU

#include <iostream>

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 = "<<a <<"\n b = "<< b;
 
    Swap(a, b);
 
     cout<<"\n\nSau khi swap:\n a =  "<< a<<"\n b = "<< b;
    return 0;
}

Và kết quả khi chạy chương trình

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]

5 1 Bỏ phiếu bình chọn
Xếp hạng bài viết
BÀI VIẾT LIÊN QUAN

4 BÌNH LUẬN

Đăng ký nhận thông báo
Thông báo email khi
guest
4 Bình luận
Cũ nhất
Mới nhất Được bình chọn nhiều nhất
Không thể gửi email
Phản hồi nội tuyến
nguyen tan tai
nguyen tan tai
1 tháng trước

nếu swap 3 số thì sao

Nguyển Hải
Nguyển Hải
1 tháng trước

Bài viết dễ hiểu cảm ơn anh!

NÊN ĐỌC THÊM

Bạn muốn tìm kiếm gì?


4
0
Giáo sư! có thể ném gạch bên dưới nhé!x
()
x