知行社区

 找回密码
 立即注册

QQ登录

只需一步,快速开始

查看: 2181|回复: 2
收起左侧

代数系统实验代码

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

欢迎批评指正~

mian.cpp


  1. #include"menu.h"
  2. #include"operate.h"
  3. int main(){
  4. string choice;//设置为字符串型防止输入非法字符时死循环
  5. do{
  6.   system("cls");
  7.   Menu();
  8. loop:    cin>>choice;
  9.   cout<<"请输入完整的运算表,不完整时默认为0"<<endl;
  10.   cout<<"输入示例:集合:a b c;运算表:a,b,c;映射:0 1"<<endl<<endl;
  11.   if(choice=="1"){
  12.    Table_combine();//判断运算是否可结合
  13.   }
  14.   else if(choice=="2"){
  15.    Table_assign();//判断运算一对运算二是否可分配
  16.   }
  17.   else if(choice=="3"){
  18.    Table_isomorphism();//判断两个代数系统是否同构
  19.   }
  20.   else if(choice=="0"){
  21.    system("pause");
  22.    exit(1);
  23.   }
  24.   else{
  25.    cout<<"ERROR! ENTER AGAIN!"<<endl;
  26.    goto loop;
  27.   }
  28.   system("pause");
  29. }while(1);
  30. system("pause");
  31. return 0;
  32. }
复制代码

menu.cpp

  1. #include"menu.h"

  2. void Menu(){
  3.         cout<<"******************************";
  4.         cout<<"代数系统";
  5.         cout<<"******************************"<<endl;
  6.         cout<<"1.判断运算是否可结合"<<endl;
  7.         cout<<"2.判断运算是否可分配"<<endl;
  8.         cout<<"3.判断两个代数是否同构"<<endl;
  9.         cout<<"0.退出系统"<<endl;
  10.         cout<<"*************************************";
  11.         cout<<"*******************************"<<endl;
  12. }
复制代码

menu.h

  1. #ifndef menu_h
  2. #define menu_h
  3. #include<iostream>
  4. using namespace std;
  5. void Menu();

  6. #endif
复制代码

 楼主| 起名字最烦了 发表于 2011-11-15 00:59 | 显示全部楼层
jihe.h
  1. #ifndef jihe_h
  2. #define jihe_h
  3. #include<iostream>
  4. #include<string>
  5. #include<fstream>
  6. using namespace std;

  7. //集合类
  8. class Jihe{
  9. public:
  10.         Jihe(){num=0;}
  11.         void set();//输入集合
  12.         int get_num();//获得集合个数
  13.         void get();//输出集合
  14.         friend Jihe operator/(Jihe&,const Jihe&);//重载/完成集合的交集运算
  15.         friend Jihe operator+(Jihe&,const Jihe&);//重载/完成集合的并集运算
  16.         friend Jihe operator-(Jihe&,const Jihe&);//重载/完成集合的差集运算
  17.         friend void operator*(Jihe&,const Jihe&);//重载/完成集合的直积集运算
  18. protected:
  19.         char a[100];
  20.         int num;//集合元素的个数
  21. };
  22. class Guanxi:public Jihe{
  23. public:
  24.         Guanxi(){guanxi="0000000000000000000";}
  25.         void set_g();//获得关系
  26.         void get_g();//打印关系
  27.         void get_matrix();//得到关系矩阵
  28. private:
  29.         string guanxi;
  30. };
  31. //运算表
  32. class Table:public Jihe{
  33. public:
  34.         Table():tmp(1000,'0'),tmp2(1000,'0'),table(1000,'0'){}//初始化字符串
  35.         void set_table();
  36.         void set_mapping();
  37.         void print_table();
  38.         void mapping_print();
  39.         void combineTable_print();
  40.         void assignTable_print(Table b);
  41.         void iosmorphismTable_print(Table b);
  42. private:
  43.         string table;
  44.         string tmp;
  45.         string tmp2;
  46.         int mapping[50];
  47. };
  48. #endif
