C语言 命题公式真值表
1.实验目的
掌握命题公式真值表的求解,并实现自动求解程序。
2.实验内容
输入:任意命题公式
输出:该命题公式的真值表
要求:
- 输入任意命题公式,要求用数据存储命题公式的所有赋值及对应真值,并输出该公式真值表
- 此题,难度稍大,对命题公式的表示的方式不一样,实现过程略有不同,可查找相关资料。
3.实验过程(主要思想、核心算法、核心代码)
代码比较长,还需要细心观看,有什么意见还请大佬提出,谢谢!
主函数
#include <stdio.h>
#include <string.h>
int main()
{void quFan(char a[]);void kuohao(char a[]);void heQu(char a[]);void stJian(char a[]);void xiQu(char a[]);int allData(char a[],char b[]);void fillIn(char a[],char varchar[],int nvar,char values[],char resultchar[]);char pstate[120],pstate0[120],charList[120],charVal[120];int i=0,nold=0,nnew=0,nvar=1,nRow=1,j=0,flagsum=1;printf("请输入公式(析|,合&,条-,双=,否!,01):\n");gets(pstate0);nold=strlen(pstate0)+1;nnew=strlen(pstate0);for(i=0;i<nnew;i++){pstate[i]=pstate0[i];}pstate[i]='\0';nvar=allData(pstate,charList);//取变元个数nRow=1;//有2^n个情况for(i=0;i<nvar;i++){charVal[i]='0';nRow=nRow*2;}charVal[i]='\0';for(i=0;i<nRow;i++){//输出每种情况的结果for(j=0;j<nvar;j++){printf("%4c",charVal[j]);//每种赋值情况输出}/**将值填入公式pstate原始数组返回pstate填充后数组*/fillIn(pstate0,charList,nvar,charVal,pstate);//计算公式的值nold=strlen(pstate0)+1;nnew=strlen(pstate);while(nnew<nold){nold=strlen(pstate);quFan(pstate);kuohao(pstate);stJian(pstate);heQu(pstate);xiQu(pstate);nnew=strlen(pstate);}printf("%15c%s",' ',pstate);printf("\n");//值加1flagsum=1;for(j=nvar-1;j>=0;j--){if(charVal[j]=='1'){if(flagsum==1){//1+1=10//进位charVal[j]='0';flagsum=1;}else{break;}//1+0=1 不变}else if(charVal[j]=='0'){if(flagsum==1){ //0+1=1 //没有进位charVal[j]='1'; flagsum=0;}else{break;}// 0+0 }}}return 0;
}
取反,也就是非!
void quFan(char a[]){int _result=0,i=0,j=0;while(i<strlen(a)){j=i;_result=0;//非的真值情况if((j+1<strlen(a))&&(a[j]=='!')&&(a[j+1]=='1')){a[j]='0';_result=1;}else if((j+1<strlen(a))&&(a[j]=='!')&&(a[j+1]=='0')){a[j]='1';_result=1;}if(_result==1){//修改成功后则后面的往前覆盖j++;while(a[j+1]!='\0'){a[j]=a[j+1]; j++;}a[j]='\0';}else{i++;}}
}
括号解析
void kuohao(char a[])
{int _result=0,i=0,j=0;while(i<strlen(a)){j=i; _result=0;//括号的处理if((j+2<strlen(a))&&(a[j]=='(')&&(a[j+1]=='1')&&(a[j+2]==')')){a[j]='1'; _result=1;}else if((j+2<strlen(a))&&(a[j]=='(')&&(a[j+1]=='0')&&(a[j+2]==')')){a[j]='0'; _result=1;}if(_result==1){//修改成功后则后面的往前覆盖j++;while(a[j+2]!='\0'){a[j]=a[j+2]; j++;}a[j]='\0';}else {i++;}}
}
合取
void heQu(char a[]){int _result=0,i=0,j=0;while(i<strlen(a)){j=i;_result=0;//合取的真值情况if((j+2<strlen(a))&&(a[j]=='0')&&(a[j+1]=='&')&&(a[j+2]=='0')){a[j]='0';_result=1;}else if((j+2<strlen(a))&&(a[j]=='0')&&(a[j+1]=='&')&&(a[j+2]=='1')){a[j]='0';_result=1;}else if((j+2<strlen(a))&&(a[j]=='1')&&(a[j+1]=='&')&&(a[j+2]=='0')){a[j]='0';_result=1;}else if((j+2<strlen(a))&&(a[j]=='1')&&(a[j+1]=='&')&&(a[j+2]=='1')){a[j]='1';_result=1;}if(_result==1){//修改成功后则后面的往前覆盖j++;while(a[j+2]!='\0'){a[j]=a[j+2];j++;}a[j]='\0';}else {i++;}}
}
析取
void xiQu(char a[]){int _result=0,i=0,j=0;while(i<strlen(a)){j=i;_result=0;//析取的真值情况if((j+2<strlen(a))&&(a[j]=='0')&&(a[j+1]=='|')&&(a[j+2]=='0')){a[j]='0';_result=1;}else if((j+2<strlen(a))&&(a[j]=='0')&&(a[j+1]=='|')&&(a[j+2]=='1')){a[j]='1';_result=1;}else if((j+2<strlen(a))&&(a[j]=='1')&&(a[j+1]=='|')&&(a[j+2]=='0')){a[j]='1';_result=1;}else if((j+2<strlen(a))&&(a[j]=='1')&&(a[j+1]=='|')&&(a[j+2]=='1')){a[j]='1';_result=1;}if(_result==1){//修改成功后则后面的往前覆盖j++;while(a[j+2]!='\0'){a[j]=a[j+2];j++;}a[j]='\0';//结尾添加字符串结束符}else {i++;}}
}
双条件
void stJian(char a[])
{int _result=0,i=0,j=0;while(i<strlen(a)){j=i;_result=0;//双条件的真值情况if((j+2<strlen(a))&&(a[j]=='0')&&(a[j+1]=='=')&&(a[j+2]=='0')){a[j]='0';_result=1;}else if((j+2<strlen(a))&&(a[j]=='0')&&(a[j+1]=='=')&&(a[j+2]=='1')){a[j]='0';_result=1;}else if((j+2<strlen(a))&&(a[j]=='1')&&(a[j+1]=='=')&&(a[j+2]=='0')){a[j]='0';_result=1;}else if((j+2<strlen(a))&&(a[j]=='1')&&(a[j+1]=='=')&&(a[j+2]=='1')){a[j]='1';_result=1;}if(_result==1){//修改成功后则后面的往前覆盖j++;while(a[j+2]!='\0'){a[j]=a[j+2];j++;}a[j]='\0';}else {i++;}}
}
获取命题公式所有不同的元素
int allData(char a[],char b[]){char tmpc=' '; int n=strlen(a),i=0,j=0,k=0;for(i=0;i<n;i++){//获取所有变元,以便于输出和赋值if(((a[i]>='a')&&(a[i]<='z'))||((a[i]>='A')&&(a[i]<='Z'))){for(k=0;k<j;k++){if(b[k]==a[i]){break;}}if(k>=j){b[j]=a[i];j++;}}}b[j]='\0';//加上结束标志//printf("====%s",b);//从高到低排序for(i=0;i<j-1;i++){for(k=0;k<j-i-1;k++){if(b[k]>b[k+1]){tmpc=b[k];b[k]=b[k+1];b[k+1]=tmpc;}}}return j;//不同的变元个数
}
将赋值情况代入命题公式中
void fillIn(char a[],char varchar[],int nvar,char values[],char resultchar[])
{/**a是原始公式varchar是变元列表如abcvalues 是变元的某次取值二进制的思维把相应位置的变元替换成'0'或'1'*/int nLen=strlen(a),i=0,j=0,k=0;for(i=0;i<nLen;i++){//不改变原数组resultchar[i]=a[i];}resultchar[i]='\0';for(i=0;i<nLen;i++){for(j=0;j<nvar;j++){if(resultchar[i]==varchar[j]){resultchar[i]=values[j];break;}}}
}
温馨提示:以上是完整代码,小代码块可能多出一个花括号,不碍事那是main的或括号。大佬有意见或者建议还请提出,学习进步。
C语言 命题公式真值表相关推荐
- 命题公式的主合取范式C语言,命题公式主范式的自动生成与形式输出.pdf
收稿日期 2006 04 19 作者简介 张会凌 1954 男 甘肃成县人 甘肃联合大学数学与信息学院副教授 主要从事微分几何与计算机方面 的研究 文章编号 1672 691X 2006 05 004 ...
- 用c语言构造真值表,构造命题公式的真值表--biaobiao88
对给出的任意一个命题公式(不超过四个命题变元),使学生会用c语言的程序编程表示出来,并且能够计算它在各组真值指派下所应有的真值,画出其真值表. #include using namespace std ...
- 求命题公式的真值表及主范式(栈实现)
设计思路 首先用一个串来储存使用者所输入的命题表达式,依据人类的思维,会对输入的命题公式进行分析和计算,但计算机可不会,这时我们就要写入相关代码把使用者输入的命题表达式转换为计算机所能进行计算的后缀表 ...
- [离散数学]命题逻辑P_4:命题公式和真值表
[离散数学]命题逻辑P_4:命题公式和真值表 前言 1. 命题变元 常值命题定义 例子 命题变量定义 注意 2. 命题公式 定义 关于命题公式的说明 例子 3. 公式的解释 定义 例子 注意 4. 真 ...
- 命题公式的主合取范式C语言,程序设计题: 命题逻辑应用系统
命题逻辑应用系统 1 问题描述 该系统要求实现命题逻辑中基本算法及其应用系统,包括真值表的计算.主析取和主合取范式的计算.通过此课题,熟练掌握命题公式的计算机表示.命题等价常见算法的实现,实现一个简单 ...
- 1.2命题公式及其赋值
上节讨论了简单命题(原子命题)和复合命题以及它们的符号化形式简单命题是命题逻辑中最基本的研究单位,其真值是确定的,又称作命题常项或命题常元,命题常项相当于初中的常数.初等数学中还有变量,对应地这里有命 ...
- 离散数学知识点总结(2):命题公式的类型
文章目录 命题公式 命题常量和命题变元 命题合式公式的递归式定义(well-Formed formula) 联结词的优先级 命题公式的种类 重言式 / 永真式 (常见举例) 矛盾式 / 不可满足式 / ...
- 离散数学(二):命题公式的等值演算
将命题符号化并进行等值演算是进行逻辑推理的重要环节. 1.命题公式 命题常项:简单命题. 命题变项:真值不确定的陈述句. 命题公式(合式公式.公式) :将命题变项用联结词或圆括号按一定逻辑关系联结起来 ...
- [离散数学]命题逻辑P_5:命题公式分类和等价
[离散数学]命题逻辑P_5:命题公式分类和等价 前言 1. 真值表告诉我们什么? 例子 2. 命题公式分类 定义 例子 3. 公式的逻辑等价 定义 定理 证明 总结 前言 第五讲:命题公式分类和等价 ...
最新文章
- PAT甲级排队问题合集 (持续更新中)
- Fedora 20 安装搜狗拼音输入法
- STM32之ADC实例(基于DMA方式)
- 升级进度卡住_升级 iOS 系统时卡住怎么办?
- dseo13b打开自动消失_抖音怎么自动生成字幕?动态字幕有哪几种?
- MFC-使用自定义控件的方法
- P6640-[BJOI2020]封印【SAM,二分】
- spring mvc 异步_DeferredResult – Spring MVC中的异步处理
- java怎么用doss窗口_GitHub - doss128/symphony: 一款用 Java 实现的现代化社区(论坛/BBS/社交网络/博客)平台。...
- 数据结构之选择排序:直接选择排序
- linux和Windows之间互传文件
- ILS-LDA基于迭代最小二乘的字典学习算法的学习
- 【转】关于python中re模块split方法的使用
- “飞跃四十载 同发展·共繁荣”巡回展在江苏举行
- Elasticsearch 实战(四、分词与IK分词器)
- 一个强迫症的电脑下(软件篇)
- 【JAVA】List常用移除、过滤、去重、flatMap、peek等操作
- dva的state引用及connect连接
- Vue设置浏览器小图标(ICON)
- 电影最top《投名状》摘录