/* Kadai043 		    */
/* 3×3 の arrayA の転置行列を求め、それと arrayB との行列同士の積を求めるプログラム
を作成せよ。		    */
/* 2026.7.6 H.Funayama  */
#include <stdio.h>
#define ARRAYSIZE 3

int main(void) {
    int arrayA[ARRAYSIZE][ARRAYSIZE] = { {1,1,1},{2,2,2}, {3,3,3} };
    int arrayB[ARRAYSIZE][ARRAYSIZE] = { {1,1,1},{1,1,1}, {1,1,1} };

    int transA[ARRAYSIZE][ARRAYSIZE]; // Aの転置行列
    int arrayC[ARRAYSIZE][ARRAYSIZE]; // 積の結果
    int i, j, k;

    /*転置行列*/
    for (i = 0; i < ARRAYSIZE; i++) {
        for (j = 0; j < ARRAYSIZE; j++) {
            transA[i][j] = arrayA[j][i];
        }
    }

    /*行列の積 */
    for (i = 0; i < ARRAYSIZE; i++) {
        for (j = 0; j < ARRAYSIZE; j++) {
            arrayC[i][j] = 0;
            for (k = 0; k < ARRAYSIZE; k++) {
                arrayC[i][j] += transA[i][k] * arrayB[k][j];
            }
        }
    }

    for (i = 0; i < ARRAYSIZE; i++) {
        for (j = 0; j < ARRAYSIZE; j++)
            printf("%3d", transA[i][j]);

        if (i == ARRAYSIZE / 2)
            printf(" × ");
        else
            printf("   ");

        for (j = 0; j < ARRAYSIZE; j++)
            printf("%3d", arrayB[i][j]);

        if (i == ARRAYSIZE / 2)
            printf(" = ");
        else
            printf("   ");

        for (j = 0; j < ARRAYSIZE; j++)
            printf("%3d", arrayC[i][j]);

        printf("\n");
    }

    printf("\n終了します。\n");

    return 0;
}

