离散数学实验&&命题逻辑实验

嘿,道友可是来自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;
}

 实验报告>>>>>>

欢迎友友们参观我的gitee仓库,这里有完整代码和实验报告

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值