您好,欢迎来到爱go旅游网。
搜索
您的当前位置:首页利用真值表法求主析取范式及主合取范式的实现解析

利用真值表法求主析取范式及主合取范式的实现解析

来源:爱go旅游网


实 验 报 告

( / 学年 第 一 学期)

课程名称

离散数学

实验名称 利用真值表法求主析取范式及主合取范式的

实现

实验时间 指导单位 指导教师

月 日

学生姓名 学院(系)

班级学号 专 业

实 验 报 告

实验名称 利用真值表法求主析取范式及主合取范式的实现 实验类型 上机 实验学时 4 实验时间 指导教师 一、 实验目的和要求 能够列出合式公式的真值表并给出相应主析取范式和主合取范式。 二、实验环境(实验设备) 硬件:PC机。 软件:Code::Blocks (C++ ) 三、实验原理及内容 内容:编程实现用真值表法求任意含三个以内变量的合式公式的主析取范式和主合取范式。 原理:首先读入变元个数,然后读入合式公式,用堆栈的知识将中缀表达式转化为后缀表达式,调用否定、析取、合取、条件、双条件的函数计算P、Q、R取不同真值时合式公式的真值,然后输出真值表,调用计算主析取范式和主合取范式的函数并输出。

程序: #include #include #include #include using namespace std; string OriginalForm; //原式 string Hequ; //主合取范式 string Xiqu; //主析取范式 class SeqStack//建立一个堆栈,利用将中缀表达式转为后缀表达式 { public: SeqStack(int mSize); ~SeqStack(); char Top(); bool Push(char x); bool Pop(); private: char *st; int top; int maxtop; }; SeqStack::SeqStack(int mSize) { maxtop = mSize - 1; top = -1; st = new char[mSize]; } SeqStack::~SeqStack() { delete[]st; } char SeqStack::Top() { return st[top]; } bool SeqStack::Push(char x) { if(top == maxtop) return false; st[++top] = x; return true; } bool SeqStack::Pop() { if(top == -1) return false; top--; return true; } int p, q, r, s, t, u; int a, b, result; int v =0; int number;//用number表示变元的个数 SeqStack stack(200); void Not() //否定 { a = stack.Top(); stack.Pop(); result = a == 1 ? 0 : 1; stack.Push(result); } void Or() //析取 { result = a + b; result = result > 1 ? 1 : result; stack.Push(result); } void And() //合取 { result = a * b; stack.Push(result); } void If() //条件,b->a { result = (b == 1 && a == 0) ? 0 : 1; stack.Push(result); } void Doubleif() //双条件 { result = (b == a) ? 1 : 0; stack.Push(result); } bool CanIn(char out)//优先级的判断 { char in = stack.Top(); int i, o; switch(in) { case '#':i = 0; break; case '(':i = 1; break; case '-':i = 3; break; case '>':i = 5; break; case '|':i = 7; break; case '&':i = 9; break; case '!':i = 11; break; case ')':i = 12; break; } switch(out) { case '#':o = 0; break; case '(':o = 12; break; case '-':o = 2; break; case '>':o = 4; break; case '|':o = 6; break; case '&':o = 8; break; case '!':o = 10; break; case ')':o = 1; break; } if(i < o) return true; else return false; } void InfixToPostfix()//中缀表达式转后缀表达式 { string tmp = \"\"; stack.Push('#'); for(int i = 0; (unsigned)i ':If(); break; case '|':Or(); break; case '&':And(); break; case '!':Not(); break; } } } if(number == 2) { for(int i = 0; (unsigned)i ':If(); break; case '|':Or(); break; case '&':And(); break; case '!':Not(); break; } } } } void Print() { if(number == 3) { cout << \"P\\" <<\"Q\\" << \"R\\" << \"Z\" << endl; for(p = 1; p >= 0; p--) { for(q = 1; q >= 0; q--) { for(r = 1; r >= 0; r--) { Calculate(); if(result == 1) Xiqu =Xiqu +\"(\" + (p == 1 ? \"P\" : \"!P\") + \"&\" +(q == 1 ? \"Q\" : \"!Q\") + \"&\" + (r == 1 ?\"R\" : \"!R\") + \")\" + \" | \"; else Hequ = Hequ +\"(\" + (p == 0 ? \"P\" : \"!P\") + \"|\" + (q== 0 ? \"Q\" : \"!Q\") + \"|\" + (r == 0 ?\"R\" : \"!R\") + \")\" + \" & \"; cout << p <<\"\\" << q << \"\\" << r <<\"\\" << result << endl; } } } } if(number == 2) { cout << \"P\\" <<\"Q\\" << \"Z\" << endl; for(p = 1; p >= 0; p--) { for(q = 1; q >= 0; q--) { Calculate(); if(result == 1) Xiqu =Xiqu + \"(\"+ (p == 1 ? \"P\" : \"!P\") + \"&\" + (q == 1 ?\"Q\" : \"!Q\") + \")\" + \" | \"; else Hequ = Hequ + \"(\" + (p ==0 ? \"P\" : \"!P\") + \"|\" + (q == 0 ? \"Q\" :\"!Q\") + \")\" + \" & \"; cout << p <<\"\\" << q << \"\\" << result << endl; } } } cout< 表示条件\" << endl<> number; cout<<\" 请输入合式公式:\"; switch(number) { case 2:cout << endl <<\" 变元请用P、Q表示\" << endl << endl; break; case 3:cout << endl <<\" 变元请用P、Q、R表示\" << endl << endl; break; } char str[100]; cin >> str; OriginalForm=str; InfixToPostfix(); Print(); cout<>flag; } return 0; } 流程图:

