离散数学命题公式真值表C++或C语言实验报告
离散数学实验——求真值表.docx

一实验目的 (1)二实验内容 (1)三实验环境 (1)四实验原理和实现过程(算法描述) (1)五实验数据及结果分析; (3)六源程序清单; (5)七其他收获和体会。
(14)一实验目的熟悉掌握命题逻辑中的联接词、真值表、主范式等,进一步能用它们来解决实际问题。
二实验内容1.从键盘输入两个命题变元P和Q的真值,求它们的合取、析取、条件和双条件的真值。
(A)2.求任意一个命题公式的真值表(B,并根据真值表求主范式(C))三实验环境C或C++语言编程环境实现。
四实验原理和实现过程(算法描述)A:首先提示用户输入真值指派,然后判断用户输入的是否是0或者1,如果不是则利用while语句提示错误,然后提示重新输入直至输入正确,再根据用户输入的真值给代表合取,析取,蕴含,双条件的变量赋值,再以两行表格形式输出所得结果。
最后提示按#键退出, 否则继续循环求真值。
B:主要思路:首先提示用户输入表达式,然后编写并调用一个函数将表达式转换为逆波兰式,在转换的同时,插入部分语句将表达式中的变量名存储到数组bianl[N]中,然后输出存好的各变量名及用户输入的表达式(建立表头),将每次的真值指派存在数组zhi[]中,编写函数zzhi ()每次调用zzhi ()时都使数组zhi □中的真值加1, (利用递推实现加一时可能的进位,)然后编写并调用一函数qiuzhi ()计算每次真值指派下的逆波兰表达式的值,再输出各真值指派和求出的表达式的真值,然后调用函数zzhiO将真值指派的数组加1, 最后外围利用while 语句循环输出每个不同的真值指派和该指派下表达式的值。
将表达式转换成逆波兰式并将变量提取的算法:首先需要分配2 个栈,一个作为临时存储运算符的栈fu[], —个作为输入逆波兰式的栈nibol:],从中缀式的左端开始取字符,逐序进行如下步骤:(1)若取出的字符是字母,则该字母直接送入nibol[]栈。
同时为了找出所有变量,将该变量名与数组bianl[]中已有的元素比较, 如果bianl □中还没有该字母,则该字母是新出现的变量,将其录入数组bianl []中。
离散数学实验报告真值

