我的编程空间,编程开发者的网络收藏夹
学习永远不晚

C语言怎么实现合式公式的判断

短信预约 -IT技能 免费直播动态提醒
省份

北京

  • 北京
  • 上海
  • 天津
  • 重庆
  • 河北
  • 山东
  • 辽宁
  • 黑龙江
  • 吉林
  • 甘肃
  • 青海
  • 河南
  • 江苏
  • 湖北
  • 湖南
  • 江西
  • 浙江
  • 广东
  • 云南
  • 福建
  • 海南
  • 山西
  • 四川
  • 陕西
  • 贵州
  • 安徽
  • 广西
  • 内蒙
  • 西藏
  • 新疆
  • 宁夏
  • 兵团
手机号立即预约

请填写图片验证码后获取短信验证码

看不清楚,换张图片

免费获取短信验证码

C语言怎么实现合式公式的判断

这篇文章主要讲解了“C语言怎么实现合式公式的判断”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“C语言怎么实现合式公式的判断”吧!

合式公式

C语言怎么实现合式公式的判断

很明显用递归去模拟实现判断过程相对容易。(当然利用栈,循环实现也行,毕竟递归是发生在栈区(函数栈帧),另外递归解决时要处理的细节就很多了,循环会更麻烦)。

由合式公式的定义,很明显原子公式就是我们递归的出口,确定了出口,剩下就是怎么通过递归算法,递推到这个出口

约定

联结词代替 
 
合取(^)*(数量积) 
析取(V)+(数量和) 
蕴含(->)> 
等价=

思路

C语言怎么实现合式公式的判断

删除否定联结词

思路用一个辅助数组去占时存储非!的字符,之后拷贝到原区间,不过要对原区间进行赋值\0

