欧卡2中文社区

 找回密码
 立即注册

QQ登录

只需一步,快速开始

需要三步,才能开始

只需两步,慢速开始

玩欧卡就用莱仕达V99方向盘欧卡2入门方向盘选莱仕达V9莱仕达折叠便携游戏方向盘支架欢迎地图Mod入驻
查看: 3556|回复: 2
收起左侧

代数系统实验代码

[复制链接]
回帖奖励 5 金币 回复本帖可获得 1 金币奖励! 每人限 1 次
起名字最烦了 发表于 2011-11-15 00:55 | 显示全部楼层 |阅读模式
本帖最后由 起名字什么的最烦了 于 2011-11-15 00:57 编辑

欢迎批评指正~

mian.cpp
#include"menu.h"
#include"operate.h"
int main(){
 string choice;//设置为字符串型防止输入非法字符时死循环
 do{
  system("cls");
  Menu();
loop:    cin>>choice;
  cout<<"请输入完整的运算表,不完整时默认为0"<<endl;
  cout<<"输入示例:集合:a b c;运算表:a,b,c;映射:0 1"<<endl<<endl;
  if(choice=="1"){
   Table_combine();//判断运算是否可结合
  }
  else if(choice=="2"){
   Table_assign();//判断运算一对运算二是否可分配
  }
  else if(choice=="3"){
   Table_isomorphism();//判断两个代数系统是否同构
  }
  else if(choice=="0"){
   system("pause");
   exit(1);
  }
  else{
   cout<<"ERROR! ENTER AGAIN!"<<endl;
   goto loop;
  }
  system("pause");
 }while(1);
 system("pause");
 return 0;
}
menu.cpp
#include"menu.h"

void Menu(){
        cout<<"******************************";
        cout<<"代数系统";
        cout<<"******************************"<<endl;
        cout<<"1.判断运算是否可结合"<<endl;
        cout<<"2.判断运算是否可分配"<<endl;
        cout<<"3.判断两个代数是否同构"<<endl;
        cout<<"0.退出系统"<<endl;
        cout<<"*************************************";
        cout<<"*******************************"<<endl;
}
menu.h
#ifndef menu_h
#define menu_h
#include<iostream>
using namespace std;
void Menu();

#endif
 楼主| 起名字最烦了 发表于 2011-11-15 00:59 | 显示全部楼层
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;
}
 楼主| 起名字最烦了 发表于 2011-11-15 01:03 | 显示全部楼层
operate.h
#ifndef operate_h
#define operate_h
#include<iostream>
#include<string>
using namespace std;

void Table_combine();//判断运算是否可结合
void Table_assign();//判断运算一对运算二是否可分配
void Table_isomorphism();//判断两个代数系统是否同构

class Formula{
public:
        void set_formula();
        void get_formula();
private:
        string formula;
};

void TrueTab();
void Equ();
void Form();
void Legal();

#endif
operate.cpp
#include"operate.h"
#include"jihe.h"

//判断运算是否可结合
void Table_combine(){
        Table a;
        cout<<"请输入集合:";
        a.set();
        cout<<"请输入运算表:";
        a.set_table();
        system("pause");
        system("cls");
        cout<<"集合:";
        a.get();
        cout<<"您输入的运算表为:"<<endl;
        a.print_table();
        cout<<endl<<endl;
        a.combineTable_print();
}
//判断运算一对运算二是否可分配
void Table_assign(){
        Table a;
        cout<<"请输入集合:";
        a.set();
        cout<<"请输入运算表一*:";
        a.set_table();
        Table b=a;
        cout<<"请输入运算表二+:";
        b.set_table();
        system("pause");
        system("cls");
        cout<<"集合:";
        a.get();
        cout<<"您输入的运算表为:"<<endl;
        cout<<"运算表一*:"<<endl;
        a.print_table();
        cout<<endl;
        cout<<"运算表二+:"<<endl;
        b.print_table();
        cout<<endl<<endl;
        a.assignTable_print(b);
}
//判断两个代数系统是否同构
void Table_isomorphism(){
        Table a,b;
        cout<<"请输入集合A:";
        a.set();
        cout<<"请输入映射:";
        a.set_mapping();
        cout<<"请输入集合B:";
        b.set();
        cout<<"请输入运算表一*:";
        a.set_table();
        cout<<"请输入运算表二+:";
        b.set_table();
        system("pause");
        system("cls");
        cout<<"集合A:";
        a.get();
        cout<<"集合B:";
        b.get();
        cout<<"您输入的映射为:";
        a.mapping_print();
        cout<<"您输入的运算表为:"<<endl;
        cout<<"运算表一*:"<<endl;
        a.print_table();
        cout<<endl;
        cout<<"运算表二+:"<<endl;
        b.print_table();
        cout<<endl<<endl;
        a.iosmorphismTable_print(b);
}

void Formula::set_formula(){
        cout<<"情输入公式:"<<endl;
        cin>>formula;
}
void Formula::get_formula(){
        cout<<"您输入的公式为:"<<endl;
        cout<<formula<<endl;
}


void TrueTab(){
}
void Equ(){
}
void Form(){
}
void Legal(){
        Formula a;
        a.set_formula();
        a.get_formula();
}

联系我们|手机版|欧卡2中国 ( 湘ICP备11020288号-1 )

GMT+8, 2024-11-25 16:41 , Processed in 0.041364 second(s), 8 queries , Redis On.

Powered by Discuz! X3.4

Copyright © 2001-2023, Tencent Cloud.

快速回复 返回顶部 返回列表