Kiểm tra ma trận vuông đối xứng trong lập trình C/C++

Kiem tra ma tran doi xung

Đâ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.

Kiểm tra ma trận vuông đối xứng trong C/C++(Mảng 2 chiều đố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ụ.

Kiểm tra ma trận vuông đối xứng trong C/C++(Mảng 2 chiều đối xứng)

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

#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

Kiểm tra ma trận vuông đối xứng trong lập trình C/C++

Đỗi với trường hợp ma trận không đối xứng

Kiểm tra ma trận vuông đối xứng trong lập trình C/C++

[Xem tất cả bài viết chủ đề C/C++ tại đây]