程序判定合式公式.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;
}
}
}
}
}
}