花了一下午在写这个重言式判别,可能是我孤陋寡闻了,总感觉这个名字怪怪的,就是判断一个永真式、永假式、可满足式了,书上面就要说是"重言式"。判断这个所谓重言式,核心算法就是用真值表啦,试过所有取值。

具体代码如下(可能有bug):有些难理解的我都有注释

/**//********************************************************************
    created:    2007/11/09

    author:        刺猬
    
    purpose:    判断表达式的属性 永真式 永假式 可满足式
*********************************************************************/
#include<stdio.h>
#include<stdlib.h>


typedef struct exp...{
    char data;
    int  weight;
}express;


express symbolrepresent[27];
express originalexpression[50];            

int trueforever=0;
int falseforever=0;
int originalexpressionlength =0;
int symbolrepresentlength=0;

//欢迎屏幕
void ShowWelcome()
...{
    printf(" ");
    printf(" ");
    printf(" ");
    printf(" ");
    printf(" * * * * * * * * * * * * * * * * * * * * * * * * ");
    printf(" *         数据结构课程设计:           * ");
    printf(" * * * * * * * * * * * * * * * * * * * * * * * * ");
    printf(" ");
    printf(" 06052711班 ");
    printf(" 刺猬 ");
    printf(" ");
}

//表达式分析器 分析权值 把 | 权值设为1  &设为2  ~设为3 
   //处理括号的思路是:遇见左括号 把里面权值提升4  遇见右括号 把权值减去4  这样可以处理多括号问题

int analyse(express *p)
...{
    int weight=0;
    int length=0;
    printf("请输入表达式,并以回车符为结束: ");
    printf("注意:请自行检查输入表达式的正确性 ");
    while(scanf("%c",&(p->data))&&p->data!=10)
    ...{
        if(p->data>=97&&p->data<=122)
            p->data=p->data-32;        
        switch(p->data)
        ...{
        case '(':
            weight=weight+4;          //遇见左括号 把里面权值提升4 
            p->weight=0;                  //注意括号权值为0
            break;
        case ')':
            weight=weight-4;         //遇见右括号 把权值减去4 
            p->weight=0;
            break;
        case '|':
            p->weight=weight+1;
            break;
        case '&':
            p->weight=weight+2;
            break;
        case '~':
            p->weight=weight+3;
            break;
        default:
            p->weight=0;         //imply the data is char
            break;
        }
        p++;
        length++;
    }
    return length;
}

//查找表达式中权值最小的,作为子树的根节点
int findMin(express *originalexpression,int start,int end)
...{
    int key=0;
    int current=start;
    int location=0;
    while(!originalexpression[current].weight)
    ...{key=originalexpression[current].weight;current++;}
    key=current>end?key:originalexpression[current].weight;
    location=current>end?0:current;
    while(current<=end)
    ...{
        if(originalexpression[current].weight&&originalexpression[current].weight<key)
        ...{
            location=current;
            key=originalexpression[current].weight;
        }
        current++;
    }
    return location;
}


//分析原表达式,提取所有变量 就是把所有变量罗列在一个数组内
int makeSymbolReprentArray(express *originalexpression)   
...{
    int length=0;
    int hashmap[26]=...{0};
    while(originalexpression->data!=10)
    ...{
        if(originalexpression->data>=65&&originalexpression->data<=90)
        ...{
            if(!hashmap[(int)(originalexpression->data-65)])
            ...{
                hashmap[(int)(originalexpression->data-65)]=1;
                symbolrepresent[length].data=originalexpression->data;
                length++;
            }
        }
        originalexpression++;
    }
    return length;
}

//查找每个变量所代表值 0或1
int findSymbolRepresent(char symbol)
...{
    int location=0;
    while(symbolrepresent[location].data!=symbol)
    ...{
        location++;
    }
    return symbolrepresent[location].weight;
}

