题目部分:
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--;
}
}