fun_in_checkexpression.cpp
来自「本程序是完成一个函数计算器的功能,通过输入表达式,然输入表达的未知数,则可以计算」· C++ 代码 · 共 279 行
CPP
279 行
#include "head.h"
extern FILE *fp;
extern expression expre;
/*公式输入函数*/
void InputExpression()
{
printf("Please input expression.\n");
printf(">") ;
scanf("%s" , expre.p_Expression) ; //输入公式字符串
}
/*检查字符窜str的第i个位置开始的后面字符是否与字符窜s相匹配,是的话将i=i+len(s),并返回1,否则返回0*/
int CheckFuncName(char *str,int &i, char *s)
{ //检查字符窜str的第i个位置开始的后面字符是否与字符窜s相匹配
//是的话将i=i+len(s),并返回1,否则返回0
int j=0;
for(j=0;j<(int)strlen(s);j++)
if(str[i+j]!=s[j])
break;
if(j==(int)strlen(s))
{
i=i+strlen(s);
return 1;
}
else return 0;
}
int CheckExpression(char *new_exp)
{
//检查输入的表达式是否正确,包括括号是否配对、库函数是否正确,
//若正确,返回值为1;否则返回0;
//printf("%s",&new_exp);
char string[MAX] ; //存放算术表达式,长度为MAX=50
char st[MAX/2]; //存放括号的栈
int top=0 , i=0; //栈顶
while(*new_exp != '\0')
{
string[i] = *new_exp ;
i++;
new_exp++;
if(i > 50) //算术表达式的长度大于50时,返回0;
return 0 ;
}
string[i] = '\0' ;
for(i=0;string[i]!='\0';i++)
{
//如果是左括号,则入栈
if(string[i]=='(' || string[i]=='[' || string[i]=='{')
{ //如果是左括号,则入栈
top++;
st[top]=string[i];
continue;
}
//小括号
if(string[i]==')') //小括号
{
if(st[top]=='(') //配对
{
top--; //出栈
continue;
}
else return 0; //不配对,返回0
}
//中括号
if(string[i]==']')
{
if(st[top]=='[') //配对
{
top--; //出栈
continue;
}
else return 0; //不配对,返回0
}
//大括号
if(string[i]=='}')
{
if(st[top]=='{') //配对
{
top--; //出栈
continue;
}
else return 0; //不配对,返回0
}
//运算符
if(string[i]=='+' || string[i]=='-' || string[i]=='*' || string[i]=='/' || string[i]==',')
{ //如果有连续运算符则错误
if(string[i+1]=='+' || string[i+1]=='-' || string[i+1]=='*' ||string[i+1]=='/')
return 0; //错误,返回0
else
continue; //无连续运算符情况
}
//小写字母
if('a'<=string[i] && string[i]<='z' )
{ //是以a开头的库函数
if(string[i]=='a')
{
if(CheckFuncName(string,i,"acos")||CheckFuncName(string,i,"asin")
||CheckFuncName(string,i,"atan2")||CheckFuncName(string,i,"atan"))
{
if(string[i]=='('||string[i]=='['||string[i]=='{')
{ //如果函数后是括号
st[++top]=string[i]; // 括号入栈
continue;
}
else //如果函数后不是括号,返回0
return 0;
}
}
//是以c开头的函数
if(string[i]=='c')
{
if(CheckFuncName(string,i,"cosh")||CheckFuncName(string,i,"cos")||
CheckFuncName(string,i,"ceil"))
{
if(string[i]=='('||string[i]=='['||string[i]=='{')
{ //如果函数后是括号
st[++top]=string[i]; // 括号入栈
continue;
}
else //如果函数后不是括号,返回0
return 0;
}
}
//是以e开头的函数
if(string[i]=='e')
{
if(CheckFuncName(string,i,"exp"))
{
if(string[i]=='('||string[i]=='['||string[i]=='{')
{ //如果函数后是括号
st[++top]=string[i]; // 括号入栈
continue;
}
else //如果函数后不是括号,返回0
return 0;
}
}
//是以f开头的函数
if(string[i]=='f')
{
if(CheckFuncName(string,i,"frexp") || CheckFuncName(string,i,"fabs")
||CheckFuncName(string,i,"floor")||CheckFuncName(string,i,"fmod"))
{
if(string[i]=='('||string[i]=='['||string[i]=='{')
{ //如果函数后是括号
st[++top]=string[i]; // 括号入栈
continue;
}
else //如果函数后不是括号,返回0
return 0;
}
}
//是以m开头的函数
if(string[i]=='m')
{
if(CheckFuncName(string,i,"modf"))
{
if(string[i]=='('||string[i]=='['||string[i]=='{')
{ //如果函数后是括号
st[++top]=string[i]; // 括号入栈
continue;
}
else //如果函数后不是括号,返回0
return 0;
}
}
//是以l开头的函数
if(string[i]=='l')
{
if(CheckFuncName(string,i,"ldexp")||CheckFuncName(string,i,"log")||CheckFuncName(string,i,"log10"))
{
if(string[i]=='('||string[i]=='['||string[i]=='{')
{ //如果函数后是括号
st[++top]=string[i]; // 括号入栈
continue;
}
else //如果函数后不是括号,返回0
return 0;
}
}
//是以p开头的函数
if(string[i]=='p')
{
if(CheckFuncName(string,i,"pow"))
{
if(string[i]=='('||string[i]=='['||string[i]=='{')
{ //如果函数后是括号
st[++top]=string[i]; // 括号入栈
continue;
}
else //如果函数后不是括号,返回0
return 0;
}
}
//是以s开头的函数
if(string[i]=='s')
{
if(CheckFuncName(string,i,"sinh")||CheckFuncName(string,i,"sin")||
CheckFuncName(string,i,"sqrt"))
{
if(string[i]=='('||string[i]=='['||string[i]=='{')
{ //如果函数后是括号
st[++top]=string[i]; // 括号入栈
continue;
}
else //如果函数后不是括号,返回0
return 0;
}
}
//是以t开头的函数
if(string[i]=='t')
{
if(CheckFuncName(string,i,"tanh")||CheckFuncName(string,i,"tan"))
{
if(string[i]=='('||string[i]=='['||string[i]=='{')
{ //如果函数后是括号
st[++top]=string[i]; // 括号入栈
continue;
}
else //如果函数后不是括号,返回0
return 0;
}
}
if(string[i+1]=='+' || string[i+1]=='-' || string[i+1]=='*'|| string[i+1]=='/' || string[i+1]=='\0' || string[i+1] == ')'|| string[i+1] == ',')//如果a<=string[i]<=z字符,但其后不是+、-、*、/时,则返回0
continue ;
else
return 0 ;
}
else if(string[i]=='P')
if(CheckFuncName(string , i , "PI")) //是否是PI常量
continue ;
else
return 0 ; //常量表达错误
else
return 0; //如果string[i]是其他字符,则返回0
}//for(i=0;string[i]!='\0';i++)
if(top!=0) //括号不匹配,返回0
return 0;
//表达式正确
string[i]='\0';
//将表达式中的大、中括号该成小括号
for(i=0;string[i]!='\0';i++)
{
if((string[i]=='[')||(string[i]=='{'))
string[i]='(';
else if((string[i]==']')||(string[i]=='}'))
string[i]=')';
}
return 1;
}
//判断是否是从文件登入还是公式登入
int CheckLoginFileOrExpression()
{
int l_number = 0 ;
char c ;
if((fp = fopen(FileName , "r"))==NULL) // 若FileName 文件不存在, 退出此函数
{
printf("The file %s doesn't exit or the file have no content.",FileName);
return 0 ;
}
printf("Whether read expression from file to login(Y/N)\n>"); //是否从文件夹中登入,'Y'表示从文件登入,'N'表示从缓存中登入
getchar();
c=getchar();
if(c=='Y'||c=='y')
{
return 1 ;
}
else
{
return 0 ;
}
}
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?