c语言程序判断关系R在集合A是否等价、相容、偏序

这是我们离散老师布置的第二次程序作业,有些写的不好的地方,需要改进的地方,希望大佬们指出来,希望大家多多包涵和支持,哈哈。

输入的要求

输入:集合A元素的个数,关系R的关系矩阵,
输出:判断关系R在集合A是否等价、相容、偏序

算法思想

判断关系R在集合A是否等价、相容、偏序,也就是判断关系R是否满足自反,对称,反对称,传递这些性质。
等价:自反,对称,传递
相容:自反,对称
偏序:自反,反对称,传递
所以只要写四个函数判断关系R是否满足自反,对称,反对称,传递
自反:关系矩阵的角对角线全为1
对称:若<x,y>=1则<y,x>=1,写函数时,只要判读关系矩阵的上三角或下三角即可。判断<x,y>等于<y,x>即可,若出现<x,y>不等于<y,x>,则不符合对称。
反对称:若<x,y>=1,则<y,x>=0,写函数时,也只要判读关系矩阵的上三角或下三角即可。判断<x,y>不等于<y,x>即可,若出现<x,y>等于<y,x>,则不符合对称。
传递:需要遍历除对角线外的整个关系矩阵,列如,碰见关系矩阵位置的[i][j], 则应找到第j行,不为0的一一匹配,(例如第j行的[j][p]),则组成[i][p]若不等于1,则不符合传递的性质,若全部符合,则符合传递的性质。

代码

第一个头文件const.h

#pragma once


#define TRUE			 1
#define FALSE			 0
#define OK				 1
#define ERROR			 1
#define INFEASIBLE		-1
#define OVERFLOW		-2


typedef int Status;

第二个文件Function.h

#pragma once

#include<cstdio>
#include<iostream>

#include"const.h"

using namespace std;


Status Reflexive(int arr[50][50],int num)//判断是否自反
{
	int i,flag=0;

	for (i = 0; i < num; i++)
	{
		if (arr[i][i] == 1)
		{
			flag++;
		}
	}
	if (flag == num)
		return OK;
	else
		return FALSE;

}

Status Symmetry(int arr[50][50], int num)//判断是否对称
{
	int i, j;
	int flag = 0;
	for (i = 0; i < num-1; i++)
	{
		for (j = i+1; j < num; j++)
		{
			if (arr[i][j] != arr[j][i])
				flag = 1;
		}
	}
	if (flag == 0)
		return OK;
	else
		return FALSE;
}

Status Asymmetry(int arr[50][50], int num)//判断是否为反对称
{
	int i, j;
	int flag = 0;
	for (i = 0; i < num - 1; i++)
	{
		for (j = i + 1; j < num; j++)
		{
			if (arr[i][j]==1 && arr[j][i]==1)
				flag = 1;
		}
	}
	if (flag == 0)
		return OK;
	else
		return FALSE;
}

Status Transitive(int arr[50][50], int num)//判断是否传递
{
	int i, j;
	int p1;
	int flag = 0;

	for (i = 0; i < num; i++)
	{
		for (j = 0; j < num; j++)
		{
			if (i != j)
			{
				if (arr[i][j] == 1)
				{
					for (p1 = 0; p1 < num; p1++)
					{
						if (arr[j][p1] == 1)
						{
							if (arr[i][p1] != 1)
								flag = 1;
						}
					}
				}
			}
		}
	}
	if (flag == 0)
		return OK;
	else
		return FALSE;

}

源文件Collection_Relationship.cpp

#include"Function.h"

//1 0 0 0 0 1 0 0 0 0 1 0 0 0 0 1
int main()
{
	int a[50];//用来存放集合A;
	int arr[50][50];//用来存放关系矩阵
	int i, j,num;//num存集合元素个数

	cout << "请输入集合A的个数:";
	//printf("请输入集合A的个数:");
	//scanf("%d", &num);
	cin >> num;

	//printf("请输入集合A的所有元素\n");
	cout << "请输入集合A的所有元素"<<endl;
	for (i = 0; i < num; i++)
		//scanf("%d", &a[i]);
		cin >> a[i];

	//printf("请输入关系矩阵(按行序输入)\n");
	cout << "请输入关系矩阵R(按行序输入)" << endl;
	for (i = 0; i < num; i++) {
		for (j = 0; j < num; j++) {
			//scanf("%d", &arr[i][j]);
			 cin >> arr[i][j];
		}
	}


	int mark1=0, mark2=0, mark3 = 0,mark4=0;

	mark1 = Reflexive(arr, num);
	mark2 = Symmetry(arr, num);
	mark3 = Asymmetry(arr, num);
	mark4 = Transitive(arr, num);

	if (mark1 == 1 && mark2 == 1&& mark4 == 1)
		cout << "关系R在A上是等价的" << endl;
	else
		cout << "关系R在A上不是等价的" << endl;
	if (mark1 == 1 && mark2 == 1)
		cout << "关系R在A上是相容的" << endl;
	else
		cout << "关系R在A上不是是相容的" << endl;
	if (mark1 == 1 && mark3 == 1 && mark4 == 1)
		cout << "关系R是A的一个偏序关系" << endl;
	else
		cout << "关系R不是A的一个偏序关系" << endl;

	cin.get();
	cin.get();
	return OK;
}

输出结果

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

  • 20
    点赞
  • 57
    收藏
    觉得还不错? 一键收藏
  • 9
    评论
评论 9
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值