嘿,道友可是来自zzu
这里的是2023级离散数学课程的编程实验,这个答案以C语言为主,本答案存在借助AI以及借鉴其它资源,希望能给你带来帮助或者启发,如果代码未能令您满意,还望见谅,轻点喷,谢谢。
考虑到各位的时间紧迫,这里就不再详细解释代码的逻辑等等细节了,各位可以将代码喂给聪明的AI工具来辅助理解。
运行截图>>>>>>
完整代码>>>>>>
#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
#include<string.h>
#include<math.h>
#include<windows.h>
int number[3];
int result[2][100];
int num = 0;
int x = 1;
int n;
int n2number = 0;
int print = 0;
int relatino = 0;
int Relatino = 0;
int nonumber = 0;
int NOnumber = 0;
char w='#';
int last;
int current;
int length;
int LENGTH;
int judment = 0;
char sum[100];
//由于C语言无法调用和识别吸取、合取、非、条件的符号,这里分别用‘|’‘&’‘!’‘>’代替;
int judgeTF(int last,int current,char s) {
int k;
switch(s){
case '|':
k = last + current;
break;
case '&':
k = last * current;
break;
case '>':
if (last && (!current)) {
k = 0;
}
else { k = 1; }
break;
default: k = last;
break;
}
return k;
}//逻辑判断函数;
int judge(char* s) {
int t = 0;
int k=1;
while (t < strlen(s)&&k) {
if (s[t] == '>') { judment = 1; }
x = 1;
if ((s[t] <= 'Z' && s[t] >= 'A') || (s[t] <= 'z' && s[t] >= 'a')) {
for (int i = 0; i < num; i++) {
if (sum[i] == s[t]) {
x = 0;
break;
}
}
if (x) { sum[num] = s[t]; num++; }
if (t) {
if (s[t - 1] != '|' && s[t - 1] != '&' && s[t - 1] != '!' && s[t - 1] != '>') {
k = 0;
break;
}
}
}
else {
switch (s[t]) {
case '|':
if ((!t) || s[t - 1] == '|' || s[t - 1] == '!' || s[t - 1] == '>' || s[t - 1] == '&' || t == strlen(s) - 1) {
k = 0;
}
break;
case '&':
if ((!t) || s[t - 1] == '|' || s[t - 1] == '!' || s[t - 1] == '>' || s[t - 1] == '&' || t == strlen(s) - 1) {
k = 0;
}
break;
case '!':
if (t) {
if ((s[t - 1] <= 'Z' && s[t - 1] >= 'A') || (s[t - 1] <= 'z' && s[t - 1] >= 'a') || t == strlen(s) - 1) {
k = 0;
}
}
break;
case '>':
if ((!t) || s[t - 1] == '|' || s[t - 1] == '!' || s[t - 1] == '>' || s[t - 1] == '&' || t == strlen(s) - 1) {
k = 0; judment = 1;
}
break;
default:k = 0;
break;
}
}
t++;
}
return k;
}//判断表达式格式是否正确的函数;
void TF(char* s, int x) {
int Y = pow(2, x) - 1, t = 0, y, T;
int tf;
for (int i = 0; i < x; i++) {
printf("%c ", sum[i]);
}
printf("结果\n");
while (Y >= 0) {
int c[2][256] = {};
print = 0;
t = 0;
tf = 0;
relatino = 0;
Relatino = 0;
nonumber = 0;
NOnumber = 0;
y = Y;
while (t < strlen(s)) {
T = t;
while (relatino < 2 && t < strlen(s)) {
if (s[t] == '!') {
nonumber++;
}
if (s[t] == '>' || s[t] == '|' || s[t] == '&') {
w = s[t];
}
if ((s[t] <= 'z' && s[t] >= 'a') || (s[t] <= 'Z' && s[t] >= 'A')) {
if (!relatino) { T = t; }
relatino++;
}
t++;
if (!relatino) { NOnumber++; }
}
nonumber -= NOnumber;
nonumber = nonumber % 2;
NOnumber = NOnumber % 2;
if (!print) {
for (int i = 0; i < 2; i++) {
if ((c[0][s[t - 1]] != 1) && (c[1][s[t - 1]] != 1)) {
print++;
if (!i) {
if (y / pow(2, x - i - 1) >= 1) {
printf("T "); if (!Relatino) { last = 1; Relatino++; c[1][s[T]] = 1; }
else {
current = 1; Relatino++;
c[1][s[T]] = 1;
}
}
else {
printf("F ");
if (!Relatino) {
last = 0; Relatino++;
c[0][s[T]] = 1;
}
else { current = 0; Relatino++; c[0][s[T]] = 1; }
}
}
if (i == 1) {
if (y / pow(2, x - i - 1) >= 1) {
printf("T "); if (!Relatino) { last = 1; Relatino++; c[1][s[t - 1]] = 1; }
else {
current = 1; Relatino++;
c[1][s[t - 1]] = 1;
}
}
else {
printf("F ");
if (!Relatino) {
last = 0; Relatino++;
c[0][s[t - 1]] = 1;
}
else { current = 0; Relatino++; c[0][s[t - 1]] = 1; }
}
}
if (y >= pow(2, x - i - 1)) { y = y - pow(2, x - i - 1); }
}
else {
if (!Relatino) {
if (c[1][s[t - 1]]) { last = 1; Relatino++; }
if (c[0][s[t - 1]]) { last = 0; Relatino++; }
}
else {
if (c[1][s[t - 1]]) { current = 1; Relatino++; }
if (c[0][s[t - 1]]) { current = 0; Relatino++; }
}
}
}
}
else {
if ((c[0][s[t - 1]] != 1) && (c[1][s[t - 1]] != 1)) {
if (y / pow(2, x - print - 1) >= 1) {
printf("T "); if (!Relatino) { last = 1; Relatino++; c[1][s[t - 1]] = 1; }
else {
current = 1; Relatino++;
c[1][s[t - 1]] = 1;
}
}
else {
printf("F ");
if (!Relatino) {
last = 0; Relatino++;
c[0][s[t - 1]] = 1;
}
else { current = 0; Relatino++; c[0][s[t - 1]] = 1; }
}
if (y >= pow(2, x - print - 1)) { y = y - pow(2, x - print - 1); }
print++;
}
else {
if (!Relatino) {
if (c[1][s[t - 1]]) { last = 1; Relatino++; }
if (c[0][s[t - 1]]) { last = 0; Relatino++; }
}
else {
if (c[1][s[t - 1]]) { current = 1; Relatino++; }
if (c[0][s[t - 1]]) { current = 0; Relatino++; }
}
}
}
if (nonumber) {
if (current) {
current = 0;
c[0][t - 1] = 1;
c[1][t - 1] = 0;
}
else {
current = 1;
c[0][t - 1] = 0;
c[1][t - 1] = 1;
}
}
if (NOnumber) {
if (last) {
last = 0;
c[0][T] = 1;
c[1][T] = 0;
}
else {
last = 1;
c[0][T] = 0;
c[1][T] = 1;
}
}
tf = judgeTF(last, current, w);
relatino = 1;
last = tf;
Relatino = 1;
NOnumber = 0;
nonumber = 0;
if (t == length && length != strlen(s)) {
if (!last) {
tf = 1;
for (int i = 0; i < (number[1] - number[0]); i++) {
printf("- ");
}
break;
}
}
}
int z = pow(2, number[0]) - 1;
if (tf) {
printf("T.\n");
}else { printf("F.\n"); }
if (n == 1) { result[0][z - Y] = tf; }
else {
result[0][n2number] = tf;
n2number++;
}
if (t == length && n==2) {
Y = Y - pow(2, x - number[0]);
}
else {
Y--;
}
}
}//判断所有情况真值的函数,并且负责打印真值表;
int form(int numbe) {
int k = 1;
int K = 1;
for (int i = 0; i < numbe; i++) {
if (result[0][i]) {
K = 0;
}
else {
k = 0;
}
if ((!K) && (!k)) { break; }
}
if (k) {
return 1;
}
if (K) {
return 0;
}
if ((!K) && (!k)) { return 2; }
}//判断命题的永真永假情况的函数;
int main() {
int Y;
int onetotwo;
int twotoone;
int t = 0;
printf("请输入命题表达式的个数\n");
scanf("%d", &n);
getchar();
char s[2][200];
printf("请输入命题表达式\n");
for (int i = 0; i < n; i++) {
gets(s[i]);
}
length = strlen(s[0]);
if (n == 1) {
if (judge(s[0])) {
number[0] = num;
num = 0;
printf("真值表如下\n\n");
TF(s[0], number[0]);
switch (form(pow(2,number[0]))) {
case 0:printf("\n命题公式1为矛盾式");
if (judment) { printf("且命题推理不正确"); }
break;
case 1:printf("\n命题公式1为重言式");
if (judment) { printf("且命题推理正确"); }
break;
case 2:printf("\n命题公式1为可满足式");
if (judment) { printf("且命题推理不正确"); }
break;
}printf("\n");
printf("\n主析取范式为:\n");
for (int i = 0; i < pow(2, number[0]); i++) {
Y = pow(2, number[0]) - i - 1;
if (result[0][i]) {
if (!t) { t = 1; }
else { printf("∨"); }
printf("(");
for (int j = 0; j < number[0]; j++) {
if (!j) {
if (Y / pow(2, number[0] - j - 1) >= 1) {
printf("%c", sum[j]);
}
else {
printf("!%c", sum[j]);
}
if (Y >= pow(2, number[0] - j - 1)) {
Y = Y - pow(2, number[0] - j - 1);
}
}
else {
if (Y / pow(2, number[0] - j - 1) >= 1) {
printf("∧%c", sum[j]);
}
else {
printf("∧!%c", sum[j]);
}
if (Y >= pow(2, number[0] - j - 1)) {
Y = Y - pow(2, number[0] - j - 1);
}
}
}
printf(")");
}
}t = 0;
printf("\n主合取范式为:\n");
for (int i = 0; i < pow(2, number[0]); i++) {
Y = pow(2, number[0]) - i - 1;
if (!result[0][i]) {
if (!t) { t = 1; }
else { printf("∧"); }
printf("(");
for (int j = 0; j < number[0]; j++) {
if (!j) {
if (Y / pow(2, number[0] - j - 1) >= 1) {
printf("!%c", sum[j]);
}
else {
printf("%c", sum[j]);
}
if (Y >= pow(2, number[0] - j - 1)) {
Y = Y - pow(2, number[0] - j - 1);
}
}
else {
if (Y / pow(2, number[0] - j - 1) >= 1) {
printf("∨!%c", sum[j]);
}
else {
printf("∨%c", sum[j]);
}
if (Y >= pow(2, number[0] - j - 1)) {
Y = Y - pow(2, number[0] - j - 1);
}
}
}
printf(")");
}
}t = 0;
}
else {
printf("命题表达式格式错误!\n");
}
}
if (n == 2) {
length = strlen(s[0]);
LENGTH = strlen(s[1]);
judge(s[0]);
number[0] = num;
num = 0;
judge(s[1]);
number[2] = num;
num = 0;
for (int i = 0; i < LENGTH + 1; i++) {
if (!i) { s[0][length + i] = '>'; }
else {
s[0][length + i] = s[1][i - 1];
}
}
s[0][length + LENGTH + 1] = '\0';
for (int i = 0; i < length + 1; i++) {
if (!i) { s[1][LENGTH + i] = '>'; }
else {
s[1][LENGTH + i] = s[0][i - 1];
}
}
s[1][length + LENGTH + 1] = '\0';
if (judge(s[0])) {
number[1] = num;
num = 0;
printf("命题1条件命题2真值表为:\n");
TF(s[0], number[1]);
switch (form(n2number)) {
case 0:onetotwo = 0;
break;
case 1:onetotwo = 1;
break;
case 2:onetotwo = 0;
break;
}
n2number = 0;
judge(s[1]);
length = LENGTH;
number[0] = number[2];
printf("命题2条件命题1真值表为:\n");
TF(s[1], number[1]);
switch (form(n2number)) {
case 0:twotoone = 0;
break;
case 1:twotoone = 1;
break;
case 2:twotoone = 0;
break;
}
if (onetotwo && twotoone) {
printf("命题1与命题2等价\n");
}
else {
if (onetotwo) {
printf("命题1蕴含命题2\n");
}
if (twotoone) {
printf("命题2蕴含命题1\n");
}
if ((!onetotwo) && (!twotoone)) {
printf("命题1与命题2无蕴含关系\n");
}
}
}
else {
printf("命题表达式格式错误!\n");
}
}
system("pause");
return 0;
}