#include<stdio.h>
#include<string.h>//包含strlen()的原型
#include<ctype.h>//包含isupper()的原型
#define NUM 20
int check(char * string);
static int len;//存储字符串的长度
int main(){
char source[NUM];
int i = 0;//使用户可以执行多次输入
while(i == 0){
printf(".............欢迎进入合式公式检验窗口....................\n");
printf("\t\t\t请输入字符串\t\t\t\n");
printf("\'-\'表示否定联结词,\'*\'表示合取联结词,\'+\'表示析取联结词\n");
printf("\'>\'表示条件联结词,\'~\'表示双条件联结词\n");
gets(source);
len = strlen(source);
if(source[0] != '\0'){
if(len == 1){
if(isupper(source[0])){
printf("Yes!this string is combined formula\n");//若字符串中只包含一个大写字母,把它当做命题符,也是合式公式
}
else{
printf("No!this string isn't combined formula!\n");
}
}
else
check(source);//字符串长度大于1,进入函数判断
}
else
printf("No!this string isn't combined formula!\n");//字符串为空的情况
printf("输入一个数字以执行其他操作\n");
printf("0 表示重新进入检验窗口\t\t1 表示退出检验窗口\n");
scanf("%d", &i);
getchar();
}
return 0;
}
//检验是否是合式公式的函数
int check(char * string){
char again[NUM];//存储除去括号后的字符串
int i,flag = 0,judge1 = 0,judge2 =0;
int left = 0,right = 0;
for(i=1; i<len-1; i++){//计数总左,右括号数
if(*(string+i) == '(')
left++;
if(*(string+i) == ')')
right++;
}
if(left != right)
printf("No!this string isn't combined formula!\n");
else{
if(*string == '(' && *(string+len-1) == ')'){//除去最外层的一对括号
if(*(string + 1) == '-'){//遇到否定联结词时,除去否定联结词
for(i=0; i+2<len-1; i++)
again[i] = *(string + 2 +i);//剩下的字符存储在一个数组里
again[i] = '\0';
len = strlen(again);
if(len == 1 && isupper(again[0])){//除去否定联结词,只剩下一个大写字母的情况
printf("Yes!this string is combined formula!\n");
return 1;//检测完毕后即可退出检测
}
else
flag = check(again);
}
else{
if(isupper(*(string+1)) ){
if(isupper(*(string+3)))
{
if(*(string+2)=='*' || *(string+2)=='+' || *(string+2)=='>' || *(string+2)=='~'){
printf("Yes!this string is combined formula\n");
return 1;
}
}
}
else{
char a[NUM],b[NUM];//存储新的数组来进行递归判断是否是合式公式
int bnum = 0;//计数括号数
int stop = 1,j;
//划分部分
for(i=1,j=0; ;i++,j++){
if(*(string+i) == '(')
bnum++;
a[j] = *(string+i);
if(*(string+i) == ')')
bnum--;
if(bnum == 0){
stop = 0;
break;
}
}
a[j+1] = '\0';
len = strlen(a);
if(stop == 0)
judge1 = check(a);
stop = 1;
if(*(string+i)=='*' || *(string+i)=='+' || *(string+i)=='>' || *(string+i)=='~'){
for(i+=1,j=0; i<len-1; i++,j++){
if(*(string+i) == '(')
bnum++;
if(*(string+i) == ')')
bnum--;
b[j] = *(string+i);
if(!bnum){
stop = 0;
break;
}
}
}
b[j+1] = '\0';
len = strlen(b);
if(stop == 0)
judge2 = check(b);
}
}
}
}
if(flag == 1 || (judge1 == 1 && judge2 == 1))
printf("Yes!this string is combined formula!\n");
return 0;
}