Đảo ngược mảng trong C | Laptrinhcanban.com

HOME › >>

Đảo ngược mảng trong C

Trong ngôn ngữ C không tồn tại hàm có sẵn nào giúp chúng ta đảo ngược mảng trong C cả. Do vậy chúng ta cần phải ứng dụng các hàm có sẵn khác để có thể tự tạo hàm đảo ngược mảng trong C. Ứng dụng hàm này, chúng ta có thể đảo ngược dãy số trong C và bạn sẽ học được chúng sau bài học này.

Có 2 phương pháp để đảo ngược mảng trong C như sau:

  • Đảo ngược mảng bằng cách dùng define
  • Đảo ngược mảng bằng cách viết trực tiếp

Logic đảo ngược mảng trong C | Đảo ngược dãy số trong C

Đảo ngược mảng trong C là xử lý viết lại một mảng với các phần tử theo thứ tự ngược lại từ cuối lên đầu. Lưu ý ở đây mảng là mảng số, do đó chúng ta cũng có thể gọi xử lý này là đảo ngược dãy số trong C.

Nếu bạn muốn đảo ngược một mảng chuỗi trong C, hãy theo dõi bài viết sau:

Quay trở lại với xử lý đảo ngược dãy số trong C, ví dụ chúng ta mảng dãy số như sau:

int array[] = {0, 1, 2, 3, 4, 5};

Để đảo ngược dãy số này này, chúng ta sử dụng ý tưởng rất đơn giản. Chúng ta hoán đổi số đầu với số cuối trong mảng, sau đó giảm phạm vi bằng cách tiến dần về giữa mảng và lặp lại quá trình hoán đổi số đầu với số cuối trong mảng.

Nói cách khác, với mảng số ở trên thì chúng ta sẽ hoán đổi 0 với 5, 1 với 4, và 2 với 3 , để thu về mảng kết quả là {5, 4, 3, 2, 1, 0}.

Đảo ngược mảng trong C - đảo ngược dãy số trong C

Lại nữa, để có thể hoán đổi 2 phần tử như trên, chúng ta cần phải chuẩn bị một vùng tạm thời để chứa một trong 2 phần tử, và hoán đổi với logic temp = X; X = Y; Y = temp;

Logic hoán đổi 2 số trong C

Và để thực hiện được logic hoán đổi 2 số ở trên, chúng ta sẽ có 2 phương pháp là định nghĩa xử lý hoán đổi bằng từ khoádefine hoặc là viết trực tiếp xử lý hoán đổi trong hàm tự tạo. Tương đương với chúng sẽ là 2 phương pháp đảo ngược mảng trong C như dưới đây.

Đảo ngược mảng bằng cách dùng define

define là một từ khoá dùng để định nghĩa macro trong C. Bằng cách sử dụng define, chúng ta có thể định nghĩa các biến hoặc hàm được sử dụng nhiều lần trong chương trình bởi một macro, và sử dụng macro này đại diện cho các xử lý đó trong chương trình C.

Ví dụ, hai macro dưới đây sẽ giúp chúng ta định nghĩa số PI, cũng như hàm tính diện tích hình trong chẳng hạn.

#define PI 3.14
#define area(r) (PI*r*r)

Quay trở lại bài toán đảo ngược mảng trong C, chúng ta sẽ dùng define để tạo một macro để định nghĩa hàm hoán đổi 2 phần tử trong C như sau:

#define SWAP(type,x,y) do{type tmp = x; x = y; y = tmp;}while(0)

Và sử dụng macro này, chúng ta có thể hoàn thành hàm đảo ngược mảng trong C như sau:

#include <stdio.h>

//Định nghĩa maco có tác dụng hoán đổi 2 phần tử
#define SWAP(type,x,y) do{type tmp = x; x = y; y = tmp;}while(0)

