/*********
 行列の積
*********/
#include <stdio.h>

#define   NUM_N  3     /*Aの行数の指定*/
#define   NUM_L  4     /*Aの列数とBの行数の指定*/
#define   NUM_M  5     /*Bの列数の指定*/

void main(void)
{
    float a[NUM_N][NUM_L];   /*行列A*/
    float b[NUM_L][NUM_M];   /*行列B*/
    float c[NUM_N][NUM_N];   /*積を格納する行列C*/
    int i;
    int j;
    int k;

    /*行列Aの各行iについて以下の操作を繰り返す*/
    for(i=0; i<NUM_N; i++)

        /*各列jについて行列Aのij成分を入力する*/
        for(j=0; j<NUM_L; j++){
            printf("A[%d,%d]=",i+1,j+1);
            scanf("%f",&a[i][j]);
        }

    /*行列Bの各行iについて以下の操作を繰り返す*/
    for(i=0; i<NUM_L; i++)

        /*各列jについて行列Bのij成分を入力する*/
        for(j=0; j<NUM_M; j++){
            printf("B[%d,%d]=",i+1,j+1);
            scanf("%f",&b[i][j]);
        }

    /*各行iについて以下の操作を繰り返す*/
    for(i=0; i<NUM_N; i++)

        /*各列jについて以下の操作を繰り返す*/
        for(j=0; j<NUM_M; j++){

            /*配列の初期化*/
            c[i][j]=0;
            /*kを0からNUM_Lまで変化させながら以下の操作を繰り返す*/
            for(k=0; k<NUM_L; k++)

                /*Cのij成分にAのij成分*Bのjk成分を加える*/
                c[i][j] += a[i][k]*b[k][j];
        }

    printf("\n");
    printf("C:\n");
    /*各行iについて以下の操作を繰り返す*/
    for(i=0; i<NUM_N; i++){

        /*各列jについて行列Cのi行j列の値を出力する*/
        for(j=0; j<NUM_M; j++)
            printf("%10.5f",c[i][j]);

        /*改行する*/
        printf("\n");
    }
}
