实验一:逻辑运算表示与验证

  1. 实验目的和要求

实验目的:理解命题逻辑相关运算,增强逻辑推理能力

实验要求:

(1).从键盘输入命题常元的真值求他们的合取、析取、求反、异或、单条件、 双条件以及命题表达式的真值。

(2).求任意一个给定命题表达式的真值表,并根据真值表给出主范式。

        思路:对于求合取、析取、求反、异或、单条件(蕴含)、 双条件(等价)这些基础逻辑运算比较容易实现,对于常元与(2)的变元表达式,可以使用双栈结构(类似双栈计算器),借助栈的“先进后出”特性来解析表达式子;注意表达式的输入格式。

2. 实验环境和工具

开发环境:Visual Studio 2019

3. 实验结果

3.1 程序流程图

3.2 程序代码 (仅供参考,水平有限,有错请指出)

#include<iostream>
#include<string>
#include<vector>
#include<stack>
#include<algorithm>
using namespace std;
void show()
{cout << "******************************" << endl;cout << "***********逻辑运算***********" << endl;cout << "       1——逻辑与运算" << endl;cout << "       2——逻辑或运算" << endl;cout << "       3——逻辑非运算" << endl;cout << "       4——逻辑异或运算" << endl;cout << "       5——逻辑单条件运算" << endl;cout << "       6——逻辑双条件运算" << endl;cout << "       7——逻辑常元表达式运算" << endl;cout << "       8——逻辑变元表达式运算" << endl;cout << "       0——程序退出" << endl;cout << "******************************" << endl;cout << endl;
}
void menu1()
{cout << "----------------使用说明----------------" << endl;cout << "========================================" << endl;cout << "==      true用'1'      false用'0'    ==" << endl;cout << "==  命题变元字母不能重复且数量小于8  ==" << endl;cout << "==      逻辑变元用单个字母表示       ==" << endl;cout << "==      与逻辑用'*'   或逻辑用'+'    ==" << endl;cout << "==      非逻辑用'!'   异或逻辑用'^'  ==" << endl;cout << "==      单条件用'>'   双条件用'='    ==" << endl;cout << "=======================================" << endl;
}
void menu2()
{cout << "----------------使用说明----------------" << endl;cout << "========================================" << endl;cout << "==       命题变元所用字母不能重复     ==" << endl;cout << "==        且变元个数不能超过8个       ==" << endl;cout << "==      逻辑变元用单个字母表示        ==" << endl;cout << "==      与逻辑用'*'   或逻辑用'+'     ==" << endl;cout << "==      非逻辑用'!'   异或逻辑用'^'   ==" << endl;cout << "==      单条件用'>'   双条件用'='     ==" << endl;cout << "========================================" << endl;
}
stack<bool>opr;
stack<char>opr1;
stack<char>cal;
bool calculate()
{bool a = 0, b = 0; char c = '0';c = cal.top(); cal.pop();if (c != '!'){b = opr.top(); opr.pop();}a = opr.top(); opr.pop();switch (c){case '!':return !a;case'*':return a && b;case'+':return a || b;case'>':{if (a == 1 && b == 0)return 0;else return 1;}case'=':return a == b;}
}
int priority(const char ch)//符号优先级判断
{//¬, ∧, ∨, →, ↔switch (ch){case'(':return 0;case'^':return 1;case'=':return 2;case'>':return 3;case'+':return 4;case'*':return 5;case'!':return 6;case')':return 7;}
}
bool pack(string str1)
{char ch = '0'; int lv1 = 0, lv2 = 0; bool r = 0, result = 1;int i = 0, len = str1.size() - 1;//读到最后一个while (i < len)//扫描式子{if (str1[i] == '0' || str1[i] == '1'){if (str1[i] == '0'){r = 0;opr.push(r);}else{r = 1;opr.push(r);}i++;}else{if (cal.empty()){cal.push(str1[i]);i++;continue;}else{ch = cal.top();lv1 = priority(ch);lv2 = priority(str1[i]);if (lv2 == 0){cal.push(str1[i]);i++;}else if (lv2 == 7){ch = cal.top();while (ch != '('){result = calculate();opr.push(result);ch = cal.top();}cal.pop();//弹出左括号i++;}else{while (!cal.empty() && lv2 <= lv1){result = calculate();opr.push(result);if (!cal.empty()){ch = cal.top();lv1 = priority(ch);}}cal.push(str1[i]);i++;}}}}while (!cal.empty())//当把式子读完且操作符栈仍非空时{result = calculate();//计算opr.push(result);}if (cal.empty())return result;
}
void case1(bool P, bool Q, bool result)
{cout << "请输入真值value1和value2:";cin >> P >> Q;result = P && Q;cout << "逻辑与结果为:" << result << endl;cout << endl;
}
void case2(bool P, bool Q, bool result)
{cout << "请输入真值value1和value2:";cin >> P >> Q;result = P || Q;cout << "逻辑或结果为:" << result << endl;cout << endl;
}
void case3(bool P, bool result)
{cout << "请输入真值value1:";cin >> P;result = !P;cout << "逻辑非结果为:" << result << endl;cout << endl;
}
void case4(bool P, bool Q, bool result)
{cout << "请输入真值value1和value2:";cin >> P >> Q;result = P ^ Q;cout << "逻辑异或结果为:" << result << endl;cout << endl;
}
void case5(bool P, bool Q, bool result)
{cout << "请输入真值value1和value2:";cin >> P >> Q;if (P == 1 && Q == 0)result = 0;cout << "逻辑单条件结果为:" << result << endl;cout << endl;
}
void case6(bool P, bool Q, bool result)
{cout << "请输入真值value1和value2:";cin >> P >> Q;if (P != Q)result = 0;cout << "逻辑双条件结果为:" << result << endl;cout << endl;
}
void case7()
{string str1;cout << "请输入表达式<以#键结束>:";cin >> str1;cout << "运算结果为:" << pack(str1) << endl;cout << endl;
}
void case8()
{string s;cout << "请输入表达式<以#键结束>:";cin >> s;s.pop_back();vector<char> letter, disjunctive, conjunctive;//letter存放字母 for (int i = 0; i < s.size(); i++){if ((s[i] > 64 && s[i] < 91) || (s[i] > 96 && s[i] < 123)){//大小写26个字母 letter.push_back(s[i]);}}//真值表 cout << "真值表为:" << endl;cout << "————————————————————" << endl;for (int i = 0; i < letter.size(); i++)cout << letter[i] << "          ";cout << s << endl;cout << "————————————————————" << endl;vector<char> letters = letter;int d;stack<int> stk;for (int i = 0; i < pow(2, letter.size()); i++){int t = i;string s1 = s;for (int j = 0; j < letter.size(); j++){d = t % 2;t = t / 2;stk.push(d);}for (int k = 0; k < letter.size(); k++){int top = stk.top();cout << top << "          ";s1[s1.find(letter[k])] = top + 48;//转成char型的0和1stk.pop();}s1.push_back('#');bool c = pack(s1);cout << c << endl;//主析取范式 if (c == true){int num = 0;disjunctive.push_back('(');for (int i = 0; i < s1.size(); i++){if (s1[i] == 48) //真值为0,加! {disjunctive.push_back('!');disjunctive.push_back(letters[num]);disjunctive.push_back('*');num++;}else if (s1[i] == 49) //真值为1{disjunctive.push_back(letters[num]);disjunctive.push_back('*');num++;}else if (s1[i] == '#')break;                  elsecontinue;}disjunctive.pop_back();disjunctive.push_back(')');disjunctive.push_back('+');}//主合取范式 else{int num = 0;conjunctive.push_back('(');for (int i = 0; i < s1.size(); i++){if (s1[i] == 49){//真值为1,加! conjunctive.push_back('!');conjunctive.push_back(letters[num]);conjunctive.push_back('+');num++;}else if (s1[i] == 48){//真值为0 conjunctive.push_back(letters[num]);conjunctive.push_back('+');num++;}else if (s1[i] == '#')break;elsecontinue;}conjunctive.pop_back();conjunctive.push_back(')');conjunctive.push_back('*');}}disjunctive.pop_back();conjunctive.pop_back();cout << "————————————————————" << endl;cout << "主析取范式为:";for (int i = 0; i < disjunctive.size(); i++){cout << disjunctive[i];}cout << endl << "主合取范式为:";for (int i = 0; i < conjunctive.size(); i++){cout << conjunctive[i];}cout << endl; cout << endl;
}
int main()
{int choice = 0; bool p = 0, q = 0, r = 0, result = 1;show();while (true){cout << "请输入您要进行逻辑运算的符号:";cin >> choice;switch (choice){case 1:menu1();case1(p, q, result);break;case 2:menu1();case2(p, q, result);break;case 3:menu1();case3(p, result);break;case 4:menu1();case4(p, q, result);break;case 5:menu1();case5(p, q, result);break;case 6:menu1();case6(p, q, result);break;case 7:case7();break;case 8:menu2();case8();break;case 0:exit(0);break;default:cout << "输入错误请重新输入!" << endl;break;}}return 0;
}

