这是我们离散老师布置的第二次程序作业,有些写的不好的地方,需要改进的地方,希望大佬们指出来,希望大家多多包涵和支持,哈哈。
输入的要求
输入:集合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;
}
输出结果