离散数学实验报告真值四川⼤学计算机学院实验报告实验名称:求合适公式的真值指导教师:姓名:学号:班级:⽇期:⼀.实验⽬的设计⼀个程序,来达到输⼊⼀个正确的合式公式,求它的真值表。
通过实验,更好地掌握离散数学中的概念、性质和运算。
⼆.功能设计任意输⼊的合适公式计算其真值表并输出三.界⾯设计四.实现步骤算法逻辑如下:(1)任意设计⼀个真值判断表达式,并使其赋值计算(2)计算模拟器中所对应的⼀组真值指派下合式公式的真值(3)输出真值表中对应于模拟器所给出的⼀组真值指派及这组真值指派所对应的⼀⾏真值。
五.运⾏结果六.源代码#include#include#includeusing namespace std;string calcValue(string value1);string calcValueNop(string value1);string caclAnd(string x,string y);string caclOr(string x,string y);string caclNot(string x);int main(){string in,varList="";//="!a+b^c"cout<<"*****************************************\n"<cout<<"** 欢迎进⼊逻辑运算软件**\n"<cout<<"** (可运算真值表,⽀持括号) **\n"<cout<<"** ⽤!表⽰否定**\n"<cout<<"** ⽤^表⽰合取**\n"<cout<<"** ⽤+表⽰析取**\n"<cout<<"*****************************************\n\n"<cout<<"请输⼊命题公式:注意: !,^,+,(,),字母为合法,不要有数字、空格,括号也要匹配!"< cout<<"⽰例:!a+b^c"<cin>>in;cout<<"输⼊命题公式"<int length=in.length();int i=0,j=0;for(i=0;ichar code=in[i];if( ((code>=97)&&(code<123)||((code>=65))&&(code<81))&&varList.find(code, 0)==-1 ) varList+=code;}int n=varList.length();for(i=0;icout<int flag;char *trow=new char[n];for(i=0;ifor(i=0;ifor(j=0;jcout<string value1=in;for(j=0;jchar x=varList[j];for(int k=0;kif(value1[k]==x)value1[k]=trow[j];}cout<flag=1;for(j=n-1;j>-1;j--) {int temp;temp=int(trow[j])-48;flag=flag+temp;if(flag==2) {trow[j]='0';flag=1;}else{trow[j]='1';flag=0;break;}}}delete trow;system("pause");return 0;}string calcValue(string value1){int nlp=value1.find('(',0);int nrp=value1.length();string x="",v="";int i=nlp+1;while(nlp>=0) {x=value1.substr(i,1);if(x=="("){nlp=i;i++;}else{if(x==")"){nrp=i;v=calcValueNop(value1.substr(nlp+1,nrp-nlp-1));value1=(nlp>0?value1.substr(0,nlp):"")+v+((nrp+1)<=value1.length()?value1.substr(n rp+1):"");nlp=value1.find('(',0);i=nlp+1;}else{i=i+1;}}if(i>=value1.length()){nlp=value1.find('(',0);i=nlp+1;}}return calcValueNop(value1);}string calcValueNop(string value1){int nnot=value1.find('!',0);while(nnot>=0) {value1=(nnot>0?value1.substr(0,nnot):"")+caclNot(value1.substr(nnot+1,1))+((nnot+ 2)<=value1.length()?value1.substr(nnot+2):"");nnot=value1.find('!',0);}int nand=value1.find('^',0);while (nand>0){value1=((nand-1)>0?value1.substr(0,nand-1):"")+caclAnd(value1.substr(nand-1,1),va lue1.substr(nand+1,1))+((nand+2) <=value1.length()?value1.substr(nand+2):"");nand=value1.find('^',0);}int nOr=value1.find('+',0);while (nOr>0){value1=((nOr-1)>0?value1.substr(0,nOr-1):"")+caclOr(value1.substr(nOr-1,1),value1. substr(nOr+1,1))+((nOr+2)<=value1.length()?value1.substr(nOr+2):"");nOr=value1.find('+',0);}return value1;}string caclAnd(string x,string y){if ((x=="1") && (y=="1")){return "1";}else {return "0";}}string caclOr(string x,string y){if ((x=="0") && (y=="0")){return "0";}else {return "1";}}string caclNot(string x){if (x=="1") {return "0";}else {return "1";}}七.⼼得体会离散数学课程在各学科领域,特别在计算机科学与技术领域有着⼴泛的应⽤,同时离散数学也是计算机专业的许多专业课程,如程序设计语⾔编译技术、⼈⼯智能、算法设计与分析等必不可少的先⾏课程。
离散数学上机实验报告

