程序判定合式公式.docx

上传人:b****5 文档编号:6768204 上传时间:2023-01-10 格式:DOCX 页数:10 大小:17.09KB
下载 相关 举报
程序判定合式公式.docx_第1页
第1页 / 共10页
程序判定合式公式.docx_第2页
第2页 / 共10页
程序判定合式公式.docx_第3页
第3页 / 共10页
程序判定合式公式.docx_第4页
第4页 / 共10页
程序判定合式公式.docx_第5页
第5页 / 共10页
点击查看更多>>
下载资源
资源描述

程序判定合式公式.docx

《程序判定合式公式.docx》由会员分享,可在线阅读,更多相关《程序判定合式公式.docx(10页珍藏版)》请在冰豆网上搜索。

程序判定合式公式.docx

程序判定合式公式

合式公式的判定

1、基本概念

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:

指长度相等且从左向右比处处相等

初始段:

从最左端开始向右扫描

结尾段:

从最右端开始向左扫描

2、编程思路

假定给定的程序变量为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、重头开始判断

3、程序代码

#include

#include

#include

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

{

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(max1==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。

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)

{

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;

}

}

}

}

}

}

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 医药卫生 > 基础医学

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1