离散数学数理逻辑与集合论相关内容

一.实验目的

  1. 实现二元合取、析取、蕴涵和等价表达式的计算。熟悉连接词逻辑运算规则,利用程序语言实现逻辑这几种逻辑运算。
  2. 通过编程实现,使学生掌握关系矩阵构造的基本方法。
  3. 通过编程实现,使学生熟练掌握利用计算机语言实现逻辑运算的基本方法。
  4. 使学生熟练掌握利用计算机语言实现逻辑运算的基本方法,增强逻辑推理能力。

二.实验原理

  1. 不同的联结词联结不同的命题变元,将会产生不同的真值结果。
  2. 设A为集合,R为非空集合A上的关系,则相应有R的n次幂,以及r(R),s(R),t(R)。
  3. P∧Q;P∨Q;P->Q;P<-->Q;r(R)=R∪R(0);s(R)=R∪R(逆);t(R)=R(1阶)∪R(2阶)∪R(3阶)∪...。

三.实验内容

  1. 从键盘输入两个命题变元P和Q的真值,求它们的合取、析取、蕴涵和等价四种运算的真值。要求对输入内容进行分析,如果不符合0、1条件需要重新输入,程序有良好的输入输出界面。
  2. 对给出的任意一个命题公式(不超过四个命题变元),使学生会利用编程软件表示出来,并且能够计算它在各组真值指派下所应有的真值,画出其真值表。
  3. 编程解决下列问题:
    求公式的主析取范式与主合取范式,并求公式的成真赋值和成假赋值。
  4. 编程解决下列问题:
    设A={a,b,c,d}, R={<a,b>,<b,a>,<b,c>,<c,d>}, 求R的各次幂, 用矩阵表示。
  5. 编程解决下列问题:
    设A={a,b,c,d}, R={<a,b>,<b,a>,<b,c>,<c,d>,<d,b>}, 求出 r(R), s(R), t(R),利用关系矩阵表示。

四.实验代码

1 第一题实验代码:

#include<stdio.h>
int main(){
		int P,Q;
		printf("请输入P的真值:\n");
		scanf("%d",&P);
		printf("请输入Q的真值:\n");
		scanf("%d",&Q);
		if(P==1&&Q==1) {
			printf("P∧Q的结果是true\n");
		}
		else {
			printf("P∧Q的结果是false\n");
		}
		if(P==1||Q==1) {
			printf("P∨Q的结果是true\n");
		}
		else {
			printf("P∨Q的结果是false\n");	
		}
		if(P==1&&Q==0) {
		    printf("P->Q的结果是false\n");
		} 
		else { 
		    printf("P->Q的结果是ture\n"); 
		} 
		if((P==1&&Q==0)||(P==0&&Q==1)){ 
		    printf("P<-->Q的结果是false\n");
		} 
		else {
		    printf("P<-->Q的结果ture");
	    } }

2 第二题实验代码:

