1、湖南大学离散数学程序设计题程序设计题2010年语言不限,显示方式中的表格线可以不出现,但要显示为表格的样子,到底做哪道题,在上机时由老师宣布或抽签决定。1、自动生成真值表2、判断两个公式是否等值3、生成主析取、主合取范式4、判断一个公式是否合法已给出了基本方法,判断过程中也给出判断过程。5、集合运算6、关系矩阵与关系的复合说明二个序偶之间用分号(;)分隔。“关系一的矩阵”是指给出关系一的关系矩阵。直接利用序偶进行复合,得到其关系的复合7、求关系的自反与对称闭包关系的自反闭包关系的对称闭包8、利用矩阵求其关系的复合与传递闭包9、判断运算是否可结合10、判断运算一对运算二是否可分分配11、判断两个
2、代数是否同构/1.1自动生成真值表#include#includeusing namespace std;class Gongshi/得到任意公式真值表的类private: string yuanshimingti;/用来保存输入的原始公式。 string guodu;/过渡用的字符串。 string zuijian;/保存命题变元的字符串。 int num;/原子命题个数public: Gongshi(string a)/构造函数 yuanshimingti=a; guodu=00000000000000000000;/初始化为0000.为了更好的储存数据 zuijian=000000000
3、00000000000; huoquzimu();/调用设置函数 void huoquzimu()/得到原子命题的函数 int k=0; for(int i=0;yuanshimingtii!=0;i+) if(yuanshimingtii=a)&(yuanshimingtii=z)/原子命题必须是小写字母 guoduk=yuanshimingtii; k+; guoduk=0;/字符串结束符 setguodu();/调用函数,去掉重复的 void setguodu()/化简所得到的命题变元,去掉重复的。 int k=1; zuijian0=guodu0; for(int i=1;guodui
4、!=0;i+) if(jianyan(guodui,i) zuijiank=guodui; k+; guoduk=0; num=k;/记下命题变元的个数 bool jianyan(char a,int n)/检验是否重复的子函数 for(int i=0;in;i+) if(a=zuijiani) return 0; return 1; void operator1()/主操作函数1 for(int i=0;inum;i+)/输出第一行不变的格式 coutzuijiani ; coutyuanshimingti 真值endl; int a=1;/用来储存一共有多少种解释。 for(i=0;inu
5、m;i+) a=a*2; /分2num种情况,来解释真值表 int b=0,c10=0,0,0,0,0,0,0,0,0,0; for(i=0;ia;i+) int d=b; for(int j=0;j-1;j-) coutcj ; b+; string cc=0000000000; for(j=0;jnum;j+) if(cj=1) ccj=1; else ccj=0; string aa; aa=yuanshimingti; /通过双重循环,用0/1来替代命题变员 for(int k=0;knum;k+)/变员 for(int j=0;aaj!=0;j+)/原始公式 if(aaj=zuiji
6、ank) aaj=ccnum-k-1; coutaa operator2(aa); coutn; char operator2(string chushi)/操作函数2,得到某种解释下真值表的值,主要思路:从前到后,从外到里! /第一步,先找到和计算出最外面的括号! int a,b=0,k=0; for(int i=0;chushii-1!=)&chushii!=0;i+) if(chushii=) b=i; for(i=0;chushii!=)&chushii!=0;i+) if(chushii=() a=i; if(b!=0) for(i=a+1;ib;i+) guoduk=chushii
7、; k+; guoduk=0; char t; t=operator2(guodu); chushia=t; int z=a+1; for(k=b+1;chushik-1!=0;k+) chushiz=chushik; z+; return operator2(chushi); /第二步再去掉否定 for(i=0;chushii!=0;i+) if(chushii=!) if(chushii+1=1) chushii+1=0; else chushii+1=1; int z=i; for(k=z+1;chushik-1!=0;k+) chushiz=chushik; z+; /第三步直接计算真
8、值 char c=1; for(i=0;chushii!=0;i+) if(chushii=+) if(chushii-1=1)|(chushii+1=1) chushii+1=1; else chushii+1=0; if(chushii=) if(chushii-1=1)&(chushii+1=1) chushii+1=1; else chushii+1=0; if(chushii+1!=0) c=chushii+1; return c; ;int main() string a1;/用来接收输入的字符串 cout(合取用代替,析取用+代替,命题变元用小写字母)endl; couta1;
9、coutendl; Gongshi gongshi1(a1);/初始化一个类的对象. gongshi1.operator1();/调用该类的主操作函数,实现目的. return 0;/1.2判断两个公式是否等值#include#includeusing namespace std;class Gongshi/得到任意公式真值表的类private: string yuanshimingti;/用来保存输入的原始公式1。 string yuanshimingti2;/用来保存输入的原始公式2。 string guodu;/过渡用的字符串。 string zuijian;/保存命题变元的字符串。 s
10、tring guodu2;/过渡用的字符串2。 string zuijian2;/保存命题变元的字符串2。 int num;/公式1原子命题个数 int num2;/公式2原子命题个数public: Gongshi(string a,string b)/构造函数 yuanshimingti=a; yuanshimingti2=b; guodu=00000000000000000000;/初始化为0000.为了更好的储存数据 zuijian=00000000000000000000; guodu2=00000000000000000000; zuijian2=000000000000000000
11、00; huoquzimu1();/调用设置函数设置公式一 huoquzimu2();/调用设置函数设置公式二 /公式一 void huoquzimu1()/得到原子命题的函数 int k=0; for(int i=0;yuanshimingtii!=0;i+) if(yuanshimingtii=a)&(yuanshimingtii=a)&(yuanshimingti2i=z)/原子命题必须是小写字母 guodu2k=yuanshimingti2i; k+; guodu2k=0;/字符串结束符 setguodu2();/调用函数,去掉重复的 void setguodu2()/化简所得到的命题
12、变元,去掉重复的。 int k=1; zuijian20=guodu20; for(int i=1;guodu2i!=0;i+) if(jianyan(guodu2i,i) zuijian2k=guodu2i; k+; guodu2k=0; num2=k;/记下命题变元的个数 bool jianyan(char a,int n)/检验是否重复的子函数 for(int i=0;in;i+) if(a=zuijiani) return 0; return 1; void operator1()/主操作函数1 bool jz=1; for(int i=0;inum;i+)/输出第一行不变的格式 co
13、utzuijiani ; coutyuanshimingti 真值 yuanshimingti2 真值 相等吗?endl; int a=1;/用来储存一共有多少种解释。 for(i=0;inum;i+) a=a*2; /分2num种情况,来解释真值表 int b=0,c10=0,0,0,0,0,0,0,0,0,0; for(i=0;ia;i+) int d=b; for(int j=0;j-1;j-) coutcj ; b+; /公式一 string cc=0000000000; for(j=0;jnum;j+) if(cj=1) ccj=1; else ccj=0; string aa; a
14、a=yuanshimingti; /通过双重循环,用0/1来替代命题变员 for(int k=0;knum;k+)/变员 for(int j=0;aaj!=0;j+)/原始公式 if(aaj=zuijiank) aaj=ccnum-k-1; coutaa operator2(aa);/第一个公式 /公式二 cc=0000000000;/重新初始化 for(j=0;jnum;j+) if(cj=1) ccj=1; else ccj=0; string aa2; aa2=yuanshimingti2; /通过双重循环,用0/1来替代命题变员 for(k=0;knum;k+)/变员 for(int
15、j=0;aa2j!=0;j+)/原始公式 if(aa2j=zuijiank) aa2j=ccnum-k-1; cout aa2 operator2(aa2);/第二个公式 cout (operator2(aa2)=operator2(aa); if(operator2(aa2)!=operator2(aa) jz=0; coutn; if(jz) cout 二个公式等值相等endl; else cout 二个公式不等值不相等endl; char operator2(string chushi)/操作函数2,得到某种解释下真值表的值,主要思路:从前到后,从外到里! /第一步,先找到和计算出最外面
16、的括号! int a,b=0,k=0; for(int i=0;chushii-1!=)&chushii!=0;i+) if(chushii=) b=i; for(i=0;chushii!=)&chushii!=0;i+) if(chushii=() a=i; if(b!=0) for(i=a+1;ib;i+) guoduk=chushii; k+; guoduk=0; char t; t=operator2(guodu); chushia=t; int z=a+1; for(k=b+1;chushik-1!=0;k+) chushiz=chushik; z+; return operator
17、2(chushi); /第二步再去掉否定 for(i=0;chushii!=0;i+) if(chushii=!) if(chushii+1=1) chushii+1=0; else chushii+1=1; int z=i; for(k=z+1;chushik-1!=0;k+) chushiz=chushik; z+; /第三步直接计算真值 char c=1; for(i=0;chushii!=0;i+) if(chushii=+) if(chushii-1=1)|(chushii+1=1) chushii+1=1; else chushii+1=0; if(chushii=) if(chu
18、shii-1=1)&(chushii+1=1) chushii+1=1; else chushii+1=0; if(chushii+1!=0) c=chushii+1; return c; ;int main() string a1,a2;/用来接收输入的字符串 cout(合取用代替,析取用+代替,命题变元用小写字母)endl; couta1; couta2; coutendl; Gongshi gongshi(a1,a2);/初始化一个类的对象. gongshi.operator1();/调用该类的主操作函数,实现目的. return 0;/1.3自动生成主析取范式和主合取范式#includ
19、e#includeusing namespace std;class Gongshi/得到任意公式真值表的类private: string yuanshimingti;/用来保存输入的原始公式。 string guodu;/过渡用的字符串。 string zuijian;/保存命题变元的字符串。 int num;/原子命题个数public: Gongshi(string a)/构造函数 yuanshimingti=a; guodu=00000000000000000000;/初始化为0000.为了更好的储存数据 zuijian=00000000000000000000; huoquzimu()
20、;/调用设置函数 void huoquzimu()/得到原子命题的函数 int k=0; for(int i=0;yuanshimingtii!=0;i+) if(yuanshimingtii=a)&(yuanshimingtii=z)/原子命题必须是小写字母 guoduk=yuanshimingtii; k+; guoduk=0;/字符串结束符 setguodu();/调用函数,去掉重复的 void setguodu()/化简所得到的命题变元,去掉重复的。 int k=1; zuijian0=guodu0; for(int i=1;guodui!=0;i+) if(jianyan(guodu
21、i,i) zuijiank=guodui; k+; guoduk=0; num=k;/记下命题变元的个数 bool jianyan(char a,int n)/检验是否重复的子函数 for(int i=0;in;i+) if(a=zuijiani) return 0; return 1; void operator1()/主操作函数1 int z=0,y=0; int true130,qq1=0; int false130,qq2=0; for(int i=0;inum;i+)/输出第一行不变的格式 coutzuijiani ; coutyuanshimingti 真值endl; int a=1;/用来储存一共有多少种解释。 for(i=0;inum;i+) a=a*2; /分2num种情况,来解释真值表 int b=0,c10=0,0,0,0,0,0,0,0,0,0; for(i=0;ia;i+) int d=b; for(int j=0;j-1;j-) coutcj ; b+; string cc=0000000000; for(j=0;jnum;j+) if(cj=1) ccj=1; else cc
copyright@ 2008-2022 冰豆网网站版权所有
经营许可证编号:鄂ICP备2022015515号-1