Anyview:离散数学(第三章)

前言(用前说明)

以下所有答案皆为作者本人所做,自认为写的是一坨,仅供参考,切勿抄袭(懂得都懂),也希望各位可以写下评论给出更好的解法,谢谢。

1

#include "allinclude.h"
Boolean isStatementFormula(pStatementFormula pFormula)
{  // Add your code here
    StatementFormulaSymbles front,middle,next1;//前中后三个变量
    int LeftNum=0,RightNum=0,pNum=0;
    front=getCurrentSymbleType(pFormula);//获取句子的第一个符号
    switch(front)//第一个字符的所有情况处理
    {
        case Exception:
        case Conjunction:
        case Disjunction:
        case Implication:
        case Equivalence:
        case RightParenthesis:
            return false;//当第一个字符为异常情况、合取号、析取号、蕴涵号、等价号、右括号时,返回错误,因为一个命题不可能以这些开头
        case LeftParenthesis:
            LeftNum++;//当第一个符号为左括号时,左数加1
            break;
        case EndOfFormula:
            return true;//第一个字符为结束字符“#”,直接返回true
        case PropositionalVariable://第一个字符为命题变元
            pNum++;
    }
    //指示器指向下一个
    nextPos(pFormula);
    //接收下一个元素
    middle=getCurrentSymbleType(pFormula);
    switch(middle)//第二个字符的所有处理情况
    {
        case RightParenthesis:
            return false;//第二个为右括号,什么情况下不为命题
        case LeftParenthesis:
            if(front==PropositionalVariable)
            {
                return false;//前面为命题变元
            }
            LeftNum++;//为左括号时,左数加1
            break;
        case PropositionalVariable:
            if(front==PropositionalVariable)//第一个字符也为命题变元,第二个字符也是命题变元肯定不为命题
            {
                return false;
            }
        case Negation:
            if(front==PropositionalVariable)//第一个字符也为命题变元,第二个字符也是命题变元肯定不为命题
            {
                return false;
            }
    }
    while(next1!=EndOfFormula)//循环到下一个元素变量指向“#”字符时
    {
        nextPos(pFormula);//指示器指向下一个字符
        next1=getCurrentSymbleType(pFormula);//下一个元素变量获取指示器所指元素
        if(next1==LeftParenthesis)//下一个为左括号
        {
            LeftNum++;//左数加1
        }
        if(next1==RightParenthesis)//下一个为右括号
        {
            RightNum++;
        }
        if(front==Exception||middle==Exception||next1==Exception)//若其中有一个为异常字符,则返回false
        {
            return false;
        }
        if(middle==RightParenthesis)//中间为括号
        {
            if(next1==PropositionalVariable)//下一个为命题变元
            {
                return false;//错误,不是命题
            }
            if(next1==Negation)//下一个为否定号
            {
                return false;//错误,不是命题
            }
        }
        if(middle==PropositionalVariable)//若q为命题变元
        {
            pNum++;
            if(next1==PropositionalVariable||front==PropositionalVariable||next1==Negation||next1==LeftParenthesis)//前面和后面的不能为命题变元,后面也不可以是否定号
            {
                return false;
            }
        }
        if(middle==Conjunction||middle == Disjunction||middle == Implication||middle==Equivalence)//若middle为联结词
        {
            if((front != PropositionalVariable && front != RightParenthesis)||(next1 !=PropositionalVariable && next1 != LeftParenthesis && next1 != Negation))//前后字符既不为命题变元,也不相应为右,左括号,并且后一个字符不为否定号,则为不合法的命题公式
            {
                return false;
            }
            if(next1 == Negation)//若nexts 为否定号
        {
            if(middle == PropositionalVariable||middle == RightParenthesis)//且currS 为命题变元或者右括号时
            {
                return false;
            }
        }
        }
        front=middle;//移位
        middle=next1;
    }
    if(LeftNum!=RightNum||pNum==0)//右括号不等于左括号的数量
    {
        return false;
    }
    return true;

}

2

