合式公式的判断
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;
}
程序要求:
输入一个公式,判断是否是合式公式
………………………………………………………………………………………………………………………………………
#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;
}
相关文章推荐
- React Native 中组件的生命周期
- 最全Pycharm教程(33)——使用Pycharm编写IPython Notebook文件
- PHP数据库统计时间戳按天分组输出数据
- visual studio开发C#笔记02——颜色选择对话框ColorDialog
- 使用Ant批量打包Android应用完全指南
- 腾讯新闻评论数据爬取
- 网络新闻评论观点挖掘系统实现
- 例题5-4 UVA 156 Ananagrams反片语(映射map)
- Struts2 XML配置详解
- 观察者模式
- android欢迎界面,Viewpager的基本使用
- 二叉树的前序、中序、后序遍历非递归实现
- php \r \n 和 <br/> \t
- mysql and or
- 在CentOS上升级把Nginx
- C++常用的#include头文件总结
- 排序算法,堆算法实现TopK
- 初识贝叶斯网络
- H-L-S
- 关于分布式事务、两阶段提交协议、三阶提交协议