#include<iostream>
#include<cctype>
#include<set>
#include<string>
#include<stack>
using namespace std;
#define Max 1000
int Array_one[Max][4]={0},Array_two[Max][4]={0},Counter_one=0,Counter_two=0;//储存各个变元的真值,计数器
string s;
int n;//串s,储存命题公式
stack<char> Stack;//创建字符栈
stack<int> Num;//创建数字栈
char save[Max],c;//用于储存后缀表达式和临时字符
int follow=0;//计数器
int p,q,r,g;//用于储存真值
int Amp();//操作符优先级比较函数
void Transform();//中缀表达式转后缀表达式
void fei();//非运算
void yu();//与运算
void huo();//或运算
void tiaojian();//条件运算
void Shuangtiaojian();//双条件运算
void Truenum1();//真值运算
void Truenum2();//真值运算
void Truenum3();//真值运算
void Truenum4();//真值运算
int main()
{
	cout<<"变元为p,q,r,g"<<endl;
	cout<<"!:非运算;&:与运算;|:或运算;>: 条件运算;$:双条件运算;(:左括号;):右括号。"<<endl;
	cout<<"请输入命题变元的数目:"<<endl;
	cin>>n;
	cout<<"请输入命题公式:"<<endl;
	cin>>s;
	Transform();
	cout<<"\t\t\t\t**真值表**"<<endl;
	if(n==1){
	cout<<"p\t\t"<<s<<endl;
		Truenum1();
	cout<<endl;
	return 0;
	}
	else if(n==2){
	cout<<"p\t\t"<<"q\t\t"<<s<<endl;
		Truenum2();
	cout<<endl;
	return 0;}
	else if(n==3){
	cout<<"p\t\t"<<"q\t\t"<<"r\t\t"<<s<<endl;
		Truenum3(); 
	cout<<endl;
	return 0;}
	else{
	cout<<"p\t\t"<<"q\t\t"<<"r\t\t"<<"g\t\t"<<s<<endl;
		Truenum4();
	cout<<endl;
	return 0;}
}
int Amp(char a) {
	switch(a)
	{
		//由逻辑运算符优先级得到
		case ')':return 5;break;
		case '!':return 4;break;
		case '&':return 3;break;
		case '|':return 2;break;
		case '>':return 1;break;
		case '$':return 0;break;
		case '(':return -1;break;
	}
}
void Transform() {
	for(int i=s.length()-1;i>=0;i--) {//遍历命题公式
		c=s[i];//临时储存字符
		if(isalpha(c))//如果为字母,后缀表达式直接储存
			save[follow++]=c;
		if(c=='!'||c=='&'||c=='|'||c=='>'||c=='$'||c=='('||c==')') {//当为操作符时
			if(Stack.empty()) Stack.push(c);//字符栈为空,直接压入
			else if(c!='(') Stack.push(c);//当遍历未读取到左括号时,操作符直接入栈
			else if(c=='(') {//当读取到左括号时
				while(!Stack.empty()&&Amp(Stack.top())>Amp(c))//当字符栈不为空且栈内操作符优先级大于站外优先级时
				{
					if(Stack.top()==')') break;//读取到右括号时,直接跳出循环
					save[follow++]=Stack.top();//栈顶操作符储存到后缀表达式中
					Stack.pop();//操作符出栈
				}
				if(Stack.top()==')') Stack.pop();//当栈顶操作符为左括号时,直接出栈
			}
		}
	}
	while(!Stack.empty())//输出全部栈内操作符存储到后缀表达式中
	{
		save[follow++]=Stack.top();
		Stack.pop();
	}
}
void Truenum1() {
	for(p=0;p<=1;p++) {
				cout<<p<<"\t\t";
				for(int i=0;i<follow;i++) {
					c=save[i];//临时存储字符
					if(isalpha(c)) {//当为字母变元时,转换为对应的真值
						switch(c)
						{
							//真值压入数字栈
							case 'p':Num.push(p); break;
						}
					}
					else if(c=='!') fei();
					else if(c=='&') yu();
					else if(c=='|') huo();
					else if(c=='>') tiaojian();
					else if(c=='$')	Shuangtiaojian();
				}
				cout<<Num.top()<<endl;
			if(Num.top()==1) {//由主析取范式特性进行判断
				Array_one[Counter_one++][0]=p;
			}
			else{//由主合取范式特性进行判断
				Array_two[Counter_two++][0]=p;
			}
			Num.pop();//最终的命题公式真值出栈
			}
		}
	void Truenum2() {
	for(p=0;p<=1;p++) {
		for(q=0;q<=1;q++) {
				cout<<p<<"\t\t"<<q<<"\t\t";
				for(int i=0;i<follow;i++) {
					c=save[i];//临时存储字符
					if(isalpha(c)) {//当为字母变元时,转换为对应的真值
						switch(c)
						{
							//真值压入数字栈
							case 'p':Num.push(p); break;
							case 'q':Num.push(q); break;
						}
					}
					else if(c=='!') fei();
					else if(c=='&') yu();
					else if(c=='|') huo();
					else if(c=='>') tiaojian();
					else if(c=='$')	Shuangtiaojian();
				}
				cout<<Num.top()<<endl;
			if(Num.top()==1) {//由主析取范式特性进行判断
				Array_one[Counter_one][0]=p;
				Array_one[Counter_one++][1]=q;
			}
			else{//由主合取范式特性进行判断
				Array_two[Counter_two][0]=p;
				Array_two[Counter_two++][1]=q;
			}
			Num.pop();//最终的命题公式真值出栈
			}
		}
	}
		void Truenum3() {
	for(p=0;p<=1;p++) {
		for(q=0;q<=1;q++) {
			for(r=0;r<=1;r++) {
				cout<<p<<"\t\t"<<q<<"\t\t"<<r<<"\t\t";
				for(int i=0;i<follow;i++) {
					c=save[i];//临时存储字符
					if(isalpha(c)) {//当为字母变元时,转换为对应的真值
						switch(c)
						{
							//真值压入数字栈
							case 'p':Num.push(p); break;
							case 'q':Num.push(q); break;
							case 'r':Num.push(r); break;
						}
					}
					else if(c=='!') fei();
					else if(c=='&') yu();
					else if(c=='|') huo();
					else if(c=='>') tiaojian();
					else if(c=='$')	Shuangtiaojian();
				}
				cout<<Num.top()<<endl;
			if(Num.top()==1) {//由主析取范式特性进行判断
				Array_one[Counter_one][0]=p;
				Array_one[Counter_one][1]=q;
				Array_one[Counter_one++][2]=r;
			}
			else{//由主合取范式特性进行判断
				Array_two[Counter_two][0]=p;
				Array_two[Counter_two][1]=q;
				Array_two[Counter_two++][2]=r;
			}
			Num.pop();//最终的命题公式真值出栈
			}
		}
	}
}
		void Truenum4() {
	for(p=0;p<=1;p++) {
		for(q=0;q<=1;q++) {
			for(r=0;r<=1;r++) {
				for(g=0;g<=1;g++){
				cout<<p<<"\t\t"<<q<<"\t\t"<<r<<"\t\t"<<g<<"\t\t";
				for(int i=0;i<follow;i++) {
					c=save[i];//临时存储字符
					if(isalpha(c)) {//当为字母变元时,转换为对应的真值
						switch(c)
						{
							//真值压入数字栈
							case 'p':Num.push(p); break;
							case 'q':Num.push(q); break;
							case 'r':Num.push(r); break;
							case 'g':Num.push(g); break;
						}
					}
					else if(c=='!') fei();
					else if(c=='&') yu();
					else if(c=='|') huo();
					else if(c=='>') tiaojian();
					else if(c=='$')	Shuangtiaojian();
				}
				cout<<Num.top()<<endl;
			if(Num.top()==1) {//由主析取范式特性进行判断
				Array_one[Counter_one][0]=p;
				Array_one[Counter_one][1]=q;
				Array_one[Counter_one][2]=r;
				Array_one[Counter_one++][3]=g;
			}
			else{//由主合取范式特性进行判断
				Array_two[Counter_two][0]=p;
				Array_two[Counter_two][1]=q;
				Array_two[Counter_two][2]=r;
				Array_two[Counter_two++][3]=g;
			}
			Num.pop();//最终的命题公式真值出栈
			}
		}
	}
}
}
void fei() {//一元操作符,!expr
	int True=!Num.top(); Num.pop();//弹出一个真值,并出栈
	Num.push(True);//操作结果压栈
}
void yu() {//二元操作符,Expr&&expr
	int True_one=Num.top(); Num.pop();//弹出两个真值,并出栈
	int True_two=Num.top(); Num.pop();
	int True=True_one&&True_two;
	Num.push(True);//操作结果压栈
}
void huo() {//二元操作符,Expr||expr
	int True_one=Num.top(); Num.pop();
	int True_two=Num.top(); Num.pop();
	int True; 
	if(True_one==0&&True_two==0) True=0;
	else True=1;
	Num.push(True);
}
void tiaojian() {//二元操作符,Expr->expr
	int True_one=Num.top(); Num.pop();
	int True_two=Num.top(); Num.pop();
	int True;
	if(True_one==0&&True_two==1) True=0;
	else True=1;
	Num.push(True);
}
void Shuangtiaojian() {//二元操作符,Expr<->expr
	int True_one=Num.top(); Num.pop();
	int True_two=Num.top(); Num.pop();
	int True;
	if(True_one==True_two) True=1;
	else True=0;
	Num.push(True);}

