程序判定合式公式Word下载.docx

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

程序判定合式公式Word下载.docx

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

程序判定合式公式Word下载.docx

返回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!

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

当前位置:首页 > 解决方案 > 其它

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

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