Вычисление Транспонированной Матрицы на C

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

Введение

В этом лабораторном практикуме вы научитесь вычислять транспонированную матрицу на языке C. Практикум охватывает следующие этапы:

Чтение Размеров и Элементов: Вы узнаете, как читать размеры (строки и столбцы) матрицы и заполнять её значениями, введёнными пользователем. Этот этап закладывает основу для процесса транспонирования матрицы.

Перестановка Строк и Столбцов: Ядро транспонирования матрицы заключается в перестановке строк и столбцов исходной матрицы для создания транспонированной матрицы.

Вывод Транспонированной Матрицы: Наконец, вы научитесь отображать транспонированную матрицу, что позволит вам проверить правильность процесса транспонирования.

По завершении этого практикума вы получите глубокое понимание транспонирования матриц и сможете реализовать его на языке программирования C.

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

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

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

cd ~/project
nano matrix_transpose.c

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

#include <stdio.h>

#define MAX_ROWS 100
#define MAX_COLS 100

int main() {
    int rows, cols;
    int matrix[MAX_ROWS][MAX_COLS];

    // Чтение размеров матрицы
    printf("Введите количество строк: ");
    scanf("%d", &rows);

    printf("Введите количество столбцов: ");
    scanf("%d", &cols);

    // Ввод элементов матрицы
    printf("Введите элементы матрицы:\n");
    for (int i = 0; i < rows; i++) {
        for (int j = 0; j < cols; j++) {
            printf("Введите элемент [%d][%d]: ", i, j);
            scanf("%d", &matrix[i][j]);
        }
    }

    // Вывод исходной матрицы
    printf("\nИсходная матрица:\n");
    for (int i = 0; i < rows; i++) {
        for (int j = 0; j < cols; j++) {
            printf("%d ", matrix[i][j]);
        }
        printf("\n");
    }

    return 0;
}

Компилируем и запускаем программу:

gcc matrix_transpose.c -o matrix_transpose
./matrix_transpose

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

Введите количество строк: 3
Введите количество столбцов: 3
Введите элементы матрицы:
Введите элемент [0][0]: 1
Введите элемент [0][1]: 2
Введите элемент [0][2]: 3
Введите элемент [1][0]: 4
Введите элемент [1][1]: 5
Введите элемент [1][2]: 6
Введите элемент [2][0]: 7
Введите элемент [2][1]: 8
Введите элемент [2][2]: 9

Исходная матрица:
1 2 3
4 5 6
7 8 9

Давайте разберём ключевые части кода:

  • Мы определяем максимальный размер матрицы с помощью MAX_ROWS и MAX_COLS
  • scanf() используется для чтения входных данных пользователя о строках, столбцах и элементах матрицы
  • Вложенные циклы используются для ввода и вывода элементов матрицы
  • Программа проверяет входные данные в пределах максимального разрешённого размера матрицы

Перестановка Строк и Столбцов

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

Откройте существующий файл matrix_transpose.c:

cd ~/project
nano matrix_transpose.c

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

#include <stdio.h>

#define MAX_ROWS 100
#define MAX_COLS 100

int main() {
    int rows, cols;
    int matrix[MAX_ROWS][MAX_COLS];
    int transposed[MAX_COLS][MAX_ROWS];

    // Чтение размеров матрицы
    printf("Введите количество строк: ");
    scanf("%d", &rows);

    printf("Введите количество столбцов: ");
    scanf("%d", &cols);

    // Ввод элементов матрицы
    printf("Введите элементы матрицы:\n");
    for (int i = 0; i < rows; i++) {
        for (int j = 0; j < cols; j++) {
            printf("Введите элемент [%d][%d]: ", i, j);
            scanf("%d", &matrix[i][j]);
        }
    }

    // Транспонирование матрицы
    for (int i = 0; i < rows; i++) {
        for (int j = 0; j < cols; j++) {
            transposed[j][i] = matrix[i][j];
        }
    }

    // Вывод исходной матрицы
    printf("\nИсходная матрица:\n");
    for (int i = 0; i < rows; i++) {
        for (int j = 0; j < cols; j++) {
            printf("%d ", matrix[i][j]);
        }
        printf("\n");
    }

    // Вывод транспонированной матрицы
    printf("\nТранспонированная матрица:\n");
    for (int i = 0; i < cols; i++) {
        for (int j = 0; j < rows; j++) {
            printf("%d ", transposed[i][j]);
        }
        printf("\n");
    }

    return 0;
}

