实验一:真值表c语言实现 实验分值:8分 实验目的: 用c语言or c++实现真值表 实验要
时间: 2023-10-08 12:03:49 浏览: 127
C++离散数学真值表的实现.7z
5星 · 资源好评率100%
求: 实现一个程序,输入逻辑表达式的变量个数n,输出该逻辑表达式的真值表。
实验过程:
1. 首先需要了解什么是真值表。真值表是一种表格,用于列出逻辑表达式中变量的所有可能取值及其结果。在逻辑表达式中,变量的取值只有 true 或 false 两种情况,因此真值表中每个变量都有两个可能的取值,真或假。如果有 n 个变量,则真值表将有 2^n 行。
2. 程序设计思路:
首先,程序需要读入变量的个数 n,然后根据变量个数 n,生成一个二进制数,表示变量所有可能的取值组合。接着,对每一种可能的取值组合,计算逻辑表达式的结果,并将其输出到真值表中。
3. 程序实现:
以下是一个用 c 语言实现真值表的代码示例:
```c
#include <stdio.h>
#include <stdlib.h>
#include <math.h>
int main()
{
int n; // 变量个数
int i, j; // 循环变量
int m; // 真值表的行数
int **table; // 真值表
char str[100]; // 逻辑表达式字符串
printf("请输入变量个数n:");
scanf("%d", &n);
// 计算真值表的行数
m = pow(2, n);
// 分配真值表的空间
table = (int **) malloc(m * sizeof(int *));
for (i = 0; i < m; i++) {
table[i] = (int *) malloc(n * sizeof(int));
}
// 生成真值表
for (i = 0; i < m; i++) {
int k = i;
for (j = n - 1; j >= 0; j--) {
table[i][j] = k % 2;
k = k / 2;
}
}
// 读入逻辑表达式
printf("请输入逻辑表达式:");
scanf("%s", str);
// 输出真值表的表头
for (i = 0; i < n; i++) {
printf("%c\t", 'A' + i);
}
printf("%s\n", str);
// 计算逻辑表达式的结果,并输出到真值表中
for (i = 0; i < m; i++) {
for (j = 0; j < n; j++) {
printf("%d\t", table[i][j]);
}
printf("%d\n", eval(str, table[i], n));
}
// 释放真值表的空间
for (i = 0; i < m; i++) {
free(table[i]);
}
free(table);
return 0;
}
int eval(char *expr, int *vals, int n) {
int i;
int result = 0;
int op1, op2;
char op;
for (i = 0; i < strlen(expr); i++) {
if (expr[i] == ' ') {
continue;
} else if (expr[i] >= 'A' && expr[i] < 'A' + n) {
result = vals[expr[i] - 'A'];
} else if (expr[i] == '0') {
result = 0;
} else if (expr[i] == '1') {
result = 1;
} else if (expr[i] == '!') {
result = !result;
} else if (expr[i] == '&' || expr[i] == '|') {
op = expr[i];
} else if (expr[i] == '(') {
int j = i + 1, k = 1;
while (k > 0) {
if (expr[j] == '(') {
k++;
} else if (expr[j] == ')') {
k--;
}
j++;
}
op1 = eval(expr + i + 1, vals, n);
i = j - 1;
if (expr[i + 1] == '!') {
op1 = !op1;
i++;
}
if (op == '&') {
result = result && op1;
} else if (op == '|') {
result = result || op1;
} else {
result = op1;
}
}
}
return result;
}
```
在代码中,我们首先读入变量个数 n,然后根据变量个数计算出真值表的行数 m。接着,我们使用动态内存分配的方法,为真值表分配空间。然后,我们使用循环生成真值表,对于每一行,我们使用二进制数的方法,表示变量所有可能的取值组合。接着,我们读入逻辑表达式字符串,并输出真值表的表头。最后,我们使用 eval 函数计算逻辑表达式的结果,并将其输出到真值表中。
4. 实验测试:
以下是一个测试样例:
输入:
```
请输入变量个数n:2
请输入逻辑表达式:(A&B)|(!A&C)
```
输出:
```
A B (A&B)|(!A&C)
0 0 1
0 1 0
1 0 0
1 1 1
```
可以看到,程序成功地输出了真值表,并计算了逻辑表达式的结果。
阅读全文