1、 内容:编程实现用真值表法求任意含三个以内变量的合式公式的主析取范式和主合取范式。 原理:首先读入变元个数,然后读入合式公式,用堆栈的知识将中缀表达式转化为后缀表达式,调用否定、析取、合取、条件、双条件的函数计算P、Q、R取不同真值时合式公式的真值,然后输出真值表,调用计算主析取范式和主合取范式的函数并输出。 程序:#includestringconio.hwindows.husing namespace std;string OriginalForm; /原式string Hequ; /主合取范式string Xiqu; /主析取范式class SeqStack/建立一个堆栈,利用将中缀表达
2、式转为后缀表达式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 charmSize;SeqStack() deletest;char SeqStack:Top() return sttop;bool SeqStack:Push(char x) if(top = max
3、top) return false; st+top = x; return true;Pop() if(top = -1) top-;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
4、: result;void And() /合取 result = a * b;void If() /条件,b-a result = (b = 1 & a = 0) ?void Doubleif() /双条件 result = (b = a) ? 0;bool CanIn(char out)/优先级的判断 char in = stack.Top(); int i, o; switch(in) case #i = 0; break;(i = 1;-i = 3;i = 5;|i = 7;i = 9;!i = 11;)i = 12; switch(out)o = 0;o = 12;o = 2;o =
5、4;o = 6;o = 8;o = 10;o = 1; if(i o) elsevoid InfixToPostfix()/中缀表达式转后缀表达式 string tmp = ; stack.Push(); for(int i = 0; (unsigned)i OriginalForm.length(); i+) if(OriginalFormi = P | OriginalFormi = Q |OriginalFormi = RSTU) tmp=tmp+OriginalFormi; continue; if(CanIn(OriginalFormi) stack.Push(OriginalFor
6、mi); else if(OriginalFormi = while(stack.Top() != tmp = tmp + stack.Top(); do while(!CanIn(OriginalFormi); OriginalForm = tmp;void Calculate()/计算主析取范式和主合取范式的函数 if(number = 3)| OriginalFormi = v = OriginalFormi = ? p : OriginalFormi= q : r; stack.Push(v); if(OriginalFormi ! b = stack.Top(); switch(Or
7、iginalFormi)Doubleif();If();Or();And();Not(); if(number = 2) q;void Print() cout Pt = 0; p-) for(q = 1; q q-) for(r = 1; r r-) Calculate(); if(result = 1) Xiqu =Xiqu +( + (p = 1 ?P :) + +(q = 1 ?Q + (r = 1 ?R) + | Hequ = Hequ + + (p = 0 ?| + (q= 0 ? + (r = 0 ? & p t q r result Xiqu =Xiqu + + (p = 1
8、? + (q = 1 ? Hequ = Hequ + + (p =0 ? + (q = 0 ? coutendl; if(Xiqu.length() != 0) Xiqu.erase(Xiqu.length() - 2); if(Hequ.length() ! Hequ.erase(Hequ.length() - 2);主析取范式:Xiqu endl 主合取范式: Hequ int main() int flag=1; while(flag=1) SetConsoleTextAttribute(GetStdHandle (STD_OUTPUT_HANDLE),FOREGROUND_INTENS
9、ITY |FOREGROUND_GREEN|FOREGROUND_BLUE); /设置绿色和蓝色相加(即青色) system(cls/清屏- 欢迎使用!endl ! 表示否定 endl 表示条件 - 表示双条件 输入你的变元数目: cin number;cout 请输入合式公式: switch(number) case 2:cout flag; return 0; 开始输入变元个数流程图: N举例使用:四、实验小结(包括问题和解决方法、心得体会、意见与建议等) 刚开始思考如何写这个程序的时候,我不知道该如何处理输入进来的合式公式,在翻阅了数据结构书籍之后我才忽然反应过来,可以用堆栈的知识,将输入进来的中缀表达式转化为后缀表达式,这样就方便计算合式公式的真值了。这次离散数学实验中,我成功地将所学习得C+的编程知识和数据结构里的堆栈的知识运用了起来,虽然中途遇到了一些困难,但最终都很好地解决了。这次实验让我学会了利用编程语言来求主析取范式和主合取范式,更加深刻地理解了这两种范式,并且也让我对C、C+等编程语言有了更强的运用能力,让我明白了离散数学和编程知识是息息相关、密不可分的。以后我将更加认真学习离散数学,并且更多地将编程的知识运用起来。五、指导教师评语成 绩批阅人日 期