#include <stdio.h>
#include <stdlib.h>
// (Ⅱ)整数値を要素にもつk 行m 列行列A とm 行n 列行列B を宣言し，それらの要素をキーボー
// ドから入力してA×B を算出するプログラムを作成せよ．ただし，k，m，n はk≠m，m≠n，k≧2，
// m≧2，n≧2 を満たす任意の値をプログラム内で各自設定してよい．ただし，A×B の値を画面
// 表示する前に，k 行n列行列C に値を代入しておくこと．

char matName;
int mode;

// prototype
void input(int *a, int x, int y);
void calc(int *a1, int x1, int y1, int *a2, int x2, int y2, int *c);
void display(int *a, int x, int y);
void clear(int *a, int x, int y);


void calc(int *a1, int x1, int y1, int *a2, int x2, int y2, int *c)
{
  int i, j;

  for ( i = x1 * y1; i--;)
    for ( j = x2 * y2; j--;)
      if ((i % y1) == (j / y2))
        *(c + (i / y1) *y2 + (j % y2)) += *(a1 + i) **(a2 + j);
}

void display(int *a, int x, int y)
{
  int i;
  for ( i = x * y; i--;) {
    printf("%d ", *a++);
    if (i % y == 0) putchar('\n');
  }
  putchar('\n');
}

void input(int *a, int x, int y)
{
  int i, j;

  for ( i = 0; i < x; ++i)
    for ( j = 0; j < y; ++j) {
      if (mode) {
        printf("%c[%d][%d]=", matName, i, j );
        scanf("%d", a++);
      } else {
        *a++ = rand() % 10;
      }
    }
}

void clear(int *a, int x, int y)
{
  int i;
  for ( i = x * y; i--;) *a++ = 0;
}


int main()
{
  int k = 3, m = 2, n = 4;
  int A[k][m];
  int B[m][n];
  int C[k][n];

  printf("0:debug  1:manual\n" );
  scanf("%d", &mode);

  matName = 'A';
  input(*A, k, m);
  matName = 'B';
  input(*B, m, n);

  clear(*C, k, n);
  calc(*A, k, m, *B, m, n, *C);
  display(*A, k, m);
  display(*B, m, n);
  display(*C, k, n);

  return 0;
}