Компилируем и запускаем программу:

gcc matrix_transpose.c -o matrix_transpose
./matrix_transpose

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

Введите количество строк: 3
Введите количество столбцов: 3
Введите элементы матрицы:
Введите элемент [0][0]: 1
Введите элемент [0][1]: 2
Введите элемент [0][2]: 3
Введите элемент [1][0]: 4
Введите элемент [1][1]: 5
Введите элемент [1][2]: 6
Введите элемент [2][0]: 7
Введите элемент [2][1]: 8
Введите элемент [2][2]: 9

Исходная матрица:
1 2 3
4 5 6
7 8 9

Транспонированная матрица:
1 4 7
2 5 8
3 6 9

Ключевые моменты по транспонированию матриц:

  • Мы создаём новую матрицу transposed с изменёнными размерами
  • Транспонирование выполняется путём перестановки строк и столбцов
  • transposed[j][i] = matrix[i][j] — ключевое преобразование
  • Размеры исходной и транспонированной матриц меняются местами

Вывод Транспонированной Матрицы

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

Откройте файл matrix_transpose.c:

cd ~/project
nano matrix_transpose.c

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

#include <stdio.h>

#define MAX_ROWS 100
#define MAX_COLS 100

void printMatrix(int matrix[MAX_ROWS][MAX_COLS], int rows, int cols, const char* title) {
    printf("%s:\n", title);
    for (int i = 0; i < rows; i++) {
        for (int j = 0; j < cols; j++) {
            printf("%4d ", matrix[i][j]);
        }
        printf("\n");
    }
    printf("\n");
}

int main() {
    int rows, cols;
    int matrix[MAX_ROWS][MAX_COLS];
    int transposed[MAX_COLS][MAX_ROWS];

    // Проверка входных данных
    do {
        printf("Введите количество строк (1-%d): ", MAX_ROWS);
        scanf("%d", &rows);
    } while (rows <= 0 || rows > MAX_ROWS);

    do {
        printf("Введите количество столбцов (1-%d): ", MAX_COLS);
        scanf("%d", &cols);
    } while (cols <= 0 || cols > MAX_COLS);

    // Ввод элементов матрицы
    printf("Введите элементы матрицы:\n");
    for (int i = 0; i < rows; i++) {
        for (int j = 0; j < cols; j++) {
            printf("Введите элемент [%d][%d]: ", i, j);
            scanf("%d", &matrix[i][j]);
        }
    }

    // Транспонирование матрицы
    for (int i = 0; i < rows; i++) {
        for (int j = 0; j < cols; j++) {
            transposed[j][i] = matrix[i][j];
        }
    }

    // Вывод матриц с отформатированным выводом
    printMatrix(matrix, rows, cols, "Исходная матрица");
    printMatrix(transposed, cols, rows, "Транспонированная матрица");

    return 0;
}

Компилируем и запускаем программу:

gcc matrix_transpose.c -o matrix_transpose
./matrix_transpose

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

Введите количество строк (1-100): 3
Введите количество столбцов (1-100): 3
Введите элементы матрицы:
Введите элемент [0][0]: 1
Введите элемент [0][1]: 2
Введите элемент [0][2]: 3
Введите элемент [1][0]: 4
Введите элемент [1][1]: 5
Введите элемент [1][2]: 6
Введите элемент [2][0]: 7
Введите элемент [2][1]: 8
Введите элемент [2][2]: 9

Исходная матрица:
   1    2    3
   4    5    6
   7    8    9

Транспонированная матрица:
   1    4    7
   2    5    8
   3    6    9

Основные улучшения в этой версии:

  • Добавлена проверка входных данных для размеров матрицы
  • Создана отдельная функция printMatrix() для лучшей организации кода
  • Улучшен вывод матрицы с выравниванием формата с помощью %4d
  • Добавлено заголовки к выводу матриц для большей ясности
  • Более надёжная обработка матриц разных размеров

Резюме

В этом лабораторном практикуме вы научитесь вводить размеры и элементы матрицы, переставлять строки и столбцы, а также выводить транспонированную матрицу в программе на языке C. Сначала программа запрашивает у пользователя количество строк и столбцов, а затем позволяет ввести элементы матрицы. Затем отображается исходная матрица. Далее программа меняет местами строки и столбцы для вычисления транспонированной матрицы, и, наконец, выводится транспонированная матрица.

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