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ị
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.
Ủ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).
- Khóa học lập trình C/C++ từ A-Z cho người mới – Giảm giá 40% hôm nay
- Khóa học Java cơ bản dành cho người mới bắt đầu- Giảm 40% hôm nay
- Khóa học lập trình Android từ cơ bản đến thành thạo – Giảm ngay 40%
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.
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++
>>XEM THÊM: Khóa học lập trình C/C++ từ A-Z cho người mới – Giảm giá 40% hôm nay
Đố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]
Bài viết dễ hiểu cảm ơn anh!
Theo dõi thêm các bài viết ủng hộ mình nhé@@
nếu swap 3 số thì sao
không có hàm swap 3 số, lúc đó nó sẽ trở thành bài toán là sắp xếp ngẫu nhiên dãy số với điều kiện tất cả các phần tử đều được đảo vị trí…..