Kiểm tra đối xứng là một dạng bài tập hay dành cho việc luyện tập lập trình C/C++, đây là bài tập lập trình đơn giản dành cho người bắt đầu, tuy nhiên độ hiệu quả thì tướng đối tốt.
Kiểm tra mảng đối xứng trong lập trình C/C++
Trước tiên nói một chút về mảng đối xứng là mảng như thế nào, thì đơn giản mảng đối xứng là mảng có các phần tử trong mảng đối xứng qua trục giữa sẽ luôn bằng nhau.
Đối với mảng có số lượng phần tử chẵn, ta sẽ chia mảng ra làm 2 đoạn đúng bằng nhau và trục sẽ cắt ngang giữa 2 đoạn…ta sẽ lấy từng cặp đối xứng qua trục.
Đối với mảng có số phần tử lẻ, phần tử nằm ở giữa sẽ là trục, phần tử này ta không cần so sánh đối xứng hoặc só sánh thì sẽ so sánh với chính nó.
Vậy ý tưởng của bài toán sẽ như sau, Ta sẽ duyệt vòng lặp ở phía nửa bên trái của mảng sau đó so sánh với phần tử đối xứng bên phải mảng. Nếu tất cả các cặp số đều bằng nhau thì kết luận mảng là đối xứng, ngược lại kết luận mảng không đối xứng.
Ta viết chương trình C như sau:
#include <stdio.h>
#include <stdbool.h>
//Hàm kiểm tra mảng đối xứng
bool checkDoiXung(int n, int A[]){
int i;
//Duyệt 1 nửa mảng phia bên trái
for(i = 0;i<n/2;i++){
//Lấy phần tử thứ i phía bên trái mảng so sánh phần tử đối xứng bên phải mảng nếu có 1 cặp khác nhau ta kết luận luôn là mảng không đối xứng
if(A[i] != A[n-i-1]) return false; //A[n-i-1] là để lấy phần tử đối xứng qua trục
}
return true; //Duyệt hết vòng lặp không tìm được cặp số đối xứng nào khác nhau thì mảng này đối xứng nhau
}
int main()
{
int n;
printf("Nhap so phan tu: ");
scanf("%d,",&n);
int A[n];
int i;
for(i = 0; i<n;i++){
printf("A[%d] = ",i);
scanf("%d", &A[i]);
}
printf("\n\nMang vua nhap:\n");
for(i = 0; i<n;i++){
printf("%d ", A[i]);
}
if(checkDoiXung(n, A)) printf("\n\n =>Mang vua nhap doi xung nhau");
else printf("\n\n =>Mang vua nhap khong doi xung nhau");
}
Nếu cảm thấy hàm trên khó hiểu hơn 1 chút thì mình viết lại hàm kiểm tra đối xứng như sau, tuy nhiên khuyến khích viết code theo cách trê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%
#include <stdio.h>
#include <stdbool.h>
bool checkDoiXung(int n, int A[]){
int i;
int dem = 0;
for(i = 0;i<n;i++){
if(A[i] != A[n-i-1]){
dem++;
}
}
if(dem == 0) printf("\n\nMang doi xung nhau");
else printf("\n\nMang khong doi xung nhau");
}
int main()
{
int n;
printf("Nhap so phan tu: ");
scanf("%d,",&n);
int A[n];
int i;
for(i = 0; i<n;i++){
printf("A[%d] = ",i);
scanf("%d", &A[i]);
}
printf("\n\nMang vua nhap:\n");
for(i = 0; i<n;i++){
printf("%d ", A[i]);
}
checkDoiXung(n, A);
}
Chuyển đổi thành chương trình C++.
#include <iostream>
using namespace std;
bool checkDoiXung(int n, int A[]){
for(int i = 0;i<n/2;i++){
if(A[i] != A[n-i-1]) return false;
}
return true;
}
int main()
{
int n;
cout<<"Nhap so phan tu: ";
cin>>n;
int A[n];
int i;
for(i = 0; i<n;i++){
cout<<"A["<<n<<"] = ";
cin>>A[i];
}
cout<<"\nMang vua nhap:\n";
for(i = 0; i<n;i++){
cout<<A[i]<<" ";
}
if(checkDoiXung(n, A)) cout<<"\n\n =>Mang vua nhap doi xung nhau";
else cout<<"\n\n =>Mang vua nhap khong doi xung nhau";
}
[Xem tất cả bài viết chủ đề C/C++ tại đây]