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 + -
显示快捷键?