复制代码
jihe.cpp
  1. #include"jihe.h"
  2. //输入集合1

  3. void Jihe::set(){
  4.         int i=0;
  5.         do{
  6.                 cin>>a[i];
  7.                 i++;
  8.                 num++;
  9.         }while(getchar()!='\n');
  10. }
  11. //获得集合个数
  12. int Jihe::get_num(){
  13.         return num;
  14. }
  15. //打印集合1
  16. void Jihe::get(){
  17.         //去掉重复元素
  18.         for(int i=0;i<num;i++)
  19.         for(int j=i+1;j<num;j++){
  20.                 if(a[j]==a[i]&&a[i]!=' '){
  21.                         a[j]=' ';
  22.                 }
  23.         }
  24.         //打印集合,如果元素为空则不打印
  25.         cout<<"{";
  26.         for(int i=0;i<num;i++){
  27.                 if(a[i]!=' ')
  28.                 cout<<a[i]<<",";
  29.         }
  30.         cout<<"}";
  31.         cout<<endl;
  32. }
  33. //重载/完成集合的(假)交集运算
  34. Jihe operator/(Jihe& a,const Jihe& b){
  35.         int k=0;
  36.         Jihe m;
  37.         for(int i=0;i<a.num;i++)
  38.                 for(int j=0;j<b.num;j++){
  39.                         if(a.a[i]==b.a[j]){
  40.                                 m.a[k++]=a.a[i];//如果有相同元素则赋值给c集合
  41.                                 m.num++;
  42.                         }
  43.                 }
  44.        
  45.         return m;
  46. }
  47. //重载+完成集合的(假)并集运算
  48. Jihe operator+(Jihe& a,const Jihe& b){
  49.         int k=0;
  50.         Jihe m;
  51.         //将两集合连接
  52.         for(int i=0;i<a.num;i++){
  53.                 m.a[k++]=a.a[i];
  54.                 m.num++;
  55.         }
  56.         for(int j=0;j<b.num;j++)
  57.                 m.a[m.num++]=b.a[j];
  58.         return m;
  59. }
  60. //重载-完成集合的(假)差运算
  61. Jihe operator-(Jihe& a,const Jihe& b){
  62.         int k=0;
  63.         Jihe c=a;
  64.         for(int i=0;i<c.num;i++)
  65.                 for(int j=0;j<b.num;j++){
  66.                         if(c.a[i]==b.a[j])
  67.                                 c.a[i]=' ';//如果有相同元素则赋值为空
  68.                 }
  69.         return c;
  70. }
  71. //重载*完成集合的直积运算
  72. void operator*(Jihe& a,const Jihe& b){
  73.         int k=0,flag=0;
  74.         for(int i=0;i<a.num;i++){
  75.                 if(a.a[i]==' ')
  76.                         i++;
  77.                 for(int j=0;j<b.num;j++){
  78.                         if(flag%5==0)
  79.                         cout<<endl;
  80.                         cout<<"<"<<a.a[i]<<","<<b.a[j]<<">,";
  81.                         flag++;
  82.                         if(b.a[j+1]==' ')
  83.                                 j++;
  84.                 }
  85.         }
  86.         cout<<endl;
  87. }
  88. //获得关系
  89. void Guanxi::set_g(){
  90.         cin>>guanxi;
  91. }
  92. //打印关系
  93. void Guanxi::get_g(){
  94.         cout<<guanxi<<endl;
  95. }
  96. //获得关系矩阵
  97. void Guanxi::get_matrix(){
  98.         int i=0,j=0;
  99.         //关系矩阵
  100.         int **p;
  101.         p=new int*[num];
  102.         for(i=0;i<num;i++)
  103.                 p[i]=new int[num];
  104.         for(i=0;i<num;i++)
  105.                 for(j=0;j<num;j++)
  106.                         p[i][j]=0;//初始化为0
  107.        
  108.         int flag[100],k=0;
  109.         //找出关系中点在集合中的位置
  110.         for(i=0;i<guanxi.length();i++){
  111.                 for(int k1=0;k1<num;k1++){
  112.                         if(guanxi[i]==a[k1]){
  113.                                 flag[k++]=k1;
  114.                         }
  115.                 }
  116.         }
  117.         int odd[50],even[50],tmp1=0,tmp2=0;
  118.         //偶数位置为行,奇数位置为列
  119.         for(i=0;i<k;i++){
  120.                 if(i%2==0)
  121.                         even[tmp1++]=flag[i];
  122.                 else
  123.                         odd[tmp2++]=flag[i];
  124.         }
  125.         for(i=0;i<tmp1;i++)
  126.                 p[even[i]][odd[i]]=1;

  127.         cout<<endl;
  128.         cout<<"关系矩阵为:"<<endl;
  129.         for(i=0;i<num;i++){
  130.                 for(j=0;j<num;j++)
  131.                         cout<<p[i][j]<<' ';
  132.                 cout<<endl;
  133.         }
  134.         for(int i=0;i<num;i++)
  135.                 delete []p[i];
  136.         delete []p;
  137. }
  138. //输入运算表
  139. void Table::set_table(){
  140.         cin>>table;
  141. }
  142. //打印运算表
  143. void Table::print_table(){
  144.         int i=0,j=0;
  145.         for(i=0;i<table.length();i++){
  146.                 if(table[i]!=',')
  147.                         tmp[j++]=table[i];
  148.         }
  149.                 for(j=0;j<num*num;j++){
  150.                         if(j%num==0&&j!=0)
  151.                                 cout<<endl;
  152.                         cout<<tmp[j]<<' ';
  153.                        
  154.                 }
  155. }
  156. //输入映射
  157. void Table::set_mapping(){
  158.         for(int i=0;i<num;i++)
  159.         cin>>mapping[i];
  160. }
  161. //输出映射
  162. void Table::mapping_print(){
  163.         for(int i=0;i<num;i++)
  164.         cout<<mapping[i]<<',';
  165.         cout<<endl;
  166. }
  167. //输出运算是否可结合
  168. void Table::combineTable_print(){
  169.         int judge=0;
  170.         cout<<"x y z x*(y*z) (x*y)*z 相等"<<endl;
  171.         for(int i=0;i<num;i++)
  172.                 for(int j=0;j<num;j++)
  173.                         for(int k=0;k<num;k++){
  174.                                 int flag1=0,flag2=0,q=0;
  175.                                 for(q=0;q<num;q++){
  176.                                         if(tmp[j*num+k]==a[q])
  177.                                                 flag1=q;//记下a[j]*a[k]值在集合中的位置
  178.                                 }
  179.                                 for(q=0;q<num;q++){
  180.                                         if(tmp[i*num+j]==a[q])
  181.                                                 flag2=q;//记下a[i]*a[j]值在集合中的位置
  182.                                 }
  183.                                 cout<<a[i]<<" "<<a[j]<<" "<<a[k]<<"    "<<tmp[i*num+flag1];//tmp[i*num+flag1]是a[i]*(a[j]*a[k])的值
  184.                                 cout<<"       "<<tmp[flag2*num+k];//tmp[flag2*num+k]是(a[i]*a[j])*a[k]的值
  185.                                 if(tmp[i*num+flag1]==tmp[flag2*num+k])
  186.                                         cout<<"      =";
  187.                                 else{
  188.                                         cout<<"      ≠";
  189.                                         judge=1;
  190.                                 }
  191.                                 cout<<endl;
  192.                         }
  193.                 cout<<endl;
  194.                 if(judge==1)
  195.                         cout<<"运算不可结合!"<<endl;
  196.                 else
  197.                         cout<<"运算可结合"<<endl;
  198.                 cout<<endl;
  199. }
  200. //输出运算是否可分配
  201. void Table::assignTable_print(Table b){
  202.         int judge=0;
  203.         cout<<"x y z x*(y+z) (x*y)+(y*z) 相等"<<endl;
  204.         for(int i=0;i<num;i++)
  205.                 for(int j=0;j<num;j++)
  206.                         for(int k=0;k<num;k++){
  207.                                 int flag1=0,flag2=0,flag3=0,q=0;
  208.                                 for(q=0;q<num;q++){
  209.                                         if(b.tmp[j*num+k]==a[q])
  210.                                                 flag1=q;//记下a[j]+a[k]值在集合中的位置
  211.                                 }
  212.                                 for(q=0;q<num;q++){
  213.                                         if(tmp[i*num+j]==a[q])
  214.                                                 flag2=q;//记下a[i]*a[j]值在集合中的位置
  215.                                 }
  216.                                 for(q=0;q<num;q++){
  217.                                         if(tmp[i*num+k]==a[q])
  218.                                                 flag3=q;//记下a[i]*a[k]值在集合中的位置
  219.                                 }
  220.                                 cout<<a[i]<<" "<<a[j]<<" "<<a[k]<<"    "<<tmp[i*num+flag1];//tmp[i*num+flag1]是a[i]*(a[j]*a[k])的值
  221.                                 cout<<"         "<<b.tmp[flag2*num+flag3];//tmp[flag2*num+k]是(a[i]*a[j])+(a[i]*a[k])的值
  222.                                 if(tmp[i*num+flag1]==b.tmp[flag2*num+flag3])
  223.                                         cout<<"       =";
  224.                                 else{
  225.                                         cout<<"       ≠";
  226.                                         judge=1;
  227.                                 }
  228.                                 cout<<endl;
  229.                         }
  230.                 cout<<endl;
  231.                 if(judge==1)
  232.                         cout<<"运算*对+不可分配!"<<endl;
  233.                 else
  234.                         cout<<"运算*对+可分配"<<endl;
  235.                 cout<<endl;
  236. }
  237. //输出代数系统是否同构
  238. void Table::iosmorphismTable_print(Table b){
  239.         int judge=0,i=0,j=0;
  240.         char f[50];
  241.         for(i=0;i<num;i++)
  242.                 f[mapping[i]]=b.tmp[mapping[i]];
  243.         cout<<"x y f(x*y) f(x)+f(y) 相等"<<endl;
  244.         for(i=0;i<num;i++)
  245.                 for(j=0;j<num;j++){
  246.                         int flag1=0,flag2=0,flag3=0,q=0;
  247.                         for(q=0;q<num;q++){
  248.                                 if(tmp[j*num+i]==a[q])
  249.                                         flag1=q;//记下a[i]*a[j]值在集合A中的位置
  250.                         }
  251.                         for(q=0;q<num;q++){
  252.                                 if(f[i]==b.a[q])
  253.                                         flag2=q;//记下f[i]值在集合B中的位置
  254.                         }
  255.                         for(q=0;q<num;q++){
  256.                                 if(f[j]==b.a[q])
  257.                                         flag3=q;//记下f[j]在集合B中的位置
  258.                         }
  259.                         cout<<a[i]<<" "<<a[j]<<" "<<"  "<<f[flag1];//f[flag1]是f(a[i]*a[j])的值
  260.                         cout<<"        "<<b.tmp[flag2*num+flag3];//tmp[flag2*num+k]是(a[i]*a[j])*a[k]的值
  261.                         if(f[flag1]==b.tmp[flag2*num+flag3])
  262.                                 cout<<"      =";
  263.                         else{
  264.                                 cout<<"      ≠";
  265.                                 judge=1;
  266.                         }
  267.                         cout<<endl;
  268.                 }
  269.                 cout<<endl;
  270.                 if(judge==1)
  271.                         cout<<"代数系统<A,*>与<B,+>不同构!"<<endl;
  272.                 else
  273.                         cout<<"代数系统<A,*>与<B,+>同构"<<endl;
  274.                 cout<<endl;
  275. }
