/*
    http://t...content-available-to-author-only...h.net/test/read.cgi/tech/1354070278/618
        618 名前：デフォルトの名無しさん [sage]： 2012/12/28(金) 19:37:31.49  
        [1] 授業単元：プログラミング演習 ２
        [2] 問題文(含コード&リンク)
        行列の積を計算する関数multの関数プロトタイプ宣言が以下のように記述されている
        void mult(double ＊ma, double ＊mb, double ＊mc, int n);
        いま、定数Nの値がmain関数の外で#define N 3 と定義されている。N×Nの正方行列maとmb,そしてmcはmain関数の中で
        double ma[N][N];
        double mb[N][N];
        double mc[N][N] = { 0.0 } ;
        と定義されている。このとき関数multを次のように呼び出して行列の積mc=ma • mb を計算したい。
        mult((double ＊)ma, (double ＊)mb, (double ＊)mc, N);
        関数multをブラケット演算子[]なしで書き上げなさい。
        [3.1] OS： unix
        [3.2] コンパイラ名とバージョン： gcc
        [3.3] 言語： C
        [4] 期限：1月まで（出来れば早めにお願いします） 
*/
#include<stdio.h>

#define N  (3)

void mult(double *ma, double *mb, double *mc, int n)
{
    int i, j, k;
    double sum;
    for (j = 0; j < n; j++) {
        for (i = 0; i < n; i++) {
            sum = 0.0;
            for (k = 0; k < n; k++) {
                sum += *(ma + j * n + k) * (*(mb + k * n + i));
            }
            *(mc + j * n + i) = sum;
        }
    }
}

void print_matrix(double *x, char *s)
{
    int i, j;
    printf("%s =\n", s);
    for (j = 0; j < N; j++) {
        printf("  | ");
        for (i = 0; i < N; i++) {
            printf("%f ", *(x + j * N + i));
        }
        printf("|\n");
    }
}

int main()
{
    double ma[N][N] = { {1.0, 2.0, -1.0}, {3.0, 2.0, 1.0}, {0.0, 1.0, 2.0} };
    double mb[N][N] = { {1.0, -2.0, -1.0}, {1.0, 2.0, 1.0}, {3.0, 1.0, 2.0} };
    double mc[N][N] = { 0.0 };

    mult((double *) ma, (double *) mb, (double *) mc, N);
    print_matrix((double *) ma, "ma");
    print_matrix((double *) mb, "mb");
    print_matrix((double *) mc, "mc = ma * mb");

    return 0;
}