Проверка симметричности матрицы на языке C

CBeginner
Практиковаться сейчас

Введение

В этом лабораторном занятии (lab) вы узнаете, как проверить, является ли матрица симметричной на языке программирования C. В рамках лабораторного занятия рассматриваются следующие шаги: чтение размеров и элементов матрицы, проверка симметричности матрицы путем сравнения элементов в симметричных позициях и вывод информации о том, является ли матрица симметричной или нет. В лабораторном занятии предоставляется пошаговое руководство с примерами кода, которые помогут вам понять процесс проверки симметричности матрицы на языке C.

Лабораторное занятие начинается с демонстрации того, как прочитать размеры и элементы матрицы с использованием языка программирования C. Затем вводится логика проверки симметричности матрицы путем сравнения элементов в симметричных позициях. Наконец, в лабораторном занятии показано, как вывести результат, указывающий, является ли матрица симметричной или нет.

Чтение размеров и элементов

На этом шаге вы узнаете, как прочитать размеры и элементы матрицы на языке программирования C для проверки симметричности матрицы. Мы создадим программу, которая позволит пользователям вводить размер и элементы матрицы.

Сначала создадим новый файл на языке C для нашей программы по проверке симметричности матрицы:

cd ~/project
nano symmetric_matrix.c

Теперь добавим следующий код для чтения размеров и элементов матрицы:

#include <stdio.h>

#define MAX_SIZE 100

int main() {
    int n, matrix[MAX_SIZE][MAX_SIZE];

    // Read matrix dimensions
    printf("Enter the size of the square matrix: ");
    scanf("%d", &n);

    // Read matrix elements
    printf("Enter matrix elements:\n");
    for (int i = 0; i < n; i++) {
        for (int j = 0; j < n; j++) {
            printf("Enter element [%d][%d]: ", i, j);
            scanf("%d", &matrix[i][j]);
        }
    }

    // Print the entered matrix
    printf("\nEntered Matrix:\n");
    for (int i = 0; i < n; i++) {
        for (int j = 0; j < n; j++) {
            printf("%d ", matrix[i][j]);
        }
        printf("\n");
    }

    return 0;
}

Скомпилируйте и запустите программу:

gcc symmetric_matrix.c -o symmetric_matrix
./symmetric_matrix

Пример вывода:

Enter the size of the square matrix: 3
Enter matrix elements:
Enter element [0][0]: 1
Enter element [0][1]: 2
Enter element [0][2]: 3
Enter element [1][0]: 2
Enter element [1][1]: 4
Enter element [1][2]: 5
Enter element [2][0]: 3
Enter element [2][1]: 5
Enter element [2][2]: 6

Entered Matrix:
1 2 3
2 4 5
3 5 6

Разберем основные части кода:

  • #define MAX_SIZE 100 устанавливает максимальный размер матрицы, чтобы предотвратить переполнение буфера
  • scanf() используется для чтения размеров матрицы и отдельных элементов
  • Вложенные циклы используются для ввода и отображения элементов матрицы
  • Программа позволяет пользователю ввести квадратную матрицу любого размера до 100x100

Проверка условия A[i][j] = A[j][i]

На этом шаге вы измените предыдущую программу, чтобы проверить, является ли матрица симметричной, сравнивая элементы по строкам и столбцам.

Откройте существующий файл и обновите код:

cd ~/project
nano symmetric_matrix.c

Замените предыдущий код следующей реализацией:

#include <stdio.h>
#include <stdbool.h>

#define MAX_SIZE 100

int main() {
    int n, matrix[MAX_SIZE][MAX_SIZE];
    bool is_symmetric = true;

    // Read matrix dimensions
    printf("Enter the size of the square matrix: ");
    scanf("%d", &n);

    // Read matrix elements
    printf("Enter matrix elements:\n");
    for (int i = 0; i < n; i++) {
        for (int j = 0; j < n; j++) {
            printf("Enter element [%d][%d]: ", i, j);
            scanf("%d", &matrix[i][j]);
        }
    }

    // Check symmetry
    for (int i = 0; i < n; i++) {
        for (int j = 0; j < n; j++) {
            if (matrix[i][j]!= matrix[j][i]) {
                is_symmetric = false;
                break;
            }
        }
        if (!is_symmetric) break;
    }

    // Print symmetry result
    if (is_symmetric) {
        printf("\nThe matrix is symmetric.\n");
    } else {
        printf("\nThe matrix is not symmetric.\n");
    }

    return 0;
}

Скомпилируйте и запустите программу:

gcc symmetric_matrix.c -o symmetric_matrix
./symmetric_matrix

Пример вывода для симметричной матрицы:

Enter the size of the square matrix: 3
Enter matrix elements:
Enter element [0][0]: 1
Enter element [0][1]: 2
Enter element [0][2]: 3
Enter element [1][0]: 2
Enter element [1][1]: 4
Enter element [1][2]: 5
Enter element [2][0]: 3
Enter element [2][1]: 5
Enter element [2][2]: 6

The matrix is symmetric.

Пример вывода для несимметричной матрицы:

