离散数学 您所在的位置:网站首页 真值表在线生成 离散数学

离散数学

2023-09-22 22:20| 来源: 网络整理| 查看: 265

主要完成真值表的自动生成:

1. 自动生成真值表 2. 生成主合取范式

给出两个版本,先给一个简单的,怕大家看完都不想往下看了,简单版本的,只需要100多行代码!!!!(好像也不少),但是比第二个版本增加了生成主合取范式的功能,主要是利用了库函数,所以比较简单:

#include #include #include #include using namespace std; int main() { string a,b; cin>>a; int n=a.length(); b=a; int num=0; for(int i=0;i if(a[i]==a[j]) {q=0; break;} } if(a[i]>='a'&&a[i]int q=1; for(int j=0;jq=0; break;} } if(a[i]>='a'&&a[i] int m=n; string c=a; for(int i=0;i for(int j=0;j if(c.find("!1")!=string::npos) c=c.replace(c.find("!1"),2,"0"); if(c.find("!0")!=string::npos) c=c.replace(c.find("!0"),2,"1"); if(c.find("1+1")!=string::npos) c=c.replace(c.find("1+1"),3 , "1"); if(c.find("1+0")!=string::npos) c=c.replace(c.find("1+0"),3 , "1"); if(c.find("0+1")!=string::npos) c=c.replace(c.find("0+1"),3 , "1"); if(c.find("0+0")!=string::npos) c=c.replace(c.find("0+0"),3 , "0"); if(c.find("1*1")!=string::npos) c=c.replace(c.find("1*1"),3 , "1"); if(c.find("1*0")!=string::npos) c=c.replace(c.find("1*0"),3 , "0"); if(c.find("0*1")!=string::npos) c=c.replace(c.find("0*1"),3 , "0"); if(c.find("0*0")!=string::npos) c=c.replace(c.find("0*0"),3 , "0"); if(c.find("1-1")!=string::npos) c=c.replace(c.find("1-1"),3 , "1"); if(c.find("1-0")!=string::npos) c=c.replace(c.find("1-0"),3 , "0"); if(c.find("0-1")!=string::npos) c=c.replace(c.find("0-1"),3 , "1"); if(c.find("0-0")!=string::npos) c=c.replace(c.find("0-0"),3 , "1"); if(c.find("1=1")!=string::npos) c=c.replace(c.find("1=1"),3 , "1"); if(c.find("1=0")!=string::npos) c=c.replace(c.find("1=0"),3 , "0"); if(c.find("0=1")!=string::npos) c=c.replace(c.find("0=1"),3 , "0"); if(c.find("0=0")!=string::npos) c=c.replace(c.find("0=0"),3 , "1"); if(c.find("(1)")!=string::npos) c=c.replace(c.find("(1)"),3 , "1"); if(c.find("(0)")!=string::npos) c=c.replace(c.find("(0)"),3 , "0"); m=c.length(); } for(int i=0;i zhenzhi[i]=0; zhenzhi[i-1]=zhenzhi[i-1]+1; } } cishu++; } for(int i=0;i for (int i=0;i cout for (int i=0;i cout char tmpc=' '; int n=strlen(a),i=0,j=0,k=0; for(i=0; i for(k=0; k break; } } if(k>=j) { b[j]=a[i]; j++; } } } //从低到高排序 for(i=0; i if(b[k]>b[k+1]) { tmpc=b[k]; b[k]=b[k+1]; b[k+1]=tmpc; } } } b[j]='\0';//加上结束标志 return j;//小写字母个数 } void fillValue(char a[],char varchar[],int nvar, char valchar[],char resultchar[]) { //a是原始公式 , varchar是变元列表如pqrs //valchar是变元的某次取值 int nLen=strlen(a),i=0,j=0,k=0; for(i=0; i //原公式中的每个字符 for(j=0; j //是第j变元 ,其值换成第j个值 resultchar[i]=valchar[j]; break; } } } } void negatecal(char a[]) { int _result=0,i=0,j=0; while(i a[j]='0'; _result=1; } else if((j+1 //如果有运算后面的往前移 j++; while(a[j+1]!='\0') { //后面的字符往前移一格 a[j]=a[j+1]; j++; } a[j]='\0'; } else { //没有!0 或!1 则看下一个指针 i++; } } } void kuanhao(char a[]) { int _result=0,i=0,j=0; while(ia[j]='1';_result=1;} else if((j+2 j++; while(a[j+2]!='\0'){//后面的字符往前移一格 a[j]=a[j+2]; j++; } a[j]='\0'; } else {//没有!0 或!1 则看下一个指针 i++; } } } void conYsh(char a[]) { int _result=0,i=0,j=0; while(i a[j]='0';_result=1;} else if((j+2a[j]='0';_result=1;} else if((j+2 j++;//后面的字符往前移两格 while(a[j+2]!='\0') {a[j]=a[j+2];j++;} a[j]='\0'; } else { //没有!0 或!1 则看下一个指针 i++; } } } void biCondYsh(char a[]) { int _result=0,i=0,j=0; while(ia[j]='1';_result=1;} else if((j+2a[j]='0';_result=1;} else if((j+2 j++; while(a[j+2]!='\0') {a[j]=a[j+2];j++;} a[j]='\0'; } else {i++;} } } void condYsh(char a[] ) { int _result=0,i=0,j=0; while(i a[j]='1'; _result=1; } else if((j+2 a[j]='0'; _result=1; } else if((j+2 j++; while(a[j+2]!='\0') { a[j]=a[j+2]; j++; } a[j]='\0'; } else { i++; } } } void disConjYsh(char a[]) { int _result=0,i=0,j=0; while(i a[j]='0'; _result=1; } else if((j+2 a[j]='1'; _result=1; } else if((j+2 j++; while(a[j+2]!='\0') { a[j]=a[j+2]; j++; } a[j]='\0'; } else { i++; } } } int main(int argc,char* argv[]) { char pstate[120],pstate0[120],charList[120],charVal[120]; char minItem[1024][52],truetable[1024];//最多10个变量 int i=0,nold=0,nnew=0,nvar=1,nRow=1,j=0,flagsum=1,iMinItem=0; printf("请输入公式(析+,合*,条—,双=,否定!,01):\n"); gets(pstate0);fflush(stdin); nold=strlen(pstate0)+1;nnew=strlen(pstate0); for(i=0;i charVal[i]='0';nRow=nRow*2; } charVal[i]='\0'; //真值表的首行 printf("\n"); for(i=0;iprintf("%4c",'-');} printf("|"); for(i=0;i //真值表的各行 for(j=0;j nold=strlen(pstate); negatecal(pstate);//否定 kuanhao(pstate);//(A) conYsh(pstate); biCondYsh(pstate); condYsh(pstate); disConjYsh(pstate); nnew=strlen(pstate); } if(strlen(pstate)==1){ if(pstate[0]=='1'){ for(j=0;j if(charVal[j]=='1'){ if(flagsum==1){//1+1=10//进位 charVal[j]='0';flagsum=1; }else //1+0=1 不变 {break; } } else if(charVal[j]=='0'){ if(flagsum==1)//0+1=1//没有进位 {charVal[j]='1';flagsum=0;} else //0+0结束 {break; } } } } for(i=0;i printf("m%s",minItem[i]); } else {printf("+m%s",minItem[i]);} } printf("\n"); for(i=0;i printf("("); for(j=0;j if(minItem[i][j]=='1'){printf("%c",charList[j]);} else {printf("!%c",charList[j]);} } else{ if(minItem[i][j]=='1'){ printf("*%c",charList[j]);} else {printf("*!%c",charList[j]);} } } printf(")"); } else { printf("+("); for(j=0;j if(minItem[i][j]=='1'){printf("%c",charList[j]);} else {printf("!%c",charList[j]);} }else{ if(minItem[i][j]=='1'){printf("*%c",charList[j]);} else{printf("*!%c",charList[j]);} } } printf(")"); } } }

第一个程序主要是用了库函数find()和replace()所以比较简单,第二个就写的很模块化,可能更容易理解,大家自己看看叭~ Ps:find()和replace()函数用来处理字符串很舒服!!!!!!(C++)



【本文地址】

公司简介

联系我们

今日新闻

    推荐新闻

    专题文章
      CopyRight 2018-2019 实验室设备网 版权所有