程序判定合式公式.docx
- 文档编号:1210853
- 上传时间:2022-10-19
- 格式:DOCX
- 页数:10
- 大小:17.07KB
程序判定合式公式.docx
《程序判定合式公式.docx》由会员分享,可在线阅读,更多相关《程序判定合式公式.docx(10页珍藏版)》请在冰豆网上搜索。
程序判定合式公式
合式公式的判定
—、基本概念
1、合式公式:
(1)单个命题常项或变项是合式公式;
(2)如果A是合式公式,则「A也是合式公式;
(3)如果A,B是合式公式,则PAQ、PVQ、P-Q、P?
Q也是合式公式;
(4)只有有限次地应用
(1)〜(3)所包含的命题变元,联结词和括号的符号串是合式公式。
2、设命题集合LP:
Cl,C2,……Cn
长度:
语言构成元素的数目
表达式u=v:
指长度相等且从左向右比处处相等
初始段:
从最左端开始向右扫描
结尾段:
从最右端开始向左扫描
二、编程思路
假定给定的程序变量为U,U为Lp表达式,代表输入的带判定的字符串
又记“*”代表“A”,“V”,,“?
”四种之一。
则:
1、空表达式不是合适公式的表达式。
返回NO
2、单独的一个符号是一个公式时,当且仅当此符号为命题符号
3、如果U的长度大于1,贝UU必须以“(”开头,否则不是合式公式,返回NO。
(1)如果U的第二个符号为一个表示否定的“「”,则U必须是可以匹配(「V)模式,其中V是一个表达式。
否则U不是合式公式,即U是合式公式当且仅当V是合式公式。
于是,递归判断V是否为合式公式,转入1、重头开始判断。
(2)如果U的第二个符号不是“「”。
则U—定要符合(A*B)模式。
1对U从左向右扫描,遇到“(A”停止,其中A是一个含有相同数目的“(”和“)”
的表达式,如果没有,则U不是合式公式,返回NO。
2对U从右向左扫描,遇到“B)”停止,其中B是一个含有相同数目“(”和“)”的
表达式,如果没有,则U不是合式公式,返回NO。
3验证(A*B)的“*”是否是“A”,“V”,,“?
”四种之一,如果不是,则U
不是合式公式,返回NO。
4递归判断A,B是否为合式公式,转入1、重头开始判断
三、程序代码
#include
#include
#include
voidcheck(char*str1);
intmain(void)
{
intindex=1;
intkeyNum=1;
staticcharstring[50];
//友好界面,循环使用判断
while(index!
=0)
{
printf("欢迎使用合式公式判断系统\n");
printf("合式公式()不可以省略\n");
printf("用-表示非「\n");
printf("用*表示与A\n");
printf("用+表示或V\n");
printf("用>表示蕴涵T\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("字符串%环是合适字母\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 { 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 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(maxi==1) { Astring[0]=formal[1]; Astring[1]='\0'; } else { for(j=0;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 { 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) { Bstring[j]=formal[bindex+j]; } Bstring[j]='\0'; } //验证(A*B)的“”是否是’入”,V”,T“―四种 之一 { if(formal[2]== '*'II 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) \n\t\t\tNO! \t\t \n\t\t\tNO! \t\t if(maxi! =1&&max2! =1) { printf("字符串%$中(A*B)不对 该字符串不是合式公式\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"formal); return } } } } } }
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 程序 判定 合式 公式