实验目的
Using C-language to achieve the Join and Meet operation of Boolean matrices.
实验内容
Input two matrices A and B, and calculate and output the meet of A and B, the join of A and B.
使用环境
Win 11 & visual studio code 2022
算法介绍
Algorithm: Define an array of variable sizes in a large range, input the number(0&1) to get the matrix. Use pointer function branches to determine the return address, calculate by retrieves the value in the address.
Input: matrices A and B
Output: the meet of A and B, the join of A and B.
Take Meet operation as an example
Begin: Compares whether the first digit of the array A is 0, if so, return the digit
Step 1: if not, comparing whether the second digit of the array B is 1. If so, return the second digit.
Step 2: if not, still return the second digit.
End: Compare them in order like this.
调试过程
调试代码
objectivec
#include <stdio.h>
void input(int rows, int cols, int ar[][256]);
int* join(int rows, int cols, int ar1[][256], int ar2[][256]);
int* meet(int rows, int cols, int ar1[][256], int ar2[][256]);
int main(void)
{
int M, N, i, j, * p;
printf("please decide Rows and Columns of matrix: ");
scanf("%d %d", &M, &N);
int arry1[256][256];
int arry2[256][256];
input(M, N, arry1);
printf("the next matrix ");
input(M, N, arry2);
printf("the meet of A and B:\n");
for (i = 0; i <N; i++)
{
for (j = 0; j < M; j++)
{
p = meet(i, j, arry1, arry2);
printf("%d ", *p);
}
printf("\n");
}
printf("\n");
printf("the join of A and B:\n");
for (i = 0; i < N; i++)
{
for (j = 0; j < M; j++)
{
p = join(i, j, arry1, arry2);
printf("%d ", *p);
}
printf("\n");
}
getchar();
}
void input(int rows, int cols, int ar[][256])
{
int i, j;
printf("input: ");
for (i = 0; i < rows; i++)
for (j = 0; j < cols; j++)
{
scanf("%d", &ar[i][j]);
getchar();
}
}
int* meet(int rows, int cols, int ar1[][256], int ar2[][256])
{
if (0 == ar1[rows][cols]) return &ar1[rows][cols];
else
{
if (1 == ar2[rows][cols]) return &ar2[rows][cols];
else return &ar2[rows][cols];
}
}
int* join(int rows, int cols, int ar1[][256], int ar2[][256])
{
if (1 == ar1[rows][cols]) return &ar1[rows][cols];
else
{
if (0 == ar2[rows][cols]) return &ar2[rows][cols];
else return &ar2[rows][cols];
}
}
Another way to achieve the goal, the code removed the function of obtaining input.
objectivec
#include <stdio.h>
void fun1(int (*P)[3]);
void meet(int (*P)[3],int (*Q)[3]);
void join(int (*P)[3],int (*Q)[3]);
void main()
{
int arr1[3][3] = {{1, 0, 1}, {0, 1, 0}, {1, 1, 0}};
int arr2[3][3] = {{0, 0, 1}, {1, 1, 0}, {0, 1, 1}}; //初始化数组
fun1(arr1);
printf("the other matrix: \n");
fun1(arr2);
printf("A∧B\n");
meet(arr1,arr2);
printf("A∨B\n");
join(arr1,arr2);
getchar();
}
void fun1(int (*P)[3]) //打印二维数组
{
int i, j;
for (i = 0; i < 3; i++)
{
for (j = 0; j < 3; j++)
{
printf("%2d", *(*(P + i) + j));
}
printf("\n");
}
}
void meet(int (*P)[3],int (*Q)[3])
{
int i, j;
for (i = 0; i < 3; i++)
{
for (j = 0; j < 3; j++)
{
if (0 == *(*(P + i) + j)) printf("%2d", *(*(P + i) + j));
else
{
if (1 == *(*(Q + i) + j)) printf("%2d", *(*(Q + i) + j));
else printf("%2d", *(*(Q + i) + j));
}
}
printf("\n");
}
}
void join(int (*P)[3],int (*Q)[3])
{
int i, j;
for (i = 0; i < 3; i++)
{
for (j = 0; j < 3; j++)
{
if (1 == *(*(P + i) + j)) printf("%2d", *(*(P + i) + j));
else
{
if (0 == *(*(Q + i) + j)) printf("%2d", *(*(Q + i) + j));
else printf("%2d", *(*(Q + i) + j));
}
}
printf("\n");
}
}
运行结果
总结
This is just an algorithm that I came up with on a whim, and it might be more efficient to use Pointers of Pointers to traverse a two-dimensional array.
参考文献
《C prime plus》《C程序设计---谭浩强》