一个C语言递归的问题!~(高手请进!~)
表达式语法从键盘输入一个表达式,判断它是否符合下面的语法规则:(1)表达式只能由单字母、运算符和括号构成,不能含有数字(2)运算符仅包括:+、–、*、/、%。(3)括号只...
表达式语法
从键盘输入一个表达式,判断它是否符合下面的语法规则:
(1) 表达式只能由单字母、运算符和括号构成,不能含有数字
(2) 运算符仅包括:+、–、*、/、%。
(3) 括号只能是圆括号,不允许有方括号和花括号
(4) 变量与运算符之间、变量与括号之间允许空格,且空格数不限
(5) 以下是表达式的递归式定义,除此之外都不是正确的表达式:
① 仅有一个字母是表达式
② “表达式 运算符 表达式”和“(表达式)”是表达式
如果判断结果是输入的的表达式不符合上述规则,则需要指出错误的位置,如有多个错误只需要指出第一个错误所在位置即可。例如:
输入:A
显示:right
输入:(A)
显示:right
输入:A + A * ( b + c )
显示:right
输入:A * + B
显示: error
输入:A * ( Ab + A / bc )
显示:error
输入: ( + A )
显示: error
输入: ( x+A ( / b
显示: error
输入:A+b*(a%b
显示: error
输入: ) B + A (
显示:error
怎么编程序啊 ?
什么四元式啊??没学过~能不能只用C做啊?? 展开
从键盘输入一个表达式,判断它是否符合下面的语法规则:
(1) 表达式只能由单字母、运算符和括号构成,不能含有数字
(2) 运算符仅包括:+、–、*、/、%。
(3) 括号只能是圆括号,不允许有方括号和花括号
(4) 变量与运算符之间、变量与括号之间允许空格,且空格数不限
(5) 以下是表达式的递归式定义,除此之外都不是正确的表达式:
① 仅有一个字母是表达式
② “表达式 运算符 表达式”和“(表达式)”是表达式
如果判断结果是输入的的表达式不符合上述规则,则需要指出错误的位置,如有多个错误只需要指出第一个错误所在位置即可。例如:
输入:A
显示:right
输入:(A)
显示:right
输入:A + A * ( b + c )
显示:right
输入:A * + B
显示: error
输入:A * ( Ab + A / bc )
显示:error
输入: ( + A )
显示: error
输入: ( x+A ( / b
显示: error
输入:A+b*(a%b
显示: error
输入: ) B + A (
显示:error
怎么编程序啊 ?
什么四元式啊??没学过~能不能只用C做啊?? 展开
4个回答
展开全部
不就是编译里的四元式的生成吗,学一学编译就觉得简单了不少
① T:=newtemp;
② QT[j]=(SYN[k],SEM[s-1],SEM[s],T);j++;
③ pop(SYN,_);pop(SEM,_);pop(SEM,_); push(SEM,T);
E TE`
E` +TE` | -TE` | e
T FT`
T` *FT` | /FT` | e
F i| (E)
原码如下:
#include "iostream"
using namespace std;
char line[30]={""}; //存放输入表达式
char load[20]={""}; //存放生成四元式
int i=0,j=0;
char w,A='A',temp,temp1; //定义中间变量
char getnextchar(void); //返回下一个字符
void loadchar(char tmp);
char outchar(void);
void getE(void); //E TE1
void getE1(void); //E1 +TE1 | -TE1 | e
void getT(void); //T FT1
void getT1(void); //T1 *FT1 | /FT1 | e
void getF(void); //F i| (E)
int main() //主程序
{
cout<<"Please input the line:"<<endl;
cin>>line; //接收表达式
w=getnextchar();
getE();
return 0;
}
char getnextchar(void)
{
//cout<<"get"<<endl;
return line[i++];
}
void loadchar(char tmp)
{
load[j++]=tmp;
return;
}
char outchar(void)
{
return load[--j];
}
void getE(void) //E TE1
{
getT();
getE1();
return;
}
void getE1(void) //E1 +TE1 | -TE1 | e
{
if(w=='+'||w=='-')
{
loadchar(w);
w=getnextchar();
getT();
temp=outchar();
temp1=outchar();
cout<<"( "<<temp1<<" "<<outchar()<<" "<<temp<<" "<<A<<" )"<<endl;
loadchar(A);
A++;
getE1();
}
else return;
return;
}
void getT(void) //T FT1
{
getF();
getT1();
return;
}
void getT1(void) //T1 *FT1 | /FT1 | e
{
if(w=='*'||w=='/')
{
loadchar(w);
w=getnextchar();
getF();
temp=outchar();
temp1=outchar();
cout<<"( "<<temp1<<" "<<outchar()<<" "<<temp<<" "<<A<<" )"<<endl;
loadchar(A);
A++;
getT1();
}
else return;
return;
}
void getF(void) //F i| (E)
{
if(w>='a'&&w<='z'||w>='A'&&w<='Z')
{
loadchar(w);
w=getnextchar();
return;
}
else if(w=='(')
{
//loadchar(w);
w=getnextchar();
getE();
if(w==')')
{
w=getnextchar();
return;
}
else cout<<"Err\')\'"<<endl;
}
else cout<<"Err\'(\'"<<endl;
}
① T:=newtemp;
② QT[j]=(SYN[k],SEM[s-1],SEM[s],T);j++;
③ pop(SYN,_);pop(SEM,_);pop(SEM,_); push(SEM,T);
E TE`
E` +TE` | -TE` | e
T FT`
T` *FT` | /FT` | e
F i| (E)
原码如下:
#include "iostream"
using namespace std;
char line[30]={""}; //存放输入表达式
char load[20]={""}; //存放生成四元式
int i=0,j=0;
char w,A='A',temp,temp1; //定义中间变量
char getnextchar(void); //返回下一个字符
void loadchar(char tmp);
char outchar(void);
void getE(void); //E TE1
void getE1(void); //E1 +TE1 | -TE1 | e
void getT(void); //T FT1
void getT1(void); //T1 *FT1 | /FT1 | e
void getF(void); //F i| (E)
int main() //主程序
{
cout<<"Please input the line:"<<endl;
cin>>line; //接收表达式
w=getnextchar();
getE();
return 0;
}
char getnextchar(void)
{
//cout<<"get"<<endl;
return line[i++];
}
void loadchar(char tmp)
{
load[j++]=tmp;
return;
}
char outchar(void)
{
return load[--j];
}
void getE(void) //E TE1
{
getT();
getE1();
return;
}
void getE1(void) //E1 +TE1 | -TE1 | e
{
if(w=='+'||w=='-')
{
loadchar(w);
w=getnextchar();
getT();
temp=outchar();
temp1=outchar();
cout<<"( "<<temp1<<" "<<outchar()<<" "<<temp<<" "<<A<<" )"<<endl;
loadchar(A);
A++;
getE1();
}
else return;
return;
}
void getT(void) //T FT1
{
getF();
getT1();
return;
}
void getT1(void) //T1 *FT1 | /FT1 | e
{
if(w=='*'||w=='/')
{
loadchar(w);
w=getnextchar();
getF();
temp=outchar();
temp1=outchar();
cout<<"( "<<temp1<<" "<<outchar()<<" "<<temp<<" "<<A<<" )"<<endl;
loadchar(A);
A++;
getT1();
}
else return;
return;
}
void getF(void) //F i| (E)
{
if(w>='a'&&w<='z'||w>='A'&&w<='Z')
{
loadchar(w);
w=getnextchar();
return;
}
else if(w=='(')
{
//loadchar(w);
w=getnextchar();
getE();
if(w==')')
{
w=getnextchar();
return;
}
else cout<<"Err\')\'"<<endl;
}
else cout<<"Err\'(\'"<<endl;
}
展开全部
Is there any contradictory on (4) and (5)??file:///usr/share/ubuntu-artwork/home/index.html
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
有点像考智商的题目,找规律吧
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询