3.3 运行结果

(1)逻辑与运算

(2)逻辑或运算:

(3)逻辑非运算:

(4)逻辑异或运算:

(5)逻辑单条件运算:

(6)逻辑双条件运算:

(7)命题常元表达式运算:

(8)命题变元表达式运算:

其他实验:合肥工业大学2021离散数学上机实验四https://blog.csdn.net/qq_52791068/article/details/122656507合肥工业大学2021离散数学上机实验六https://blog.csdn.net/qq_52791068/article/details/122656801

合肥工业大学2021离散数学上机实验八https://mp.csdn.net/mp_blog/creation/editor/122663212

合肥工业大学2021离散数学上机实验一相关推荐

  1. 合肥工业大学2021汇编语言程序设计上机实验一

    实验一  基本汇编程序设计 实验目的 1.熟悉在PC机上建立.汇编.连接.调试和运行8086/8088汇编语言程序的过程: 2.掌握基本汇编语言程序设计方法. 3.熟悉DOSBOX下运行dos程序方法 ...

  2. 合肥工业大学2021汇编语言程序设计上机实验二

    实验二  高级汇编程序设计 实验目的 1. 掌握中断服务子程序的编写. 2. 汇编语言与高级语言的混编. 实验内容 1.挂接1CH中断,正计时90秒后退出.要求屏幕显示0-89的秒数. 2.VC++中 ...

  3. 合工大计算机学硕分数线,合肥工业大学2021考研复试分数线已公布

    2021考研国家线已公布,接下来迎来的是考研复试分数线,复试分数线决定游走在边缘的考生是否能够顺利进入复试环节,中公考研为大家整理"合肥工业大学2021考研复试分数线已公布",一起 ...

  4. 合肥工业大学计算机保研,合肥工业大学2021届保研分析,全校保研率12. 6%,而“它”48.8%...

    合肥工业大学位于安徽,是教育部直属的全国重点大学,有合肥和宣城两个校区,学校是"211工程"."双一流"一流学科建设高校,管理科学与工程.电气.机械等学科为学校 ...

  5. 合工大计算机专业拟录取名单,合肥工业大学2021硕士研究生拟录取名单链接汇总...

    2021合肥工业大学研究生拟录取名单汇总(各学院) 机械工程学院2021年硕士研究生拟录取名单公示 http://jxxy.hfut.edu.cn/2021/0330/c9177a252788/pag ...

  6. java合肥工业大学考试题库_合肥工业大学java程序设计实验二

    合肥工业大学java程序设计实验二 1 / 3<Java 程序设计>实验报告--实验 2实验室:三.四机房 2014 年 05 月 22日学院 计算机与信息学院 专业班级 姓名 成绩课程名 ...

  7. 南工计算机调剂,南京工业大学2021年硕士研究生调剂公告

    一.申请条件 1.申请调剂考生需符合<教育部关于印发<2021年全国硕士研究生招生工作管理规定>的通知>(教学函( 2020 )8号)要求. 2.非全日制硕士研究生需以定向就业 ...

  8. 合工大计算机研究生毕业工资,合肥工业大学2019届薪酬统计

    合肥工业大学是一所好大学,学校位于安徽省,是教育部直属的全国重点大学.考生家长在报考合肥工业大学之前,应该了解一下合肥工业大学毕业生平均薪酬情况. 合肥工业大学的平均薪酬,本文整理的是合肥工业大学20 ...

  9. 武汉理工大学合肥工业大学 计算机,合工大为什么从985降到211?附合肥工业大学211地位(合工大不是985)...

    选择科目 测一测我能上哪些大学 选择科目 领取你的专属报告 > 选择省份 关闭 请选择科目 确定 v> 合肥工业大学是安徽省一所著名高校,简称"合工大",也是安徽211 ...

