#include <stdio.h>
#include <stdlib.h> // mallocとfreeを使うために必要です

int main() {
    int rows, cols;

    // 1. 行数と列数の入力
    printf("行数を入力してください: ");
    if (scanf("%d", &rows) != 1) return 1;
    
    printf("列数を入力してください: ");
    if (scanf("%d", &cols) != 1) return 1;

    // 2. どんな環境でもエラーにならない「動的メモリ確保」による2次元配列の作成
    double **matrix = (double **)malloc(rows * sizeof(double *));
    if (matrix == NULL) {
        printf("メモリ確保に失敗しました。\n");
        return 1;
    }
    for (int i = 0; i < rows; i++) {
        matrix[i] = (double *)malloc(cols * sizeof(double));
        if (matrix[i] == NULL) {
            printf("メモリ確保に失敗しました。\n");
            return 1;
        }
    }

    // 3. 各要素に数値を入力
    printf("\n%d行 %d列の行列の要素を入力してください:\n", rows, cols);
    for (int i = 0; i < rows; i++) {
        for (int j = 0; j < cols; j++) {
            printf("要素 [%d][%d]: ", i + 1, j + 1);
            if (scanf("%lf", &matrix[i][j]) != 1) return 1;
        }
    }

    // 4. 入力された2次元配列を表示
    printf("\n--- 入力された2次元配列 ---\n");
    for (int i = 0; i < rows; i++) {
        for (int j = 0; j < cols; j++) {
            printf("%g\t", matrix[i][j]); // \tで列を綺麗に揃えます
        }
        printf("\n");
    }

    // 5. 使い終わったメモリを綺麗に片付ける（解放）
    for (int i = 0; i < rows; i++) {
        free(matrix[i]);
    }
    free(matrix);

    return 0;
}