logo资料库

北航三系离散数学大作业含代码.docx

第1页 / 共20页
第2页 / 共20页
第3页 / 共20页
第4页 / 共20页
第5页 / 共20页
第6页 / 共20页
第7页 / 共20页
第8页 / 共20页
资料共20页,剩余部分请下载后查看
一.概述
二.框图
三.需求分析(问题陈述)
四.数据结构
4.1 程序中使用的主要变量
4.2 连接可视化窗口的主要输入输出
五.算法
5.1.程序中的主要函数:
5.2.主要函数算法描述:
5.2.1.start_函数
5.2.2.myInput函数
5.2.3. yunhan_dengjia函数
5.2.4.cal函数
5.2.5.clear函数
六.运行配置
七.代码
八.运行截图
九.总结
十.参考资料
应用离散数学 范式计算器 院 ( 系 ) 名 称 自 动 化 科 学 与 电 气 工 程 学 院 专 业 名 称 自 动 化 学 生 学 号 学 生 姓 名 1
目录 一.概述 .............................................................................................................................................................. 3 二.框图 .............................................................................................................................................................. 3 三.需求分析(问题陈述) ...........................................................................................................................4 四.数据结构 ...................................................................................................................................................4 4.1 程序中使用的主要变量 ....................................................................................................................4 4.2 连接可视化窗口的主要输入输出 ................................................................................................... 4 五.算法 ...........................................................................................................................................................5 5.1.程序中的主要函数: .........................................................................................................................5 5.2.主要函数算法描述: .........................................................................................................................5 5.2.1.start_函数................................................................................................................................ 5 5.2.2.myInput 函数 ........................................................................................................................... 5 5.2.3. yunhan_dengjia 函数 ..............................................................................................................5 5.2.4.cal 函数 .................................................................................................................................... 6 5.2.5.clear 函数 .................................................................................................................................7 六.运行配置 ...................................................................................................................................................7 七.代码 ...........................................................................................................................................................7 八.运行截图 .................................................................................................................................................16 九.总结 .........................................................................................................................................................20 十.参考资料 .................................................................................................................................................20 2
一.概述 本程序在 python 环境下编写,利用 python 自带的 tkinter 库制作了简易的窗 口,利用 pyinstaller 库将代码转换为可执行文件,可以在 windows 系统中运行。 压缩包中的 python 文件在 3.52 版本中编译完成,不保证在不同版本(尤其是 python2)中正常运行。 考虑到 Python 中有一个强大的 eval 指令,可对含有与或非功能的字符串进 行运算以简化本任务,程序整体编写思路如下:1.通过窗口上的按键(键盘也可, 但不推荐)输入原子命题和逻辑运算符号 2.检查输入是否正常,如正常则统计 原子命题和数量和名称 3.将输入字符串中的蕴含和等价关系变换成只用析取合 取以及非构成的字符串 4.遍历可能出现的各种情况,通过循环对每一种情况进 行运算并归类,输出 5.得到结果,如想进行下一次计算,点击“清除”后重头开 始 二.框图 3
三.需求分析(问题陈述) 程序功能:任意输入一个命题逻辑公式(最多三个命题变项),求得其析取范式或者合取范 式。 输入:命题逻辑公式 输出:范式 要求:有 Windows 界面,界面上可以选择不同的集合运算;界面上可以输入三个集合运算 的元素 四.数据结构 4.1 程序中使用的主要变量 使用到的数据类型有:字符串、列表、整型 1.sInput:字符串格式,输入字符串,在窗口中通过按键或键盘输入,点击“开 始”后输入内容将被赋值给 sInput 字符串 2.sParse:字符串格式,简化字符串,输入字符串经过检查确认基本有效后赋给 sParse,之后进行化简 3.variable:列表格式,记录输入字符串中包含的原子命题,并按照 ASCII 码进 行排序 4.orn1:列表格式,主析取范式最小项,里面将记录所有析取的编号(此编号转 换为二进制之后可以表示各个原子命题的真假) 5.andn1:主合取范式最小项,里面将记录所有合取的编号 6.fore:列表格式,将蕴含和等价关系变形时需要寻找将逻辑符号之前和之后的 哪一部分进行变形。fore 对应的是逻辑符号之前的需参与转换部分 7.back:字符串格式,对应逻辑符号后面的需参与转换部分 8.slen:字符串格式,记录字符串转换到当前状态的真实长度 9.stop1(stop2):数值格式,做控制变量使用,查找到准确前项(后项)之前为 0,查到到之后变为 1,控制循环结束 10.flag1(flag2):数值格式,做括号标志变量使用,遇到(自动减 1,遇到) 自动加 1,确定查找过程中碰到括号的个数 11.a(b):数值格式,记录当前发现的析取(合取)范式的个数 4.2 连接可视化窗口的主要输入输出 1.intext:输入文本框,通过按键或键盘输入,允许用回车删除 2.ou1(ou2):输出析取(合取)范式列表 3.ou3(ou4):输出析取(合取)范式真值表 4.ou5(ou6):输出最终的析取(合取)表达式 4
五.算法 5.1.程序中的主要函数: start_函数 myinput 函数 yunhan_dengjia 函数 cal 函数 clear_函数 5.2.主要函数算法描述: 5.2.1.start_函数 主函数,(直接或间接)调用除 clear 函数之外的任何函数 STEP1:调用 myinput 函数完成输入 STEP2:调用 yunhan_dengjia,化简字符串中的蕴含 STEP3:调用 yunhan_dengjia,化简字符串中的等价 STE:4:调用 cal 函数枚举各种情况并进行判断归类和输出 5.2.2.myInput 函数 承担着接收输入字符串和清零的功能,清零功能是保证在完成一次运算后忘 记点击“清除”,直接输入待运算字符串进行运算一样可以得到正确结果 STEP1:清除析取列表 orn1 STEP2:清除合取列表 andn1 STEP3:清除变量列表 variable STEP4:清除所有输出文本框 STEP5:接收来自 intext 的输入 STEP6:五行语句用计算机能够识别的字符来替换离散数学中的命题逻辑符号 5.2.3. yunhan_dengjia 函数 STEP1:遍历整个字符串,初始 i=0,之后每次执行本语句 i+=1 STEP2:记录 slen 为当前字符串长度 STEP3:判断是否查找到字符串末尾,如果是的话跳出函数 STEP4:查看是否为敏感字符(待化简的'→'或'↔'),是的话进入下一步,不是的 话跳回 STEP1 STEP5:记录当前字符串长度为 slen_now 5
STEP6:定义标志变量 flag1 和控制变量 stop1,初始化为 0,定义 j=i-1,表示敏 感字符的上一个字符的位置 STEP7:判断 stop1 是否为 1,不是的话进行下一步 STEP8:判断 j 对应字符是否为‘(’,是的话 flag1-=1;判断 j 对应字符是否为‘), 是的话 flag1+=1 STEP9:判断是否查找到字符串开头,是的话令 stop1=1 STEP10:判断 flag1 是否等于 1(是否碰到了隔开优先等级的‘(’),是的话令 stop1=1 STEP11:判断是否在前面碰到了等价运算符,是的话令 stop1=1 STEP12:适当对 j 进行运算,确定前项并赋值给 fore 字符串 STEP13:定义标志变量 flag2 和控制变量 stop2,初始化为 0,定义 k=i-1,表示 敏感字符的下一个字符的位置 STEP14:判断 stop2 是否为 1,不是的话进行下一步 STEP15: 判断 k 对应字符是否为‘(’,是的话 flag1-=1;判断 j 对应字符是否为 ‘),是的话 flag1+=1 STEP16:判断是否查找到字符串开头,是的话令 stop2=1 STEP17:判断 flag2 是否等于 1(是否碰到了隔开优先等级的‘)’),是的话令 stop2=1 STEP18:判断是否在前面碰到了与自身相同的运算符或等价运算符,是的话令 stop2=1 STEP19:适当对 k 进行运算,确定前项并赋值给 back 字符串 STEP20:判断敏感符号,选择对应的化简方法进行化简 5.2.4.cal 函数 STEP1:将变量个数赋值给 vlen,将可能情况个数赋值给 n STEP2:定义 a 和 b 分别用来记录析取和合取的个数,初始化为 0 STEP3:遍历可能出现的情况,nl 初值为 0,之后返回到本语句时候 nl+=1,继 续运行,如果 nl 超出范围就跳 STEP19 STEP4:定义 value 列表用来存储这种情况下各个变量的值,令 j 指向真值表当 前行 STEP5:将 value 内各值赋值为 0 STEP6:通过除二取余法获得 nl 的二进制表示 STEP7:将二进制表示存在 value1 中,将 value 变形 STEP8:将 value 中的各个值装入各个变量中去 STEP9:计算表达式的值,如果是 1 则继续执行,如果不是则执行 STEP14 STEP10:这是一个析取式 STEP11:遍历变量个数,判断只要不是第一个变量就输出一个'∨' STEP12:判断当前变量带入的值是不是 0,是的话输出'¬'和变量名,不然只输出 变量名 STEP13:判断是否是最后一个变量,不是的话输出'∧',下一步进行 STEP18 STEP14:这是一个合取式 STEP15:遍历变量个数,判断只要不是第一个变量就输出一个'∨' STEP16:判断当前变量带入的值是不是 0,是的话输出'¬'和变量名,不然只输出 6
变量名 STEP17:判断是否是最后一个变量,不是的话输出'∧' STEP18:返回执行 STEP3 STEP19:分别输出 5.2.5.clear 函数 STEP1:清除析取列表 orn1 STEP2:清除合取列表 andn1 STEP3:清除变量列表 variable STEP4:清除所有输出文本框 STEP5:接收来自 intext 的输入 六.运行配置 打开 16721115 申佳军 范式计算器压缩文件后有一个快捷方式,双击即可 运行 exe 文件,名称为“范式计算器”的文件夹内包含转换成 exe 过程中生成的 文件。 压缩包内有一个 Python File 类型的文件,里面里面存有代码,在安装 python3.52 的情况下直接双击会运行 py 文件,在 python 内打开可以查看代码。 包括框图和代码在内的其他内容已在本文档中呈现。但由于注释换行等原因, 直接将本文档内的代码直接复制不保证正确运行,请考虑打开 exe 文件或 pyrhon file 文件。 七.代码 import tkinter as tk sInput = '' #输入的命题公式字符串 sParse = '' #化简后的 sInput variable = [] #保存公式中的变量,会按照 ASCII 码进行排序方便输出 ornl = [] #主析取范式最小项 andnl = [] #主合取范式最大项 fore = '' #符号前面的部分(将蕴含和等价化成一般形式时用到) back = '' #符号后面的部分(将蕴含和等价化成一般形式时用到) window = tk.Tk() window.title('16721115 申佳军的大作业 范式计算器') window.geometry('600x520') #定义窗口 7
l00 = tk.Label(window, text='输入:', font=('Arial', 12), width=7, height=1) 起到提示作用。 l00.place(x=30, y=10, anchor='nw') #标签, l01 = tk.Label(window, text='主析取范式:', font=('Arial', 10), width=10, height=1) #标签,起到提示作用。 l01.place(x=30, y=165, anchor='nw') l02 = tk.Label(window, text='主合取范式:', font=('Arial', 10), width=10, height=1) #标签,起到提示作用。 l02.place(x=30, y=195, anchor='nw') l03 = tk.Label(window, text=' 析 取 真 值 表 ', font=('Arial', 10), width=8, height=1) #标签,起到提示作用。 l03.place(x=30, y=240, anchor='nw') l04 = tk.Label(window, text=' 合 取 真 值 表 ', font=('Arial', 10), width=8, height=1) #标签,起到提示作用。 l04.place(x=140, y=240, anchor='nw') l05 = tk.Label(window, text='析取表达式:', font=('Arial', 10), width=10, height=1) #标签,起到提示作用。 l05.place(x=270, y=240, anchor='nw') l06 = tk.Label(window, text='合取表达式:', font=('Arial', 10), width=10, height=1) #标签,起到提示作用。 l06.place(x=270, y=370, anchor='nw') l07 = tk.Label(window, text=' 输 入 逻 辑后 点 击开 始', font=('Arial', 10), width=35, height=1) l07.place(x=190, y=40, anchor='nw') #标签,起到提示作用。 l08 = tk.Label(window, text=' 连 续 输 入前 点 击清 零', font=('Arial', 10), width=35, height=1) #标签,起到提示作用。 l08.place(x=190, y=60, anchor='nw') l09 = tk.Label(window, text=' 输 入 错 时无 输 出结 果', font=('Arial', 10), width=35, height=1) #标签,起到提示作用。 l09.place(x=190, y=80, anchor='nw') ou1 = tk.Text(window,height=1,width=64) ou1.place(x=110, y=170, anchor='nw') #输出文本窗口 8
分享到:
收藏