离散数学实验——求真值表.doc_第1页
离散数学实验——求真值表.doc_第2页
离散数学实验——求真值表.doc_第3页
离散数学实验——求真值表.doc_第4页
离散数学实验——求真值表.doc_第5页
已阅读5页,还剩13页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

0 一一 实验目的实验目的 3 二二 实验内容实验内容 3 三三 实验环境实验环境 3 四四 实验原理和实现过程 算法描述 实验原理和实现过程 算法描述 3 五五 实验数据及结果分析 实验数据及结果分析 5 六六 源程序清单 源程序清单 9 七七 其他收获和体会 其他收获和体会 18 1 一一 实验目的实验目的 熟悉掌握命题逻辑中的联接词 真值表 主范式等 进一步能用 它们来解决实际问题 二二 实验内容实验内容 1 从键盘输入两个命题变元 P 和 Q 的真值 求它们的合取 析 取 条件和双条件的真值 A 2 求任意一个命题公式的真值表 B 并根据真值表求主范式 C 三三 实验环境实验环境 C 或 C 语言编程环境实现 四四 实验原理和实现过程 算法描述 实验原理和实现过程 算法描述 A A 首先提示用户输入真值指派 然后判断用户输入的是否是 0 或者 1 如果不是则利用 while 语句提示错误 然后提示重新输入 直至输入正确 再根据用户输入的真值给代表合取 析取 蕴含 双条件的变量赋值 再以两行表格形式输出所得结果 最后提示按 键退出 否则继续循环求真值 B B 主要思路 首先提示用户输入表达式 然后编写并调用一个函数 将表达式转换为逆波兰式 在转换的同时 插入部分语句将表达式 中的变量名存储到数组 bianl N 中 然后输出存好的各变量名及用 户输入的表达式 建立表头 将每次的真值指派存在数组 zhi 中 编写函数 zzhi 每次调用 zzhi 时都使数组 zhi 中的真值加 1 利用递推实现加一时可能的进位 然后编写并调用一函数 qiuzhi 计算每次真值指派下的逆波兰表达式的值 再输出各真 值指派和求出的表达式的真值 然后调用函数 zzhi 将真值指派 的数组加 1 最后外围利用 while 语句循环输出每个不同的真值指 2 派和该指派下表达式的值 将表达式转换成逆波兰式并将变量提取的算法 首先需要分配 2 个栈 一个作为临时存储运算符的栈 fu 一个作为输入逆波兰式 的栈 nibol 从中缀式的左端开始取字符 逐序进行如下步骤 1 若取出的字符是字母 则该字母直接送入 nibol 栈 同 时为了找出所有变量 将该变量名与数组 bianl 中已有的元素比 较 如果 bianl 中还没有该字母 则该字母是新出现的变量 将 其录入数组 bianl 中 2 若取出的字符是 则直接送入 fu 栈栈顶 3 若取出的字符是 则将距离 fu 栈栈顶最近的 之间的运算符 逐个出栈 依次送入 nibol 栈 此时抛弃 4 若取出的字符是运算符 则将该运算符与 fu 栈栈顶元 素比较 如果该运算符优先级大于 fu 栈栈顶运算符优先级 此 处是编写程序时自己判断好优先级了再按不同情况处理 则将该运 算符进 fu 栈 否者 将 fu 栈的栈顶运算符弹出 送入 nibol 栈中 直至 fu 栈栈顶运算符低于 不包括等于 该运算符优先级 则将该运算符送入 fu 栈 5 重复上面的 1 4 步 直至处理完所有的输入字符 6 最后将残留在符号栈 fu 中的运算符依次出栈 由于是用数组做的栈 所以 使用逆波兰式求值时只需直接从 数组 nibol 的第一个元素 nibol 0 开始依次读取就行了 计算逆波兰式的值的算法 把转换好的逆波兰式从 nibol 0 开 始依次读取 如果是字母 则先判断字母是第几个变量 将数组 zhi 存放了真值指派 中对应的真值 zhi i 放入数组 result 作为一个栈 中 遇到双目运算符就将 result 中栈顶的两个元 素出栈 执行运算 得到的结果再入栈 如果是单目运算符 则 只将一个元素出栈并计算和入栈 增值 用一个数组存放每一次的真值指派 并用递推实现真值 的加 1 进位 zzhi int n 3 数组 zhi 存每次的真值指派 调用 zzhi bl 1 时给 n 赋值为变量 数加 1 以防止最后一个输出完时再增值时溢出 if zhi n 0 zhi n 1 else if zhi n 1 zhi n 0 zzhi n 1 递推 实现进位 C C 在 B 的基础上加了两个二维数组 biao biao2 将真值为 1 和 0 的真值指派分别存在数组 biao 和 biao2 中 然后按 合取和析取主范式的不同定义 用循环将对应真值的变量以原或反 变量形式输出期间也输出合取 析取符和括号 使之成为主范式 再编写好主要的功能之后 我又在源程序基础上加了一些判断输 入错是的提示和处理 具体见实验数据分析和源程序的注释 五五 实验数据及结果分析 实验数据及结果分析 A A 当输入的真值不为 0 或者 1 时提示错误并要求重新输入 可循环输入直到输入 才退出 如图所示 以表格的形式输出结 果 并且真值都正确 4 B B 和和 C C 首先提示输入表达式 合取 析取 蕴含 双条件分别用flag flag intintint he xi yunh dengj p q he xi yunh dengj p q he xi yunh dengj p q printf printf printf 欢迎进入欢迎进入欢迎进入 n n n printf t printf t printf t 本次实验计算二元表达式的值本次实验计算二元表达式的值本次实验计算二元表达式的值 n n n n n n do do do printf printf printf 请输入请输入请输入 P QP QP Q 的真值指派 的真值指派 的真值指派 0 0 0 或或或 1 1 1 n n n printf p printf p printf p scanf d scanf d scanf d while p 0 np np fflush stdin fflush stdin fflush stdin scanf d scanf d scanf d printf Q printf Q printf Q scanf d scanf d scanf d while q 0 nQ nQ fflush stdin fflush stdin fflush stdin scanf d scanf d scanf d he p 1he p 1he p 1 xi p 1 q 1 1 0 xi p 1 q 1 1 0 xi p 1 q 1 1 0 yunh p 0 q 1 1 0 yunh p 0 q 1 1 0 yunh p 0 q 1 1 0 dengj p q 1 0 dengj p q 1 0 dengj p q 1 0 printf tP tQ tP Q tP Q tP Q tP Q n printf tP tQ tP Q tP Q tP Q tP Q n printf tP tQ tP Q tP Q tP Q tP Q n 8 printf t d t dprintf t d t dprintf t d t d t d t d t d t d t d t d t d t d t d t t t d p q he xi yunh dengj d p q he xi yunh dengj d p q he xi yunh dengj printf n t printf n t printf n t 按按按 退出 其它任意键继续退出 其它任意键继续退出 其它任意键继续 n n n fflush stdin fflush stdin fflush stdin scanf c scanf c scanf c while flag while flag while flag B B B 和和和 C C C include include include include include include include include include include include include define define define N N N 202020 charcharchar yuan N N 0 fu N 0 nibol N N 0 bianl N yuan N N 0 fu N 0 nibol N N 0 bianl N yuan N N 0 fu N 0 nibol N N 0 bianl N intintint zhi N 0 zhi N 0 zhi N 0 全局变量分别存储原表达式全局变量分别存储原表达式全局变量分别存储原表达式 yuanyuanyuan 求逆波兰式时的符号 求逆波兰式时的符号 求逆波兰式时的符号 fufufu 存储逆波兰式存储逆波兰式存储逆波兰式 nibolnibolnibol 存储变量 存储变量 存储变量 bianl bianl bianl 存储真值指派存储真值指派存储真值指派 zhizhizhi intintint nitop 1 ftop 1 bl 1 nitop 1 ftop 1 bl 1 nitop 1 ftop 1 bl 1 存储逆波兰式和求逆波兰式时要用到的存符号的数组的栈顶指针以及变量下标存储逆波兰式和求逆波兰式时要用到的存符号的数组的栈顶指针以及变量下标存储逆波兰式和求逆波兰式时要用到的存符号的数组的栈顶指针以及变量下标 intintint error0 0 error0 0 error0 0 intintint biao N N N geshu 0 biao N N N geshu 0 biao N N N geshu 0 存储使真值为一的真值指派 用来求主析取范式存储使真值为一的真值指派 用来求主析取范式存储使真值为一的真值指派 用来求主析取范式 intintint biao2 N N N geshu2 0 biao2 N N N geshu2 0 biao2 N N N geshu2 0 voidvoidvoid main0 main0 main0 函数声明函数声明函数声明 nibolan nibolan nibolan 将输入的表达式转换为逆波兰式将输入的表达式转换为逆波兰式将输入的表达式转换为逆波兰式 intintint i j k flag fg 1 i j k flag fg 1 i j k flag fg 1 flag flag flag 记录某变量是否已出现 记录某变量是否已出现 记录某变量是否已出现 fgfgfg 记录上个变量是字母记录上个变量是字母记录上个变量是字母 1 1 1 运算符号运算符号运算符号 2 2 2 左括号左括号左括号 0 0 0 右括号 右括号 右括号 3 3 3 j strlen yuan j strlen yuan j strlen yuan for i 0 i j i for i 0 i j i for i 0 i A error0 1 return error0 1 return error0 1 return fg 1 fg 1 fg 1 nibol nitop yuan i nibol nitop yuan i nibol nitop yuan i flag 1 flag 1 flag 1 for k 0 k bl k for k 0 k bl k for k 0 k if yuan i if yuan i if fg 0 fg 2 if fg 0 fg 2 if fg 0 fg 2 printf printf printf 输入错误 表达式不规范请重新输入 输入错误 表达式不规范请重新输入 输入错误 表达式不规范请重新输入 error0 1 return error0 1 return error0 1 return fg 2 fg 2 fg 2 while fu ftop fu ftop nibol nitop fu ftop nibol nitop fu ftop fu ftop yuan i fu ftop yuan i fu ftop yuan i elseelseelse if yuan i if yuan i if yuan i if fg 0 fg 2 if fg 0 fg 2 if fg 0 fg 2 printf printf printf 输入错误 表达式不规范请重新输入 输入错误 表达式不规范请重新输入 输入错误 表达式不规范请重新输入 error0 1 return error0 1 return error0 1 return fg 2 fg 2 fg 2 while fu ftop fu ftop nibol nitop fu ftop nibol nitop fu ftop fu ftop yuan i fu ftop yuan i fu ftop yuan i elseelseelse printf printf printf 输入了错误的符号 请重新输入 输入了错误的符号 请重新输入 输入了错误的符号 请重新输入 error0 1 return error0 1 return error0 1 return 如果输入错误的符号 则提示错误如果输入错误的符号 则提示错误如果输入错误的符号 则提示错误 while ftop 0 while ftop 0 while ftop 0 nibol nitop fu ftop nibol nitop fu ftop nibol nitop fu ftop zzhi intzzhi intzzhi int n n n 用数组用数组用数组 zhizhizhi 存每次的真值指派存每次的真值指派存每次的真值指派 调用时给调用时给调用时给 n n n 赋值为变量数加赋值为变量数加赋值为变量数加 1 1 1 即 即 即 zzhi bl 1 zzhi bl 1 zzhi bl 1 12 if zhi n 0 if zhi n 0 if zhi n 0 zhi n 1 zhi n 1 zhi n 1 elseelseelse if zhi n 1 if zhi n 1 if zhi n 1 zhi n 0 zhi n 0 zhi n 0 zzhi n 1 zzhi n 1 zzhi n 1 递推递推递推 intintint qiuzhi qiuzhi qiuzhi intintint i j result N res 1 a b i j result N res 1 a b i j result N res 1 a b for i 0 i nitop i for i 0 i nitop i for i 0 i A j bl j for j 0 j bl j for j 0 j nibol i if nibol i a result res a result res b result res b result res b result res if nibol i result res a 1result res a 1 13 elseelseelse if nibol i if nibol i if nibol i result res a 1 b 1 1 0 result res a 1 b 1 1 0 result res a 1 b 1 1 0 elseelseelse if nibol i if nibol i if nibol i result res b 0 a 1 1 0 result res b 0 a 1 1 0 result res b 0 a 1 1 0 elseelseelse if nibol i if nibol i if nibol i result res a b 1 0 result res a b 1 0 result res a b 1 0 elseelseelse if nibol i if nibol i if nibol i a result res a result res a result res result res a result res a result res a returnreturnreturn result res result res result res 返回计算完毕时最终的结果返回计算完毕时最终的结果返回计算完毕时最终的结果 voidvoidvoid main0 main0 main0 为实现循环输入将为实现循环输入将为实现循环输入将 mainmainmain 函数提取成模块函数提取成模块函数提取成模块 main0main0main0 intintint i j m 0 n1 result0 i j m 0 n1 result0 i j m 0 n1 result0 printf printf printf 欢迎进入欢迎进入欢迎进入 n n n printf printf printf 本次实验输出表达式的真值表本次实验输出表达式的真值表本次实验输出表达式的真值表 n n n 请输入表达式请输入表达式请输入表达式 printf printf printf 合取 析取 蕴含 双条件分别用合取 析取 蕴含 双条件分别用合取 析取 蕴含 双条件分别用 n n memset yuan 0 sizeof yuan memset yuan 0 sizeof yuan memset yuan 0 sizeof yuan memset fu 0 sizeof fu memset fu 0 sizeof fu memset fu 0 sizeof fu memset nibol 0 sizeof nibol memset nibol 0 sizeof nibol memset nibol 0 sizeof nibol memset bianl 0 sizeof bianl memset bianl 0 sizeof bianl memset bianl 0 sizeof bianl memset zhi 0 sizeof zhi memset zhi 0 sizeof zhi memset zhi 0 sizeof zhi nitop 1 ftop 1 bl 1 error0 0 geshu 0 geshu2 0 nitop 1 ftop 1 bl 1 error0 0 geshu 0 geshu2 0 nitop 1 ftop 1 bl 1 error0 0 geshu 0 geshu2 0 memset biao 0 sizeof biao memset biao 0 sizeof biao memset biao 0 sizeof biao memset biao2 0 sizeof biao2 memset biao2 0 sizeof biao2 memset biao2 0 sizeof biao2 scanf s yuan scanf s yuan scanf s yuan nibolan nibolan nibolan system cls system cls system cls if error0 if error0 if error0 return return return for i 0 i bl i for i 0 i bl i for i 0 i bl i 14 printf t c bianl i printf t c bianl i printf t c bianl i printf t s n yuan printf t s n yuan printf t s n yuan n1 pow 2 bl 1 n1 pow 2 bl 1 n1 pow 2 bl 1 dododo result0 qiuzhi result0 qiuzhi result0 qiuzhi if result0 0 if result0 0 if result0 0 for i 1 i bl 1 i for i 1 i bl 1 i for i 1 i bl 1 i printf t d zhi i printf t d zhi i printf t d zhi i biao2 geshu2 i zhi i biao2 geshu2 i zhi i biao2 geshu2 i zhi i geshu2 geshu2 geshu2 elseelseelse for i 1 i bl 1 i for i 1 i bl 1 i for i 1 i bl 1 i printf t d zhi i printf t d zhi i printf t d zhi i biao geshu i zhi i biao geshu i zhi i biao geshu i zhi i geshu geshu geshu printf tprintf tprintf t d n result0 d n result0 d n result0 zzhi bl 1 zzhi bl 1 zzhi bl 1 while m int n1 while m int n1 while m int n1 printf printf printf 主析取范式为 主析取范式为 主析取范式为 n n n for i 0 i geshu i for i 0 i geshu i for i 0 i geshu i for j 1 j bl j for j 1 j bl j for j 1 j bl j if biao i j 1 if biao i j 1 if biao i j 1 printf c bianl j 1 printf c bianl j 1 printf c bianl j 1 15 elseelseelse printf c bianl j 1 printf c bianl j 1 printf c bianl j 1 if biao i j 1 if biao i j 1 if biao i j 1 printf c bianl j 1 printf c bianl j 1 printf c bianl j 1 elseelseelse printf c bianl j 1 printf c bianl j 1 printf c bianl j 1 if i geshu 1 if i geshu 1 if i geshu 1 printf printf printf elseelseelse printf n printf n printf n printf printf printf 主合取范式为 主合取范式为 主合取范式为 n n n for i 0 i geshu2 i for i 0 i geshu2 i for i 0 i geshu2 i printf printf printf for j 1 j bl j for j 1 j bl j for j 1 j bl j if biao2 i j 0 if biao2 i j 0 if biao2 i j 0 printf c bianl j 1 printf c bianl j 1 printf c bianl j 1 elseelseelse printf c bianl j 1 printf c bianl j 1 printf

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论