您的位置:首页 > 其它

合式公式的判断

2015-12-17 16:32 344 查看
………………………………………………………………………………………………………………………………………
程序要求:
输入一个公式,判断是否是合式公式
………………………………………………………………………………………………………………………………………

#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;

}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: