厦门理工学院 离散数学 实验1

题目部分:

1、 通过键盘输入两个命题变元P和Q的真值,求它们的非(┑)、合取(∧)、析取(∨)、

蕴含(→)和等价 ( ↔  )的真值。

运行结果截屏:

2、编程计算以下命题公式的真值表

(1)p∧r∧┑(q→p)

(2) (p→q) ↔(p→r)

(3) (p∧┑(q→p)) ∧(q∧r)

运行结果截屏

3、预测比赛名次,有A,B,C,D四人参加百米赛跑,观众甲、乙、丙预测比赛的名次为:    甲说: C第一,B第二;    乙说: C第二,D第三;    丙说: A第二,D第四;  比赛结束后发现甲、乙、丙每人的预测都只对一半,试问实际名次如何(假定没有并列者)?

运行结果截屏

4. 警察局抓了A、B、C、D四名偷窃嫌疑犯,其中有一个人是小偷。审问中A说:“我不是小偷。”B说:“C是小偷。”C说:“小偷肯定是D。”D说:“C在冤枉人。”现在已经知道四个人中三个人的是真话,一人说的是假话,问到底谁是小偷?

(分析:因为牵扯C的线索最多,故从C入手。假设C是小偷,则ABD均说真话,C说假话符合题意。所以C是小偷)

5、求以下公式的主析取范式

(1)A =( p∧q)∨(┑p∧q∧r)

(2) B = (p∨(q∧r)) ∧(┑q∨(p∧r))

并判断公式A、B是否等值

运行结果截屏

代码部分

 

#include<iostream>
using namespace std;

void fun0();//Gongneng
void fun1();//题目1
void fun2();//题目2
void fun3_1();//题目3_1,解法1
void fun3_2();//题目3_2,解法2
void fun4();//题目4
void fun5();//题目5

int main() {
	cout<<"\n题1=================================================\n"<<endl;
	fun1();
	cout<<"\n\n\n题2=================================================\n"<<endl;
	fun2();
	cout<<"\n\n\n题3解法1=================================================\n"<<endl;
	fun3_1();
	cout<<"\n\n\n题3解法2=================================================\n"<<endl;
	fun3_2();
	cout<<"\n\n\n题4=================================================\n"<<endl;
	fun4();
	cout<<"\n\n\n题5=================================================\n"<<endl;
	fun5();
}


void fun1() {
	int p, q;
	cout << "请输入p的值(0/1):";
	cin >> p;
	cout << "请输入q的值(0/1):";
	cin >> q;

	cout << "¬p:" << !p << endl;
	cout << "¬q:" << !q << endl;
	cout << "p∧q:" << (p || q) << endl;
	cout << "pVq:" << (p && q) << endl;
	cout << "p→q:" << ((!p) || q) << endl;
	cout << "p<->q:" << (p == q) << endl;
}

void fun2() {
	int p, q, r;
	cout << "输出真值表如下:" << endl;
	cout << "p\t" << "q\t" << "r\t" << "p∧q∧¬(p→q)\t" << "(p→q)<->(p→r)\t" << "(p∧¬(q→p)∧(q∧r)" << endl;
	for (int i = 0; i <= 7; i++) {
		r = i % 2;
		q = (i / 2) % 2;
		p = i / 4;
		cout << p << "\t" << q << "\t" << r << "\t\t";
		cout << (p && r && !((!p) || q)) << "\t\t";
		cout << (((!p) || q) == ((!p) || r)) << "\t\t";
		cout << ((p && !((!p) || q)) && (q && r)) << "\t\t\t" << endl;
	}
	cout << endl;
}

void fun3_1() {
	int a, b, c, d;
	for (a = 1; a <= 4; a++) {
		for (b = 1; b <= 4; b++) {
			for (c = 1; c <= 4; c++) {
				for (d = 1; d <= 4; d++) {
					if (c == 1 && b != 2) {
						if (d == 3)
							if (a == 2 && a != b && a != c && a != d && b != c && b != d && c != d)
								cout << "abcd的排名为:" << a << b << c << d << endl;;
					} else if (b == 2 && c != 1) {
						if (c == 2 && d != 3) {
							if (d == 4 && a != b && a != c && a != d && b != c && b != d && c != d)
								cout << "abcd的排名为:" << a << b << c << d << endl;
						} else if (c != 2 && d == 3) {
							if (a == 2 && a != b && a != c && a != d && b != c && b != d && c != d)
								cout << "abcd的排名为:" << a << b << c << d << endl;
						}
					}

				}
			}
		}
	}
}

void fun3_2() {
	int a, b, c, d;
	for (a = 1; a <= 4; a++) {
		for (b = 1; b <= 4; b++) {
			for (c = 1; c <= 4; c++) {
				for (d = 1; d <= 4; d++) {
					if(a!=b&&a!=c&&a!=d&&b!=c&&b!=d&&c!=d)				
						if(((c==1)+(b==2)==1)&&((c==2)+(d==3)==1)&&((a==2)+(d==4)==1))
								cout<<"abcd的排名为"<<a<<b<<c<<d<<endl;
										
					
				}
			}
		}
	}
}

void fun4() {
	int a, b, c, d;
	for (a = 1; a >= 0; a--)
		for (b = 1; b >= 0; b--)
			for (c = 1; c >= 0; c--)
				for (d = 1; d >= 0; d--)
					if ((!a + c + d + (!d) == 3) && (a + b + c + d == 1)) {
						if (a)
							printf("小偷是:A\n");
						if (b)
							printf("小偷是:B\n");
						if (c)
							printf("小偷是:C\n");
						if (d)
							printf("小偷是:D\n");
					}
}

void fun5() {
	bool A, B;
	int p, q, r, a[8], b[8], j = -1, k = -1;
	cout << "p\t" << "q\t" << "r\t" << "A\t" << "B\t" << "A<->B" << endl;
	for (int i = 0; i <= 7; i++) {
		r = i % 2;
		q = (i / 2) % 2;
		p = i / 4;
		A = ((p && q) || ((!p) && q && r));
		B = ((p || (q && r)) && ((!p) || (q && r)));
		cout << p << "\t" << q << "\t" << r << "\t" << A << "\t" << B << "\t";
		cout << "  " << (A == B) << endl;
		if (A == 1) {
			j++;
			a[j] = r * 1 + q * 2 + p * 4;

		}
		if (B == 1) {
			k++;
			b[k] = r * 1 + q * 2 + p * 4;

		}
	}
	cout << "A的主析取范式为:" << endl << "\t";
	while (j >= 0) {
		if (j == 0) {
			cout << "m(" << a[j] << ") " << endl;
			break;
		}
		cout << "m(" << a[j] << ") V ";
		j--;
	}


	cout << "B的主析取范式为:" << endl << "\t";
	while (k >= 0) {
		if (k == 0) {
			cout << "m( " << b[k] << " ) " << endl;
			break;
		}
		cout << "m(" << b[k] << ") V ";
		k--;
	}


}