void Del_Negation(char* str,int n){assert(str);char* tmp = (char*)calloc(n+1, sizeof(char));//多一个1,是为了放置\0,避免strcpy越界拷贝assert(tmp);int cnt = 0;int i = 0;while (i < n)//将除!的字符赋值到tmp中{if (str[i] != '!'){tmp[cnt++] = str[i];}++i;}memset(str, 0, sizeof(char)*n);//对str那块内存重新赋值为\0,防止tmp拷贝到str中后,s扔有旧的数据strcpy(str, tmp);free(tmp);tmp = NULL;}

删除括号

删除括号,因为是对首尾进行的删除,这里通过2次strcpy就可以完成

void Del_Bracket( char* str, int left, int right){assert(str);char* tmp = (char*)calloc(right - left +1+1, sizeof(char));assert(tmp);str[right] = '\0';strcpy(tmp, str+left+1);strcpy(str+left, tmp);}

第一个联结词的下标

找寻区间中第一双目运算符:找到就返回下标,否则就返回0.

int Find_Fist_operator( char* str, int left, int right){int ret = 0;while (left<right){if (str[left + 1] == '+' || str[left + 1] == '*' || str[left + 1] == '>' || str[left + 1] == '='){ret = left + 1;return ret;}++left;}return 0;//如果ret是0,说明是非法,反之就正确}

判断合式公式

注意区间的操作,不然很容易造成野指针的访问。

bool Is_CombForm(char* str, int left, int right){if ((0 == (right - left))//区间是原子命题&& ('A' <= str[left] || 'Z' >= str[left])){return true;}if (str[left] != '(')//第一个字符是字母: A>(B){int keyi = Find_Fist_operator(str, left, right);//找寻第一个双目运算符if (keyi > 0){if (str[keyi + 1] == '(')//A<(B){Del_Bracket(str, keyi + 1, right);return Is_CombForm(str, left, keyi - 1) && Is_CombForm(str, keyi + 1, right - 2);}else//A<B{return Is_CombForm(str, left, keyi - 1) && Is_CombForm(str, keyi + 1, right);}}}else//第一个是(:(A)<B{int brackt = 0;//当brackt为0,说明将双目运算符的左操作数全体找到了int cnt = left;int flag = 0;while (cnt<right){if (str[cnt] == '('){brackt++;}if (str[cnt] == ')'){brackt--;flag = cnt;}++cnt;//[  left  , flag]  >  [flag+2,right]if (brackt == 0){Del_Bracket(str, left, flag);if (str[flag + 2] == '('){Del_Bracket(str, flag + 2, right);return Is_CombForm(str, left, flag - 2) && Is_CombForm(str, flag+ 2, right - 2);}else{return Is_CombForm(str, left, flag - 2) && Is_CombForm(str, flag + 2, right);}}}}return false;}

所有代码

#define _CRT_SECURE_NO_WARNINGS#include<iostream>#include <stdlib.h> #include <string.h>#include <assert.h>#include<time.h>#include<windows.h>using namespace std;//思路用一个辅助数组去占时存储非!的字符,之后拷贝到原区间,不过要对原区间进行赋值0void Del_Negation(char* str,int n){assert(str);char* tmp = (char*)calloc(n+1, sizeof(char));//多一个1,是为了放置\0,避免strcpy越界拷贝assert(tmp);int cnt = 0;int i = 0;while (i < n)//将除!的字符赋值到tmp中{if (str[i] != '!'){tmp[cnt++] = str[i];}++i;}memset(str, 0, sizeof(char)*n);//对str那块内存重新赋值为\0,防止tmp拷贝到str中后,s扔有旧的数据strcpy(str, tmp);free(tmp);tmp = NULL;}//删除括号,因为是对首尾进行的删除,这里通过2次strcpy就可以完成void Del_Bracket( char* str, int left, int right){assert(str);char* tmp = (char*)calloc(right - left +1+1, sizeof(char));assert(tmp);str[right] = '\0';strcpy(tmp, str+left+1);strcpy(str+left, tmp);}//判断是否为原子式//因为去除括号的原因,当只有一个字母是原子式,否则不是bool Is_operator(const char* str,int left,int right){assert(str);if ((0==(right-left))&&('A' <=str[left]||'Z'>=str[left])){return true;}return false;}//找寻区间中第一双目运算符:找到就返回下标,否则就返回0.int Find_Fist_operator( char* str, int left, int right){int ret = 0;while (left<right){if (str[left + 1] == '+' || str[left + 1] == '*' || str[left + 1] == '>' || str[left + 1] == '='){ret = left + 1;return ret;}++left;}return 0;//如果ret是0,说明是非法,反之就正确}bool Is_CombForm(char* str, int left, int right){if ((0 == (right - left))//区间是原子命题&& ('A' <= str[left] || 'Z' >= str[left])){return true;}if (str[left] != '(')//第一个字符是字母: A>(B){int keyi = Find_Fist_operator(str, left, right);//找寻第一个双目运算符if (keyi > 0){if (str[keyi + 1] == '(')//A<(B){Del_Bracket(str, keyi + 1, right);return Is_CombForm(str, left, keyi - 1) && Is_CombForm(str, keyi + 1, right - 2);}else//A<B{return Is_CombForm(str, left, keyi - 1) && Is_CombForm(str, keyi + 1, right);}}}else//第一个是(:(A)<B{int brackt = 0;//当brackt为0,说明将双目运算符的左操作数全体找到了int cnt = left;int flag = 0;while (cnt<right){if (str[cnt] == '('){brackt++;}if (str[cnt] == ')'){brackt--;flag = cnt;}++cnt;//[  left  , flag]  >  [flag+2,right]if (brackt == 0){Del_Bracket(str, left, flag);if (str[flag + 2] == '('){Del_Bracket(str, flag + 2, right);return Is_CombForm(str, left, flag - 2) && Is_CombForm(str, flag+ 2, right - 2);}else{return Is_CombForm(str, left, flag - 2) && Is_CombForm(str, flag + 2, right);}}}}return false;}void Text(char *str){cout << str;int sz = strlen(str);Del_Negation(str, sz);sz = strlen(str);if (Is_CombForm(str, 0, sz-1)){printf("-------YES\n");}else{printf("----------NO\n");}}int main (){char arr1[] = "P>!R";char  arr2[] = "!(P>Q)>!R";char arr3[] = "P>((P*R)>Q)";char arr4[] = "((P>R)*(Q*(P>R)))=R";char arr5[] = "((P>Q)>R)>Y";char arr6[] = "PQ";char arr7[] = "(P>RT)>Q";char arr8[] = "((P>Q)*(P>QT))>(R*T)";Text(arr1);Text(arr2);Text(arr3);Text(arr4);Text(arr5);Text(arr6);Text(arr7);Text(arr8);printf("-------------------------BY New Young\n");return 0;}

效果

C语言怎么实现合式公式的判断

感谢各位的阅读,以上就是“C语言怎么实现合式公式的判断”的内容了,经过本文的学习后,相信大家对C语言怎么实现合式公式的判断这一问题有了更深刻的体会,具体使用情况还需要大家实践验证。这里是编程网,小编将为大家推送更多相关知识点的文章,欢迎关注!

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

C语言怎么实现合式公式的判断

下载Word文档到电脑,方便收藏和打印~

下载Word文档

猜你喜欢

C语言怎么实现合式公式的判断

这篇文章主要讲解了“C语言怎么实现合式公式的判断”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“C语言怎么实现合式公式的判断”吧!合式公式很明显用递归去模拟实现判断过程相对容易。(当然利用栈,
2023-06-29

c语言常见图片格式判断实例

这篇文章介绍了c语言常见图片格式判断实例,有需要的朋友可以参考一下
2022-11-15

C语言断言的实现方式有哪些

C语言中断言的实现方式有以下几种:assert宏:assert宏是C语言标准库中提供的用于断言的宏定义。它的用法是在需要断言的地方加上assert宏,并在括号中添加需要判断的条件表达式。如果条件表达式为假,则会触发断言失败,并输出相应的错误
2023-10-26

c语言如何判断正确的表达式

在C语言中,可以使用以下方法判断一个表达式的正确性:1. 语法检查:C语言编译器会在编译阶段对代码进行语法检查,如果表达式中出现了不符合语法规则的元素或者语法错误,编译器会报错,并给出错误的位置和具体信息。2. 类型匹配:C语言是一种静态类
2023-08-08

用c语言编程实现素数判断(判断素数的c语言程序函数)

以下是一个用C语言编写的判断素数的函数:```c#include #include bool isPrime(int n) {if (n return false;}for (int i = 2; i * i if (n % i == 0)
2023-09-22

c语言怎么实现输入年份判断闰年

C语言中,可以使用以下方法来判断一个年份是否是闰年:1. 闰年的定义是可以被4整除但不能被100整除,或者可以被400整除。2. 使用模运算符 `%` 来判断年份是否能被4和100整除,以及是否能被400整除。下面是一个示例代码:```c#
2023-10-12

怎么用C语言实现链式栈

这篇文章给大家分享的是有关怎么用C语言实现链式栈的内容。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过来看看吧。堆栈的基本概念堆栈是只能在一端增删元素的表结构,该位置称为栈顶堆栈的基本运算是压入和弹出,前者相当于插入,而后者则是删
2023-06-22

c语言合法常量判断的方法是什么

在C语言中,常量是固定的值,不能被修改。判断一个常量是否合法可以通过以下方法:1. 根据常量的数据类型进行判断:C语言中有多种数据类型,如整型、浮点型、字符型等。对于不同的数据类型,有不同的合法常量表示方式和取值范围。因此,首先要确定常量的
2023-10-20

C语言怎么实现多项式加减

在C语言中,可以使用数组来表示多项式。数组的下标表示多项式的指数,数组的值表示多项式的系数。以下是一个示例代码,用于实现两个多项式的加法和减法:```c#include #define MAX_DEGREE 100// 多项式结构体type
2023-08-18

c语言怎么实现多项式相加

在C语言中,可以通过定义一个多项式结构体来表示多项式,然后定义相应的函数来实现多项式的相加。首先,我们可以定义一个包含系数和指数的结构体:```ctypedef struct {float coefficient;int exponent;
2023-08-18

c语言怎么判断三个数的大小

可以通过比较三个数之间的大小关系来判断它们的大小。以下是一个示例代码:#include int main() {int num1, num2, num3;printf("Enter three numbers: ");s
c语言怎么判断三个数的大小
2024-03-01

C语言中的汉诺塔公式是什么

这篇文章主要为大家展示了“C语言中的汉诺塔公式是什么”,内容简而易懂,条理清晰,希望能够帮助大家解决疑惑,下面让小编带领大家一起研究并学习一下“C语言中的汉诺塔公式是什么”这篇文章吧。汉诺塔公式汉诺塔问题在数学层面的公式:不用说,你看到这个
2023-06-28

如何使用C语言数学公式来实现表白

这篇文章主要介绍如何使用C语言数学公式来实现表白,文中介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们一定要看完!一、首先简介一下所需要用到的知识点以及各个知识点的用法(1)输出函数:printf();(printf()是C语言标准库函
2023-06-22

怎么用R语言绘图实现公式与变量对象混合拼接

本篇内容主要讲解“怎么用R语言绘图实现公式与变量对象混合拼接”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“怎么用R语言绘图实现公式与变量对象混合拼接”吧!当我们在R中进行绘图时,如果涉及到数学或
2023-06-25

C语言如何实现完全平方整数的判断

这篇文章主要为大家展示了“C语言如何实现完全平方整数的判断”,内容简而易懂,条理清晰,希望能够帮助大家解决疑惑,下面让小编带领大家一起研究并学习一下“C语言如何实现完全平方整数的判断”这篇文章吧。一、原理:利用 sqrt -- 求平方根 函
2023-06-22

c语言怎么判断素数个数的大小

在 c 语言中判断素数个数大小的方法有多种,包括:暴力判断法:逐个检查数字是否被 2 至自身以外的数整除。埃拉托斯特尼筛法:标记素数的倍数为合数,并统计素数个数。素数表法:预先生成素数表,判断时直接查找。miller-rabin 检验法:使
c语言怎么判断素数个数的大小
2024-05-14

编程热搜

  • Python 学习之路 - Python
    一、安装Python34Windows在Python官网(https://www.python.org/downloads/)下载安装包并安装。Python的默认安装路径是:C:\Python34配置环境变量:【右键计算机】--》【属性】-
    Python 学习之路 - Python
  • chatgpt的中文全称是什么
    chatgpt的中文全称是生成型预训练变换模型。ChatGPT是什么ChatGPT是美国人工智能研究实验室OpenAI开发的一种全新聊天机器人模型,它能够通过学习和理解人类的语言来进行对话,还能根据聊天的上下文进行互动,并协助人类完成一系列
    chatgpt的中文全称是什么
  • C/C++中extern函数使用详解
  • C/C++可变参数的使用
    可变参数的使用方法远远不止以下几种,不过在C,C++中使用可变参数时要小心,在使用printf()等函数时传入的参数个数一定不能比前面的格式化字符串中的’%’符号个数少,否则会产生访问越界,运气不好的话还会导致程序崩溃
    C/C++可变参数的使用
  • css样式文件该放在哪里
  • php中数组下标必须是连续的吗
  • Python 3 教程
    Python 3 教程 Python 的 3.0 版本,常被称为 Python 3000,或简称 Py3k。相对于 Python 的早期版本,这是一个较大的升级。为了不带入过多的累赘,Python 3.0 在设计的时候没有考虑向下兼容。 Python
    Python 3 教程
  • Python pip包管理
    一、前言    在Python中, 安装第三方模块是通过 setuptools 这个工具完成的。 Python有两个封装了 setuptools的包管理工具: easy_install  和  pip , 目前官方推荐使用 pip。    
    Python pip包管理
  • ubuntu如何重新编译内核
  • 改善Java代码之慎用java动态编译

目录