Lệnh hoán đổi ab dùng để làm gì

Bạn dùng ngôn ngữ gì thì mình không biết nhưng mình sẽ cho bạn ý tưởng1. Biến trung giantg=a;a=b;

b=tg;


2. Không dùng biến trung giana=a+b; VD: a=10, b=5 => a+b=15; => a=15; => b=15-5=10 => a=15-10=5;b=a-b;

a=a-b;

Trong bài tập này chúng ta sẽ thực hiện chương trình hoán đổi hai số sử dụng con trỏ C++. Đây là một bài tập đơn giản giúp các bạn làm quen với con trỏ trong C++.

Lệnh hoán đổi ab dùng để làm gì

Lệnh hoán đổi ab dùng để làm gì

Bài viết này được đăng tại freetuts.net, không được copy dưới mọi hình thức.

Để làm được bài tập này các bạn cần có kiến thức căn bản về C++ như cách tạo hàm và sử dụng hàm và hiểu được cách hoạt động của con trỏ p.

Chương trình hoán đổi hai số sử dụng con trỏ trong C++

Trong ví dụ này chúng ta sẽ tạo một hàm swap() để thực hiện công việc hoán đổi. Sau khi viết được hàm swap() chúng ta sẽ viết tiếp hàm main(). Trong hàm main() chúng ta sẽ yêu cầu người dùng nhập vào hai số cần hoán đổi. Tiếp đến sẽ gọi hàm swap() để thực hiện hoán đổi hai số mà người dùng vừa mới nhập vào.

#include <iostream> using namespace std; void swap(int *x,int *y) { int t; t = *x; *x = *y; *y = t; } int main() { int num1,num2; cout<<"Nhập vào số thứ nhất: "; cin>>num1; cout<<"Nhập vào số thứ hai: "; cin>>num2; cout<<"Trước khi đổi: \n"<<"Số thứ nhất = " <<num1<<"\nSố thứ hai = "<<num2; swap(&num1,&num2); cout<<"\nSau khi đổi: \n"<<"Số thứ nhất = " <<num2<<"\nSố thứ hai = "<<num1; cout<<"\n-----------------------------------\n"; cout<<"Chương trình này được đăng tại Freetuts.net"; }

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

Bài viết này được đăng tại [free tuts .net]

Lệnh hoán đổi ab dùng để làm gì

Như vậy là chúng ta đã thực hiện xong chương trình hoán đổi hai số sử dụng con trỏ trong C++. Chúc các bạn thực hiện thành công!!!

Bài toán: Cho hai biến A, B. Dùng biến trung gian Tam để hoán đổi giá trị của hai biến ban đầu.

Thuật toán:

Lệnh hoán đổi ab dùng để làm gì

- Chương trình:

program HoanDoiGiaTriHaiSo;

    { Khai báo 3 biến A, B, Tam }    

    { Nhập dữ liệu cho biến A, B }

    { Xuất giá trị của biến A, B }

Trong thực tế, chúng ta phải xây dựng các chương trình, các hàm hoán vị để hoán đổi giá trị của các phần tử, ví dụ chương trình sắp xếp dãy là một điển hình.

Để hoán vị 2 số, ta có thể hình dung giống như chúng ta có 2 cốc. Cốc A đựng nước chanh, cốc B đựng thuốc trừ sâu. Làm sao để chúng ta chuyển nước chanh sang cốc B và chuyển thuốc trừ sâu sang cốc a? Đơn giản là dùng thêm 1 cốc phụ là cốc c và bắt đầu chuyển:

  • B1: Đổ cốc chanh A sang cốc C. => A rỗng, C chứa chanh
  • B2: Đổ cốc thuốc trừ sâu B sang cốc A => B rỗng, A chứa thuốc trừ sâu
  • B3: Đổ cốc chanh C sang cốc B => B chứa chanh.
  • Ok. Giờ A chứa thuốc trừ sâu, B chứa nước chanh.

Lệnh hoán đổi ab dùng để làm gì

Cách đổi chỗ 2 cốc nước

2. Code hoán vị

Làm tương tự trong lập trình ta sẽ hoán đổi được giá trị của 2 biến.

// 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; }

Kết quả:

Nhap 2 so a, b: 3

6

Ban da nhap: a = 3

b = 6

Sau khi hoan vi: a = 6

b = 3

Ok. Bây giờ thử tách ra thành hàm hoán vị xem sao:

3. Hàm hoán vị trong 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; }

Kết quả:

Nhap 2 so a, b: 3

6

Ban da nhap: a = 3

b = 6

Sau khi goi ham hoanvi: a = 3

b = 6

Oh, Sao kết quả chúng ta không có sự hoán vị?

Với chương trình này chúng ta xây dựng 1 hàm hoán vị để đổi vị trí giữa 2 bến a và b, tuy nhiên chúng ta đã sử dụng tham trị nên các giá trị của a và b không thay đổi hay nói cách khác là chúng không được hoán vị cho nhau.

Các bạn hiểu truyền tham trị tức là khi gọi hàm hoanvi(a, b) thì ngay lập tức giá trị của a và b (3 và 6) được đưa vào hàm chứ không phải là các biến a, b nên biến a, b của chúng ta không hề thay đổi khi hàm kết thúc.

Code đúng như sau:

// 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; }

Kết quả:

Nhap 2 so a, b: 3

6

Ban da nhap: a = 3

b = 6

Sau khi hoan vi: a = 6

b = 3

Ở trên chúng ta xây dựng hàm hoanvi với 2 đối số là *a và *b kiểu int. *a và *b nghĩa là con trỏ a và con trỏ b. Trong thân hàm chúng ta có viết *a, *b (VD: int temp = *a) thì dấu * thể hiện là giá trị của con trỏ a.

Do hàm dùng con trỏ nên khi gọi hàm chúng ta phải truyền vào địa chỉ của các biến tức là hoanvi(&a, &b) , ở đây dấu & để lấy địa chỉ của biến a và biến b.

4. Hàm hoán vị trong C++

Nếu các bạn viết trong C++ (file có đuôi là .cpp) thì có thể viết hàm hoán vị dễ hơn một chút như sau.

// 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; }

Hoặc có thể dùng hàm swap có sẵn trong thư viện algorithm

#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; }