3 第三题实验代码:

#include<iostream>
#include<cctype>
#include<set>
#include<string>
#include<stack>
using namespace std;
#define Max 1000
int Array_one[Max][4]={0},Array_two[Max][4]={0},Counter_one=0,Counter_two=0;//储存各个变元的真值,计数器
int chengzhen[1000];
int chengjia[1000];
string s;
int n;//串s,储存命题公式
int count1=0;
int count2=0;
stack<char> Stack;//创建字符栈
stack<int> Num;//创建数字栈
char save[Max],c;//用于储存后缀表达式和临时字符
int follow=0;//计数器
int p,q,r,g;//用于储存真值
int Amp();//操作符优先级比较函数
void Transform();//中缀表达式转后缀表达式
void fei();//非运算
void yu();//与运算
void huo();//或运算
void tiaojian();//条件运算
void Shuangtiaojian();//双条件运算
void Truenum1();//真值运算
void Output_xiqu1();//输出主析取式
void Output_hequ1();//输出主合取式
void Truenum2();//真值运算
void Output_xiqu2();//输出主析取式
void Output_hequ2();
void Truenum3();//真值运算
void Output_xiqu3();//输出主析取式
void Output_hequ3();
void Truenum4();//真值运算
void Output_xiqu4();//输出主析取式
void Output_hequ4();
int main()
{
	for(int i=0;i<1000;i++){
		chengzhen[i]=2;
		chengjia[i]=2;
	}
	cout<<"变元为p,q,r,g"<<endl;
	cout<<"! 非运算,& 与运算,| 或运算,> 条件运算,$ 双条件运算,( 左括号,) 右括号"<<endl;
	cout<<"请输入命题变元的数目:"<<endl;
	cin>>n;
	cout<<"请输入命题公式!"<<endl;
	cin>>s;
	Transform();
	if(n==1){
		Truenum1();
	Output_hequ1();
	Output_xiqu1();
	cout<<"成真赋值为:"<<endl;
	for(int j=0;j<=100;j++){
		if(chengzhen[j]==0||chengzhen[j]==1)
		cout<<chengzhen[j]<<" ";
	}
	printf("\n");
	cout<<"成假赋值为:"<<endl;
	for(int j=0;j<=100;j++){
		if(chengjia[j]==0||chengjia[j]==1)
		cout<<chengjia[j]<<" ";
	}
	cout<<endl;
	}
	else if(n==2){
		Truenum2();
	Output_hequ2();
	Output_xiqu2();
	cout<<"成真赋值为:"<<endl;
	for(int j=0;j<=100;j++){
		if(chengzhen[j]==0||chengzhen[j]==1)
		cout<<chengzhen[j]<<"";
		count1++;
		if(count1%2==0)
		cout<<" "<<"";
	}
	printf("\n");
	cout<<"成假赋值为:"<<endl;
	for(int j=0;j<=100;j++){
		if(chengjia[j]==0||chengjia[j]==1)
		cout<<chengjia[j]<<"";
		count2++;
		if(count2%2==0)
		cout<<" "<<"";
	}
	cout<<endl;
}
	else if(n==3){
		Truenum3();
	Output_hequ3();
	Output_xiqu3();
	cout<<"成真赋值为:"<<endl;
	for(int j=0;j<=100;j++){
		if(chengzhen[j]==0||chengzhen[j]==1)
		cout<<chengzhen[j]<<"";
		count1++;
		if(count1%3==0)
		cout<<" "<<"";
	}
	printf("\n");
	cout<<"成假赋值为:"<<endl;
	for(int j=0;j<=100;j++){
		if(chengjia[j]==0||chengjia[j]==1)
		cout<<chengjia[j]<<"";
		count2++;
		if(count2%3==0)
		cout<<" "<<"";
	}
	cout<<endl;
	return 0;}
	else{
		Truenum4();
	Output_hequ4();
	Output_xiqu4();
	cout<<endl;
	cout<<"成真赋值为:"<<endl;
	for(int j=0;j<=100;j++){
		if(chengzhen[j]==0||chengzhen[j]==1)
		cout<<chengzhen[j]<<"";
		count1++;
		if(count1%4==0)
		cout<<" "<<"";
	}
	printf("\n");
	cout<<"成假赋值为:"<<endl;
	for(int j=0;j<=100;j++){
		if(chengjia[j]==0||chengjia[j]==1)
		cout<<chengjia[j]<<"";
			count2++;
		if(count2%4==0)
		cout<<" "<<"";
	}}
}
int Amp(char a) {
	switch(a)
	{
		//由逻辑运算符优先级得到
		case ')':return 5;break;
		case '!':return 4;break;
		case '&':return 3;break;
		case '|':return 2;break;
		case '>':return 1;break;
		case '$':return 0;break;
		case '(':return -1;break;
	}
}
void Transform() {
	for(int i=s.length()-1;i>=0;i--) {//遍历命题公式
		c=s[i];//临时储存字符
		if(isalpha(c))//如果为字母,后缀表达式直接储存
			save[follow++]=c;
		if(c=='!'||c=='&'||c=='|'||c=='>'||c=='$'||c=='('||c==')') {//当为操作符时
			if(Stack.empty()) Stack.push(c);//字符栈为空,直接压入
			else if(c!='(') Stack.push(c);//当遍历未读取到左括号时,操作符直接入栈
			else if(c=='(') {//当读取到左括号时
				while(!Stack.empty()&&Amp(Stack.top())>Amp(c))//当字符栈不为空且栈内操作符优先级大于站外优先级时
				{
					if(Stack.top()==')') break;//读取到右括号时,直接跳出循环
					save[follow++]=Stack.top();//栈顶操作符储存到后缀表达式中
					Stack.pop();//操作符出栈
				}
				if(Stack.top()==')') Stack.pop();//当栈顶操作符为左括号时,直接出栈
			}
		}
	}
	while(!Stack.empty())//输出全部栈内操作符存储到后缀表达式中
	{
		save[follow++]=Stack.top();
		Stack.pop();
	}
}
void Truenum1() {
	for(p=0;p<=1;p++) {
				for(int i=0;i<follow;i++) {
					c=save[i];//临时存储字符
					if(isalpha(c)) {//当为字母变元时,转换为对应的真值
						switch(c)
						{
							//真值压入数字栈
							case 'p':Num.push(p); break;
						}
					}
					else if(c=='!') fei();
					else if(c=='&') yu();
					else if(c=='|') huo();
					else if(c=='>') tiaojian();
					else if(c=='$')	Shuangtiaojian();
				}
			if(Num.top()==1) {//由主析取范式特性进行判断
				Array_one[Counter_one++][0]=p;
			}
			else{//由主合取范式特性进行判断
				Array_two[Counter_two++][0]=p;
			}
			}
		}