Enter the size of the square matrix: 3
Enter matrix elements:
Enter element [0][0]: 1
Enter element [0][1]: 2
Enter element [0][2]: 3
Enter element [1][0]: 4
Enter element [1][1]: 5
Enter element [1][2]: 6
Enter element [2][0]: 7
Enter element [2][1]: 8
Enter element [2][2]: 9

The matrix is not symmetric.

Основные моменты в коде:

  • Булева переменная is_symmetric отслеживает симметрию матрицы
  • Вложенные циклы сравнивают matrix[i][j] с matrix[j][i]
  • Если какие - либо элементы различаются, is_symmetric устанавливается в false
  • Программа прерывает выполнение циклов заранее, если обнаружена асимметрия

Вывод информации о симметричности матрицы

На этом последнем шаге вы улучшите программу, чтобы получить более детальный вывод о симметричности матрицы, и создадите функцию для повышения модульности кода.

Откройте существующий файл и обновите код:

cd ~/project
nano symmetric_matrix.c

Замените предыдущий код следующей реализацией:

#include <stdio.h>
#include <stdbool.h>

#define MAX_SIZE 100

// Function to check matrix symmetry
bool is_symmetric_matrix(int matrix[MAX_SIZE][MAX_SIZE], int n) {
    for (int i = 0; i < n; i++) {
        for (int j = 0; j < n; j++) {
            if (matrix[i][j] != matrix[j][i]) {
                return false;
            }
        }
    }
    return true;
}

// Function to print matrix
void print_matrix(int matrix[MAX_SIZE][MAX_SIZE], int n) {
    printf("\nMatrix:\n");
    for (int i = 0; i < n; i++) {
        for (int j = 0; j < n; j++) {
            printf("%4d ", matrix[i][j]);
        }
        printf("\n");
    }
}

int main() {
    int n, matrix[MAX_SIZE][MAX_SIZE];

    // Read matrix dimensions
    printf("Enter the size of the square matrix: ");
    scanf("%d", &n);

    // Read matrix elements
    printf("Enter matrix elements:\n");
    for (int i = 0; i < n; i++) {
        for (int j = 0; j < n; j++) {
            printf("Enter element [%d][%d]: ", i, j);
            scanf("%d", &matrix[i][j]);
        }
    }

    // Print the entered matrix
    print_matrix(matrix, n);

    // Check and print symmetry status
    if (is_symmetric_matrix(matrix, n)) {
        printf("\nSymmetry Analysis:\n");
        printf("✓ The matrix is symmetric.\n");
        printf("  - All elements A[i][j] are equal to A[j][i]\n");
        printf("  - Matrix is invariant under transpose\n");
    } else {
        printf("\nSymmetry Analysis:\n");
        printf("✗ The matrix is not symmetric.\n");
        printf("  - Some elements A[i][j] are not equal to A[j][i]\n");
    }

    return 0;
}

Скомпилируйте и запустите программу:

gcc symmetric_matrix.c -o symmetric_matrix
./symmetric_matrix

Пример вывода для симметричной матрицы:

Enter the size of the square matrix: 3
Enter matrix elements:
Enter element [0][0]: 1
Enter element [0][1]: 2
Enter element [0][2]: 3
Enter element [1][0]: 2
Enter element [1][1]: 4
Enter element [1][2]: 5
Enter element [2][0]: 3
Enter element [2][1]: 5
Enter element [2][2]: 6

Matrix:
   1    2    3
   2    4    5
   3    5    6

Symmetry Analysis:
✓ The matrix is symmetric.
  - All elements A[i][j] are equal to A[j][i]
  - Matrix is invariant under transpose

Пример вывода для несимметричной матрицы:

Enter the size of the square matrix: 3
Enter matrix elements:
Enter element [0][0]: 1
Enter element [0][1]: 2
Enter element [0][2]: 3
Enter element [1][0]: 4
Enter element [1][1]: 5
Enter element [1][2]: 6
Enter element [2][0]: 7
Enter element [2][1]: 8
Enter element [2][2]: 9

Matrix:
   1    2    3
   4    5    6
   7    8    9

Symmetry Analysis:
✗ The matrix is not symmetric.
  - Some elements A[i][j] are not equal to A[j][i]

Основные улучшения:

  • Добавлена функция is_symmetric_matrix() для лучшей организации кода
  • Создана функция print_matrix() для отображения содержимого матрицы
  • Улучшен вывод с детальным анализом симметричности
  • Использованы визуальные индикаторы (✓/✗) для выделения статуса симметричности

Резюме

В этом лабораторном занятии (lab) вы узнаете, как прочитать размеры и элементы матрицы на языке программирования C, а затем проверить, является ли матрица симметричной. Сначала вы создадите программу, которая позволит пользователям вводить размер и элементы матрицы. Затем вы измените программу, чтобы проверить симметричность матрицы, убедившись, что каждый элемент A[i][j] равен соответствующему элементу A[j][i]. Наконец, вы выведете информацию о том, является ли матрица симметричной или нет.

Основные моменты, которые вы освоите на завершенных шагах, включают чтение размеров и элементов матрицы с использованием функции scanf(), отображение введенной матрицы и сравнение элементов матрицы для определения ее симметричности. Программа позволяет пользователю ввести квадратную матрицу любого размера до 100x100.