Vấn đề nằm ở đoạn mã nguồn đảo ngược mảng của bạn,
int B[100];
for(int i=n-1; i>=0; i--)
{
for(int j=0; j < n; j++)
{
B[j] = A[i];
}
}
Đọc đoạn mã nguồn trên thì mình giả sử ý tưởng của bạn là cho hai mảng cùng chạy, mảng A chạy từ vị trí cuối cùng i = n - 1
về lại đầu mảng, còn mảng B chạy ngược lại từ vị trí đầu tiên j = 0
cho đến cuối mảng, sau đó cứ mỗi vị trí i
và j
, bạn gán B[j] = A[i]
với hy vọng rằng phần tử cuối của mảng A sẽ là phần tử đầu của mảng B, như vậy là bạn đã đảo ngược được mảng.
Ý tưởng của bạn đúng nhưng việc thể hiện ý tưởng bằng mã nguồn của bạn có vấn đề như thế này, thay vì sử dụng một vòng lặp for
thôi là đủ bạn sử dụng tới hai vòng lặp for
dẫn đến kết quả bị sai, nó sẽ sai ở chỗ chúng ta chỉ muốn ở mỗi lần lặp, i
giảm 1 thì j
tăng 1, cụ thể:
Khi i = 4
, j
sẽ chạy từ 0 cho tới 4 (sai, chúng ta chỉ muốn i
giảm 1 thì j
tăng 1 tại một lần lặp, đằng này j
tăng từ 0 tới 4)
Kết quả mảng B tại thời điểm này: B = [5, 5, 5, 5, 5] do tại mỗi vị trí i
, j
chạy 5 lần, còn i
không thay đổi, cho nên tất cả phần tử trong mảng B chỉ được cập nhật bằng một giá trị tại A[i]
Khi i = 3
, j
vẫn sẽ chạy từ 0 cho tới 4 (sai)
Kết quả mảng B tại thời điểm này: B = [4, 4, 4, 4, 4] (tương tự)
- .... (tương tự)
Khi i = 0
, j
vẫn sẽ chạy từ 0 cho tới 4 (sai)
Kết quả mảng B cuối cùng: B = [1, 1, 1, 1, 1] (tương tự)
Cho nên, bạn sửa lại đoạn mã nguồn có vấn đề ở trên như sau,
for(int i=0; i<n/2; i++)
{
int index = n - i - 1;
int tmp = A[index];
A[index] = A[i];
A[i] = tmp;
}
Ý tưởng cũng đơn giản như bạn thôi, i
chạy từ đầu mảng đến giữa mảng, mỗi lần i
lặp, ta thực hiện hoán vị phần tử bên vế trái và phần tử bên vế phải bằng cách tính chỉ số index của phần tử bên vế phải của mảng A dựa vào index của vế trái, ví dụ với mảng 5 phần tử n = 5
:
i = 0
thì index = 5 - 0 - 1 = 4
(chính xác)
i = 1
thì index = 5 - 1 - 1 = 3
(chính xác)
- .... (tương tự)
Chương trình cuối cùng của bạn được sửa như sau:
#include <conio.h>
#include <stdio.h>
void main()
{
int A[100];
int n;
printf("Nhap vao so luong phan tu cua mang la: ");
scanf("%d", &n);
//nhap mang
for(int i=0; i<n; i++)
{
printf("Nhap phan tu thu %d: ", i);
scanf("%d", &A[i]);
}
//dao nguoc mang
for(int i=0; i< n/2; i++)
{
int index = n - i - 1;
int tmp = A[index];
A[index] = A[i];
A[i] = tmp;
}
//xuat mang
for(int i=0; i<n; i++)
{
printf("%4d", A[i]);
}
printf("\n");
}
Correct me if I'm wrong ^^!