程序判定合式公式Word下载.docx
《程序判定合式公式Word下载.docx》由会员分享,可在线阅读,更多相关《程序判定合式公式Word下载.docx(10页珍藏版)》请在冰豆网上搜索。
返回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、重头开始判断
3、程序代码
#include<
stdio.h>
string.h>
stdlib.h>
voidcheck(char*str1);
intmain(void)
{
intindex=1;
intkeyNum=1;
staticcharstring[50];
//友好界面,循环使用判断
while(index!
=0)
{
printf("
欢迎使用合式公式判断系统\n"
);
合式公式()不可以省略\n"
用-表示非﹁\n"
用*表示与∧\n"
用+表示或∨\n"
用>
表示蕴涵→\n"
用~表示等值←→\n"
请输入您要判断识别的字符串:
\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]='
;
字符串%s\t有效长度:
%d\n"
formal,len);
//空字符串不是合式公式
if(len==0)
字符串为空\n\t\t\tNO!
\t\t该字符串不是合式公式\n"
return;
//单独的一个符号是一个公式时,当且仅当次符号为命题符号
elseif(len==1)
if(!
isalpha(formal[0]))
printf("
字符串%s不是合适字母\n\t\t\tNO!
formal);
return;
else
\t\t\tYES!
\t\t字符串%s是合式公式\n"
//如果U的长度大于,则U必须以“(”开头,否则不是合式公式,返回NO。
else
if((formal[0]!
('
)||(formal[len-1]!
)'
))
字符串%s没有以“(”开始或者以“)”结束\n\t\t\tNO!
//如果U的第二个符号为一个表示否定的“﹁”,则U必须是可以匹配(﹁V)模式
if(formal[1]=='
-'
{
charnewstring[50];
inti=0;
for(i=0;
i<
len-3;
i++)
{
newstring[i]=formal[2+i];
}
newstring[i]='
check(newstring);
//递归判断V是否为合式公式
}
//如果U的第二个符号不是“﹁”。
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!
return;
//截取新的短的字符串A
if(max1==1)
Astring[0]=formal[1];
Astring[1]='
else
for(j=0;
aindex;
Astring[j]=formal[1+j];
Astring[j]='
}
//对U从右向左扫描,遇到“B)”停止,其中B是一个含有相同数目“(”和“)”的表达式
max2=0;
for(j=len-1;
j>
=0;
j--)
rearnum++;
max2++;
rearnum--;
if(rearnum==1)
bindex=j;
if(rearnum==0&
max2==1)
rearnum++;
if(rearnum!
=1)
字符串%s中没有扫描到B)\n\t\t\tNO!
return;
//截取新的短的字符串B
if(max2==1)
Bstring[0]=formal[len-2];
Bstring[1]='
(bindex+j)<
len-1;
Bstring[j]=formal[bindex+j];
Bstring[j]='
//验证(A*B)的“*”是否是“∧”,“∨”,“→”,“←→”四种之一
if(max1==1&
if(formal[2]=='
*'
||
formal[2]=='
+'
>
'
~'
)
//递归判断A,B是否为合式公式
check(Astring);
check(Bstring);
else
printf("
字符串%s中连接符不对\n\t\t\tNO!
return;
if(aindex!
=bindex-2)
if(max1!
=1&
max2!
=1)
printf("
字符串%s中(A*B)不对\n\t\t\tNO!
return;
if(formal[aindex+1]=='
formal[aindex+1]=='
//如果不是,则U不是合式公式,返回NO。
字符串%s中(A*B)模式不对\n\t\t\tNO!