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;
}
|