题解:
偏序性需满足自反性、反对称性和传递性即可。
先将数据输入到集合A中,在将关系输入到二维数组R中,模拟集合A上的二元关系R,在写函数判断R数组上是否具有自反性反对称性和传递性,如果都满足则具有偏序性。
代码:
#include<iostream>
using namespace std;
int A[100];
int R[100][100] = { 0 };//全局变量,初始化R的二维数组为0,意为无(x,y)
int main()
{
bool isInA(int x, int y, int max);
bool isZF(int max);
bool isAntiDC(int max);
bool isCD(int max);
int x, y;//二维数组的下标
int N, T;//需要输入的数组的个数
cout << "Please enter the number of sets A: ";
cin >> N;//输入集合A的个数
int max = 0;//用于寻找集合中最大的元素,便于后面判断各种关系
//输入集合A
cout << "Please enter sets A: " << endl;
cout << ">>";
for (int i = 0; i < N; i++)
{
cin >> A[i];
if (max < A[i])
max = A[i];
cout << ">>" ;
}
//输入二维数组即关系R
cout << "Please enter the number of sets R: ";
cin >> T;
cout << "Please enter sets R: " << endl;
bool f = true;//用于判断x和y是否在数组A上
while (T--)
{
cin >> x >> y;
//判断x和y是否在A上,如果是则输入到关系R上
if (isInA(x, y, max))
R[x][y] = 1;
else
f = false;
}
//判断是否具有偏序关系
if (f && isZF(max) && isAntiDC(max) && isCD(max))
cout << "在集合A上R具有偏序关系" << endl;
else
cout << "在集合A上R无偏序关系" << endl;
return 0;
}
//判断关系R是否在A上
bool isInA(int x, int y, int max)
{
max++;//也可将后面for循环中的‘<’换成‘<=’,这样就不用max++
int f = 0;
for (int i = 0; i < max; i++)
{
if (x == A[i])
{
f++;
break;
}
}
for (int j = 0; j < max; j++)
{
if (y == A[j])
{
f++;
break;
}
}
if (f == 2)
return true;
return false;
}
//判断是否具有自反性
bool isZF(int max)
{
for (int i = 0; i <= max; i++)
{
if (!R[i][i])
return false;
}
return true;
}
//判断是否具有反对称性
bool isAntiDC(int max)
{
for (int i = 0; i <= max; i++)
{
for (int j = 0; j <= max; j++)
{
if (i == j)
continue;
else
{
if (R[i][j] * R[j][i])
return false;
}
}
}
return true;
}
//判断是否具有传递性
bool isCD(int max)
{
for (int i = 0; i <= max; i++)
{
for (int j = 0; j <= max; j++)
{
if (R[i][j])
{
for (int k = 0; k <= max; k++)
{
if (R[j][k])
if (!R[i][k])
return false;
}
}
}
}
return true;
}