//虚拟构建一个二叉树 注意并没有真正构建 不过可理解为建立一个树了 算法核心是一个类似中序遍历二叉树 
int virtualCreateTree(express *originalexpression,int start,int end)        //在以start和end的范围内建子树
...{
    int key=0;
    if(start==end)                                                          //start==end 表明这个是叶子节点 那么里面是个变量 
        return findSymbolRepresent(originalexpression[start].data);           
    else if(start>end)
        return 1;                                                           //start>end  处理~的特殊情况
    else
    ...{
        key=findMin(originalexpression,start,end);                          //寻找最小权值  作为子树根节点    
        switch(originalexpression[key].data)
        ...{
        case '|':
            return(virtualCreateTree(originalexpression,start,key-1)||virtualCreateTree(originalexpression,key+1,end));
            break;
        case '&':
            return(virtualCreateTree(originalexpression,start,key-1)&&virtualCreateTree(originalexpression,key+1,end));
            break;
        case '~':     //注意~的处理 实际上我是用的(1&&!右子树)
            return(virtualCreateTree(originalexpression,start,key-1)&&(!virtualCreateTree(originalexpression,key+1,end)));
        }
    }
    
}

//递归给所有变量赋值 注意递归思想用回溯二叉树理解
void recursion(express *symbolrepresent,int i,int length)
...{
    if(i<length)
    ...{
        symbolrepresent[i].weight=1;                   //当前变量取1  
        recursion(symbolrepresent,i+1,length);         //递归调用下一个变量
        symbolrepresent[i].weight=0;                   //当前变量取0    
        recursion(symbolrepresent,i+1,length);         //递归调用下一个变量
    }
    else                                              //递归结束啦
    ...{
        if(!trueforever||!falseforever)               //注意这个处理 当表达式出现可真情况和可假情况 那么断定它是可满足式  没必要做下去了
        ...{
            switch(virtualCreateTree(originalexpression,0,originalexpressionlength-1))
            ...{
            case 1:
                trueforever++;
                break;
            case 0:
                falseforever++;
                break;
            default :
                break;
            }
        }
        else
            return ;
    }
}    

//结果处理  没啥说的
void resultReturn(int symbolrepresentlength)
...{
    int i=0;
    if(trueforever&&falseforever)
    ...{
        printf("您输入的变量名序列为: ");
        while(i<symbolrepresentlength)
        ...{printf("%c ",symbolrepresent[i].data);i++;}
        printf(" ");
        printf("satisfactible ");
    }
    else if(!trueforever)
        printf("falseforever ");
    else
        printf("trueforever ");    
}

//用户自己设置值  也没啥说的
void userSetWeight()
...{
    int i=0;
    printf("请依次为变量赋值,并以回车键结束: ");
    while(i<symbolrepresentlength)
    ...{
        printf("%c: ",symbolrepresent[i].data);
        scanf("%d",&symbolrepresent[i].weight);
        i++;
    }
    if(virtualCreateTree(originalexpression,0,originalexpressionlength-1))
        trueforever++;
    else
        falseforever++;
}

//主目录
void mainFunctionMenus()
...{
    int menu=0;
    printf("请选择您的变量设值方式: ");
    printf("1.计算机自动穷举 ");
    printf("2.用户指定设置 ");
    scanf("%d",&menu);
    if(1==menu)
        recursion(symbolrepresent,0,symbolrepresentlength);
    else
        userSetWeight();
}


int main()
...{
    ShowWelcome();
    originalexpressionlength        =    analyse(originalexpression);
    symbolrepresentlength           =    makeSymbolReprentArray(originalexpression);
    mainFunctionMenus();
    resultReturn(symbolrepresentlength);
    //printf("%d",analyse(exp));
    //printf(" %d",findMin(exp,0,analyse(exp);))
    return 0;
}

