c++实现 离散数学 “自反 对称 ” 详解
想要一个关系的实现,那么最重要的就是对于其关系原理的理解
话不多说直接开始吧!
自反性:
其实就是要求在关系图中每一个顶点都有一个环,即在关系矩阵中要求主对角线上的元素为1。
就像这样:
注意:这里的时候要每一个元素都有环,或者说在关系矩阵中主对角线都是1,才叫做具有自反性
像下面的这个,就不具有自反性了
反自反性:
听名字就可以知道,他和自反性是完全相反的,所以只要在关系图中每一个顶点都没有环,即在关系矩阵中要求主对角线上的元素为0。
像这样:
注意:这里的时候要每一个元素都没有环,或者说在关系矩阵中主对角线都是0,才叫做具有反自反性
像下面的这个,就不具有自反性了,也不具有反自反性,他啥也不是
清楚了他的原理,那么代码的思路就直接出来了
思路:他是4个元素对吧,我们其实就是在判断他主对角线0和1的个数,设立一个二维数组,来对于a[i][i]主对角线进行判断
代码:
void shuzu::zifanxing()//主要依据 { int cout0 = 0,cout1 = 0; for (int i = 1; i < 5; i++) { if (a[i][i] == 0) cout0++; else if (a[i][i] == 1) cout1++; } if (cout0 == 4) cout << "这个呢,具有自反性" << endl; else if (cout1 == 4) cout << "这个呢,具有反自反性" << endl; else cout << "这个呢,在自反方面啥也不是" << endl; }
对称性
这个就比较的好判断,在关系图中就看他有没有礼尚往来,如果具有对称性那么他一定全部!是双边,而在关系矩阵中就是直接关于主对角线对称就可以哒。
像这样:
他们是不是对称了,哈哈哈哈哈哈哈
反对称性
这个嘛,就是只有单边,没有双边,即在关系矩阵里面没有一个对称的。
超级经典的就是下三角:
在这里的话,就要注意一下,如果有单有双,那么他在对称性方面他啥也不是。主对角线上的的数不影响他的对称性,你想嘛!关于主对角线对称的话不就是他本身了
思路:
简单的来说就是履历看,a[i][j]和a[j][i],他们是不是相等。来记录他的的单边和双边,再在最后来判断。
代码:
void shuzu::duichenxing() { int cout1 = 0, cout0 = 0; for (int i = 1; i < 5; i++) for (int j = 1; j < 5; j++) { if (a[i][j] == a[j][i]) cout1++; else if (a[i][j] != a[j][i]) cout0++; } if (cout0 == 0 && cout1 != 0) cout << "这个呢,具有对称性"; else if (cout1 == 0 && cout0 != 0) cout << "这个呢,不具有对称性"; else cout << "这个呢,在对称性方面啥也不是" << endl; }
最后为了让输入输出的效率更高,我在数组那一块用了重载
重载的介绍可以看 数组输入输出流的重载
https://blog.csdn.net/weixin_52521533/article/details/116309686?spm=1001.2014.3001.5502
*
整体代码
#include <iostream> using namespace std; class shuzu { public: void display(); void zifanxing();//自反性 void duichenxing();//对称性 friend istream & operator >> (istream&input,shuzu&A); friend ostream & operator << (ostream&output, shuzu&A); private: int a[5][5];//定义一个4*4的数组,下标0不储存。 }; void shuzu::zifanxing()//主要依据 { int cout0 = 0,cout1 = 0; for (int i = 1; i < 5; i++) { if (a[i][i] == 0) cout0++; else if (a[i][i] == 1) cout1++; } if (cout0 == 4) cout << "这个呢,具有自反性" << endl; else if (cout1 == 4) cout << "这个呢,具有反自反性" << endl; else cout << "这个呢,在自反方面啥也不是" << endl; } void shuzu::duichenxing() { int cout1 = 0, cout0 = 0; for (int i = 1; i < 5; i++) for (int j = 1; j < 5; j++) { if (a[i][j] == a[j][i]) cout1++; else if (a[i][j] != a[j][i]) cout0++; } if (cout0 == 0 && cout1 != 0) cout << "这个呢,具有对称性"; else if (cout1 == 0 && cout0 != 0) cout << "这个呢,不具有对称性"; else cout << "这个呢,在对称性方面啥也不是" << endl; } void shuzu::display() { for (int i = 1; i < 5; i++) for (int j = 1; j < 5; j++) cin >> a[i][j]; } ostream & operator << (ostream&ou, shuzu&A) { for (int i = 1; i < 5; i++) for (int j = 1; j < 5; j++) ou << A.a[i][j]; return ou; } istream & operator >> (istream&in, shuzu&A) { for (int i = 1; i < 5; i++) for (int j = 1; j < 5; j++) in >> A.a[i][j]; return in; } int main() { shuzu A; cin>>A; A.duichenxing(); A.zifanxing(); return 0; }