开始 输入变元个数 输入合式公式 输出真值表 计算主析取范式和 主合取范式 输出主析取范式和主合取范式 是否继续使用(Y/N) Y N

退出程序

举例使用:

四、实验小结(包括问题和解决方法、心得体会、意见与建议等) 刚开始思考如何写这个程序的时候,我不知道该如何处理输入进来的合式公式,在翻阅了数据结构书籍之后我才忽然反应过来,可以用堆栈的知识,将输入进来的中缀表达式转化为后缀表达式,这样就方便计算合式公式的真值了。 这次离散数学实验中,我成功地将所学习得C++的编程知识和数据结构里的堆栈的知识运用了起来,虽然中途遇到了一些困难,但最终都很好地解决了。这次实验让我学会了利用编程语言来求主析取范式和主合取范式,更加深刻地理解了这两种范式,并且也让我对C、C++等编程语言有了更强的运用能力,让我明白了离散数学和编程知识是息息相关、密不可分的。以后我将更加认真学习离散数学,并且更多地将编程的知识运用起来。 五、指导教师评语 成 绩 批阅人 日 期 古今名言

敏而好学,不耻下问——孔子

业精于勤,荒于嬉;行成于思,毁于随——韩愈 兴于《诗》,立于礼,成于乐——孔子 己所不欲,勿施于人——孔子 读书破万卷,下笔如有神——杜甫 读书有三到,谓心到,眼到,口到——朱熹 立身以立学为先,立学以读书为本——欧阳修 读万卷书,行万里路——刘彝

黑发不知勤学早,白首方悔读书迟——颜真卿 书卷多情似故人,晨昏忧乐每相亲——于谦 书犹药也,善读之可以医愚——刘向 莫等闲,白了少年头,空悲切——岳飞 发奋识遍天下字,立志读尽人间书——苏轼 鸟欲高飞先振翅,人求上进先读书——李苦禅 立志宜思真品格,读书须尽苦功夫——阮元 非淡泊无以明志,非宁静无以致远——诸葛亮

熟读唐诗三百首,不会作诗也会吟——孙洙《唐诗三百首序》 书到用时方恨少,事非经过不知难——陆游 问渠那得清如许,为有源头活水来——朱熹 旧书不厌百回读,熟读精思子自知——苏轼 书痴者文必工,艺痴者技必良——蒲松龄

声明

访问者可将本资料提供的内容用于个人学习、研究或欣赏,以及其他非商业性或非盈利性用途,但同时应遵守著作权法及其他相关法律的规定,不得侵犯本文档及相关权利人的合法权利。谢谢合作!

因篇幅问题不能全部显示,请点此查看更多更全内容

Copyright © 2019- igat.cn 版权所有 赣ICP备2024042791号-1

违法及侵权请联系:TEL:199 1889 7713 E-MAIL:2724546146@qq.com

本站由北京市万商天勤律师事务所王兴未律师提供法律服务