重言式判别 (数据结构课程设计)相关推荐

  1. C/C++数据结构课程设计安排

    C/C++数据结构课程设计安排 数据结构课程设计安排 课程设计学时:32学时 课程设计目的:综合应用数据结构课程中所学的数据结构:线性表.栈.队列.数组.广义表.树.二叉树.图.查找表中的一种或多种数 ...

  2. 数据结构课程设计——机票售卖系统(C++)

    引言 这学期最后的数据结构课程设计需要我们完成一个简单的小程序,我选择了一个机票售卖系统,实现了一些基本的功能:因为时间给的比较短,又赶在复习周补课,所以并没有什么突出的地方,我就在这里聊聊我的代码实 ...

  3. 数据结构课程设计---最长公共子串

    数据结构课程设计,由用户输入两个字符串串X和Y,再由用户输入一个任意的字符串Z,实现以下功能: ①如果字符串Z是字符串X的子串,则显示Z在X中的位置并记录,如果字符串Z是字符串Y的子串,则显示Z在Y中 ...

  4. 设树采用孩子兄弟表示法存放.用类c语言设计算法计算树的高度.,(数据结构课程设计分类题目.doc...

    (数据结构课程设计分类题目 线性表 顺序表: 1.设有一元素为整数的线性表L=(a1,a2,a3,-,an),存放在一维数组A[N]中,设计一个算法,以表中an作为参考元素,将该表分为左.右两部分,其 ...

  5. c语言数据结构五子棋实验报告,数据结构课程设计-五子棋

    数据结构课程设计-五子棋 姓 名: 学 院: 计算机与通信学院 班 级: 通信工程 101 班 指导老师: 目录一.需求分析 31.1 开发背景 .32.2 功能简介 .3二.系统设计 42.1 函数 ...

  6. 数据结构迷宫代码_数据结构课程设计——迷宫求解(二)

    前言 接上文的介绍,本文将主要介绍如何生成随机迷宫,在网上找到的资源也比较多,这里我选取了随机 Prim 算法生成迷宫,选择这个算法的理由如下: 算法思想简单,易于实现 生成的迷宫比较自然,不会出现明 ...

  7. c语言小数表达式运算课程设计,数据结构课程设计表达式计算.doc

    数据结构课程设计表达式计算 福建农林大学计算机与信息学院 计算机类 课程设计报告 课程名称:算法与数据结构课程设计题目:表达式计算姓 名:系:数学系专 业:数学与应用数学年 级:学 号:指导教师:宁正 ...

  8. 数据结构课程设计:顺序结构、动态链表结构下的一元多项式的加法、减法、乘法的实现...

    原来做的数据结构课程设计,今天整理资料时偶然发现了,自己留着没啥意思,共享一下吧,互相交流学习 要求 设有一元多项式Am(x)和Bn(x). Am(x)=A0+A1x1+A2x2+A3x3+- +Am ...

  9. c语言数据结构课程设计停车场管理系统,数据结构课程设计报告停车场管理系统...

    <数据结构课程设计报告停车场管理系统>由会员分享,可在线阅读,更多相关<数据结构课程设计报告停车场管理系统(8页珍藏版)>请在人人文库网上搜索. 1.数据结构课程设计报告系 别 ...

  10. 学生搭配问题数据结构报告c语言,数据结构课程设计_学生搭配问题.doc

    数据结构课程设计_学生搭配问题 数据结构课程设计 题 目: 学生搭配问题 学 院: 班 级: 学 生 姓 名: 学 生 学 号: 指 导 教 师: 2012 年 12 月 3 日 课程设计任务书 姓名 ...

最新文章

  1. 将单向链表按某值分成左边小、中间相等、右边大的形式
  2. tp5 excel 导入 mysql_TP5框架下MySQL通过LOAD DATA INFILE批量导入数据详细操作
  3. 如何知道网站的IP,然后利用IP登陆网站?
  4. NLP十大数据扩充策略
  5. go日期和时间相关函数使用示例
  6. python修改xpath节点_Xpath python在特定文本后查找节点
  7. MobileNet(v1、v2)——CNN经典网络模型详解(pytorch实现)
  8. 【Linux查看tomcat版本】
  9. DropDownList 数据绑定
  10. 089 重用父类方法的两种方式
  11. java调用hownet--jni
  12. 秒懂Https之CA证书与自签名证书漫谈
  13. AN APPROACH OF VECTOR FIELD TEXTURE VISUALIZATION BASED ON FIELD DRIVEN STRENGTH算法实现
  14. java tracert_tracert详解
  15. 使用 Python 爬取网页数据
  16. 这几个用 Pyecharts 做出来的交互图表,领导说叼爆了!
  17. 台式计算机怎么联网,台式电脑怎么联网宽带
  18. Accessing Data with MongoDB
  19. Blender新手入门试水作品:Low poly版敲击兽
  20. 基于物理和深度学习的角色动画软件:Cascadeur

热门文章

  1. python-图像边缘化处理
  2. 闲鱼一直不确认收货怎么办?
  3. 腾飞之势,搏击苍穹:网页设计
  4. 数仓建设保姆级5W字教程,离线实时一网打尽(理论+实战)
  5. 《SOA中国路线图》可圈可点之处
  6. 510房产网是江阴知名的房地产服务平台
  7. Microsoft Word 2007 向程序发送命令时出现问题解决方法
  8. python ps_python前端之Photoshop
  9. 运维工程师被墨菲定律的各种打脸之DXX问题
  10. CSDN博客之星评选