一、实验内容
从键盘输入二元关系用沃尔算法求出它的传递闭包,并输出。
二、实验步骤
熟悉沃尔算法,然后将其用程序编写出来,任意输入二元关系,观察程序运行结果,
用另一种算法算出结果,与其比较,调试程序。
三、实验代码
#include<stdio.h>
int main()
{
int n,i,j,k,a[10][10];
printf("﹁q=0\n");
printf("p∧q=1\n");
printf("p∨q=1\n");
printf("p→q=1\n");
printf("p<->q=1\n");
}
continue;
}
if('n'==t)
break;
}
return 0;
}
四、实验体会
求真值运算中,应注意各种连接词的试用方法,以及其在不同情况下的真值。
printf("\n");
}
return 0;
}
四、实验体会
熟悉并使用沃尔算法,关系矩阵中只有0和1,所以用沃尔算法求得的数若大于1,应该返回1,其余不变。
实验四、三种闭包运算
一、实验内容
从键盘输入一个二元关系,求它的自反闭包,对称闭包,传递闭包,并输出。
二、实验步骤
编写程序,从键盘输入一个二元关系,当求传递闭包时,试与沃尔算法的传递闭包做比较,观察程序运行结果,调试程序。
char t;
while(t)
{
printf("是否运算程序(y/n):\n");
任意命题公式的真值表

实验报告实验名称:任意命题公式的真值表实验目的与要求:通过实验,帮助学生更好地掌握计算机科学技术常用的离散数学中的概念、性质和运算,包括联结词、真值表、运算的优先级等,提高学生编写实验报告、总结实验结果的能力,培养学生的逻辑思维能力和算法设计的思想,能够独立完成简单的算法设计和分析,进一步用它们来解决实际问题,帮助学生学习掌握C/C++语言程序设计的基本方法和各种调试手段,使学生具备程序设计的能力。
实验内容提要:求任意一个命题公式的真值表实验步骤:(一)、关于命题公式的形式和运算符(即联结词)的运算首先根据离散数学的相关知识,命题公式由命题变元和运算符(即联结词)组成,命题变元用大写字母英文表示(本次试验没有定义命题常元T和F,即T、F都表示命题变元),每个命题变元都有两种真值指派0和1,对应于一种真值指派,命题公式有一个真值,由所有可能的指派和命题公式相应的真值按照一定的规范构成的表格称为真值表。
目前离散数学里用到的包括扩充联结词总共有九种,即析取(或)、合取(与)、非、蕴含、等值、与非、或非、异或、蕴含否定,常用的为前五种,其中除了非运算为一元运算以外,其它四种为二元运算。
所以本次实验设计时只定义了前五种运算符,同时用“/”表示非,用“*”表示合取,用“+”表示析取,用“>”表示蕴含,用“:”表示等值,且这五种运算符的优先级依次降低,如果需用括号改变运算优先级,则用小括号()改变。
以下为上述五种运算符运算时的一般真值表,用P和Q表示命题变元:1.非,用“/”表示2.合取(与),用“*”表示3.析取(或),用“+”表示4.蕴含,用“>”表示5.等值,用“:”表示(二)、命题公式真值的计算对于人来说,计算数学表达式时习惯于中缀表达式,例如a*b+c,a*(b+c)等等,而对于计算机来说,计算a*b+c还好,计算a*(b+c)则困难,因为括号的作用改变了运算的顺序,让计算机识别括号而改变计算顺序显得麻烦。
最新离散数学命题公式真值表C或C语言试验报告

精品文档离散数学实验报告姓名:鲍佳珍专业班级:12级计算机本部一班实验成绩:201212201401016 学号:【实验题目】1.命题逻辑实验二【实验目的】2.熟悉掌握命题逻辑中真值表,进一步能用它们来解决实际问题。
【实验内容】3.求任意一个命题公式的真值表【实验要求】4、C++语言编程实现C或【算法描述】5.1.实验原理表征逻辑事件输入和输出之间全部可能状态的表格。
列出命题公式真值表:命题公式的取值由组成命题公式的命表示假。
1通常以表示真,0 真假值的表。
真题变元的取值和命题联结词决定,命题联结词的真值表给出了真假值的算法。
值表是在逻辑中使用的一类数学表,用来确定一个表达式是否为真或有效。
实验过程2.输出结果:然后用函数运算,首先是输入一个合理的式子,生成相应真值表,要求可生成逻辑非、合取、析取、蕴含、双条件表达式的真值表,例如: !a输入输出真值表如下:a !a1 001a&&b输入输出真值表如下:a b a&&b0 0 00 1 01 0 01 1 1a||b输入输出真值表如下:精品文档.精品文档a b a||b0 0 00 1 11 0 11 1 1输入a->b输出真值表如下:a b a->b0 0 10 1 11 0 01 1 1输入a<>b (其中<>表示双条件)输出真值表如下:a b a<>b0 0 10 1 01 0 01 1 16.【源程序(带注释)】#include<stdio.h>#include<string.h>void hequ();void yunhan();void xiqu();void shuang();void fei();//声明五个函数int main(){int ch;char s[10];精品文档.精品文档牰湩晴尨欢迎使用命题公式真值表查找软件\n\n);printf(.合取 2.析取 3.蕴含 4.双条件 5.非0.结束查找\n);//软件使用界面的输出scanf(%d,&ch);while(ch){printf(\\n您能查找真值表的命题公式有以下几种:\n\n);printf(.合取请输入a&&b 2.析取请输入a||b 3.蕴含请输入a->b 4.双条件请输入a<>b 5.非请输入!a\n);//选择输入的公式类型getchar();牰湩晴尨请输入您所需要查询的公式:);scanf(%s,s);if(!strcmp(s,a&&b))hequ();else if(!strcmp(s,!a))fei();else if(!strcmp(s,a||b))xiqu();else if(!strcmp(s,a->b))yunhan();精品文档.精品文档else if(!strcmp(s,a<>b))//将输入的公式与程序内存在的公式进行比较shuang();else牰湩晴尨对不起,您所要查找的公式不存在!\n\n);printf(\1.继续查找0. 结束\n\n);scanf(%d,&ch); //使程序循环}return 0;}void hequ(){a&&b\n); printf(a b0\n); printf( 10\n); printf( 00\n); 0 printf(1\n); printf( 1}void xiqu()a||b\n); b printf(a 1\n); 1 printf(精品文档.精品文档printf( 0 0\n); printf( 0 1\n); printf( 1 1\n); }void yunhan(){printf(a b a->b\n); 1\n); printf( 11\n); 0 printf( printf( 0\n); 01\n);printf( 1}void fei(){!a\n); printf(a0\n); printf(1\n); printf(void shuang(){printf(a b a<>b\n);0\n); printf( 1精品文档.精品文档printf( 0 1\n);printf( 0 0\n);printf( 1 1\n);} //定义五个函数7.【实验结果与分析总结(含运行结果截图)】输入界面输入公式并输出真值表精品文档.精品文档继续查找结束程序精品文档.精品文档精品文档.。
离散数学实验报告命题逻辑—构造命题公式的真值表

【实验目的】使学生熟练掌握利用计算机语言实现逻辑运算的基本方法。
【实验内容】对给出的任意一个命题公式(不超过四个命题变元),使学生会用C语言的程序编程表示出来,并且能够计算它在各组真值指派下所应有的真值,画出其真值表。
【实验原理】给出任意一个命题公式,我们可以将它用C程序表示出来,并且能够计算它在各组真值指派下所应有的真值(或是逻辑运算的结果)。
这有多种方法。
上面我们已经给出了逻辑连结词的定义,根据这种定义方法,我们也可以把一个命题公式表示成为条件语句中的条件表达式,这样我们就可以得到该命题公式的逻辑运算结果了。
【程序代码】#include <bits/stdc++.h>using namespace std;int a[8][3]={{0,0,0},{0,0,1},{0,1,0},{0,1,1},{1,0,0},{1,0,1},{1,1,0},{1,1,1}};int b[8]={0,0,0,0,0,0,0,0};int xa[8]={0,0,0,0,0,0,0,0};int s(char c,int as,int i){//1 true;0 falseif(c=='|'){if(a[i][as]==1||a[i][as+1]==1){return 1;} else{return 0;}}if(c=='&'){if(a[i][as]==1&&a[i][as+1]==1){return 1;} else{return 0;}}if(c=='='){if(a[i][as]==a[i][as+1]){return 1;} else{return 0;}}if(c=='!'){if(a[i][as]==a[i][as+1]){return 0;return 1;}}if(c=='>'){if(a[i][as]==1||a[i][as+1]==0){return 0;} else{return 1;}}}int so(char c,int i,int as){if(c=='|'){if(xa[i]==1||a[i][as+1]==1){return 1;} else{return 0;}}if(c=='&'){if(xa[i]==1&&a[i][as+1]==1){return 1;} else{return 0;}}if(c=='='){if(xa[i]==a[i][as+1]){return 1;} else{return 0;}}if(c=='!'){if(xa[i]==a[i][as+1]){return 0;} else{return 1;}}if(c=='>'){if(xa[i]==1||a[i][as+1]==0){return 0;return 1;}}}int main(void) {string f;cin>>f;char c1=f[1];char c2=f[3];for(int i=0;i<8;i++){for(int j=0;j<3;j++){printf("%d ",a[i][j]);}printf("\n");}for(int i=0;i<8;i++){xa[i]=s(c1,0,i);}for(int i=0;i<8;i++){b[i]=so(c2,i,1);}for(int i=0;i<8;i++){printf("%d\n",b[i]);}return 0;}【实验结果】【实验心得】。
离散数学实验

离散数学实验报告(实验一)专业:自动化班级:学号:姓名:日期2010.10.28一实验内容(二选一)1. 从键盘输入两个命题变元P和Q的真值,求它们的合取、析取、条件和双条件的真值(A)2. 求任意一个命题公式的真值表(B),并根据真值表求主范式(C)。
二实验目的熟悉掌握命题逻辑中的联接词、真值表、主范式等,进一步能用它们来解决实际问题。
三实验环境进入Visual C++ 环境后,选择菜单“File | New”,在弹出的对话框中单击上方的选项卡“Projects”,选择“Win32 Console Application”工程类型,在“Project name”一栏中填写工程名例如MyFirst,在“Location”一栏中填写工程路径(目录). 选择菜单“Project | Add to Project | New”,为工程添加新的C++源文件。
选择菜单为工程添加新源文件在“File Name”栏填入新添加的源文件名,如MyFirst.cpp,“Location”一栏指定文件路径,按按钮“OK”完成C++源程序的系统新建操作。
编译源程序:选择Build | Build菜单(F7为快捷键),系统将会在Output窗口给出所有的错误信息和警告信息。
当所有错误修正之后,系统将会生成扩展名为.exe的可执行文件。
对于Output窗口给出的错误信息,双击可以使输入焦点跳转到引起错误的源代码处以进行修改。
执行程序:选择Build | Execute菜单项(Ctrl + F5为快捷键),执行程序,将会出现一个DOS窗口,按照程序输入要求正确输入数据后,程序即正确执行。
四实验原理和实现过程(算法描述)1.程序主界面本程序界面主要有两个操作,1:求真值。
2:求任何公式的真值。
操作1完成A 类题要求,操作2完成A,B类题要求。
如果出输入的操作项不是0,1,2,则会提示出错,再次选择。
其界面如图所示:2.算法描述和实现过程在做A类题时,算法实现,首先判断输入格式是否正确,在把蕴含(→),等值(←→),通过变换,化成只有非,合取和析取的等价公式,在利用C语言中的运算符非(!),与(&&)和或(||)算出任何两元变量的真值。
离散数学实验

离散数学实验实验一真值计算一、实验目的熟悉联结词合取、析取、条件和双条件的概念,编程求其真值。
二、实验内容(1)求任意一个命题公式的真值表:从键盘输入两个命题P 和Q 的真值,求它们的合取、析取、蕴含和等价的真值(2)利用真值表求任意一个命题公式的主范式(3)利用真值表进行逻辑推理三、实验报告要求列出实验目的、实验内容、实验步骤、源程序和实验结果。
#include#includeint main(){int p,q,hequ,xiqu,yunhan,dengjia;printf("请输入命题P和Q的真值(0或1)");scanf("%d%d",&p,&q);if(p!=0&&p!=1||q!=0&&q!=1)printf("输入错误");else{if(p==0&&q==0){hequ=0;xiqu=0;yunhan=1;dengjia=1;}else if(p==0&&q==1){hequ=0;xiqu=1;yunhan=1;dengjia=0;}else if(p==1&&q==0){hequ=0;xiqu=1;yunhan=0;dengjia=0;}else if(p==1&&q==1){hequ=1;xiqu=1;yunhan=1;dengjia=1;}printf("合取的真值为:%d\n",hequ);printf("析取的真值为:%d\n",xiqu);printf("蕴含的真值为:%d\n",yunhan);printf("等价的真值为:%d\n",dengjia);system("pause");return 0;}}实验二两个集合运算(交、并、补)一、实验目的集合论是一切数学的基础,也是计算机科学不可或缺的,在数据结构,数据库理论,开关理论,自动机理论和可计算理论等领域都有广泛的应用。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
离散数学实验报告
专业班级:12级计算机本部一班姓名:鲍佳珍
学号:201212201401016 实验成绩:
1.【实验题目】
命题逻辑实验二
2.【实验目的】
熟悉掌握命题逻辑中真值表,进一步能用它们来解决实际问题。
3.【实验内容】
求任意一个命题公式的真值表
4、【实验要求】
C或C++语言编程实现
5. 【算法描述】
1.实验原理
真值表:表征逻辑事件输入和输出之间全部可能状态的表格。
列出命题公式真假值的表。
通常以1表示真,0 表示假。
命题公式的取值由组成命题公式的命题变元的取值和命题联结词决定,命题联结词的真值表给出了真假值的算法。
真值表是在逻辑中使用的一类数学表,用来确定一个表达式是否为真或有效。
2.实验过程
首先是输入一个合理的式子,生成相应真值表,然后用函数运算,输出结果:要求可生成逻辑非、合取、析取、蕴含、双条件表达式的真值表,例如:输入 !a
输出真值表如下:
a !a
0 1
10
输入a&&b
输出真值表如下:
a b a&&b
0 0 0
0 1 0
1 0 0
1 1 1
输入a||b
输出真值表如下:
a b a||b
0 0 0
0 1 1
1 0 1
1 1 1
输入a->b
输出真值表如下:
a b a->b
0 0 1
0 1 1
1 0 0
1 1 1
输入a<>b (其中<>表示双条件) 输出真值表如下:
a b a<>b
0 0 1
0 1 0
1 0 0
1 1 1
6.【源程序(带注释)】
#include<stdio.h>
#include<string.h>
void hequ();
void yunhan();
void xiqu();
void shuang();
void fei();//声明五个函数
int main()
{
int ch;
char s[10];
printf("欢迎使用命题公式真值表查找软件\n\n");
printf("1.合取 2.析取 3.蕴含 4.双条件 5.非0.结束查找\n");//软件使用界面的输出
scanf("%d",&ch);
while(ch){
printf("\n\n您能查找真值表的命题公式有以下几种:\n\n");
printf("1.合取请输入a&&b 2.析取请输入a||b 3.蕴含请输入a->b 4.双条件请输入a<>b 5.非请输入!a\n");//选择输入的公式类型
getchar();
printf("请输入您所需要查询的公式:");
scanf("%s",s);
if(!strcmp(s,"a&&b"))
hequ();
else if(!strcmp(s,"!a"))
fei();
else if(!strcmp(s,"a||b"))
xiqu();
else if(!strcmp(s,"a->b"))
yunhan();
else if(!strcmp(s,"a<>b"))//将输入的公式与程序内存在的公式进行比较
shuang();
else
printf("对不起,您所要查找的公式不存在!\n\n");
printf("\n 1.继续查找0.结束\n\n");
scanf("%d",&ch); //使程序循环
}
return 0;
}
void hequ()
{
printf("a b a&&b\n");
printf("0 1 0\n");
printf("0 0 0\n");
printf("1 0 0\n");
printf("1 1 1\n");
}
void xiqu()
{
printf("a b a||b\n");
printf("0 1 1\n");
printf("1 0 1\n");
printf("1 1 1\n"); }
void yunhan()
{
printf("a b a->b\n");
printf("0 1 1\n");
printf("0 0 1\n");
printf("1 0 0\n");
printf("1 1 1\n"); }
void fei()
{
printf("a !a\n");
printf("1 0\n");
printf("0 1\n");
}
void shuang()
{
printf("a b a<>b\n");
printf("0 1 0\n");
printf("1 0 0\n");
printf("1 1 1\n");
} //定义五个函数
7.【实验结果与分析总结(含运行结果截图)】输入界面
输入公式并输出真值表
继续查找结束程序。