一.实验目的
- 实现二元合取、析取、蕴涵和等价表达式的计算。熟悉连接词逻辑运算规则,利用程序语言实现逻辑这几种逻辑运算。
- 通过编程实现,使学生掌握关系矩阵构造的基本方法。
- 通过编程实现,使学生熟练掌握利用计算机语言实现逻辑运算的基本方法。
- 使学生熟练掌握利用计算机语言实现逻辑运算的基本方法,增强逻辑推理能力。
二.实验原理
- 不同的联结词联结不同的命题变元,将会产生不同的真值结果。
- 设A为集合,R为非空集合A上的关系,则相应有R的n次幂,以及r(R),s(R),t(R)。
- 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阶)∪...。
三.实验内容
- 从键盘输入两个命题变元P和Q的真值,求它们的合取、析取、蕴涵和等价四种运算的真值。要求对输入内容进行分析,如果不符合0、1条件需要重新输入,程序有良好的输入输出界面。
- 对给出的任意一个命题公式(不超过四个命题变元),使学生会利用编程软件表示出来,并且能够计算它在各组真值指派下所应有的真值,画出其真值表。
- 编程解决下列问题:
求公式的主析取范式与主合取范式,并求公式的成真赋值和成假赋值。 - 编程解决下列问题:
设A={a,b,c,d}, R={<a,b>,<b,a>,<b,c>,<c,d>}, 求R的各次幂, 用矩阵表示。 - 编程解决下列问题:
设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");
}}