逻辑函数真值表生成程序设计报告
一.问题:
设计一个能生成具有13个输入逻辑变量的逻辑函数真值表生成程序。
二.原理:
逻辑函数(logical function)是数字电路(一种开关电路)的特点及描述工具,输入、输出量是高、低电平,可以用二元常量(0,1)来表示,输入量和输出量之间的关系是一种逻辑上的因果关系。仿效普通函数的概念,数字电路可以用逻辑函数的的数学工具来描述。
真值表是表征逻辑事件输入和输出之间全部可能状态的表格。
列出命题公式真假值的表。通常以1表示真,0 表示假。命题公式的取值由组成命题公式的命题变元的取值和命题联结词决定,命题联结词的真值表给出了真假值的算法。
真值表是在逻辑中使用的一类数学表,用来确定一个表达式是否为真或有效。 (表达式可以是论证;就是说,表达式的合取,它的每个结合项(conjunct)都是最后要做的结论的一个前提。)
三.测试结果:
四.附录(代码): #include
#define MAXNUM 100 //栈最大元素个数
#define MAXEXP 30 //允许用户输入的表达式最大字符数 #include \#include \
const char and = '&', or = '|', then = '-';
bool InOpt(char c) {
return (c == '&' || c == '|' || c == '-' || c == '#'); }
bool IsNum(char c) {
return (c >= '0' && c <= '9'); }
bool IsAlp(char c) {
return ((c <= 'z' && c >= 'a') || (c >= 'A' && c <= 'Z')); }
bool CheckSyntax(char* exp) {
char* cp = exp; while (*cp != '\\0') {
if (!(IsNum(*cp) || IsAlp(*cp) || InOpt(*cp) || *cp == '(' || *cp == ')')) return FALSE; cp++; }
if (*(--cp) != '#') return FALSE; return TRUE; }
PBinTree TransferTree(char *exp) {
PBinTreeNode pbt = CrtBinTree(); Stack
while (!(sc.GetTop()== '#' && *ch == '#')) {
if (IsAlp(*ch)) {
PBinTreeNode t = CrtBinTree(); t->data = *ch; st.Push(t);
}
else if (IsNum(*ch)) {
while (IsNum(*ch)) {
ch++; } ch--;
PBinTreeNode t = CrtBinTree(); t->data = *ch; st.Push(t); } else {
switch (*ch) {
case '(':
sc.Push(*ch); break; case ')': {
c = sc.Pop(); while (c != '(') {
PBinTreeNode t = CrtBinTree(); t->data = c;
t->rChild = st.Pop(); t->lChild = st.Pop(); st.Push(t); c = sc.Pop(); }
break; }
default: {
while (sc.GetTop() != '#' && sc.GetTop() != '(') {
PBinTreeNode t = CrtBinTree(); c = sc.Pop(); t->data = c;
t->rChild = st.Pop(); t->lChild = st.Pop(); st.Push(t); }
if (*ch != '#') sc.Push(*ch); break; } } }
if (!sc.IsEmpty() && *ch != '#') ch++; }
pbt = st.Pop(); return pbt; }
void GetVariable(PBinTree pbt) {
PBinTree vpt = pbt;
if ((pbt->data >= 'a' && pbt->data <= 'z') || (pbt->data >= 'A' && pbt->data <= 'Z')) {
printf (\请输入%c的值(1或0):\\n\ scanf (\ getchar(); }
if (vpt->lChild != NULL) GetVariable(vpt->lChild); if (vpt->rChild != NULL) GetVariable(vpt->rChild); }
char Caculate(PBinTree pbt) {
PBinTree vpt = pbt;
if (vpt == NULL) {
printf(\没有任何表达式可计算!\ return FALSE; }
if (vpt->lChild == NULL) //找到叶子结点 return vpt->data;
if (InOpt(vpt->data) && Caculate(vpt->lChild) && Caculate(vpt->rChild)) {
switch(vpt->data) {