【离散数学】集合上二元关系性质判定的实现(c语言实现)


在这里插入图片描述

实验

实验内容

对任意二元关系集合,判定其是否具有自反性、对称性、传递性、反对称性、反自反性,如果不具有某性质,需输出至少一个反例。

实验要求

要求:

  • 输入:集合X的元素个数(不超过5个元素,必 做);
  • X上关系的序偶个数(选做) 输出关系矩阵(由程序随机生成)
  • 输出性质描述,不具备的性质需给出反例描

在这里插入图片描述

输出样例

输出样例如下图:

[外链图片转存中…(img-T6pl6erM-1719884717385)]

具体实现

具体实现可以参考如下方式。

关系矩阵的初始化和打印

我们将关系矩阵存入一个二维数组中,因为集合元素个数不会超过5个,所以就用一个5行5列二维数组来表示。

在我们得到了集合元素个数之后我们就可以对数组进行0,1随机赋值

//初始关系矩阵
void init_matrix(int array[][5], int n)
{
	for (int i = 0; i < n; i++)
	{
		for (int j = 0; j < n; j++)
		{
			array[i][j] = rand() % 2;
		}
	}
}

//打印矩阵
void print_matrix(int array[][5], int n)
{
	for (int i = 0; i < n; i++)
	{
		for (int j = 0; j < n; j++)
		{
			printf("%d ", array[i][j]);
		}
		printf("\n");
	}
}

验证自反性

自反性的验证就是主对角线上元素是不是全为1,直接使用循环判断就行。

//验证自反性
void judge_introspect(int array[][5], int n)
{
	n--;
	while (n >= 0)
	{
		if (array[n][n] != 1)
		{
			printf("不满足自反性,因为第%d行第%d列应该为1\n", n+1, n+1);
			return;
		}	
		n--;
	}
	printf("满足自反性\n");
}

验证反自反性

反自反性的验证就是主对角线上元素只要有一个不是1那就满足反自反性,同样使用循环直接判断就行。

//验证反自反性
void judge_irreflexive(int array[][5], int n)
{
	n--;
	while (n >= 0)
	{
		if (array[n][n] != 0)
		{
			printf("不满足反自反性,因为第%d行第%d列应该为0\n", n+1, n+1);
			return;
		}
		n--;
	}
	printf("满足反自反性\n");
}

验证对称性

对称性就是关于主对角线对称相等,同样使用循环直接判断就行。

//验证对称性
void judge_symmetry(int array[][5], int n)
{
	for (int i = 0; i < n; i++)
	{
		for (int j = 0; j < n; j++)
		{
			if (array[i][j] != array[j][i])
			{
				printf("不满足对称性,因为第%d行第%d列和第%d行第%d列不同时为%d\n", i+1, j+1, j+1, i+1, array[i][j]);
				return;
			}
		}
	}
	printf("满足对称性\n");
}

验证反对称性

反对称性就是如果两个元素相等,那么它一定是行列相等的元素。

//验证反对称性
void judge_antisymmetry(int array[][5], int n)
{
	for (int i = 0; i < n; i++)
	{
		for (int j = 0; j < n; j++)
		{
			if (array[i][j] == array[j][i] && i != j)
			{
				printf("不满足反对称性,因为第%d行第%d列和第%d行第%d列同时为%d\n", i+1, j+1, j+1, i+1, array[i][j]);
				return;
			}
		}
	}
	printf("满足反对称性\n");
}

验证传递性

就是arr[a][b] == 1并且arr[a][c] == 1并且arr[c][b] == 1。

我在这用了三个循环来判断,是最笨的方法,如果有好办法请给在评论区分享一下。

//验证传递性
void judge_transfer(int array[][5], int n)
{
	int flag = 0;
	for (int i = 0; i < n; i++)
	{
		for (int j = 0; j < n; j++)
		{
			if (array[i][j] == 1 && i !=j)
			{
				for(int m = 0; m < n; m++)
				{
					if (((array[i][m] == 1 && array[m][j] != 1) || 
						(array[i][m] == 1 && array[m][j] != 1))
						&& m != i && m != j)
					{
						printf("不满足传递性因为第%d行第%d列为%d,第%d行第%d列为%d,第%d行第%d列也为%d\n",
							i + 1, m + 1, array[i][m], m + 1, j + 1, array[m][j], i + 1, j + 1, array[i][j]);
						
						flag++;
						break;
					}
				}
			}
		}
	}
	if (flag == 0)
	{
		for (int i = 0; i < n; i++)
		{
			for (int j = 0; j < n; j++)
			{
				if (array[i][j] == 1 && i != j)
				{
					int m = 0;
					while (1)
					{
						m = rand() % n;
						if (m != i && m != j)
						{
							break;
						}
					}
					printf("满足传递性因为第%d行第%d列为1,第%d行第%d列为1,第%d行第%d列也为1\n", i + 1, m + 1, m + 1, j + 1, i + 1, j + 1);
				}
			}
		}
	}
}

源码

源码呈上:

# define _CRT_SECURE_NO_WARNINGS 1
#include<stdio.h>
#include<time.h>
#include<stdlib.h>

//初始关系矩阵
void init_matrix(int array[][5], int n)
{
	for (int i = 0; i < n; i++)
	{
		for (int j = 0; j < n; j++)
		{
			array[i][j] = rand() % 2;
		}
	}
}

