#include<stdio.h>
#include<conio.h>
#include<Windows.h>
#pragma warning (disable : 4996)

const max = 3; // 행렬의 차수를 위한 상수
// 3x3 행렬을 위한 자료형
typedef int matrix[3][3];
matrix c, d, e;

// 함수 원형 
void mat_compute(matrix, matrix);
void print_matrix(matrix);

void main()
{
	int i, j;
	matrix a, b;
	putchar('\n');
	printf("3x3인 부울행렬 A를 입력 \n(0과 1만 사용함)\n");
	printf("예) 0 1 0\n    0 0 0\n    1 0 1\n\n");

	// 사용자가 입력할 부울행렬을 a에 저장
	for (i = 0; i < max; i++)
	{
		for (j = 0; j < max; j++)
		{
			scanf("%d", &a[i][j]);
		}
	}
	printf("\n 3x3인 부울행렬 B를 입력\n");
	// 사용자가 입력할 부울행렬을 b에 저장
	for (i = 0; i < max; i++)
	{
		for (j = 0; j < max; j++)
		{
			scanf("%d", &b[i][j]);
		}
	}

	// 부울행렬 a와 b에 대해 접합, 교합, 부울곱을 계산하는 함수 호출
	mat_compute(a, b);
	putchar('\n');

	// 접합 결과를 출력
	printf("A MEET B\n");
	print_matrix(c);
	putchar('\n');
	// 교합 결과를 출력
	printf("A JOIN B\n");
	print_matrix(d);
	putchar('\n');
	// 부울곱 결과를 출력
	printf("A Boolean product B\n");
	print_matrix(e);
	system("PAUSE");
}

// mat_compute 함수가 a와 b에 대해 접합, 교합, 부울곱 계산
void mat_compute(matrix a, matrix b)
{
	int i, j, k;
	// 접합, 교합, 부울곱 계산을 위해 삼중 for 문 사용
	for (i = 0; i < max; i++)
	{
		for (j = 0; j < max; j++)
		{
			for (k = 0; k < max; k++)
			{
				c[i][j] = a[i][j] & b[i][j];            // 접합
				d[i][j] = a[i][j] | b[i][j];   // 교합
							   // 부울곱
				if (k == 0)
				{
					e[i][j] = a[i][k] * b[k][j];
				}
				else
				{
					e[i][j] = e[i][j] | (a[i][k] & b[k][j]);
				}
			}
		}
	}
}

// print_matrix 함수가 부울행렬 x를 출력
void print_matrix(matrix x)
{
	int i, j;
	for (i = 0; i < max; i++)
	{
		putchar('\n');
		for (j = 0; j < max; j++)
		{
			printf("%2d", x[i][j]);
		}
	}
	putchar('\n');
}