void Output_xiqu1() {
	cout<<"主析取式"<<endl;
	for(int i=0;i<Counter_one;i++) {
		cout<<"(";
		if(Array_one[i][0]==0){
		cout<<"(!p)";
		chengzhen[i]=0;}
		else {cout<<"p";
		chengzhen[i]=1;}
		if(i==Counter_one-1) cout<<")";
		else {cout<<")|";}
	}
	cout<<endl;
}
void Output_hequ1() {
	cout<<"主合取式"<<endl;
	for(int i=0;i<Counter_two;i++) {
		cout<<"(";
		if(Array_two[i][0]==0) {
		cout<<"p";
		chengjia[i]=0;}
		else {cout<<"(!p)";
		chengjia[i]=1;}
		if(i==Counter_two-1) cout<<")";
		else {cout<<")&";}
	}
	cout<<endl;
}	
	void Truenum2() {
	for(p=0;p<=1;p++) {
		for(q=0;q<=1;q++) {
				for(int i=0;i<follow;i++) {
					c=save[i];//临时存储字符
					if(isalpha(c)) {//当为字母变元时,转换为对应的真值
						switch(c)
						{
							//真值压入数字栈
							case 'p':Num.push(p); break;
							case 'q':Num.push(q); break;
						}
					}
					else if(c=='!') fei();
					else if(c=='&') yu();
					else if(c=='|') huo();
					else if(c=='>') tiaojian();
					else if(c=='$')	Shuangtiaojian();
				}
			if(Num.top()==1) {//由主析取范式特性进行判断
				Array_one[Counter_one][0]=p;
				Array_one[Counter_one++][1]=q;
			}
			else{//由主合取范式特性进行判断
				Array_two[Counter_two][0]=p;
				Array_two[Counter_two++][1]=q;
			}
			}
		}
	}
