离散数学实验 命题逻辑2浙江中医药大学.docx
《离散数学实验 命题逻辑2浙江中医药大学.docx》由会员分享,可在线阅读,更多相关《离散数学实验 命题逻辑2浙江中医药大学.docx(20页珍藏版)》请在冰豆网上搜索。
![离散数学实验 命题逻辑2浙江中医药大学.docx](https://file1.bdocx.com/fileroot1/2022-10/28/c4a5a841-4727-40e9-b40b-085c9755c8f2/c4a5a841-4727-40e9-b40b-085c9755c8f21.gif)
离散数学实验命题逻辑2浙江中医药大学
离散数学实验报告
专业班级:
姓名:
学号:
实验成绩:
1.【实验题目】
命题逻辑
(2)
2.【实验目的】
熟悉掌握命题逻辑中真值表,进一步能用它们来解决实际问题。
3.【实验内容】
求任意一个命题公式的真值表
4.【实验要求】
通过以下界面提示实现相应逻辑运算,列出其真值表
****************************************************************
请选择(1—6)要进行的真值表运算:
1.逻辑非(┌P)
2.合取(P∧Q)
3.析取(P∨Q)
4.条件(P→Q)
5.双条件(P←→Q)
6.继续/退出(y/n)
****************************************************************
5.【算法描述】
1.实验原理
真值表:
列出命题公式真假值的表,通常以1表示真,0表示假。
命题公式的取值由组成命题公式的命题变元的取值和命题联结词决定,命题联结词的真值表给出了真假值的算法。
2.实验过程
对于给定的命题公式,生成相应真值表,然后用函数运算,输出结果:
如生成逻辑非、合取、析取、条件、双条件表达式的真值表,例如:
输入!
a
输出真值表如下:
a!
a
11
20
输入a&&b
输出真值表如下:
aba∧b
000
010
100
111
输入a||b
输出真值表如下:
aba∨b
000
011
101
111
输入a->b
输出真值表如下:
aba→b
001
011
100
111
输入a<>b(其中<>表示双条件)
输出真值表如下:
aba←→b
001
010
100
111
6.【源程序(带注释)】
#include
#include
#include
staticinta[2];//定义全局数组a[2]
voidmain()
{
intluojifei();//声明逻辑非函数
inthequ();//声明合取函数
intxiqu();//声明析取函数
inttiaojian();//声明条件函数
intshuangtiaojian();//声明双条件函数
voidprint();//声明打印星号函数
charn[10];
charc;
print();//打印星号
loop:
//loop循环开始标记
do
{
fflush(stdin);//清空输入缓存区,以免对后面的数据输入造成干扰
printf("请选择(1-6)要进行的真值表运算:
\n\n");
printf("\t1.逻辑非(┌P)\n\t2.合取(P∧Q)\n\t3.析取(P∨Q)\n\t4.条件(P→Q)\n\t5.双条件(P←→Q)\n\t6.继续/退出(y/n)\n");
print();
printf("\t提示:
若想查看真值表,按提示输入:
\n\t!
a查看逻辑非真值表\n\ta&&b查看合取真值表\n\ta||b查看析取真值表\n\ta->b查看条件真值表\n\ta<>b查看双条件真值表\n");
print();
scanf("%s",n);//接收用户输入的功能序号
if(strcmp("1",n)==0)//若输入为1,进行逻辑非运算
{
print();
printf("\n逻辑非结果┌P=%d\n",luojifei());//逻辑非运算结果来自luojifei子函数的返回值
print();
fflush(stdin);
system("pause");
}
if(strcmp("2",n)==0)//若输入为2,进行合取运算
{
print();
printf("\n合取结果(P∧Q)=%d\n",hequ());//合取运算结果来自hequ子函数的返回值
print();
fflush(stdin);
system("pause");
}
if(strcmp("3",n)==0)//若输入为3,进行析取运算
{
print();
printf("\n析取结果(P∨Q)=%d\n",xiqu());//析取运算结果来自xiqu子函数的返回值
print();
fflush(stdin);
system("pause");
}
if(strcmp("4",n)==0)//若输入为4,进行条件运算
{
print();
printf("\n条件运算结果(P→Q)=%d\n",tiaojian());//条件运算结果来自tiaojian子函数的返回值
print();
fflush(stdin);
system("pause");
}
if(strcmp("5",n)==0)//若输入为5,进行双条件运算
{
print();
printf("\n双条件运算结果(P→Q)=%d\n",shuangtiaojian());//双条件运算结果来自shuangtiaojian子函数的返回值
print();
fflush(stdin);
system("pause");
}
if(strcmp("6",n)==0)break;//若输入为6,跳出while循环
if(strcmp("!
a",n)==0){printf("逻辑非真值表为:
\n\ta!
a\n\t01\n\t10\n");print();fflush(stdin);system("pause");}
if(strcmp("a&&b",n)==0){printf("合取真值表为:
\n\taba∧b\n\t000\n\t010\n\t100\n\t111\n");print();fflush(stdin);system("pause");}
if(strcmp("a||b",n)==0){printf("析取真值表为:
\n\taba∨b\n\t000\n\t011\n\t101\n\t111\n");print();fflush(stdin);system("pause");}
if(strcmp("a->b",n)==0){printf("条件真值表为:
\n\taba→b\n\t001\n\t011\n\t100\n\t111\n");print();fflush(stdin);system("pause");}
if(strcmp("a<>b",n)==0){printf("双条件真值表为:
\n\taba←→b\n\t001\n\t010\n\t100\n\t111\n");print();fflush(stdin);system("pause");}
}while((c==getchar())!
=EOF);//一直执行while循环,直到无更多的数据可读取档案结束
fflush(stdin);//清空输入缓存区,以免对后面的数据输入造成干扰
printf("\n确认退出(y/n)?
");
scanf("%c",&c);//接收用户输入的字符
if(c=='y')exit
(1);//字符为y,则退出程序
else
{
print();
fflush(stdin);
gotoloop;//返回loop循环起始标签
}
}
voidprint()//定义print函数
{
printf("****************************************************************\n");
}
intpanduanp(intp)//定义判断p的值是否有效的panduanp函数
{
while(p!
=0&&p!
=1)//当p不为0,且p不为1的时候进入while循环
{
printf("\n输入有误,请重新输入P的值(0或1):
\nP=");//提示用户输错数据
fflush(stdin);
scanf("%d",&p);//重新接收p的值,再进行while循环判断
}
returnp;
}
voidpanduanpq(intp,intq)//定义判断p和q的值是否有效的panduanpq函数
{
while((p!
=0&&p!
=1)||(q!
=0&&q!
=1))//当p不为0也不为1,q不为0也不为1的时候进入循环
{
fflush(stdin);
printf("输入错误,请重新输入:
\nP=");
scanf("%d",&p);
printf("\nQ=");
scanf("%d",&q);//重新接收p和q的值,再进行while循环判断
}
a[0]=p;
a[1]=q;//将正确的p和q的值分别存储到全局数组变量a[0],a[1]中
}
intluojifei()//定义逻辑非函数
{
intpanduanp(intp);//子函数里声明panduanp函数
intp;
printf("\n您要进行逻辑非运算,请输入P的值:
\nP=");
scanf("%d",&p);
if(panduanp(p)==1)return0;//调用判断p函数来确保输入的数据有效,并传送回p的值,再对p的值进行逻辑非判断
elsereturn1;
}
inthequ()//定义合取函数
{
voidpanduanpq(intp,intq);//子函数里声明panduanpq函数
intp,q;
printf("\n您要进行合取运算,请输入P与Q的值(0或1):
\nP=");
scanf("%d",&p);
printf("Q=");
scanf("%d",&q);
panduanpq(p,q);//调用判断pq函数来确保输入的p,q数据有效,有效数据在判断pq函数中已经储存到了全局变量a[0],a[1]中
if(a[0]==1&&a[1]==1)return1;//合取时,只有在p,q均为1的时候,才返回1的值
elsereturn0;
}
intxiqu()//定义析取函数
{
voidpanduanpq(intp,intq);//子函数里声明panduanpq函数
intp,q;
printf("\n您要进行析取运算,请输入P与Q的值(0或1):
\nP=");
scanf("%d",&p);
printf("Q=");
scanf("%d",&q);
panduanpq(p,q);//调用判断pq函数来确保输入的p,q数据有效,有效数据在判断pq函数中已经储存到了全局变量a[0],a[1]中
if(a[0]==1||a[1]==1)return1;//析取时,只要有一个为1,即返回1的值
elsereturn0;
}
inttiaojian()//定义条件运算函数
{
v