最新文章

  1. 45本互联网圣经级别书籍!包邮送到家!一书在手,天下我有!
  2. LeNet5,AlexNet,MobileNet它们的前身你知道吗?
  3. SQL Server 多实例下的复制
  4. hdu 3074 线段树 OR 树状数组
  5. ZZULIOJ 1075: 聚餐人数统计
  6. 【Liunx】Linux 文件基本属性
  7. php数据访问层,对数据访问层第一种实现(Acc+SQL)的重构
  8. mc服务器隐藏指令显示,服务器常用指令 搬运自Mc服主网
  9. 删除对象键值_JavaScript的解构技巧:排除对象属性、避免命名冲突、交换……...
  10. crt脚本怎么添加等待时间_如何在重启或启动时执行命令或脚本 | Linux 中国
  11. javascript的数组形式与php的数组形式
  12. 概要设计 英文_JavaScript 中的位运算和权限设计
  13. 神经网络拟合高程异常
  14. 揭秘山寨手机“四寨主”:都高仿苹果iPhone
  15. 2022年iOS面试题简答题
  16. APPLE G5 机箱改造“黑苹果”全攻略
  17. 学习大数据有推荐的么
  18. click事件在苹果手机失效的问题
  19. lrs_receive函数超时问题
  20. Android 第三方应用跳转到qq进行聊天(qq咨询)

热门文章

  1. i3-10110U和i5 10210u 哪个好
  2. 山石网科Hillstone防火墙L2TP over ***详细配置步骤(官方最新版)
  3. 性能瓶颈--CPU(上下文切换)
  4. python_爬虫_七麦网
  5. 在ROS下控制dobot(magician)机械手的吸盘
  6. 3D可视化信息管理平台让运维管理更高效率!
  7. Python CSV Reader/Writer
  8. 微信小程序:新功能WXS解读(2017.08.30新增)
  9. 云开发校园微社区微信小程序源码/二手交易/兼职交友微信小程序开源功能介绍
  10. JavaScript直接通过id获取对象