0
点赞
收藏
分享

微信扫一扫

离散数学实践作业-真值表和主范式的实现


离散数学实践作业-真值表和主范式的实现

每次交过作业之后我都会把代码放上来。没交作业之前代码不公开。

主要利用二进制。
​​​点击一下吧​​

// 把 2^n 个数 的 二进制保存起来就是真值表 ,然后根据输入的 F/T 筛选真值表
//最后 根据输入的 F / T T是极小项, F是极大项, 用 0,1处理比较好,最后输出转换一下就可以了。
#include <iostream>
#include <cstring>
#include <algorithm>
#include <string>
#include <set>
#include <map>
#include <cmath>
#include <stack>
#include <cstdio>
using namespace std;
int n;
//sum 情况 a[sum] 二进制数, flag [2] -> true | false
//习惯 +1;
struct node
{
int a[11000];
int flag[2];
}aa[11000];
int main()
{

cout<<"请输入变量个数:";
cin>>n;
//在 n 的基础上 控制数组的范围
int sum=pow(2,n),b[sum+1]={0};
char zimu[30];
char c[sum+1];//输入的字符

cout<<"请输入 "<<sum<<" 个字符(用T或F表示):";
/*输入的字符转换成 0 1,*/
for(int i=0;i<sum;i++)
{
cin>>c[i];
}
for(int i=0;i<sum;i++)
{
if(c[i]=='F') b[i]=0;
else b[i]=1;
}
/*
for(int i=0;i<sum;i++)
cout<<b[i]<<"\t";
cout<<endl;
*/
/*转换结束*/

/*把n个名字起个命题符号*/
for(int i=0;i<n;i++)
{
zimu[i]='P'+i;
}

/*把每个i 转换成 二进制数,aa[i].a[]就代表 i的二进制数
flag 代表每行 真值表出现的情况`
*/
for(int i=0;i<sum;i++)
{//i 的 二进制数
int k=i;
for(int j=0;j<n;j++)
{
int c=k%2;
aa[i].a[j]=c;
//cout<<aa[i].a[j]<<endl;
k=k/2;
}
aa[i].flag[0]=0;
aa[i].flag[1]=1;//为了 之后输入的筛选。
}
cout<<"请输出公式对应的真值表:"<<endl;
/*输出真值表*/
for(int i=0;i<n;i++)
{
cout<<zimu[i]<<"\t";
}
cout<<"A"<<endl;
for(int i=0;i<n;i++)
{
cout<<"————";
}
cout<<endl;
for(int i=0;i<sum;i++)
{
for(int j=n-1;j>=0;j--)
{
cout<<(aa[i].a[j]==0?'F':'T')<<"\t";
}
cout<<(aa[i].flag[b[i]]==0?'F':'T');
cout<<endl;
}
int flag1,flag2;
//标记 最后一次出现极大项 极小项的位置 为了 ∧、∨
for(int i=0;i<sum;i++)
{
if(b[i]==1) flag1=i;//xiao
if(b[i]==0) flag2=i; //da
}
/*b[i]==1 说明是 极小项,反之极大项*/
/*主析取范式--> 极小项*/
cout<<"请输出主析取范式:"<<endl;
for(int i=0;i<sum;i++)
{
if(b[i]==0) continue;
cout<<"< ";
for(int j=n-1;j>=0;j--)
{
if(aa[i].a[j]==1)
// cout<<(aa[i].a[j]==0?'F':'T');
cout<<zimu[n-j-1]; // 因为 二进制是倒着输出的 所以 字母要反过来
else cout<<"┐"<<zimu[n-j-1];
if(j!=0) cout<<"∧";
}
cout<<" >";
if(i!=flag1) cout<<" ∨ ";
}
cout<<endl<<endl;
/*主合取范式-->极大项*/
cout<<"请输出主合取范式:"<<endl;
for(int i=0;i<sum;i++)
{
if(b[i]==1) continue;
cout<<"< ";
for(int j=n-1;j>=0;j--)
{
if(aa[i].a[j]==0)
// cout<<(aa[i].a[j]==0?'F':'T');
cout<<zimu[n-j-1];
else cout<<"┐"<<zimu[n-j-1];
if(j!=0) cout<<" ∨ ";
}
cout<<" >";
if(i!=flag2) cout<<" ∧ ";
}
return 0;
}


举报

相关推荐

0 条评论