void Output_xiqu2() {
	cout<<"主析取式"<<endl;
	int k=0;
	for(int i=0;i<Counter_one;i++) {
		cout<<"(";
		if(Array_one[i][0]==0){
		cout<<"(!p)";
		chengzhen[k]=0;}
		else {cout<<"p";
		chengzhen[k]=1;}
		if(Array_one[i][1]==0){
		cout<<"&(!q)";
		chengzhen[k+1]=0;}
			else {cout<<"&q";chengzhen[k+1]=1;}
			k=k+2;
		if(i==Counter_one-1) cout<<")";
		else {cout<<")|";}
	}
	cout<<endl;
}
void Output_hequ2() {
	cout<<"主合取式"<<endl;
	int k=0;
	for(int i=0;i<Counter_two;i++) {
		cout<<"(";
		if(Array_two[i][0]==0) {
		cout<<"p";
		chengjia[k]=0;}
		else {cout<<"(!p)";
		chengjia[k]=1;}
		if(Array_two[i][1]==0){
		cout<<"|q";
		chengjia[k+1]=0;}
		else {cout<<"|(!q)";
		chengjia[k+1]=1;}
		k=k+2;
		if(i==Counter_two-1) cout<<")";
		else {cout<<")&";}
	}
	cout<<endl;
}

		void Truenum3() {
	for(p=0;p<=1;p++) {
		for(q=0;q<=1;q++) {
			for(r=0;r<=1;r++) {
				for(int i=0;i<follow;i++) {
					c=save[i];//临时存储字符
					if(isalpha(c)) {//当为字母变元时,转换为对应的真值
						switch(c)
						{
							//真值压入数字栈
							case 'p':Num.push(p); break;
							case 'q':Num.push(q); break;
							case 'r':Num.push(r); break;
						}
					}
					else if(c=='!') fei();
					else if(c=='&') yu();
					else if(c=='|') huo();
					else if(c=='>') tiaojian();
					else if(c=='$')	Shuangtiaojian();
				}
			if(Num.top()==1) {//由主析取范式特性进行判断
				Array_one[Counter_one][0]=p;
				Array_one[Counter_one][1]=q;
				Array_one[Counter_one++][2]=r;
			}
			else{//由主合取范式特性进行判断
				Array_two[Counter_two][0]=p;
				Array_two[Counter_two][1]=q;
				Array_two[Counter_two++][2]=r;
			}
			}
		}
	}
}
void Output_xiqu3() {
	cout<<"主析取式"<<endl;
	int k=0;
	for(int i=0;i<Counter_one;i++) {
		cout<<"(";
		if(Array_one[i][0]==0){
		cout<<"(!p)";
		chengzhen[k]=0;}
		else {cout<<"p";
		chengzhen[k]=1;}
		if(Array_one[i][1]==0) {
		cout<<"&(!q)";
		chengzhen[k+1]=0;}
			else {cout<<"&q";
			chengzhen[k+1]=1;}
		if(Array_one[i][2]==0) {
		cout<<"&(!r)";
		chengzhen[k+2]=0;}
		else {cout<<"&r";chengzhen[k+2]=1;}
		k=k+3;
		if(i==Counter_one-1) cout<<")";
		else {cout<<")|";}
	}
	cout<<endl;
}
void Output_hequ3() {
	cout<<"主合取式"<<endl;
	int k=0;
	for(int i=0;i<Counter_two;i++) {
		cout<<"(";
		if(Array_two[i][0]==0) {
		cout<<"p";
		chengjia[k]=0;}
		else {cout<<"(!p)";
		chengjia[k]=1;}
		if(Array_two[i][1]==0){
		cout<<"|q";
		chengjia[k+1]=0;}
		else {cout<<"|(!q)";
		chengjia[k+1]=1;}
		if(Array_two[i][2]==0) {
		cout<<"|r";
		chengjia[k+2]=0;}
		else {cout<<"|(!r)";
		chengjia[k+2]=1;}
		k=k+3;
		if(i==Counter_two-1) cout<<")";
		else {cout<<")&";}
	}
	cout<<endl;
}
		void Truenum4() {
	for(p=0;p<=1;p++) {
		for(q=0;q<=1;q++) {
			for(r=0;r<=1;r++) {
				for(g=0;g<=1;g++){
				for(int i=0;i<follow;i++) {
					c=save[i];//临时存储字符
					if(isalpha(c)) {//当为字母变元时,转换为对应的真值
						switch(c)
						{
							//真值压入数字栈
							case 'p':Num.push(p); break;
							case 'q':Num.push(q); break;
							case 'r':Num.push(r); break;
							case 'g':Num.push(g); break;
						}
					}
					else if(c=='!') fei();
					else if(c=='&') yu();
					else if(c=='|') huo();
					else if(c=='>') tiaojian();
					else if(c=='$')	Shuangtiaojian();
				}
			if(Num.top()==1) {//由主析取范式特性进行判断
				Array_one[Counter_one][0]=p;
				Array_one[Counter_one][1]=q;
				Array_one[Counter_one][2]=r;
				Array_one[Counter_one++][3]=g;
			}
			else{//由主合取范式特性进行判断
				Array_two[Counter_two][0]=p;
				Array_two[Counter_two][1]=q;
				Array_two[Counter_two][2]=r;
				Array_two[Counter_two++][3]=g;
			}
			}
		}
	}
}
}

