程序判定合式公式.docx
- 文档编号:6740533
- 上传时间:2023-01-09
- 格式:DOCX
- 页数:10
- 大小:17.68KB
程序判定合式公式.docx
《程序判定合式公式.docx》由会员分享,可在线阅读,更多相关《程序判定合式公式.docx(10页珍藏版)》请在冰豆网上搜索。
程序判定合式公式
合式公式的判定
一、基本概念
1、合式公式:
(1)单个命题常项或变项是合式公式;
(2)如果A是合式公式,则﹁A也是合式公式;
(3)如果A,B是合式公式,则P∧Q、P∨Q、P→Q、P↔Q也是合式公式;
(4)只有有限次地应用
(1)~(3)所包含的命题变元,联结词和括号的符号串是合式公式。
2、设命题集合Lp:
C1,C2,……Cn
长度:
语言构成元素的数目
表达式u=v:
指长度相等且从左向右比处处相等
初始段:
从最左端开始向右扫描
结尾段:
从最右端开始向左扫描
二、编程思路
假定给定的程序变量为U,U为Lp表达式,代表输入的带判定的字符串
又记“*”代表“∧”,“∨”,“→",“↔"四种之一。
则:
1、空表达式不是合适公式的表达式。
返回NO
2、单独的一个符号是一个公式时,当且仅当此符号为命题符号
3、如果U的长度大于1,则U必须以“(”开头,否则不是合式公式,返回NO。
(1)如果U的第二个符号为一个表示否定的“﹁”,则U必须是可以匹配(﹁V)模式,其中V是一个表达式.否则U不是合式公式,即U是合式公式当且仅当V是合式公式。
于是,递归判断V是否为合式公式,转入1、重头开始判断.
(2)如果U的第二个符号不是“﹁”。
则U一定要符合(A*B)模式。
①对U从左向右扫描,遇到“(A"停止,其中A是一个含有相同数目的“("和“)"的表达式,如果没有,则U不是合式公式,返回NO。
②对U从右向左扫描,遇到“B)”停止,其中B是一个含有相同数目“(”和“)”的表达式,如果没有,则U不是合式公式,返回NO。
③验证(A*B)的“*”是否是“∧”,“∨”,“←”,“↔”四种之一,如果不是,则U不是合式公式,返回NO.
④递归判断A,B是否为合式公式,转入1、重头开始判断
三、程序代码
#include〈stdio。
h〉
#include #include〈stdlib。 h> voidcheck(char*str1); intmain(void) { intindex=1; intkeyNum=1; staticcharstring[50]; //友好界面,循环使用判断 while(index! =0) { printf(”欢迎使用合式公式判断系统\n”); printf("合式公式()不可以省略\n"); printf(”用-表示非﹁\n”); printf("用*表示与∧\n”); printf("用+表示或∨\n"); printf("用〉表示蕴涵→\n”); printf("用~表示等值←→\n"); printf(”请输入您要判断识别的字符串: \n"); scanf("%s”,&string); check(string); printf(”请选择: 0-—退出系统;1—-继续判断其它字符串\n”); scanf("%d",&keyNum); if(keyNum==0){ break; } else{ continue; } } } //合式公式字符串的判读 voidcheck(char*str1) { charformal[50]; intlen=0; //获取字符串的长度并且去除空格 while(*str1! ='\0’) { if(*str1! =’') { formal[len]=*str1; len++; } str1++; } formal[len]='\0’; printf(”字符串%s\t有效长度: %d\n”,formal,len); //空字符串不是合式公式 if(len==0) { printf(”字符串为空\n\t\t\tNO! \t\t该字符串不是合式公式\n"); return; } //单独的一个符号是一个公式时,当且仅当次符号为命题符号 elseif(len==1) { if(! isalpha(formal[0])) { printf("字符串%s不是合适字母\n\t\t\tNO! \t\t该字符串不是合式公式\n”,formal); return; } else { printf(”\t\t\tYES! \t\t字符串%s是合式公式\n",formal); return; } } //如果U的长度大于,则U必须以“(”开头,否则不是合式公式,返回NO. else { if((formal[0]! =’(')||(formal[len-1]! =')')) { printf("字符串%s没有以“(”开始或者以“)”结束\n\t\t\tNO! \t\t该字符串不是合式公式\n",formal); return; } else { //如果U的第二个符号为一个表示否定的“﹁”,则U必须是可以匹配(﹁V)模式 if(formal[1]==’-’) { charnewstring[50]; inti=0; for(i=0;i〈len—3;i++) { newstring[i]=formal[2+i]; } newstring[i]='\0’; check(newstring);//递归判断V是否为合式公式 } //如果U的第二个符号不是“﹁”。 则U一定要符合(A*B)模式。 else { intj=0; intmax1=0; intmax2=0; intaindex=0; intbindex=0; intprenum=0; intrearnum=0; charAstring[50]; charBstring[50]; //对U从左向右扫描,遇到“(A”停止,其中A是一个含有相同数目的“(”和“)”的表达式 for(j=0;j〈len;j++) { if(formal[j]==’(') { prenum++; max1++; } elseif(formal[j]==')') { prenum—-; if(prenum==1) { aindex=j; break; } if(prenum==0&&max1==1) { prenum++; } } } //如果没有,则U不是合式公式,返回NO。 if(prenum! =1) { printf("字符串%s中没有扫描到(A\n\t\t\tNO! \t\t该字符串不是合式公式\n”,formal); return; } //截取新的短的字符串A if(max1==1) { Astring[0]=formal[1]; Astring[1]='\0'; } else { for(j=0;j〈aindex;j++) { Astring[j]=formal[1+j]; } Astring[j]='\0’; } //对U从右向左扫描,遇到“B)"停止,其中B是一个含有相同数目“(”和“)”的表达式 max2=0; for(j=len-1;j〉=0;j--) { if(formal[j]==’)’) { rearnum++; max2++; } elseif(formal[j]=='(’) { rearnum--; if(rearnum==1) { bindex=j; break; } if(rearnum==0&&max2==1) { rearnum++; } } } //如果没有,则U不是合式公式,返回NO。 if(rearnum! =1) { printf(”字符串%s中没有扫描到B)\n\t\t\tNO! \t\t该字符串不是合式公式\n”,formal); return; } //截取新的短的字符串B if(max2==1) { Bstring[0]=formal[len—2]; Bstring[1]='\0’; } else { for(j=0;(bindex+j)〈len-1;j++) { Bstring[j]=formal[bindex+j]; } Bstring[j]='\0'; } //验证(A*B)的“*"是否是“∧”,“∨",“→”,“←→”四种之一 if(max1==1&&max2==1) { if(formal[2]==’*’|| formal[2]=='+'|| formal[2]==’>'|| formal[2]=='~') { //递归判断A,B是否为合式公式 check(Astring); check(Bstring); } else { printf(”字符串%s中连接符不对\n\t\t\tNO! \t\t该字符串不是合式公式\n”,formal); return; } } else { if(aindex! =bindex—2) { if(max1! =1&&max2! =1) { printf("字符串%s中(A*B)不对\n\t\t\tNO! \t\t该字符串不是合式公式\n",formal); return; } } if(formal[aindex+1]=='*'|| formal[aindex+1]=='+’|| formal[aindex+1]==’〉’|| formal[aindex+1]==’~') { //递归判断A,B是否为合式公式 check(Astring); check(Bstring); } //如果不是,则U不是合式公式,返回NO。 else { printf("字符串%s中(A*B)模式不对\n\t\t\tNO! \t\t该字符串不是合式公式\n”,formal); return; } } } } } }
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 程序 判定 合式 公式
![提示](https://static.bdocx.com/images/bang_tan.gif)