复制代码
 楼主| 起名字最烦了 发表于 2011-11-15 01:03 | 显示全部楼层
operate.h
  1. #ifndef operate_h
  2. #define operate_h
  3. #include<iostream>
  4. #include<string>
  5. using namespace std;

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

  9. class Formula{
  10. public:
  11.         void set_formula();
  12.         void get_formula();
  13. private:
  14.         string formula;
  15. };

  16. void TrueTab();
  17. void Equ();
  18. void Form();
  19. void Legal();

  20. #endif
复制代码
operate.cpp
  1. #include"operate.h"
  2. #include"jihe.h"

  3. //判断运算是否可结合
  4. void Table_combine(){
  5.         Table a;
  6.         cout<<"请输入集合:";
  7.         a.set();
  8.         cout<<"请输入运算表:";
  9.         a.set_table();
  10.         system("pause");
  11.         system("cls");
  12.         cout<<"集合:";
  13.         a.get();
  14.         cout<<"您输入的运算表为:"<<endl;
  15.         a.print_table();
  16.         cout<<endl<<endl;
  17.         a.combineTable_print();
  18. }
  19. //判断运算一对运算二是否可分配
  20. void Table_assign(){
  21.         Table a;
  22.         cout<<"请输入集合:";
  23.         a.set();
  24.         cout<<"请输入运算表一*:";
  25.         a.set_table();
  26.         Table b=a;
  27.         cout<<"请输入运算表二+:";
  28.         b.set_table();
  29.         system("pause");
  30.         system("cls");
  31.         cout<<"集合:";
  32.         a.get();
  33.         cout<<"您输入的运算表为:"<<endl;
  34.         cout<<"运算表一*:"<<endl;
  35.         a.print_table();
  36.         cout<<endl;
  37.         cout<<"运算表二+:"<<endl;
  38.         b.print_table();
  39.         cout<<endl<<endl;
  40.         a.assignTable_print(b);
  41. }
  42. //判断两个代数系统是否同构
  43. void Table_isomorphism(){
  44.         Table a,b;
  45.         cout<<"请输入集合A:";
  46.         a.set();
  47.         cout<<"请输入映射:";
  48.         a.set_mapping();
  49.         cout<<"请输入集合B:";
  50.         b.set();
  51.         cout<<"请输入运算表一*:";
  52.         a.set_table();
  53.         cout<<"请输入运算表二+:";
  54.         b.set_table();
  55.         system("pause");
  56.         system("cls");
  57.         cout<<"集合A:";
  58.         a.get();
  59.         cout<<"集合B:";
  60.         b.get();
  61.         cout<<"您输入的映射为:";
  62.         a.mapping_print();
  63.         cout<<"您输入的运算表为:"<<endl;
  64.         cout<<"运算表一*:"<<endl;
  65.         a.print_table();
  66.         cout<<endl;
  67.         cout<<"运算表二+:"<<endl;
  68.         b.print_table();
  69.         cout<<endl<<endl;
  70.         a.iosmorphismTable_print(b);
  71. }

  72. void Formula::set_formula(){
  73.         cout<<"情输入公式:"<<endl;
  74.         cin>>formula;
  75. }
  76. void Formula::get_formula(){
  77.         cout<<"您输入的公式为:"<<endl;
  78.         cout<<formula<<endl;
  79. }


  80. void TrueTab(){
  81. }
  82. void Equ(){
  83. }
  84. void Form(){
  85. }
  86. void Legal(){
  87.         Formula a;
  88.         a.set_formula();
  89.         a.get_formula();
  90. }
复制代码

QQ|小黑屋|手机版|知行技术社区 ( 湘ICP备11020288号-1 )

GMT+8, 2020-9-29 19:21 , Processed in 0.058689 second(s), 8 queries , Redis On.

Powered by Discuz! X3.4

Copyright © 2001-2020, Tencent Cloud.

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