Đây là một dạng bài tập tương đối cơ bản giúp cho việc luyện tập code lập trình C/C++ mang lại hiệu quả rất tốt.
Kiểm tra ma trận vuông đối xứng trong lập trình C/C++
Thế nào là ma trận vuông đối xứng, thì trong môn học Đại số tuyến tính, một ma trận vuông đối xứng là một ma trận vuông A, bằng chính ma trận chuyển vị của nó (ma trận chuyển vị là một ma trận mà ở đó các hàng được thay thế bằng các cột, và ngược lại).
Mỗi phần tử của một ma trận đối xứng thì đối xứng qua đường chéo chính.
Ví dụ về 1 ma trận vuông đối xứng.
Và đâu là đường chéo chính, đường chéo phụ thì bạn xem hình bên dưới. Đỏ là đường chéo chính, xanh là đường chéo phụ.
Bạn sẽ thấy là các phần tử mảng sẽ đối xứng nhau qua đường chéo chính(không tính các phần tử nằm trên đường chéo).
Vậy ta sẽ viết chương trình C++ kiểm tra ma trận vuông đối xứng như sau:
#include<iostream>
#include<cmath>
#define maxn 100
using namespace std;
//Hàm nhập vào ma trận vuông
void nhap(int a[][maxn],int &n)
{
cout<<"nhap n: "; cin>>n;
for(int i=0;i<n;i++)
for(int j=0;j<n;j++)
{
cout<<"A["<<i<<"]["<<j<<"] = ";
cin>>a[i][j];
}
}
//Hàm xuất ma trận vuông
void xuat(int a[][maxn],int n)
{
for(int i=0;i<n;i++)
{
for(int j=0;j<n;j++)
cout<<a[i][j]<<" ";
cout<<endl;}
}
//Hàm kiểm tra ma trận đối xứng
int doixung(int a[][maxn],int n)
{
//Duyệt vong lặp để kiểm tra các phần từ
for(int i=0;i<n;i++)
{
for(int j=i+1;j<n;j++)
{
if(a[i][j] != a[j][i]) return false; //Nếu gặp 1 cặp phần tử đối xứng mà không bằng nhau kết luận luân là ma trân không đối xứng
}
}
//Nếu duyệt hết vòng lặp kg gặp cặp nào đối xứng qua trục khác nhau thì kl ma trận đối xứng
return true;
}
int main()
{
int a[maxn][maxn];
int n;
nhap(a,n);
xuat(a,n);
if(doixung(a,n)==1)
cout<<" ma tran co doi xung qua duong cheo chinh";
else
cout<<" ma tran khong doi xung qua duong cheo chinh";
}
Chuyển đổi chương trình sang thuần C
- 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<math.h>
#define maxn 100
void nhap(int a[][maxn], int *n)
{
printf("Nhap n: ");
scanf("%d",n);
int i, j;
for(i=0;i< *n;i++)
for(j=0;j< *n;j++)
{
printf("A[%d][%d] = ",i,j);
scanf("%d",&a[i][j]);
}
}
void xuat(int a[][maxn],int n)
{
int i, j;
for(i=0;i<n;i++)
{
for(j = 0;j<n; j++){
printf("%d ",a[i][j]);
}
printf("\n");
}
}
int doixung(int a[][maxn],int n)
{
int i, j;
for(i=0;i<n;i++)
{
for(j=i+1;j<n;j++)
{
if(a[i][j] != a[j][i]) return 0;
}
}
return 1;
}
int main()
{
int n;
int a[maxn][maxn];
nhap(a, &n);
xuat(a,n);
if(doixung(a, n)==1)
{
printf("Mang doi xung qua duong cheo chinh");
}
else
{
printf("Mang khong doi xung qua duong cheo chinh");
}
}
Và dưới đây là kết quả khi chạy chương trình
Đối với trường hợp ma trận đối xứng
Đỗi với trường hợp ma trận không đối xứng
[Xem tất cả bài viết chủ đề C/C++ tại đây]