//打印矩阵
void print_matrix(int array[][5], int n)
{
	for (int i = 0; i < n; i++)
	{
		for (int j = 0; j < n; j++)
		{
			printf("%d ", array[i][j]);
		}
		printf("\n");
	}
}
//验证自反性
void judge_introspect(int array[][5], int n)
{
	n--;
	while (n >= 0)
	{
		if (array[n][n] != 1)
		{
			printf("不满足自反性,因为第%d行第%d列应该为1\n", n+1, n+1);
			return;
		}	
		n--;
	}
	printf("满足自反性\n");
}
//验证反自反性
void judge_irreflexive(int array[][5], int n)
{
	n--;
	while (n >= 0)
	{
		if (array[n][n] != 0)
		{
			printf("不满足反自反性,因为第%d行第%d列应该为0\n", n+1, n+1);
			return;
		}
		n--;
	}
	printf("满足反自反性\n");
}
//验证对称性
void judge_symmetry(int array[][5], int n)
{
	for (int i = 0; i < n; i++)
	{
		for (int j = 0; j < n; j++)
		{
			if (array[i][j] != array[j][i])
			{
				printf("不满足对称性,因为第%d行第%d列和第%d行第%d列不同时为%d\n", i+1, j+1, j+1, i+1, array[i][j]);
				return;
			}
		}
	}
	printf("满足对称性\n");
}
//验证反对称性
void judge_antisymmetry(int array[][5], int n)
{
	for (int i = 0; i < n; i++)
	{
		for (int j = 0; j < n; j++)
		{
			if (array[i][j] == array[j][i] && i != j)
			{
				printf("不满足反对称性,因为第%d行第%d列和第%d行第%d列同时为%d\n", i+1, j+1, j+1, i+1, array[i][j]);
				return;
			}
		}
	}
	printf("满足反对称性\n");
}
//验证传递性
void judge_transfer(int array[][5], int n)
{
	int flag = 0;
	for (int i = 0; i < n; i++)
	{
		for (int j = 0; j < n; j++)
		{
			if (array[i][j] == 1 && i !=j)
			{
				for(int m = 0; m < n; m++)
				{
					if (((array[i][m] == 1 && array[m][j] != 1) || 
						(array[i][m] == 1 && array[m][j] != 1))
						&& m != i && m != j)
					{
						printf("不满足传递性因为第%d行第%d列为%d,第%d行第%d列为%d,第%d行第%d列也为%d\n",
							i + 1, m + 1, array[i][m], m + 1, j + 1, array[m][j], i + 1, j + 1, array[i][j]);
						
						flag++;
						break;
					}
				}
			}
		}
	}
	if (flag == 0)
	{
		for (int i = 0; i < n; i++)
		{
			for (int j = 0; j < n; j++)
			{
				if (array[i][j] == 1 && i != j)
				{
					int m = 0;
					while (1)
					{
						m = rand() % n;
						if (m != i && m != j)
						{
							break;
						}
					}
					printf("满足传递性因为第%d行第%d列为1,第%d行第%d列为1,第%d行第%d列也为1\n", i + 1, m + 1, m + 1, j + 1, i + 1, j + 1);
				}
			}
		}
	}
}
int main()
{
	srand((unsigned int)time(NULL));
	//用随机数生成集合数
	int num = rand() % 5 + 1;
	int relationMatrix[5][5] = { 0 };//关系矩阵
	init_matrix(relationMatrix, num);//初始关系矩阵
	print_matrix(relationMatrix, num);//打印矩阵
	judge_introspect(relationMatrix, num);//验证自反性
	judge_irreflexive(relationMatrix, num);//验证反自反性
	judge_symmetry(relationMatrix, num);//验证对称性
	judge_antisymmetry(relationMatrix, num);//验证反对称性
	judge_transfer(relationMatrix, num);//验证传递性
	return 0;
}
  • 22
    点赞
  • 14
    收藏
    觉得还不错? 一键收藏
  • 9
    评论
以下是Python实现二元关系性质判定的代码和解释: ```python # 定义一个函数,判断是否为自反关系 def is_reflexive(relation, elements): for element in elements: if (element, element) not in relation: return False return True # 定义一个函数,判断是否为对称关系 def is_symmetric(relation): for x, y in relation: if (y, x) not in relation: return False return True # 定义一个函数,判断是否为传递关系 def is_transitive(relation): for x, y in relation: for z, w in relation: if y == z and (x, w) not in relation: return False return True # 定义一个函数,判断是否为等价关系 def is_equivalence(relation, elements): return is_reflexive(relation, elements) and is_symmetric(relation) and is_transitive(relation) # 定义一个函数,判断是否为偏序关系 def is_partial_order(relation, elements): return is_reflexive(relation, elements) and is_transitive(relation) # 测试代码 relation = {(1, 1), (1, 2), (2, 1), (2, 2), (3, 3)} elements = [1, 2, 3] print(is_reflexive(relation, elements)) # 输出:True print(is_symmetric(relation)) # 输出:True print(is_transitive(relation)) # 输出:True print(is_equivalence(relation, elements)) # 输出:True print(is_partial_order(relation, elements)) # 输出:True ``` 解释: 以上代码定义了五个函数,分别用于判断二元关系是否为自反关系、对称关系、传递关系、等价关系和偏序关系。其中,is_reflexive函数判断是否为自反关系,is_symmetric函数判断是否为对称关系,is_transitive函数判断是否为传递关系,is_equivalence函数判断是否为等价关系,is_partial_order函数判断是否为偏序关系。这些函数都接受两个参数,一个是表示二元关系集合,另一个是元素的列表。测试代码中,我们定义了一个关系集合和元素列表,并分别调用了这些函数进行测试。
评论 9
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值