//Tạo hàm đảo ngược mảng
void reverse(int* array, int size)
{
for (int i = 0; i < size / 2; ++i) {
SWAP(int, array[i], array[size - i - 1]);
}
}

/*Tạo hàm in phần tử trong mảng*/
void show_array(int array[], int length){
for(short i = 0; i < length; i++) printf("%d ", array[i]);
printf("\n");
}

int main(void)
{
int array1[] = {11, 22, 33, 44,};
int array2[] = {0, 1, 2, 3, 4, 5};

//Lấy độ dài mảng ban đầu
int size1 = sizeof array1 / sizeof(int);
int size2 = sizeof array2 / sizeof(int);

reverse(array1, size1);
reverse(array2, size2);

//in mảng kết quả
show_array(array1,size1);
show_array(array2,size2);

return 0;
}

Kết quả của phép đảo ngược mảng trong C như dưới đây. Bạn hãy thử chạy chương trình và kiểm tra nhé.

44 33 22 11 
5 4 3 2 1 0

Đảo ngược mảng bằng cách viết xử lý hoán đổi trong hàm

Với cách thứ 2 này, thay vì dùng define để định nghĩa xử lý thì chúng ta sẽ viết trực tiếp các xử lý hoán đổi 2 số vào trong hàm đảo ngược mảng trong C như sau:

void reverse(int* array, int size)
{
/*Tạo vòng lặp để hoán đổi số đầu với số cuối trong mảng
và thu dần khoảng cách về giữa mảng*/
for (int i = 0; i < size / 2; ++i) {
//Thực hiện phép hoán đổi
int temp = array[i];
array[i] = array[size - i - 1];
array[size - i - 1] = temp;
}
}

Và chúng ta viết chương trình đảo ngược mảng trong C với hàm này như dưới đây:

#include <stdio.h>

//Tạo hàm đảo ngược mảng
void reverse(int* array, int size)
{
/*Tạo vòng lặp để hoán đổi số đầu với số cuối trong mảng
và thu dần khoảng cách về giữa mảng*/
for (int i = 0; i < size / 2; ++i) {
//Thực hiện phép hoán đổi
int temp = array[i];
array[i] = array[size - i - 1];
array[size - i - 1] = temp;
}
}

/*Tạo hàm in phần tử trong mảng*/
void show_array(int array[], int length){
for(short i = 0; i < length; i++) printf("%d ", array[i]);
printf("\n");
}

int main(void)
{
int array1[] = {11, 22, 33, 44,};
int array2[] = {0, 1, 2, 3, 4, 5};

//Lấy độ dài mảng ban đầu
int size1 = sizeof array1 / sizeof(int);
int size2 = sizeof array2 / sizeof(int);

reverse(array1, size1);
reverse(array2, size2);

//in mảng kết quả
show_array(array1,size1);
show_array(array2,size2);

return 0;
}

Và chúng ta cũng thu về kết quả đảo ngược mảng trong C tương tự như với cách ban đầu:

44 33 22 11 
5 4 3 2 1 0

Tổng kết

Trên đây Kiyoshi đã hướng dẫn bạn cách đảo ngược mảng trong C rồi. Để nắm rõ nội dung bài học hơn, bạn hãy thực hành viết lại các ví dụ của ngày hôm nay nhé.

Và hãy cùng tìm hiểu những kiến thức sâu hơn về C trong các bài học tiếp theo.

URL Link

https://laptrinhcanban.com/c/lap-trinh-c-co-ban/mang-trong-c/dao-nguoc-mang-trong-c/

Hãy chia sẻ và cùng lan tỏa kiến thức lập trình Nhật Bản tại Việt Nam!

HOME  › >>

Profile
きよしです!笑

Tác giả : Kiyoshi (Chis Thanh)

Kiyoshi là một cựu du học sinh tại Nhật Bản. Sau khi tốt nghiệp đại học Toyama năm 2017, Kiyoshi hiện đang làm BrSE tại Tokyo, Nhật Bản.