C++實(shí)現(xiàn)關(guān)系與關(guān)系矩陣的代碼詳解
ADT
集合
template<class Type> //集合的元素類(lèi)型
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(){} //無(wú)規(guī)模的初始化
Relation(int r_,int c_):dom(r_),ran(c_){} //有規(guī)模的初始化
int getR()const { return dom.getSize(); } //返回行,基類(lèi)私有成員只可調(diào)用基類(lèi)非私有函數(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類(lèi)型,它有很高的特殊性
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(); //在子類(lèi)中調(diào)用基類(lèi)函數(shù)需要制定基類(lèi)
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í)變量,必定被銷(xiāo)毀,無(wú)法作為引用被返回 (<!-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ì)稱(chēng)性
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ì)稱(chēng)性,注意都為0不違反反對(duì)稱(chēng)性!
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í)變量,是一定被銷(xiāo)毀的,所以作為引用被返回當(dāng)然就出了問(wèn)題,而此處不用引用是完全可行的。如果一定要用引用,也許可以考慮把M定義為靜態(tài)變量。
- <!-2 處曾有過(guò)一個(gè)報(bào)錯(cuò):"passing 'const RMatrix<char>' as 'this' argument discards qualifiers",原因是當(dāng)時(shí)我只將 isPassing 函數(shù)設(shè)為const,卻沒(méi)把其中調(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(); //這里不能直接這樣寫(xiě),因?yàn)榍懊嬗锌赡苁菦](méi)有換行符的,那你就會(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){ //使用">>"流輸入字符類(lèi)型會(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è)置集合的元素為字符類(lèi)型
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è)置集合的元素為字符類(lèi)型
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ì)稱(chēng)的,R3是反對(duì)稱(chēng)的,并顯示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ì)稱(chēng)性,反對(duì)稱(chēng)性
while(1){
M.randomRelation();
if(M.isSelf()==isSelf && M.isSymmetric()==isSymmetric && M.antiSymmetric()==antiSymmetric) return;
int main(){
RMatrix<char> M1; //設(shè)置集合的元素為字符類(lèi)型
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ī)的效率太低,是按秒變化的,除非直接寫(xiě)在成員函數(shù)中根據(jù)一個(gè)seed一直隨機(jī),否則程序不可能通暢,但寫(xiě)在成員函數(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"; //連接矩陣名稱(chēng)
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ì)稱(chēng)性,反對(duì)稱(chēng)性
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ì)稱(chēng)性
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ì)稱(chēng)性
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è)置集合的元素為字符類(lèi)型
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)化了一下,可以輸出矩陣名稱(chēng)了。
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ì)稱(chēng)性\n");
if(M1.antiSymmetric()) printf("具有反對(duì)稱(chēng)性\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){ //使用">>"流輸入字符類(lèi)型會(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){ //使用">>"流輸入字符類(lèi)型會(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類(lèi)型~
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è)置集合的元素為字符類(lèi)型
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(); //這里不能直接這樣寫(xiě),因?yàn)榍懊嬗锌赡苁菦](méi)有換行符的,那你就會(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){ //使用">>"流輸入字符類(lèi)型會(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è)置集合的元素為字符類(lèi)型
inputRelation(M1);
int n;
printf("請(qǐng)輸入n:");
scanf("%d",&n);
nR(M1,n);
return 0;
}參考:
新世紀(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++實(shí)現(xiàn)和電腦對(duì)戰(zhàn)三子棋實(shí)例
大家好,本篇文章主要講的是C++實(shí)現(xiàn)和電腦對(duì)戰(zhàn)三子棋實(shí)例,感興趣的同學(xué)趕快來(lái)看一看吧,對(duì)你有幫助的話(huà)記得收藏一下2022-01-01
淺談#ifndef,#define,#endif的作用和用法
下面小編就為大家?guī)?lái)一篇淺談#ifndef,#define,#endif的作用和用法。小編覺(jué)得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧2016-12-12
Qt實(shí)現(xiàn)拖動(dòng)單個(gè)控件移動(dòng)的示例代碼
做慣了靜態(tài)圖,今天來(lái)搞一搞動(dòng)態(tài)圖吧!本文將利用Qt實(shí)現(xiàn)拖動(dòng)單個(gè)控件移動(dòng)效果,文中的示例代碼講解詳細(xì),感興趣的可以動(dòng)手嘗試一下2022-06-06
C++實(shí)現(xiàn)簡(jiǎn)單的HTTP服務(wù)器
這篇文章主要為大家詳細(xì)介紹了C++實(shí)現(xiàn)簡(jiǎn)單的HTTP服務(wù)器的相關(guān)資料,感興趣的朋友可以參考下2016-05-05
c語(yǔ)言 數(shù)據(jù)結(jié)構(gòu)實(shí)現(xiàn)之字符串
這篇文章主要介紹了c語(yǔ)言 數(shù)據(jù)結(jié)構(gòu)實(shí)現(xiàn)之字符串的相關(guān)資料,需要的朋友可以參考下2017-05-05

