logo资料库

求解布尔表达式的真值.doc

第1页 / 共10页
第2页 / 共10页
第3页 / 共10页
第4页 / 共10页
第5页 / 共10页
第6页 / 共10页
第7页 / 共10页
第8页 / 共10页
资料共10页,剩余部分请下载后查看
1.实验要求:
求解布尔表达式
1. 实验要求: 求解布尔表达式 目的:本课程设计是求中缀算术表达式真值问题。求中缀算术表达式值的问 题是数据结构中栈的一个典型应用。通过本题,学生应掌握中缀表达式和后缀表 达式的转换方法和后缀表达式求值问题。 要求:已知某种类型的布尔表达式由“V”、“F”、“!”、“&”和“|” 组成,其中,“V”代表真值 True,“F”代表真值 False,“!”代表逻辑非运 算,“&”代表逻辑与运算,“|”表示逻辑或运算。并且,运算符“!”、“&” 和“|”的优先级为:“!”最高,“|”最低,“&”介于“!”和“|”之间。 你的任务是,计算给定布尔表达式的真值。 例如,布尔表达式“(V|V)&F&(F|V)”的真值为“F”. 2.实验设计 在实验设计的过程中,主要包括两个功能,分别是中缀表达式转 后缀表达式和后缀表达式求真值两个函数,在此过程中需要使用到两 个类,这两个类仅仅是数据类型不同,其他的包括函数功能等方面均 相同,所以考虑使用类模版 template;在后缀表达式的存储问题上, 并不需要太多的功能,所以就选择使用 char 型数组进行存储。 1.使用类模版 Stack,在中缀转后缀的运算中,定义 czf,用以存 放逻辑运算符;在计算真值的函数中,定义 ss,用以存放字符; 2.在中缀转后缀的函数中定义 post 数组,存放得到的后缀表达 式。 主函数 1.首先输入字符串 2.分别调用中缀转后缀函数, 3.后缀表达式真值计算函数。 布尔表达式中缀转后缀函数 chpost 1.建立栈 czf 用来存储逻辑运算符, 2.建立 post 数组用来存放后缀表达式 后缀表达式真值计算函数 yunsuan 1.建立栈 ss 用来存储字符 V F 以及运算结果
F 时,直接将它们放到 post 数组 1.当遇到 V 中。 2.当依次遍历到‘(’、‘!’、‘|’、‘&’、‘)’采 用不同的处理方法,最终得到后缀表达式 中缀转后缀表达式函数 chpost 成员 Inorder[] 栈 czf Post[] 1.在遍历后缀表达式的过程中,遇到不同的字 符,采用不同的解决方法 功能 存储输入的字符串 用以暂时存放运算符 用来存储结果 后缀表达式求真值 yunsuan 成员 栈 ss post 功能 用来暂时存放 V 运算结果 沿用上一个函数的结果-后缀表达 式 F 以及每一步的 3.用户手册: 1.程序运行时,首先会看到提示:“请输入布尔表达式(中缀表达 式,以#结束)”; 2.输入布尔表达式之后,敲击回车会得到:“转换后,后缀表达式 为:*****************”; 以及“该式真值为:*”; 3.此时程序结束; 4.调试及测试:
运行结果: 1. 2. 3. 5.完善: 基本上已完成实验要求的功能,进行拓展的话,可以进行一些统 计功能。比如下面的两个功能:
1.统计输入的括号的总数: 可以在程序的第一个函数——中缀 转后缀表达式中添加一些代码,添加统计输入的括号的个数。 2.统计进行运算的次数: 能在第二个函数——后缀表达式函数 中添加统计进行运算的次数的功能。 6.源代码 #include #include using namespace std; template//T 是数据类型 class Stack{ //定义类模版 public: Stack(){ Top = 0; } T top(){ return a[Top]; } void pop(){ Top--; } bool isempty(){ if (Top == 0)return true; else return false; } void push(T b) { } Top++; a[Top] = b; private: T a[100]; int Top;
}; void chpost(char inorder[], char post[], int &m) { int n = strlen(inorder); Stackczf; for (int i = 0; i < n; i++) { if ((inorder[i]=='V')||(inorder[i]=='F')) { } post[m] = inorder[i]; m++; if (inorder[i] == '(')czf.push(inorder[i]); if (inorder[i] == '!')czf.push(inorder[i]); if (inorder[i] == '&') { } if (!czf.isempty() && (czf.top() == '!')) { } post[m++] = czf.top(); czf.pop(); czf.push(inorder[i]); else{ czf.push(inorder[i]); } if (inorder[i] == '|')//
{ } if (!czf.isempty() && czf.top() == '!' || czf.top() == '&') { } post[m++] = czf.top(); czf.pop(); czf.push(inorder[i]); else czf.push(inorder[i]); { } if (inorder[i] == ')') { while (czf.top() != '(') post[m++] = czf.top(); czf.pop(); { } czf.pop(); } } while (!czf.isempty())
{ } post[m++] = czf.top(); czf.pop(); } //计算真值 char yunsuan(char post[],int n) { Stackss; char a,b,c,result; for(int i=0;i
ss.push(c); } if(post[i]=='&') { } b=ss.top(); ss.pop(); a=ss.top(); ss.pop(); if((a=='V')&&(b=='V')) c='V'; else c='F'; ss.push(c); if(post[i]=='!') { b=ss.top(); ss.pop(); if(b=='V') { } b='F'; ss.push(b); else if(b=='F') { b='V';
分享到:
收藏