實(shí)驗(yàn)一   判斷關(guān)系R是否為自反關(guān)系及對(duì)稱關(guān)系

A)功能

已知關(guān)系R由關(guān)系矩陣M給出,要求判斷由M表示的這個(gè)關(guān)系是否為自反關(guān)系和對(duì)稱關(guān)系。

B)基本思想

   從給定的關(guān)系矩陣來判關(guān)系R是否為自反、對(duì)稱、是很容易的。若MR的關(guān)系矩陣)的主對(duì)角線元素均為1,則R是自反關(guān)系;若M為對(duì)稱矩陣,則R是對(duì)稱關(guān)系。因?yàn)?span>R為自反的、對(duì)稱的是等價(jià)關(guān)系的必要條件,所以,本算法可以作為判等價(jià)關(guān)系算法的子程序給出。因此,在程序中設(shè)置標(biāo)志變量F,若R是自反的、對(duì)稱的。則F=1,否則F=0

 

實(shí)驗(yàn)二  判關(guān)系R是否為可傳遞關(guān)系

A)功能

給出關(guān)系R的關(guān)系矩陣M,判關(guān)系R是否為可傳遞的。

B)基本思想

一個(gè)關(guān)系R的可傳遞性定義告訴我們,若關(guān)系R是可傳遞的,則必有:mik=1mkj=1  mij=1。這個(gè)式子也可改寫成為: mij =0  mik =0mkj=0。我們就是根據(jù)后一個(gè)公式來完成判斷可傳遞性這一功能的。同算法3.1一樣,可傳遞性也是等價(jià)關(guān)系的必要條件。因此,在這里也設(shè)置標(biāo)志變量FF=1標(biāo)志關(guān)系R是可傳遞的,F=0標(biāo)志關(guān)系R是不可傳遞的。

代碼如下
頭文件
Matrix.h
class Matrix
{
public:
    Matrix(
int n);
    ~Matrix();
    void revilt(); 
//自反
    void sym();    
//對(duì)稱
    void printMatrix(); 
//輸出
    void transfer();
//傳遞
    
int F();        //記錄R的性質(zhì)
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是對(duì)稱的!!"<<endl;
        f2
=true;
    }
    
else
        cout
<<"R非對(duì)稱"<<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
<<"這個(gè)是傳遞矩陣"<<endl;
                    f3 
=true;
                }
                
else
                    cout
<<"這個(gè)是不傳遞矩陣"<<endl;
}
//主函數(shù) MatrixMain.cpp
#include 
<iostream>
#include 
"Matrix.h"
using namespace std;
int main()
{
    Matrix a(
3);
    cout
<<"關(guān)系R所對(duì)應(yīng)矩陣為"<<endl;
    a.printMatrix();
    a.revilt();
    a.sym();
    a.transfer();
    cout
<<"F="<<a.F()<<endl;
    return 
0;
}