离散数学实验三 关系性质判断

一、实验目的
熟悉关系的性质,掌握求判断关系性质的方法
二、实验内容

定义1 设R是集合X上的二元关系,对任意的x∈X,都满足∈R,则R是自反的。
定义2 设R是集合X上的二元关系,对任意的x∈X,都满足R,则R是反自反的。
定义3 设R是集合X上的二元关系,对任意的x,y∈X,满足∈R∈R,则R是对称的。
定义4 设R是集合X上的二元关系,对任意的x,y∈X,满足∈R∧∈Rx=y,则R是反对称的。X`
定义5 设R是集合X上的二元关系,对任意的x,y,z∈X,满足∈R∧∈R∈R,则R是传递的。
本实验要求从键盘输入一个关系的关系矩阵,判断该关系是否是自反的、对称的、传递的、反自反的、反对称的。用C语言或MATLAB实现。

三、实验源程序及结果截图
1.实验源程序:

#include 
#include 

int main() {
	int i,j,n;
	//输入关系矩阵,只能输入0或1,若不是0或1,提示输入错误并结束程序 
	printf("请输入关系矩阵阶数n:\n");
	scanf("%d",&n);
	int a[n][n];
	printf("请输入关系矩阵真值(0或1):\n");
	for(i=0;i<n;i++){
		for(j=0;j<n;j++){
			scanf("%d",&a[i][j]);
		}
	}
	for(i=0;i<n;i++){
		for(j=0;j<n;j++){
			if(a[i][j]!=0&&a[i][j]!=1){
				printf("输入错误!");
				return 0;
			}
		}
	}
	//判断是否为自反矩阵(自反矩阵主对角线元素全为1) 
	for(i=0;i<n;i++){
		if(a[i][i]!=1)break; 	
	}
	if(i==n)printf("该关系矩阵是自反的\n");
	else if(i<n)printf("该关系矩阵不是自反的\n");
	//判断是否为反自反矩阵(反自反矩阵主对角线元素全为0)
	 for(i=0;i<n;i++){
		if(a[i][i]!=0)break; 	
	}
	if(i==n)printf("该关系矩阵是反自反的\n");
	else if(i<n)printf("该关系矩阵不是反自反的\n");
	//判断是否为对称矩阵(对称矩阵a[i][j]==a[j][i])
	for(i=0;i<n;i++){
		for(j=0;j<n;j++){
			if(a[i][j]!=a[j][i])break;			
		}
	}
	if(i>=n&&j>=n)printf("该关系矩阵是对称的\n");
	else  printf("该关系矩阵不是对称的\n");
	//判断是否为反对称矩阵(反对称矩阵中i!=j时,a[i][j]和a[j][i]不能同时为1)
	for(i=0;i<n;i++){
		for(j=0;j<n;j++){
			if(i!=j){
				if(a[i][j]==1&&a[j][i]==1)break;
			}			
		}
	}
	if(i>=n&&j>=n)printf("该关系矩阵是反对称的\n");
	else  printf("该关系矩阵不是反对称的\n");
	//判断是否为传递矩阵(传递矩阵若a[i][j]==1并且a[j][k]==1则a[i][k]一定为1)
	int k;
	for(i=0;i<n;i++){
		for(j=0;j<n;j++){
			for(k=0;k<n;k++){
				if(a[i][j]==1&&a[j][k]==1){
					if(a[i][k]!=1)break;
				}
			}
						
		}
	}
	if(i>=n&&j>=n&&k>=n)printf("该关系矩阵是传递的\n");
	else  printf("该关系矩阵不是传递的\n");
	return 0;
}

2.运行结果:
(1)三阶矩阵
离散数学实验三 关系性质判断_第1张图片
(2)四阶矩阵
离散数学实验三 关系性质判断_第2张图片
(3)输入错误
离散数学实验三 关系性质判断_第3张图片
四、实验的分析与思考

1、实验分析
首先要清楚各个矩阵的性质:自反矩阵主对角线元素全为1,反自反矩阵主对角线元素全为0,对称矩阵a[i][j]==a[j][i],反对称矩阵中i!=j时,a[i][j]和a[j][i]不能同时为1,传递矩阵若a[i][j]==1并且a[j][k]==1则a[i][k]一定为1。

2、问题与思考
一开始运行程序时如果有多个真值输入错误,运行界面会显示多次“输入错误!”,后来发现是将scanf("%d",&a[i][j]);和if(a[i][j]!=0&&a[i][j]!=1){printf(“输入错误!”);}写到了一个循环中。
之后发现提示输入错误后后面仍然会输出自反矩阵、对称矩阵等,检查后发现在检查真值是否输入错误的for循环中写的是break而不是return 0,只是退出了for循环,程序没有结束。
一开始不知道怎样用程序表示出所有该判断的条件全成立(比如自反矩阵主对角线元素全为1),后来想到可以用for循环对条件逐个进行判断,如果有一个不成立就推出for循环,最后在循环外判断i,如果i>=n则条件全成立。

你可能感兴趣的:(离散数学实验三 关系性质判断)