void Output_xiqu4() {
	cout<<"主析取式"<<endl;
	int k=0;
	for(int i=0;i<Counter_one;i++) {
		cout<<"(";
		if(Array_one[i][0]==0){
		cout<<"(!p)";
		chengzhen[k]=0;}
		else {cout<<"p";
		chengzhen[k]=1;}
		if(Array_one[i][1]==0) {
		cout<<"&(!q)";
		chengzhen[k+1]=0;}
			else {cout<<"&q";
			chengzhen[k+1]=1;}
		if(Array_one[i][2]==0) {
		cout<<"&(!r)";
		chengzhen[k+2]=0;}
		else {cout<<"&r";chengzhen[k+2]=1;}
		if(Array_one[i][3]==0) {
		cout<<"&(!g)";
		chengzhen[k+3]=0;}
		else {cout<<"&g";
		chengzhen[k+3]=0;}
		k=k+4;
		if(i==Counter_one-1) cout<<")";
		else {cout<<")|";}
	}
	cout<<endl;
}
void Output_hequ4() {
	cout<<"主合取式"<<endl;
	int k=0;
	for(int i=0;i<Counter_two;i++) {
		cout<<"(";
			if(Array_two[i][0]==0) {
		cout<<"p";
		chengjia[k]=0;}
		else {cout<<"(!p)";
		chengjia[k]=1;}
		if(Array_two[i][1]==0){
		cout<<"|q";
		chengjia[k+1]=0;}
		else {cout<<"|(!q)";
		chengjia[k+1]=1;}
		if(Array_two[i][2]==0) {
		cout<<"|r";
		chengjia[k+2]=0;}
		else {cout<<"|(!r)";
		chengjia[k+2]=1;}
		if(Array_two[i][3]==0) {
		cout<<"|g";
		chengjia[k+3]=0;}
		else {cout<<"|(!g)";
		chengjia[k+3]=0;}
		k=k+4;
		if(i==Counter_two-1) cout<<")";
		else {cout<<")&";}
	}
	cout<<endl;
}
void fei() {//一元操作符,!expr
	int True=!Num.top(); Num.pop();//弹出一个真值,并出栈
	Num.push(True);//操作结果压栈
}
void yu() {//二元操作符,Expr&&expr
	int True_one=Num.top(); Num.pop();//弹出两个真值,并出栈
	int True_two=Num.top(); Num.pop();
	int True=True_one&&True_two;
	Num.push(True);//操作结果压栈
}
void huo() {//二元操作符,Expr||expr
	int True_one=Num.top(); Num.pop();
	int True_two=Num.top(); Num.pop();
	int True; 
	if(True_one==0&&True_two==0) True=0;
	else True=1;
	Num.push(True);
}
void tiaojian() {//二元操作符,Expr->expr
	int True_one=Num.top(); Num.pop();
	int True_two=Num.top(); Num.pop();
	int True;
	if(True_one==0&&True_two==1) True=0;
	else True=1;
	Num.push(True);
}
void Shuangtiaojian() {//二元操作符,Expr<->expr
	int True_one=Num.top(); Num.pop();
	int True_two=Num.top(); Num.pop();
	int True;
	if(True_one==True_two) True=1;
	else True=0;
	Num.push(True);}

