-
实验目的
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.
-
调试过程
-
调试代码
-
#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.
#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程序设计—谭浩强》