实验一   判断关系R是否为自反关系及对称关系

A)功能

已知关系R由关系矩阵M给出,要求判断由M表示的这个关系是否为自反关系和对称关系。

B)基本思想

   从给定的关系矩阵来判关系R是否为自反、对称、是很容易的。若MR的关系矩阵)的主对角线元素均为1,则R是自反关系;若M为对称矩阵,则R是对称关系。因为R为自反的、对称的是等价关系的必要条件,所以,本算法可以作为判等价关系算法的子程序给出。因此,在程序中设置标志变量F,若R是自反的、对称的。则F=1,否则F=0

 

实验二  判关系R是否为可传递关系

A)功能

给出关系R的关系矩阵M,判关系R是否为可传递的。

B)基本思想

一个关系R的可传递性定义告诉我们,若关系R是可传递的,则必有:mik=1mkj=1  mij=1。这个式子也可改写成为: mij =0  mik =0mkj=0。我们就是根据后一个公式来完成判断可传递性这一功能的。同算法3.1一样,可传递性也是等价关系的必要条件。因此,在这里也设置标志变量FF=1标志关系R是可传递的,F=0标志关系R是不可传递的。

代码如下
头文件
Matrix.h
class Matrix
{
public:
    Matrix(
int n);
    ~Matrix();
    void revilt(); 
//自反
    void sym();    
//对称
    void printMatrix(); 
//输出
    void transfer();
//传递
    
int F();        //记录R的性质
private:
    
int n;
    
int **a;
    bool f1;
    bool f2;
    bool f3;
};
//Matrix.cpp
#include 
"matrix.h"
#include 
<stdlib.h>
#include 
<iostream>
#include 
<time.h>

using namespace std;

 Matrix::Matrix(
int h)
{
    bool f2
=false;
    bool f1
=false;
    bool f3
=false;
    n
=h;
    a
= new int *[n];
    
for(int k=0;k<n;k++)
        a[k] 
= new int[n];
    srand((unsigned)
time(NULL));
    
for(int i=0;i<n;i++)
    {
        
for(int j=0;j<n;j++)
        {
            
if(rand()%2==0)
                a[i][j]
=0;
            
else
                a[i][j]
=1;
        }
    }
}


 void Matrix::printMatrix()
 {
     
for(int m=0;m<n;m++)
     {
         
for(int j=0;j<n;j++)
            cout
<<" "<<a[m][j]<<flush;
         cout
<<endl;
     }
 }


 Matrix::~Matrix()
 {
 }


void Matrix::revilt()
{
    bool flag1
=true;
    bool flag2
=true;
    
    
for(int i=0;i<n;i++)
    {
        
if(a[i][i]!=1)
            flag1
=false;
        
if(a[i][i]!=0)
            flag2
=false;
    }
    
if(flag1==true)
    {
        cout
<<"R是自反的!"<<endl;
        f1
=true;
    }
    
else if(flag2==true)
        cout
<<"R是反自反的!"<<endl;
    
else
        cout
<<"R既不是自反的也不是反自反的!"<<endl;
}


void Matrix::sym()
{
    
int i,j;
    bool flag3
=true;
    
for(i=0;i<n;i++)
        
for(j=0;j<n;j++)
            
if(a[i][j]!=a[j][i])
                flag3
=false;
    
if(flag3)
    {
        cout
<<"R是对称的!!"<<endl;
        f2
=true;
    }
    
else
        cout
<<"R非对称"<<endl;

}


int Matrix::F()
{
    
if(f1==true && f2==true && f3==true)
        return 
1;
    
else
        return 
0;
}


void Matrix::transfer()
{
    bool flag
=true;
    
int a2[20][20];
    
for(int i=0;i<n;i++){
                    
        
for(int x=0;x<n;x++){
            
int m=0;
            
for(int y=0;y<n;y++)
                m
+=a[i][y]*a[y][x];
            
if(m>1)
                m
=1;
            a2[i][x] 
= m;
            }
        }
                
    cout
<<"the M*M is "<<endl;
    
for(int i=0;i<n;i++) {
        
for(int j=0;j<n;j++) {
            cout
<<" "<<a2[i][j]<<flush;
            }
            cout
<<endl;
        }
        
for(int i=0;i<n;i++)
            
for(int j=0;j<n;j++)
                {
                    
if(a2[i][j]==1 && a[i][j]!=1) flag=false
                }
                
if(flag)
                {
                    cout
<<"这个是传递矩阵"<<endl;
                    f3 
=true;
                }
                
else
                    cout
<<"这个是不传递矩阵"<<endl;
}
//主函数 MatrixMain.cpp
#include 
<iostream>
#include 
"Matrix.h"
using namespace std;
int main()
{
    Matrix a(
3);
    cout
<<"关系R所对应矩阵为"<<endl;
    a.printMatrix();
    a.revilt();
    a.sym();
    a.transfer();
    cout
<<"F="<<a.F()<<endl;
    return 
0;
}