4 第四题实验代码:

#include<stdio.h>
int main(){
	int R[4][4]={{0,1,0,0},{1,0,1,0},{0,0,0,1},{0,0,0,0}};
	int y1[4][4]={{0,0,0,0},{0,0,0,0},{0,0,0,0},{0,0,0,0}};
	int y2[4][4]={{0,0,0,0},{0,0,0,0},{0,0,0,0},{0,0,0,0}};
	printf("R的0次幂为:\n");
	for(int i=0;i<4;i++){
		for(int j=0;j<4;j++){
			if(i!=j)
			printf("0 ");
			else
			printf("1 ");
		}
		printf("\n");
	}
	printf("R的偶次幂为:\n");
	for(int k=0;k<4;k++){
	for(int i=0;i<4;i++){
		for(int j=0;j<4;j++){
			y1[k][i]=y1[k][i]+R[k][j]*R[j][i];
		}
		printf("%d ",y1[k][i]);
	}printf("\n");
}
printf("R的奇次幂为:\n");
for(int k=0;k<4;k++){
	for(int i=0;i<4;i++){
		for(int j=0;j<4;j++){
			y2[k][i]=y2[k][i]+y1[k][j]*R[j][i];
		}
		printf("%d ",y2[k][i]);
	}printf("\n");
}}

