C++版本的看这个链接:
【离散数学】C++语言实现利用真值表法求主析取范式和主合取范式_zhtstar的博客-CSDN博客https://blog.csdn.net/weixin_56319483/article/details/128489182?spm=1001.2014.3001.5501
Python版本的看这个链接:
【离散数学】Python语言实现利用真值表法求主析取范式和主合取范式https://blog.csdn.net/weixin_56319483/article/details/128488744?spm=1001.2014.3001.5501
实验内容:
针对给定的包含任意个变量的真值表,编程实现用真值表法求取其所对应的主析取范式和主合取范式。
实验要求:
能够掌握通过真值表求取相应主析取和主合取范式的方法及原理。
先复习一下基本概念:或者直接跳到下面看源代码
1.主合取范式:若干个极大项的合取(交集)。例如:
2.主析取范式:若干个极小项的析取(并集)。例如:
3.极大项:就是包含全部数目的命题变元的析取表达式。例如:p∨¬q∨r
4.极小项:包含全部数目的命题变元的合取表达式。例如:¬p∧¬q∧r
Java实现 源代码如下:
package P3;
import java.util.Scanner;
public class 离散数学01 {
public static void main(String[] args) {
int length = 150;
char[] arr = new char[length];
int[][] brr = new int[length][14];
int beg=80, sta1=0, sta2=0;
int num = 0;
System.out.print("输入变量的个数:");
Scanner sc = new Scanner(System.in);
num = sc.nextInt();
int sum = (int)Math.pow(2,num);
System.out.print("请输入"+sum+"个字符(用T或F表示):");
for (int i = 1; i <= sum; i++)
{
arr[i] = sc.next().charAt(0);
if (arr[i] == 'T')
sta1++;
else
sta2++;
}
int cnt1 = 0, cnt2 = 1;
for (int i = sum - 1; i >= 0; i--)
{
cnt1 = 0;
int val = i;
while (cnt1 < num)
{
cnt1++;
brr[cnt2][cnt1] = val % 2;
val = val / 2;
}
cnt2++;
}
int h = 0;
for(int i[]:brr){
for(int j:i){
h++;
System.out.print(j+" ");
if(h%14==0)
System.out.println();
}
}
System.out.println("输出公式对应的真值表 :");
for (int i = 1; i <= num; i++)
{
System.out.print((char)(beg++)+" ");
}
System.out.println('A');
System.out.println("----------------------");
beg = 80;
for (int i = 1; i <= sum; i++)
{
for (int j = num; j >= 1; j--)
{
if (brr[i][j] == 1)
System.out.print('T' + " ");
else
System.out.print('F' + " ");
}
System.out.print(arr[i]);
System.out.println();
}
System.out.println();
int k=0;
System.out.println("输出主析取范式:");
for (int i = 1; i <= sum; i++)
{
if (arr[i] == 'T')
{
k++;
System.out.print('(');
for (int j = num; j >= 1; j--)
{
if (brr[i][j] == 1)
{
System.out.print((char)(beg++));
}
else
{
System.out.print("¬" + (char)(beg++));
}
if (j != 1)
System.out.print("∧");
}
System.out.print(')');
if (k < sta1)
System.out.print("∨");
}
beg = 80;
}
System.out.println();
k=0;
System.out.println("输出主合取范式:");
for (int i = 1; i <= sum; i++)
{
if (arr[i] == 'F')
{
k++;
System.out.print('(');
for (int j = num; j >= 1; j--)
{
if (brr[i][j] == 0)
{
System.out.print((char) (beg++));
}
else
{
System.out.print("¬" + (char)(beg++));
}
if (j != 1)
System.out.print("∨");
}
System.out.print(')');
if (k < sta2)
System.out.print("∧");
}
beg = 80;
}
System.out.println();
}
}
运行结果截图:
分析与总结: 本次的实验任务已完成,在本次实验中主要使用变量length定义数组长度,使用一维数组arr用来存放2^n次方个字符,其中n表示变量个数;使用二维数组brr用来存放真值表,使用变量beg并赋初值80,此为P的ASCII码,用来记录PQR。使用sta1, sta2 分别记录输入的‘T’与‘F’的个数。 在读取到输入的字符个数后提示用户输入相应数量的字符,获取字符后存入数组中,并分别记录‘T’和‘F’的个数。之后在二维数组中处理真值表,先给真值表赋初值0或1,在输出真值表时判断相应位置上的字符,如果是1,输出‘T’;否则输出‘F’。并在对应位置上输出获取到了字符。 |
在输出析取范式时,对arr数组各位进行遍历,如果为‘T’,则输出主析取范式;如果为‘F’,则输出主合取范式。此时要结合brr数组对应位置的数值,确定输出的合取或析取符号,以及否定符号。
倔强zc: 亲测有效
好运乄: 一摸一样
2401_87261683: 终于卸载这个流氓软件了。连带着鲁大师都给卸载了。自从装了鲁大师,就被莫名其妙安装一些垃圾软件!一起都卸载了!
迟暮599: ANCONDA右键属性兼容性设置成管理员就好了
zxc980725: 我敲可以了,大家注意只有俩cpu