|
jihe.h- #ifndef jihe_h
- #define jihe_h
- #include<iostream>
- #include<string>
- #include<fstream>
- using namespace std;
- //集合类
- class Jihe{
- public:
- Jihe(){num=0;}
- void set();//输入集合
- int get_num();//获得集合个数
- void get();//输出集合
- friend Jihe operator/(Jihe&,const Jihe&);//重载/完成集合的交集运算
- friend Jihe operator+(Jihe&,const Jihe&);//重载/完成集合的并集运算
- friend Jihe operator-(Jihe&,const Jihe&);//重载/完成集合的差集运算
- friend void operator*(Jihe&,const Jihe&);//重载/完成集合的直积集运算
- protected:
- char a[100];
- int num;//集合元素的个数
- };
- class Guanxi:public Jihe{
- public:
- Guanxi(){guanxi="0000000000000000000";}
- void set_g();//获得关系
- void get_g();//打印关系
- void get_matrix();//得到关系矩阵
- private:
- string guanxi;
- };
- //运算表
- class Table:public Jihe{
- public:
- Table():tmp(1000,'0'),tmp2(1000,'0'),table(1000,'0'){}//初始化字符串
- void set_table();
- void set_mapping();
- void print_table();
- void mapping_print();
- void combineTable_print();
- void assignTable_print(Table b);
- void iosmorphismTable_print(Table b);
- private:
- string table;
- string tmp;
- string tmp2;
- int mapping[50];
- };
- #endif
复制代码 jihe.cpp- #include"jihe.h"
- //输入集合1
- void Jihe::set(){
- int i=0;
- do{
- cin>>a[i];
- i++;
- num++;
- }while(getchar()!='\n');
- }
- //获得集合个数
- int Jihe::get_num(){
- return num;
- }
- //打印集合1
- void Jihe::get(){
- //去掉重复元素
- for(int i=0;i<num;i++)
- for(int j=i+1;j<num;j++){
- if(a[j]==a[i]&&a[i]!=' '){
- a[j]=' ';
- }
- }
- //打印集合,如果元素为空则不打印
- cout<<"{";
- for(int i=0;i<num;i++){
- if(a[i]!=' ')
- cout<<a[i]<<",";
- }
- cout<<"}";
- cout<<endl;
- }
- //重载/完成集合的(假)交集运算
- Jihe operator/(Jihe& a,const Jihe& b){
- int k=0;
- Jihe m;
- for(int i=0;i<a.num;i++)
- for(int j=0;j<b.num;j++){
- if(a.a[i]==b.a[j]){
- m.a[k++]=a.a[i];//如果有相同元素则赋值给c集合
- m.num++;
- }
- }
-
- return m;
- }
- //重载+完成集合的(假)并集运算
- Jihe operator+(Jihe& a,const Jihe& b){
- int k=0;
- Jihe m;
- //将两集合连接
- for(int i=0;i<a.num;i++){
- m.a[k++]=a.a[i];
- m.num++;
- }
- for(int j=0;j<b.num;j++)
- m.a[m.num++]=b.a[j];
- return m;
- }
- //重载-完成集合的(假)差运算
- Jihe operator-(Jihe& a,const Jihe& b){
- int k=0;
- Jihe c=a;
- for(int i=0;i<c.num;i++)
- for(int j=0;j<b.num;j++){
- if(c.a[i]==b.a[j])
- c.a[i]=' ';//如果有相同元素则赋值为空
- }
- return c;
- }
- //重载*完成集合的直积运算
- void operator*(Jihe& a,const Jihe& b){
- int k=0,flag=0;
- for(int i=0;i<a.num;i++){
- if(a.a[i]==' ')
- i++;
- for(int j=0;j<b.num;j++){
- if(flag%5==0)
- cout<<endl;
- cout<<"<"<<a.a[i]<<","<<b.a[j]<<">,";
- flag++;
- if(b.a[j+1]==' ')
- j++;
- }
- }
- cout<<endl;
- }
- //获得关系
- void Guanxi::set_g(){
- cin>>guanxi;
- }
- //打印关系
- void Guanxi::get_g(){
- cout<<guanxi<<endl;
- }
- //获得关系矩阵
- void Guanxi::get_matrix(){
- int i=0,j=0;
- //关系矩阵
- int **p;
- p=new int*[num];
- for(i=0;i<num;i++)
- p[i]=new int[num];
- for(i=0;i<num;i++)
- for(j=0;j<num;j++)
- p[i][j]=0;//初始化为0
-
- int flag[100],k=0;
- //找出关系中点在集合中的位置
- for(i=0;i<guanxi.length();i++){
- for(int k1=0;k1<num;k1++){
- if(guanxi[i]==a[k1]){
- flag[k++]=k1;
- }
- }
- }
- int odd[50],even[50],tmp1=0,tmp2=0;
- //偶数位置为行,奇数位置为列
- for(i=0;i<k;i++){
- if(i%2==0)
- even[tmp1++]=flag[i];
- else
- odd[tmp2++]=flag[i];
- }
- for(i=0;i<tmp1;i++)
- p[even[i]][odd[i]]=1;
- cout<<endl;
- cout<<"关系矩阵为:"<<endl;
- for(i=0;i<num;i++){
- for(j=0;j<num;j++)
- cout<<p[i][j]<<' ';
- cout<<endl;
- }
- for(int i=0;i<num;i++)
- delete []p[i];
- delete []p;
- }
- //输入运算表
- void Table::set_table(){
- cin>>table;
- }
- //打印运算表
- void Table::print_table(){
- int i=0,j=0;
- for(i=0;i<table.length();i++){
- if(table[i]!=',')
- tmp[j++]=table[i];
- }
- for(j=0;j<num*num;j++){
- if(j%num==0&&j!=0)
- cout<<endl;
- cout<<tmp[j]<<' ';
-
- }
- }
- //输入映射
- void Table::set_mapping(){
- for(int i=0;i<num;i++)
- cin>>mapping[i];
- }
- //输出映射
- void Table::mapping_print(){
- for(int i=0;i<num;i++)
- cout<<mapping[i]<<',';
- cout<<endl;
- }
- //输出运算是否可结合
- void Table::combineTable_print(){
- int judge=0;
- cout<<"x y z x*(y*z) (x*y)*z 相等"<<endl;
- for(int i=0;i<num;i++)
- for(int j=0;j<num;j++)
- for(int k=0;k<num;k++){
- int flag1=0,flag2=0,q=0;
- for(q=0;q<num;q++){
- if(tmp[j*num+k]==a[q])
- flag1=q;//记下a[j]*a[k]值在集合中的位置
- }
- for(q=0;q<num;q++){
- if(tmp[i*num+j]==a[q])
- flag2=q;//记下a[i]*a[j]值在集合中的位置
- }
- cout<<a[i]<<" "<<a[j]<<" "<<a[k]<<" "<<tmp[i*num+flag1];//tmp[i*num+flag1]是a[i]*(a[j]*a[k])的值
- cout<<" "<<tmp[flag2*num+k];//tmp[flag2*num+k]是(a[i]*a[j])*a[k]的值
- if(tmp[i*num+flag1]==tmp[flag2*num+k])
- cout<<" =";
- else{
- cout<<" ≠";
- judge=1;
- }
- cout<<endl;
- }
- cout<<endl;
- if(judge==1)
- cout<<"运算不可结合!"<<endl;
- else
- cout<<"运算可结合"<<endl;
- cout<<endl;
- }
- //输出运算是否可分配
- void Table::assignTable_print(Table b){
- int judge=0;
- cout<<"x y z x*(y+z) (x*y)+(y*z) 相等"<<endl;
- for(int i=0;i<num;i++)
- for(int j=0;j<num;j++)
- for(int k=0;k<num;k++){
- int flag1=0,flag2=0,flag3=0,q=0;
- for(q=0;q<num;q++){
- if(b.tmp[j*num+k]==a[q])
- flag1=q;//记下a[j]+a[k]值在集合中的位置
- }
- for(q=0;q<num;q++){
- if(tmp[i*num+j]==a[q])
- flag2=q;//记下a[i]*a[j]值在集合中的位置
- }
- for(q=0;q<num;q++){
- if(tmp[i*num+k]==a[q])
- flag3=q;//记下a[i]*a[k]值在集合中的位置
- }
- cout<<a[i]<<" "<<a[j]<<" "<<a[k]<<" "<<tmp[i*num+flag1];//tmp[i*num+flag1]是a[i]*(a[j]*a[k])的值
- cout<<" "<<b.tmp[flag2*num+flag3];//tmp[flag2*num+k]是(a[i]*a[j])+(a[i]*a[k])的值
- if(tmp[i*num+flag1]==b.tmp[flag2*num+flag3])
- cout<<" =";
- else{
- cout<<" ≠";
- judge=1;
- }
- cout<<endl;
- }
- cout<<endl;
- if(judge==1)
- cout<<"运算*对+不可分配!"<<endl;
- else
- cout<<"运算*对+可分配"<<endl;
- cout<<endl;
- }
- //输出代数系统是否同构
- void Table::iosmorphismTable_print(Table b){
- int judge=0,i=0,j=0;
- char f[50];
- for(i=0;i<num;i++)
- f[mapping[i]]=b.tmp[mapping[i]];
- cout<<"x y f(x*y) f(x)+f(y) 相等"<<endl;
- for(i=0;i<num;i++)
- for(j=0;j<num;j++){
- int flag1=0,flag2=0,flag3=0,q=0;
- for(q=0;q<num;q++){
- if(tmp[j*num+i]==a[q])
- flag1=q;//记下a[i]*a[j]值在集合A中的位置
- }
- for(q=0;q<num;q++){
- if(f[i]==b.a[q])
- flag2=q;//记下f[i]值在集合B中的位置
- }
- for(q=0;q<num;q++){
- if(f[j]==b.a[q])
- flag3=q;//记下f[j]在集合B中的位置
- }
- cout<<a[i]<<" "<<a[j]<<" "<<" "<<f[flag1];//f[flag1]是f(a[i]*a[j])的值
- cout<<" "<<b.tmp[flag2*num+flag3];//tmp[flag2*num+k]是(a[i]*a[j])*a[k]的值
- if(f[flag1]==b.tmp[flag2*num+flag3])
- cout<<" =";
- else{
- cout<<" ≠";
- judge=1;
- }
- cout<<endl;
- }
- cout<<endl;
- if(judge==1)
- cout<<"代数系统<A,*>与<B,+>不同构!"<<endl;
- else
- cout<<"代数系统<A,*>与<B,+>同构"<<endl;
- cout<<endl;
- }
复制代码 |
|