5 第五题实验代码:

#include<stdio.h>
int main(){
	int R[4][4]={{0,1,0,0},{1,0,1,0},{0,0,0,1},{0,1,0,0}};
	int R0[4][4]={{0,0,0,0},{0,0,0,0},{0,0,0,0},{0,0,0,0}};
	int R1[4][4]={{0,0,0,0},{0,0,0,0},{0,0,0,0},{0,0,0,0}};
	int R2[4][4]={{0,0,0,0},{0,0,0,0},{0,0,0,0},{0,0,0,0}};
	int R3[4][4]={{0,0,0,0},{0,0,0,0},{0,0,0,0},{0,0,0,0}};
	int tR[4][4]={{0,0,0,0},{0,0,0,0},{0,0,0,0},{0,0,0,0}};
	for(int i=0;i<4;i++){
	for(int j=0;j<4;j++){
			if(i!=j)
			R0[i][j]=0;
			else
			R0[i][j]=1;
		}}
printf("r(R)为:\n");
for(int i=0;i<4;i++){
for(int j=0;j<4;j++){
if(R[i][j]==1||R0[i][j]==1)
R0[i][j]=1;
else
R0[i][j]=0;
printf("%d ",R0[i][j]);
}printf("\n");	
}
printf("s(R)为:\n");
for(int i=0;i<4;i++){
	for(int j=0;j<4;j++){
		R1[i][j]=R[j][i];
	}
}
for(int i=0;i<4;i++){
	for(int j=0;j<4;j++){
		if(R1[i][j]==1||R[i][j]==1)
			R1[i][j]=1;
			else
			R1[i][j]=0;
			printf("%d ",R1[i][j]);
	}printf("\n");
}
for(int k=0;k<4;k++){
	for(int i=0;i<4;i++){
		for(int j=0;j<4;j++){
			R2[k][i]=R2[k][i]+R[k][j]*R[j][i];
		}
	}
}for(int k=0;k<4;k++){
	for(int i=0;i<4;i++){
		for(int j=0;j<4;j++){
			R3[k][i]=R3[k][i]+R2[k][j]*R[j][i];
		}
	}
}printf("t(R)为:\n");
for(int i=0;i<4;i++){
		for(int j=0;j<4;j++){
			if(R[i][j]==1||R2[i][j]==1||R3[i][j]==1)
			tR[i][j]=1;
			else
			tR[i][j]=0;
			printf("%d ",tR[i][j]);
		}printf("\n");
		
}}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值