#include <iostream>

using namespace std;

int** create_matrix(int rows, int cols){ // создание матрицы
    int **matrix = new int *[rows]; // создание массива matrix с размером rows
	for (int i = 0; i < rows; i++){ // цикл от 0 до rows
		matrix[i] = new int [cols]; // создание массива с размером cols в текущем элементе
	}
    return matrix; // возвращение созданной матрицы
}

void input_matrix_elements(int **matrix, int rows, int cols){ // ввод элементов матрицы
    cout << endl << "Input elements of matrix: " << endl;
    for (int i = 0; i < rows; i++){
		for (int j = 0; j < cols; j++){
            cin >> matrix[i][j];
        }
		cout << endl;
	}
}

void output_matrix(int **matrix, int rows, int cols){ // вывод элментов матрицы
    for (int i = 0; i < rows; i++){
		for (int j = 0; j < cols; j++){
            cout << matrix[i][j] << "\t";
        }
		cout << endl;
	}
}

int** matrix_transposition(int **matrix, int rows, int cols){ // транспонирование матрицы
    int **new_matrix = create_matrix(cols, rows); // создание матрицы new_matrix с размером cols на rows
    for (int i = 0; i < rows; i++){ // цикл от 0 до rows
        for (int j = 0; j < cols; j++){ // цикл от 0 до cols
            new_matrix[j][i] = matrix[i][j]; // присваиваем элементу new_matrix под индексами [j][i] значение matrix под индексами [i][j]
        }
    }
    return new_matrix; // возвращаем транспонированную матрицу
}

void delete_matrix(int **matrix, int iterations){ // удаление матрицы
    for (int i = 0; i < iterations; i++){ // цикл от 0 до iterations
        delete[] matrix[i]; // удаление текущего элемента матрицы
    }
    delete[] matrix; // удаление матрицы
}

int main(){
	int rows, cols; // строки и столбцы матрицы

	// ввод размера матрицы 
	cout << "Input rows of matrix: " << endl;
	cin >> rows;

	cout << "Input cols of matrix: " << endl;
	cin >> cols;
	
	// если размер меньше 0, то завершаем программу
	if ((rows < 1) || (cols < 1)){
		cout << "Size cannot be less than 1." << endl;
		return 0;
	}

	// инициализация матрицы с указанными размерами
    int **matrix = create_matrix(rows, cols);

	// ввод матрицы
    input_matrix_elements(matrix, rows, cols);

	// вывод матрицы
    cout << endl << "Entered matrix: " << endl;
	output_matrix(matrix, rows, cols);

    // Транспонирование введённой матрицы
    int **new_matrix = matrix_transposition(matrix, rows, cols);

    // вывод полученной матрицы
    cout << endl << "Transposed matrix: " << endl;
    output_matrix(new_matrix, cols, rows);

    // очистка ОЗУ
    delete_matrix(matrix, rows);
    delete_matrix(new_matrix, cols);
	// завершение программы
	return 0;
}
