合肥工业大学2021离散数学上机实验一
实验一:逻辑运算表示与验证
- 实验目的和要求
实验目的:理解命题逻辑相关运算,增强逻辑推理能力
实验要求:
(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离散数学上机实验一相关推荐
- 合肥工业大学2021汇编语言程序设计上机实验一
实验一 基本汇编程序设计 实验目的 1.熟悉在PC机上建立.汇编.连接.调试和运行8086/8088汇编语言程序的过程: 2.掌握基本汇编语言程序设计方法. 3.熟悉DOSBOX下运行dos程序方法 ...
- 合肥工业大学2021汇编语言程序设计上机实验二
实验二 高级汇编程序设计 实验目的 1. 掌握中断服务子程序的编写. 2. 汇编语言与高级语言的混编. 实验内容 1.挂接1CH中断,正计时90秒后退出.要求屏幕显示0-89的秒数. 2.VC++中 ...
- 合工大计算机学硕分数线,合肥工业大学2021考研复试分数线已公布
2021考研国家线已公布,接下来迎来的是考研复试分数线,复试分数线决定游走在边缘的考生是否能够顺利进入复试环节,中公考研为大家整理"合肥工业大学2021考研复试分数线已公布",一起 ...
- 合肥工业大学计算机保研,合肥工业大学2021届保研分析,全校保研率12. 6%,而“它”48.8%...
合肥工业大学位于安徽,是教育部直属的全国重点大学,有合肥和宣城两个校区,学校是"211工程"."双一流"一流学科建设高校,管理科学与工程.电气.机械等学科为学校 ...
- 合工大计算机专业拟录取名单,合肥工业大学2021硕士研究生拟录取名单链接汇总...
2021合肥工业大学研究生拟录取名单汇总(各学院) 机械工程学院2021年硕士研究生拟录取名单公示 http://jxxy.hfut.edu.cn/2021/0330/c9177a252788/pag ...
- java合肥工业大学考试题库_合肥工业大学java程序设计实验二
合肥工业大学java程序设计实验二 1 / 3<Java 程序设计>实验报告--实验 2实验室:三.四机房 2014 年 05 月 22日学院 计算机与信息学院 专业班级 姓名 成绩课程名 ...
- 南工计算机调剂,南京工业大学2021年硕士研究生调剂公告
一.申请条件 1.申请调剂考生需符合<教育部关于印发<2021年全国硕士研究生招生工作管理规定>的通知>(教学函( 2020 )8号)要求. 2.非全日制硕士研究生需以定向就业 ...
- 合工大计算机研究生毕业工资,合肥工业大学2019届薪酬统计
合肥工业大学是一所好大学,学校位于安徽省,是教育部直属的全国重点大学.考生家长在报考合肥工业大学之前,应该了解一下合肥工业大学毕业生平均薪酬情况. 合肥工业大学的平均薪酬,本文整理的是合肥工业大学20 ...
- 武汉理工大学合肥工业大学 计算机,合工大为什么从985降到211?附合肥工业大学211地位(合工大不是985)...
选择科目 测一测我能上哪些大学 选择科目 领取你的专属报告 > 选择省份 关闭 请选择科目 确定 v> 合肥工业大学是安徽省一所著名高校,简称"合工大",也是安徽211 ...
最新文章
- 45本互联网圣经级别书籍!包邮送到家!一书在手,天下我有!
- LeNet5,AlexNet,MobileNet它们的前身你知道吗?
- SQL Server 多实例下的复制
- hdu 3074 线段树 OR 树状数组
- ZZULIOJ 1075: 聚餐人数统计
- 【Liunx】Linux 文件基本属性
- php数据访问层,对数据访问层第一种实现(Acc+SQL)的重构
- mc服务器隐藏指令显示,服务器常用指令 搬运自Mc服主网
- 删除对象键值_JavaScript的解构技巧:排除对象属性、避免命名冲突、交换……...
- crt脚本怎么添加等待时间_如何在重启或启动时执行命令或脚本 | Linux 中国
- javascript的数组形式与php的数组形式
- 概要设计 英文_JavaScript 中的位运算和权限设计
- 神经网络拟合高程异常
- 揭秘山寨手机“四寨主”:都高仿苹果iPhone
- 2022年iOS面试题简答题
- APPLE G5 机箱改造“黑苹果”全攻略
- 学习大数据有推荐的么
- click事件在苹果手机失效的问题
- lrs_receive函数超时问题
- Android 第三方应用跳转到qq进行聊天(qq咨询)
热门文章
- i3-10110U和i5 10210u 哪个好
- 山石网科Hillstone防火墙L2TP over ***详细配置步骤(官方最新版)
- 性能瓶颈--CPU(上下文切换)
- python_爬虫_七麦网
- 在ROS下控制dobot(magician)机械手的吸盘
- 3D可视化信息管理平台让运维管理更高效率!
- Python CSV Reader/Writer
- 微信小程序:新功能WXS解读(2017.08.30新增)
- 云开发校园微社区微信小程序源码/二手交易/兼职交友微信小程序开源功能介绍
- JavaScript直接通过id获取对象