#include "allinclude.h"
Boolean my_Function(int leftNum,int rightNum,int pNum,StatementFormulaSymbles front,StatementFormulaSymbles middle,StatementFormulaSymbles next1,pStatementFormula pFormula)
{
    nextPos(pFormula);//指示器指向下一个字符
    next1=getCurrentSymbleType(pFormula);//下一个元素变量获取指示器所指元素
    if(next1==LeftParenthesis)//下一个为左括号
    {
        leftNum++;//左数加1
    }
    if(next1==RightParenthesis)//下一个为右括号
    {
        rightNum++;
    }
    if(front==Exception||middle==Exception||next1==Exception)//若其中有一个为异常字符,则返回false
    {
        return false;
    }
    if(middle==RightParenthesis)//中间为括号
    {
        if(next1==PropositionalVariable)//下一个为命题变元
        {
            return false;//错误,不是命题
        }
        if(next1==Negation)//下一个为否定号
        {
            return false;//错误,不是命题
        }
    }
    if(middle==PropositionalVariable)//若q为命题变元
    {
        pNum++;
        if(next1==PropositionalVariable||front==PropositionalVariable||next1==Negation||next1==LeftParenthesis)//前面和后面的不能为命题变元,后面也不可以是否定号
        {
            return false;
        }
    }
    if(middle==Conjunction||middle == Disjunction||middle == Implication||middle==Equivalence)//若middle为联结词
    {
        if((front != PropositionalVariable && front != RightParenthesis)||(next1 !=PropositionalVariable && next1 != LeftParenthesis && next1 != Negation))//前后字符既不为命题变元,也不相应为右,左括号,并且后一个字符不为否定号,则为不合法的命题公式
        {
            return false;
        }
        if(next1 == Negation)//若nexts 为否定号
        {
            if(middle == PropositionalVariable||middle == RightParenthesis)//且currS 为命题变元或者右括号时
            {
                return false;
            }
        }
    }
    front=middle;//移位
    middle=next1;
    if(next1!=EndOfFormula)//终止条件
    {
        return my_Function(leftNum,rightNum,pNum,front,middle,next1,pFormula);
    }
    if(leftNum!=rightNum||pNum==0)//左括号和右括号数不相等或命题变元个数为0
    {
        return false;
    }
    return true;
}
Boolean isStatementFormula(pStatementFormula pFormula)
{  // Add your code here
    StatementFormulaSymbles front,middle,next1;
    int leftNum=0,rightNum=0,pNum=0;
    front =getCurrentSymbleType(pFormula);//获取第一个符号
    switch(front)
    {
        case Exception:
        case Conjunction:
        case Disjunction:
        case Implication:
        case Equivalence:
        case RightParenthesis://如果第一个元素为异常情况,合取号、析取号、蕴含号、等价号、右括号,则一定不为命题
            return false;
        case LeftParenthesis:
            leftNum++;//第一个符号为左括号,则左括号数加1
            break;
        case EndOfFormula://第一个为结束字符为空命题
            return true;
        case PropositionalVariable://第一个字符为命题变元
            pNum++;
    }
    nextPos(pFormula);//指示器指向第二个符号
    middle=getCurrentSymbleType(pFormula);//中间字符读取出来
    switch(middle)//第二个字符的所有处理情况
    {
        case RightParenthesis:
            return false;//第二个为右括号,什么情况下不为命题
        case LeftParenthesis:
            if(front==PropositionalVariable)
            {
                return false;//前面为命题变元
            }
            leftNum++;//为左括号时,左数加1
            break;
        case PropositionalVariable:
            if(front==PropositionalVariable)//第一个字符也为命题变元,第二个字符也是命题变元肯定不为命题
            {
                return false;
            }
        case Negation:
            if(front==PropositionalVariable)//第一个字符也为命题变元,第二个字符也是命题变元肯定不为命题
            {
                return false;
            }
    }
    return my_Function(leftNum,rightNum,pNum,front,middle,next1,pFormula);//递归函数开始
}
  • 14
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Sɪʟᴇɴᴛ໊ོ5329

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值