欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

C++實(shí)現(xiàn)關(guān)系與關(guān)系矩陣的代碼詳解

 更新時(shí)間:2022年04月04日 08:54:04   作者:Festu  
這篇文章主要介紹了C++實(shí)現(xiàn)關(guān)系與關(guān)系矩陣,功能實(shí)現(xiàn)包括關(guān)系的矩陣表示,關(guān)系的性質(zhì)判斷及關(guān)系的合成,本文結(jié)合示例代碼給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下

ADT

集合

template<class Type>    //集合的元素類型
class Set{  //集合ADT
    int size;   //基數(shù)
    vector<Type> p;
    
    public:
    Set():size(0){}
    Set(int s):size(s){
        p.resize(s);    //重置大小
    }
    int getSize()const{ return size; }
    void push(Type e){  //添加元素
        size++;
        p.push_back(e);
    void set(int pos,Type e){   //設(shè)置元素值
        p[pos]=e;
    Type operator[](int i){ return p[i]; }  //下標(biāo)讀取
    int findElem(Type e){   //返回指定元素的下標(biāo)
        for(int i=0;i<size;i++){
            if(p[i]==e) return i;
        }
        return -1;
};

關(guān)系

template<class Type>
class Relation{
    Set<Type> dom;    //定義域
    Set<Type> ran;    //值域
    
    public:
    Relation():dom(),ran(){}  //無規(guī)模的初始化
    Relation(int r_,int c_):dom(r_),ran(c_){}   //有規(guī)模的初始化
    int getR()const { return dom.getSize(); }     //返回行,基類私有成員只可調(diào)用基類非私有函數(shù)獲得
    int getC()const { return ran.getSize(); }     //返回列
    Set<Type> getDom()const { return dom; }     //返回定義域
    Set<Type> getRan()const { return ran; }     //返回值域
    void pushDom(Type e){ dom.push(e); }    //給定義域添加元素
    void pushRan(Type e){ ran.push(e); }        //給值域添加元素
    int findDom(Type e){    //尋找定義域中元素的位置
        return dom.findElem(e);
    }
    int findRan(Type e){    //尋找值域中元素的位置
        return ran.findElem(e);
};

關(guān)系矩陣

template<class Type>
class RMatrix:public Relation<Type>{
    vector< vector<short> > m;  //二維矩陣用vector實(shí)現(xiàn),注意不能使用bool類型,它有很高的特殊性
    public:
    RMatrix(int r_,int c_):Relation<Type>(r_,c_){
        for(int i=0;i<r_;i++){
            vector<short> v(c_,0);
            m.push_back(v);     //推入r_個(gè)長(zhǎng)度為c_的vector數(shù)組構(gòu)成一個(gè)r*c的二維數(shù)組
        }
    }
    RMatrix():Relation<Type>(){   //不輸入矩陣大小時(shí)
        for(int i=0;i<MAX_NUM;i++){
            vector<short> v(MAX_NUM,0);
            m.push_back(v);
        }
    }
    RMatrix(const RMatrix<Type> &M){  //復(fù)制構(gòu)造函數(shù)
       // printf("here!");
        Set<Type> Dom=M.getDom(),Ran=M.getRan();
        int k1=Dom.getSize(),k2=Ran.getSize();
        for(int i=0;i<k1;i++){
            Relation<Type>::pushDom(Dom[i]);
        }
        for(int i=0;i<k2;i++){
            Relation<Type>::pushRan(Ran[i]);
        }
        m.resize(k1);
        for(int i=0;i<k1;i++){
            m[i].resize(0);
            for(int j=0;j<k2;j++){
                m[i].push_back(M[i][j]);
              //  printf("%d",m[i][j]);
            }
        }
    }
    void updateSize(){   //根據(jù)定義域和值域的基數(shù)設(shè)置矩陣規(guī)模
        int row=Relation<Type>::getDom().getSize();  //在子類中調(diào)用基類函數(shù)需要制定基類
        int col=Relation<Type>::getRan().getSize();    
     //   printf("row=%d,col=%d",row,col);
        m.resize(row);
        for(int i=0;i<row;i++){
            m[i].resize(0);
            for(int j=0;j<col;j++){
                m[i].push_back(short(0));
             //   printf("%d",m[i][j]);
            }
        }
        return;
    }
    vector<short> operator[](int p1)const { return m[p1]; }    //可以直接雙括號(hào)使用!
    void set(int p1,int p2,short e){     //設(shè)置矩陣值
        m[p1][p2]=e;
    }
    void push(vector<short> v){  //添加矩陣的行
        m.push_back(v);
    }
    /* 將兩個(gè)關(guān)系矩陣合成,括號(hào)內(nèi)的在右 */
    RMatrix<Type> matrixSynthesis(const RMatrix<Type> &M1)const {
        RMatrix<Type> M;    //此處的M是臨時(shí)變量,必定被銷毀,無法作為引用被返回	(<!-1)
        Set<Type> d=Relation<Type>::getDom(),r=M1.getRan();	//矩陣合成的行列關(guān)系差點(diǎn)弄錯(cuò)!
        int k1=d.getSize(),k2=r.getSize(),k3=M1.getR();
        for(int i=0;i<k1;i++){
            M.pushDom(d[i]);
        }
        for(int i=0;i<k2;i++){
            M.pushRan(r[i]);
        }
        M.updateSize();
        for(int i=0;i<k1;i++){
            for(int j=0;j<k2;j++){
                bool f=0;
                for(int p=0;p<k3;p++){
                    if(m[i][p] && M1[p][j]) f=1;
                }
                if(f) M.set(i,j,f);
            }
        }
        return M;
    }
    void randomRelation(){  //隨機(jī)生成一段關(guān)系,需要放在updatesize之后
      //  printf("time=%d\n",time(0));       //偽隨機(jī)的實(shí)現(xiàn)需要新添加兩個(gè)文件頭
        srand(time(0));     //初始化隨機(jī)數(shù)
        int r=Relation<Type>::getR(),c=Relation<Type>::getC();
        for(int i=0;i<r;i++){
            for(int j=0;j<c;j++){
                m[i][j]=rand()%2;   //生成0或1
            }
        }
        return ;
    }
    bool isSelf()const {  //自反性檢測(cè)
        int r=Relation<Type>::getR();
        for(int i=0;i<r;i++){
            if(!m[i][i]) return 0;
        }
        return 1;
    }
    bool antiSelf()const {  //反自反性檢測(cè)
        int r=Relation<Type>::getR();
        for(int i=0;i<r;i++){
            if(m[i][i]) return 0;
        }
        return 1;
    }
    bool isSymmetric()const { //對(duì)稱性
        int r=Relation<Type>::getR();
        for(int i=0;i<r;i++){
            for(int j=i+1;j<r;j++){
                if(m[i][j]!=m[j][i]) return 0;
            }
        }
        return 1;
    }
    bool antiSymmetric()const { //反對(duì)稱性,注意都為0不違反反對(duì)稱性!
        int r=Relation<Type>::getR();
        for(int i=0;i<r;i++){
            for(int j=i+1;j<r;j++){
                if(m[i][j] && m[i][j]==m[j][i]) return 0;
            }
        }
        return 1;
    }
    bool isPassing()const {   //傳遞性
        RMatrix<Type> M_=matrixSynthesis(*this);	//const函數(shù)只能調(diào)用const函數(shù) <!-2
        int r=Relation<Type>::getR();
        for(int i=0;i<r;i++){
            for(int j=0;j<r;j++){
                if(m[i][j]==0 && M_[i][j]==1) return 0;
            }
        }
        return 1;
    }
};
  • <!-1 處若是給函數(shù)返回值加上引用會(huì)報(bào)一個(gè)警告,調(diào)用函數(shù)后集合ADT處會(huì)出現(xiàn)一個(gè)內(nèi)存錯(cuò)誤,這是因?yàn)镸此處是臨時(shí)變量,是一定被銷毀的,所以作為引用被返回當(dāng)然就出了問題,而此處不用引用是完全可行的。如果一定要用引用,也許可以考慮把M定義為靜態(tài)變量。
  • <!-2 處曾有過一個(gè)報(bào)錯(cuò):"passing 'const RMatrix<char>' as 'this' argument discards qualifiers",原因是當(dāng)時(shí)我只將 isPassing 函數(shù)設(shè)為const,卻沒把其中調(diào)用的 matrixSynthesis 函數(shù)設(shè)為const。

功能實(shí)現(xiàn)

關(guān)系的矩陣表示

根據(jù)關(guān)系輸出矩陣:

void inputRelation(RMatrix<char> &M1){    //輸入關(guān)系
    printf("請(qǐng)輸入集合A的元素:\n");
    string str;
   // cin.get();  //這里不能直接這樣寫,因?yàn)榍懊嬗锌赡苁菦]有換行符的,那你就會(huì)少讀一個(gè)字符,所以只能靈活加
    getline(cin,str);
    stringstream ss1(str);
    char inp;
    while(ss1>>inp){
        M1.pushDom(inp);
        M1.pushRan(inp);
    }
    /*
    printf("請(qǐng)輸入集合B的元素:\n");
    stringstream ss2(str);
    while(ss2>>inp){
    int k1=M1.getR(),k2=M1.getC();
    Set<char> A=M1.getDom(),B=M1.getRan();
    */
    M1.updateSize();
    printf("請(qǐng)輸入關(guān)系R:(格式為\'a,b\'并用空格分割)\n");
    stringstream ss(str);
    int a,b;
    int isA=1;
    while(ss>>inp){     //使用">>"流輸入字符類型會(huì)自動(dòng)忽略空格...抽象了,printf是讀取空格的
    //    printf("%c",inp);
        if(inp==',')
            isA=0;
        else{
            if(isA)
                a=M1.findDom(inp);
            else{
                b=M1.findRan(inp);
                isA=1;
                M1.set(a,b,1);
            }
                
        }
    printf("\n");
    return;
}
void outputMatrix(const RMatrix<char> &M1){    //格式化輸出矩陣,要定義常量成員函數(shù)
    Set<char> Dom=M1.getDom(),Ran=M1.getRan();
    printf("關(guān)系矩陣如下:\n");
    for(int i=0;i<=k1;i++){
     //   printf("here?");    //手動(dòng)斷點(diǎn)
        for(int j=0;j<=k2;j++){
            if(i==0 && j==0) printf("  ");
            else
                if(j==0) printf("%c ",Dom[i-1]);
                else
                    if(i==0) printf("%c ",Ran[j-1]);
                    else{
                        printf("%d ",M1[i-1][j-1]);
                    }
        printf("\n");
int main(){
    RMatrix<char> M1;   //設(shè)置集合的元素為字符類型
    inputRelation(M1);
    outputMatrix(M1);
    return 0;

根據(jù)矩陣輸出關(guān)系序偶:

void inputMatrix(RMatrix<char> &M1){    //輸入矩陣
    printf("請(qǐng)輸入集合A的元素:\n");
    string str;
    getline(cin,str);
    stringstream ss1(str);
    char inp;
    while(ss1>>inp){
        M1.pushDom(inp);
        M1.pushRan(inp);
    }
    /*
    printf("請(qǐng)輸入集合B的元素:\n");
    getline(cin,str);
    stringstream ss2(str);
    while(ss2>>inp){
        M1.pushRan(inp);
    }
    int k1=M1.getR(),k2=M1.getC();
    Set<char> A=M1.getDom(),B=M1.getRan();
    */
    M1.updateSize();
    printf("請(qǐng)輸入關(guān)系矩陣:(空格分隔)\n");
    int k=M1.getC(),tmp;
    for(int i=0;i<k;i++){
        for(int j=0;j<k;j++){
            scanf("%d",&tmp);
            if(tmp) M1.set(i,j,tmp);
        }
    }
    printf("\n");
    return;
}
void outputRelation(const RMatrix<char> &M1){    //格式化輸出序偶,記得定義常量成員函數(shù)
    int k1=M1.getR(),k2=M1.getC();
    Set<char> Dom=M1.getDom(),Ran=M1.getRan();
    printf("關(guān)系序偶如下:\n");
    for(int i=0;i<k1;i++){
     //   printf("here?");    //手動(dòng)斷點(diǎn)
        for(int j=0;j<k2;j++){
            if(M1[i][j]){
              //  printf("i=%d,j=%d->",i,j);
                printf("(%c,%c) ",Dom[i],Ran[j]);
            }
        }
        printf("\n");
    }
}
int main(){
    RMatrix<char> M1;   //設(shè)置集合的元素為字符類型
    inputMatrix(M1);
    outputRelation(M1);
    return 0;
}

關(guān)系的性質(zhì)判斷

I. 輸入一個(gè)包含n個(gè)元素的集合A,要求隨機(jī)產(chǎn)生3個(gè)定義在集合A上的不同的關(guān)系R1,R2,R3,其中,R1和R2是自反且對(duì)稱的,R3是反對(duì)稱的,并顯示R1,R2,R3的關(guān)系矩陣表示。

先上一個(gè)嘗試用偽隨機(jī)實(shí)現(xiàn)的算法

void inputSet(RMatrix<char> &M1){    //輸入集合
    printf("請(qǐng)輸入集合A的元素:\n");
    string str;
    getline(cin,str);
    stringstream ss1(str);
    char inp;
    while(ss1>>inp){
        M1.pushDom(inp);
        M1.pushRan(inp);
    }
    /*
    printf("請(qǐng)輸入集合B的元素:\n");
    stringstream ss2(str);
    while(ss2>>inp){
    int k1=M1.getR(),k2=M1.getC();
    Set<char> A=M1.getDom(),B=M1.getRan();
    */
    M1.updateSize();
    printf("\n");
    return;
}
void outputMatrix(const RMatrix<char> &M1){    //格式化輸出矩陣,要定義常量成員函數(shù)
    Set<char> Dom=M1.getDom(),Ran=M1.getRan();
    printf("關(guān)系矩陣如下:\n");
    for(int i=0;i<=k1;i++){
     //   printf("here?");    //手動(dòng)斷點(diǎn)
        for(int j=0;j<=k2;j++){
            if(i==0 && j==0) printf("  ");
            else
                if(j==0) printf("%c ",Dom[i-1]);
                else
                    if(i==0) printf("%c ",Ran[j-1]);
                    else{
                        printf("%d ",M1[i-1][j-1]);
                    }
        }
        printf("\n");
void getRandom(RMatrix<char> &M,bool isSelf,bool isSymmetric,bool antiSymmetric){   //后三個(gè)參數(shù)標(biāo)記函數(shù)性質(zhì),分別為自反性,對(duì)稱性,反對(duì)稱性
    while(1){
        M.randomRelation();
        if(M.isSelf()==isSelf && M.isSymmetric()==isSymmetric && M.antiSymmetric()==antiSymmetric) return;
int main(){
    RMatrix<char> M1;   //設(shè)置集合的元素為字符類型
    inputSet(M1);
    RMatrix<char> M2(M1),M3(M1);
    getRandom(M1,1,1,0);
    getRandom(M2,1,1,0);
    getRandom(M3,0,0,1);
    outputMatrix(M1);
    outputMatrix(M2);
    outputMatrix(M3);
    return 0;

構(gòu)想是挺美好的,但是偽隨機(jī)的效果讓這個(gè)方法行不通,因?yàn)殡S機(jī)的效率太低,是按秒變化的,除非直接寫在成員函數(shù)中根據(jù)一個(gè)seed一直隨機(jī),否則程序不可能通暢,但寫在成員函數(shù)也不好,太特殊。

以下是后手加工版本:

void inputSet(RMatrix<char> &M1){    //輸入集合
    printf("請(qǐng)輸入集合A的元素:\n");
    string str;
    getline(cin,str);
    stringstream ss1(str);
    char inp;
    while(ss1>>inp){
        M1.pushDom(inp);
        M1.pushRan(inp);
    }
    /*
    printf("請(qǐng)輸入集合B的元素:\n");
    getline(cin,str);
    stringstream ss2(str);
    while(ss2>>inp){
        M1.pushRan(inp);
    }
    int k1=M1.getR(),k2=M1.getC();
    Set<char> A=M1.getDom(),B=M1.getRan();
    */
    M1.updateSize();
    printf("\n");
    return;
}
void outputMatrix(const RMatrix<char> &M1,string str=""){    //格式化輸出矩陣,要定義常量成員函數(shù)
    int k1=M1.getR(),k2=M1.getC();
    Set<char> Dom=M1.getDom(),Ran=M1.getRan();
    str=str+"關(guān)系矩陣如下:\n";     //連接矩陣名稱
    printf("%s",str.c_str());
    for(int i=0;i<=k1;i++){
     //   printf("here?");    //手動(dòng)斷點(diǎn)
        for(int j=0;j<=k2;j++){
            if(i==0 && j==0) printf("  ");
            else
                if(j==0) printf("%c ",Dom[i-1]);
                else
                    if(i==0) printf("%c ",Ran[j-1]);
                    else{
                        printf("%d ",M1[i-1][j-1]);
                    }
        }
        printf("\n");
    }
}
void getRandom(RMatrix<char> &M,bool isSelf,bool isSymmetric,bool antiSymmetric){   //后三個(gè)參數(shù)標(biāo)記函數(shù)性質(zhì),分別為自反性,對(duì)稱性,反對(duì)稱性
    M.randomRelation();     //先基礎(chǔ)隨機(jī)化處理
    int r=M.getC();
    if(isSelf){     //補(bǔ)足自反性
        if(!M.isSelf()){
            for(int i=0;i<r;i++){
                M.set(i,i,1);
            }
        }
    }
    if(isSymmetric){        //補(bǔ)足對(duì)稱性
        if(!M.isSymmetric()){
            for(int i=0;i<r;i++){
                for(int j=i+1;j<r;j++){
                    if(M[i][j]!=M[j][i]) M.set(j,i,M[i][j]);
                }
            }
        }
    }
    if(antiSymmetric){      //補(bǔ)足反對(duì)稱性
        if(!M.antiSymmetric()){
            for(int i=0;i<r;i++){
                for(int j=i+1;j<r;j++){
                    if(M[i][j] && M[i][j]==M[j][i]) M.set(j,i,0);
                }
            }
        }
    }
}
int main(){
    RMatrix<char> M1;   //設(shè)置集合的元素為字符類型
    inputSet(M1);
    RMatrix<char> M2(M1),M3(M1);
    getRandom(M1,1,1,0);
    getRandom(M2,1,1,0);
    getRandom(M3,0,0,1);
    outputMatrix(M1,"R1");
    outputMatrix(M2,"R2");
    outputMatrix(M3,"R3");
    return 0;
}

輸出函數(shù)優(yōu)化了一下,可以輸出矩陣名稱了。

II.給定一個(gè)矩陣判斷其性質(zhì),并輸出結(jié)果

void inputMatrix(RMatrix<char> &M1){    //輸入矩陣
    for(int i=0;i<6;i++){
        M1.setDom(i,' ');
        M1.setRan(i,' ');
    }
    printf("請(qǐng)輸入關(guān)系矩陣:(空格分隔)\n");
    int k=6,tmp;
    for(int i=0;i<k;i++){
        for(int j=0;j<k;j++){
            scanf("%d",&tmp);
            if(tmp) M1.set(i,j,tmp);
        }
    }
    printf("\n");
    return;
}
void judgeMatrix(const RMatrix<char> &M1){
    if(M1.isSelf()) printf("具有自反性\n");
    if(M1.isSymmetric()) printf("具有對(duì)稱性\n");
    if(M1.antiSymmetric()) printf("具有反對(duì)稱性\n");
    if(M1.isPassing()) printf("具有傳遞性\n");
}
int main(){
    RMatrix<char> M1(6,6);
    inputMatrix(M1);
    judgeMatrix(M1);
    return 0;
}

關(guān)系的合成

關(guān)系合成運(yùn)算:

void outputMatrix(const RMatrix<char> &M1){    //格式化輸出矩陣,要定義常量成員函數(shù)
    int k1=M1.getR(),k2=M1.getC();
    Set<char> Dom=M1.getDom(),Ran=M1.getRan();
    printf("關(guān)系矩陣如下:\n");
    for(int i=0;i<=k1;i++){
     //   printf("here?");    //手動(dòng)斷點(diǎn)
        for(int j=0;j<=k2;j++){
            if(i==0 && j==0) printf("  ");
            else
                if(j==0) printf("%c ",Dom[i-1]);
                else
                    if(i==0) printf("%c ",Ran[j-1]);
                    else{
                        printf("%d ",M1[i-1][j-1]);
                    }
        }
        printf("\n");
    }
}
void inputRelation(RMatrix<char> &M1,RMatrix<char> &M2){    //輸入關(guān)系
    printf("請(qǐng)輸入集合A的元素:\n");
    string str;
    getline(cin,str);
    stringstream ss1(str);
    char inp;
    while(ss1>>inp){
        M1.pushDom(inp);
    }
    printf("請(qǐng)輸入集合B的元素:\n");
    getline(cin,str);
    stringstream ss2(str);
    while(ss2>>inp){
        M1.pushRan(inp);
        M2.pushDom(inp);
    }
    printf("請(qǐng)輸入集合C的元素:\n");
    getline(cin,str);
    stringstream ss3(str);
    while(ss3>>inp){
        M2.pushRan(inp);
    }
    M1.updateSize();
    M2.updateSize();
    
    printf("請(qǐng)輸入關(guān)系R1:(格式為\'a,b\'并用空格分割)\n");
    getline(cin,str);
    stringstream ss(str);
    int a,b;
    int isA=1;
    while(ss>>inp){     //使用">>"流輸入字符類型會(huì)自動(dòng)忽略空格...抽象了,printf是讀取空格的
    //    printf("%c",inp);
        if(inp==',')
            isA=0;
        else{
            if(isA)
                a=M1.findDom(inp);
            else{
                b=M1.findRan(inp);
                isA=1;
                M1.set(a,b,1);
            }
                
        }
    }
    printf("R1");
    outputMatrix(M1);
    printf("請(qǐng)輸入關(guān)系R2:(格式為\'a,b\'并用空格分割)\n");
    getline(cin,str);
    stringstream ss_(str);
    isA=1;
    while(ss_>>inp){     //使用">>"流輸入字符類型會(huì)自動(dòng)忽略空格...抽象了,printf是讀取空格的
    //    printf("%c",inp);
        if(inp==',')
            isA=0;
        else{
            if(isA)
                a=M2.findDom(inp);
            else{
                b=M2.findRan(inp);
                isA=1;
                M2.set(a,b,1);
            }
                
        }
    }
    printf("R2");
    outputMatrix(M2);
    printf("\n");
    return;
}
RMatrix<char> multiplyMatrix(const RMatrix<char> &M1,const RMatrix<char> &M2){  //默認(rèn)集合元素就是char類型~
    RMatrix<char> M;
        Set<char> d=M1.getDom(),r=M2.getRan();
        int k1=d.getSize(),k2=r.getSize(),k3=M2.getR();
        for(int i=0;i<k1;i++){
            M.pushDom(d[i]);
        }
        for(int i=0;i<k2;i++){
            M.pushRan(r[i]);
        }
        M.updateSize();
        for(int i=0;i<k1;i++){
            for(int j=0;j<k2;j++){
                int f=0;
                for(int p=0;p<k3;p++){
                    if(M1[i][p] && M2[p][j]) f+=1;
                }
                if(f) M.set(i,j,f);
            }
        }
        return M;
}
void outputRelation(const RMatrix<char> &M1){    //格式化輸出序偶,記得定義常量成員函數(shù)
    int k1=M1.getR(),k2=M1.getC();
    Set<char> Dom=M1.getDom(),Ran=M1.getRan();
    printf("關(guān)系序偶如下:\n");
    for(int i=0;i<k1;i++){
     //   printf("here?");    //手動(dòng)斷點(diǎn)
        for(int j=0;j<k2;j++){
            if(M1[i][j]){
              //  printf("i=%d,j=%d->",i,j);
                printf("(%c,%c) ",Dom[i],Ran[j]);
            }
        }
        printf("\n");
    }
}
void getCalculate(const RMatrix<char> &M1,const RMatrix<char> &M2){
    RMatrix<char> M=M1.matrixSynthesis(M2);     //布爾積運(yùn)算
    printf("布爾積運(yùn)算所得的");
    outputMatrix(M);    //輸出布爾積結(jié)果
    RMatrix<char> M_=multiplyMatrix(M1,M2);     //矩陣乘積運(yùn)算
    printf("矩陣乘積所得的");
    outputMatrix(M_);
    outputRelation(M);
    return;
}
int main(){
    RMatrix<char> M1,M2;   //設(shè)置集合的元素為字符類型
    inputRelation(M1,M2);
    getCalculate(M1,M2);
    return 0;
}

縫合并優(yōu)化了幾個(gè)函數(shù)。

關(guān)系的n次運(yùn)算:

void outputMatrix(const RMatrix<char> &M1){    //格式化輸出矩陣,要定義常量成員函數(shù)
    int k1=M1.getR(),k2=M1.getC();
    Set<char> Dom=M1.getDom(),Ran=M1.getRan();
    printf("關(guān)系矩陣如下:\n");
    for(int i=0;i<=k1;i++){
     //   printf("here?");    //手動(dòng)斷點(diǎn)
        for(int j=0;j<=k2;j++){
            if(i==0 && j==0) printf("  ");
            else
                if(j==0) printf("%c ",Dom[i-1]);
                else
                    if(i==0) printf("%c ",Ran[j-1]);
                    else{
                        printf("%d ",M1[i-1][j-1]);
                    }
        }
        printf("\n");
    }
}
void inputRelation(RMatrix<char> &M1){    //輸入關(guān)系
    printf("請(qǐng)輸入集合A的元素:\n");
    string str;
   // cin.get();  //這里不能直接這樣寫,因?yàn)榍懊嬗锌赡苁菦]有換行符的,那你就會(huì)少讀一個(gè)字符,所以只能靈活加
    getline(cin,str);
    stringstream ss1(str);
    char inp;
    while(ss1>>inp){
        M1.pushDom(inp);
        M1.pushRan(inp);
    }
    M1.updateSize();
    printf("請(qǐng)輸入關(guān)系R:(格式為\'a,b\'并用空格分割)\n");
    getline(cin,str);
    stringstream ss(str);
    int a,b;
    int isA=1;
    while(ss>>inp){     //使用">>"流輸入字符類型會(huì)自動(dòng)忽略空格...抽象了,printf是讀取空格的
    //    printf("%c",inp);
        if(inp==',')
            isA=0;
        else{
            if(isA)
                a=M1.findDom(inp);
            else{
                b=M1.findRan(inp);
                isA=1;
                M1.set(a,b,1);
            }
                
        }
    }
    printf("已知R");
    outputMatrix(M1);
    return;
}
void nR(const RMatrix<char> &M1,int n){
    RMatrix<char> M(M1);
    int n_=n;
    n--;
    while(n--)
        M=M.matrixSynthesis(M);
    printf("得出 R^%d",n_);
    outputMatrix(M);
    return;
}
int main(){
    RMatrix<char> M1;   //設(shè)置集合的元素為字符類型
    inputRelation(M1);
    int n;
    printf("請(qǐng)輸入n:");
    scanf("%d",&n);
    nR(M1,n);
    return 0;
}

參考:

知乎-vector<bool>

新世紀(jì)debug戰(zhàn)士-C++實(shí)現(xiàn)偽隨機(jī)

到此這篇關(guān)于C++實(shí)現(xiàn)關(guān)系與關(guān)系矩陣的文章就介紹到這了,更多相關(guān)C++關(guān)系矩陣內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • C語(yǔ)言科學(xué)計(jì)算入門之矩陣乘法的相關(guān)計(jì)算

    C語(yǔ)言科學(xué)計(jì)算入門之矩陣乘法的相關(guān)計(jì)算

    這篇文章主要介紹了C語(yǔ)言科學(xué)計(jì)算入門之矩陣乘法的相關(guān)計(jì)算,文章中還介紹了矩陣相關(guān)的斯特拉森算法的實(shí)現(xiàn),需要的朋友可以參考下
    2015-12-12
  • 帶你粗略了解C++中的深淺拷貝

    帶你粗略了解C++中的深淺拷貝

    這篇文章主要給大家介紹了關(guān)于c++中深淺拷貝以及寫時(shí)拷貝實(shí)現(xiàn)的相關(guān)資料,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面跟著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2021-08-08
  • C++實(shí)現(xiàn)雷霆戰(zhàn)機(jī)可視化小游戲

    C++實(shí)現(xiàn)雷霆戰(zhàn)機(jī)可視化小游戲

    這篇文章主要為大家詳細(xì)介紹了C++實(shí)現(xiàn)雷霆戰(zhàn)機(jī)可視化小游戲,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2020-11-11
  • opencv利用霍夫變換檢測(cè)直線進(jìn)行圖片校正

    opencv利用霍夫變換檢測(cè)直線進(jìn)行圖片校正

    這篇文章主要為大家詳細(xì)介紹了opencv利用霍夫變換檢測(cè)直線對(duì)圖片進(jìn)行校正,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2018-12-12
  • c語(yǔ)言:金幣陣列的問題

    c語(yǔ)言:金幣陣列的問題

    本文介紹了關(guān)于c語(yǔ)言:金幣陣列的問題,需要的朋友可以參考一下
    2013-03-03
  • C++ 在堆上開辟與釋放二維、三維指針詳細(xì)解析

    C++ 在堆上開辟與釋放二維、三維指針詳細(xì)解析

    一維指針其實(shí)就相當(dāng)于一維數(shù)組,不用去看書上所說的數(shù)組在內(nèi)存中的首地址這些晦澀的話,以此類推 二維指針就相當(dāng)于二維數(shù)組,新手對(duì)一維數(shù)組的開辟與釋放比較容易熟悉
    2013-09-09
  • C++如何過濾出字符串的中文(GBK、UTF-8)

    C++如何過濾出字符串的中文(GBK、UTF-8)

    這篇文章主要給大家介紹了關(guān)于C++如何過濾出字符串的中文的相關(guān)資料,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家學(xué)習(xí)或者使用C++具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面來一起學(xué)習(xí)學(xué)習(xí)吧
    2019-07-07
  • 使用c++調(diào)用windows打印api進(jìn)行打印的示例代碼

    使用c++調(diào)用windows打印api進(jìn)行打印的示例代碼

    這篇文章主要介紹了使用c++調(diào)用windows打印api進(jìn)行打印的示例代碼,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2020-06-06
  • 最新評(píng)論