离散数学真值表(c语言编程实现)

#include <stdio.h>
#include <string.h>
#include <algorithm>
#include <iostream>
#include<cmath>
#define ll long long
using namespace std;
struct node
{
	int a[5000];
	int flag[5000];
}r[5000];
int b[5000];
char zimu[5000];
int main()
{
	int n;
	cout<<"请输入变量个数:"<<endl;
	cin>>n;
	int sum=pow(2,n);
	char c[5000];
	cout<<"请输入 "<<sum<<" 个字符(用T或F表示):"; 
	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<n;i++)
	{
		zimu[i]='P'+i;
	}
	for(int i=0;i<n;i++)
	{
		int k=i;
		for(int j=0;j<n;j++)
		{
			int x=k%2;
			r[i].a[j]=x;
			k/=2;
		}
		r[i].flag[0]=0;
		r[i].flag[1]=1;
	}
	cout<<endl;
	cout<<"请输出公式对应的真值表:"<<endl;
	cout<<"------------------------"<<endl;
	for(int i=0;i<n;i++)
	{
		cout<<zimu[i]<<"\t";
	}
	cout<<"A"<<endl;
	for(int i=0;i<sum;i++)
	{
		for(int j=n-1;j>=0;j--)
		{
			cout<<(r[i].a[j]==0?'F':'T')<<"\t";
		}
		cout<<(b[i]==0?'F':'T')<<"\t";
		cout<<endl;
	}
	int flag1,flag2;
	for(int i=0;i<sum;i++)
	{
		if(b[i]==1)
		flag1=i;
		else
		flag2=i;
	}
	cout<<"请输出主析取范式:"<<endl;
	for(int i=0;i<sum;i++)
	{
		if(b[i]==0)
		continue;
		cout<<"<";
		for(int j=n-1;j>=0;j--)
		{
			if(r[i].a[j]==1)
			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(r[i].a[j]==1)
			cout<<zimu[n-j-1];
			else
			cout<<"┐"<<zimu[n-j-1];
			if(j!=0)
			cout<<" ∨";
		}
		cout<<">";
		if(i!=flag2)
		cout<<" ∧";
	}
	return 0;
}

展开阅读全文

没有更多推荐了,返回首页