实验原理
首先输入集合元素个数,再输入集合元素循环放入数组中,接着输入关系将其转换为关系矩阵,最后调用judge函数输出性质。
#include<iostream>
#define MAX 10
using namespace std;
void judge(int a[][MAX],int n); //判断关系性质
int main()
{
int n,tmp1=0,tmp2=0,x=0,y=0;
string relation; //存放关系
int coll[MAX]; //存放集合元素
int rela[MAX][MAX] = { 0 }; //关系矩阵
cout << "请输入集合元素个数:" << endl;
cin >> n;
cout << "请输入集合元素(用空格分开):" << endl;
for (int i = 0; i < n; i++)
{
cin >> coll[i];
}
cout << "请按序偶输入关系(格式为{<x,y>,...}):" << endl;
cin >> relation;
for (int i = 0; i < relation.size(); i++)
{
if (relation[i] == '<') //遇到'<'开始录入
{
while (relation[++i] != ',')
{
x = x * 10 + relation[i] - '0'; //字符转数字
}
while (relation[++i] != '>')
{
y = y * 10 + relation[i] - '0';
}
for (int j = 0; j < n; j++) //找出元素对应的下标
{
if (coll[j] == x)
tmp1 = j;
if (coll[j] == y)
tmp2 = j;
}
rela[tmp1][tmp2] = 1;
x = y = 0;
}
}
judge(rela,n);
return 0;
}
void judge(int a[][MAX],int n)
{
int sum1=0,sum2=0,sum3=0,flag=1;
for (int i = 0; i <n ; i++) //计算对角线的和
{
sum1 += a[i][i];
}
if (sum1 == n) //全为1
cout << "该关系满足自反性。" << endl;
if(sum1 == 0) //全为0
cout<< "该关系满足反自反性。" << endl;
for (int i = 0; i < n; i++)
{
for (int j = 0; j <i; j++)
{
if (a[i][j] + a[j][i] == 1) //不对称
sum2++;
if (a[i][j] + a[j][i] == 2) //对称
sum3++;
}
}
if (sum2 == 0)
cout << "该关系满足对称性。" << endl;
if (sum3 == 0)
cout << "该关系满足反对称性。" << endl;
for (int i = 0; i < n; i++)
{
for (int j = 0; j < n; j++)
{
if (a[i][j]==1)
for (int k = 0; k < n; k++)
{
if (a[j][k] == 1 && a[i][k] == 0) //只有当xRy,yRz存在,xRz不存在才表示无传递性
flag = 0;
}
}
}
if(flag)
cout<< "该关系满足传递性。" << endl;
}
注意:
空关系、恒等关系这类特殊关系要考虑善意的推断。
本文介绍了一个通过输入集合元素和关系描述,构造关系矩阵并判断其是否满足自反性、反自反性、对称性和反对称性的程序。通过实例演示了如何使用C++实现这一过程,并关注了特殊关系的处理。
3219

被折叠的 条评论
为什么被折叠?



