fun_bolan.cpp

来自「本程序是完成一个函数计算器的功能,通过输入表达式,然输入表达的未知数,则可以计算」· C++ 代码 · 共 776 行 · 第 1/2 页

CPP
776
字号
#include "head.h"

extern double result ;  
extern Bolan bolan[MAX];  
/*//将算术表达式string转化成波兰表达式,
//波兰表达式放在bolan[]中
//转换方法:
//1.判定string[i]为未知数,直接存入bolan数组中
//2.判定string[i]为'(',将此'('压入栈,
//  若'('前为数字,则在'('前加一对'*'的处理
//3.判定string[i]为')',则将栈stact中左括号'('以后的运算符和函数依次
//  弹出,并入数组bolan中,然后将左括号'('弹出
//4.判定string[i]为'-','+',则将当前栈stack中左括号'('以后(如无'('则
//  将栈stack中所有)的运算符和函数依次弹出,存入数组bolan中,然后将
//  '-'或'+'压入栈stack中
//  如果'-'在第一个位置或其前是'(',即'-'是负号,将'~'(取负)压入stack中
//5.判定string[i]为'*'或'/',则将栈stact中顶端连续的'*'或'/'或函数依次
//  弹出,存入数组bolan中,然后将'*'或'/'压入栈stact中
//6.判定string[i]为函数,则将该函数入栈stact中
//  存入栈stact中变量func的是该函数的编号,详细编号见头文件
//  若该函数前为数字,则在该函数入栈stact前加一次对'*'的处理
//7.判定string[i]=',',将栈stact中'('后的运算符和函数全部弹出,压入数
//  组bolan中, 
//9.转换结束时,若栈stact不为空,则将栈内所有运算符和函数弹出,存入
//  数组bolan中
//10.转换结束,在数组bolan尾加一opera='#'作为结束符*/

int TranslationRPorland(char *in_exp)
{
	Bolan stack[MAX];         //存放运算符和函数的栈
	int top=0,         //存放栈stact的下标
		i,           //string的下标
		j=0,           //bolan数组的下标
	    befordigit = 1 ;  //判断'('前是否是未知数,0表示'('不是未知数,1 表示'('是未知数

	char string[MAX] ;  //算术表达式 ,长度为50
	i = 0 ;
	while(*in_exp != '\0')
	{
		string[i] = *in_exp ;
		i++;
		in_exp++;
	}
	string[i] = '#' ;

	for(i=0;string[i]!='#';i++)
	{
		/*判定string[i]为数值,直接存入bolan数组中
	    若string[i]为函数,则将该函数入栈stact中
		存入栈stact中变量func的是该函数的编号,详细编号见头文件
		若该函数前为数字,则在该函数入栈stact前加一次对'*'的处理*/
		if('a'<=string[i] && string[i]<='z' )
		{	
			if(string[i]=='a')
			{
				if(string[i+1]=='+' || 
				   string[i+1]=='-' || 
				   string[i+1]=='*'|| 
				   string[i+1]=='/' || 
				   string[i+1]=='\0'|| 
				   string[i+1]==')'|| 
				   string[i+1]=='#' )
				{
				//	UknowDigit = string[i];    //存入表达式中未知数
					bolan[j].value = string[i];              //存入表达式中未知数
					bolan[j].flag = 0 ;//标识该节点为未知数
					j++; 
					befordigit = 0 ;
					continue ;
				}
				else  //是以a开头的库函数
				{
					if(CheckFuncName(string ,i , "acos")&& string[i+1]>='a'&& string[i+1] <= 'z')   //为acos(x)函数,并将其入栈stack中
					{
						top++ ; 
						stack[top].flag = 2 ; 
						stack[top].func = 1 ;
						i-- ;    //因为在CheckFuncName函数中
						befordigit = 1 ;
						continue ; // i = i+strlen("acos") , i 已指向函数的下一个字符 , 所以要减1
					}
					if(CheckFuncName(string ,i , "asin")&& string[i+1]>='a'&& string[i+1] <= 'z')  //为asin(x)函数,并将其入栈stack中
					{
						top++ ;
						stack[top].flag = 2 ;
						stack[top].func = 2 ;
						i-- ;        //因为在CheckFuncName函数中 
						befordigit = 1 ;
						continue ;   // i = i+strlen("asin") , i 已指向函数的下一个字符 , 所以要减1
					}
					if(CheckFuncName(string ,i , "atan2")&& string[i+1]>='a'&& string[i+1] <= 'z')  //为atan2(x)函数,并将其入栈stack中
					{
						top++ ;
						stack[top].flag = 2 ;
						stack[top].func = 4;
						i-- ;        //因为在CheckFuncName函数中 
						befordigit = 1 ;
						continue ;   // i = i+strlen("atan2") , i 已指向函数的下一个字符 , 所以要减1
					}
					if(CheckFuncName(string ,i , "atan")&& string[i+1]>='a'&& string[i+1] <= 'z')  //为atan(y,x)函数,并将其入栈stack中
					{
						top++ ;
						stack[top].flag = 2 ;
						stack[top].func = 3 ;
						i-- ;        //因为在CheckFuncName函数中 
						befordigit = 1 ;
						continue ;   // i = i+strlen("atan") , i 已指向函数的下一个字符 , 所以要减1
					}
				} 
			}// if(string[i] == 'a')
			if(string[i] == 'c')
			{
				if (
					string[i+1]=='+' || 
					string[i+1]=='-' || 
					string[i+1]=='*'|| 
					string[i+1]=='/' || 
					string[i+1]=='\0'|| 
					string[i+1]==')' ||
					string[i+1]=='#'
				  )

				{
					//UknowDigit = string[i];    //存入表达式中未知数
					bolan[j].value = string[i];              //存入表达式中未知数
					bolan[j].flag = 0 ;//标识该节点为未知数
					j++;
					befordigit = 0 ;
					continue ;
				}
				else  //是以c开头的库函数
				{
					if(CheckFuncName(string ,i , "cosh")&& string[i+1]>='a'&& string[i+1] <= 'z')   //为cosh(x)函数,并将其入栈stack中
					{
						top++ ; 
						stack[top].flag = 2 ; 
						stack[top].func = 8 ;
						i-- ;    //因为在CheckFuncName函数中
						befordigit = 1 ;
						continue ; // i = i+strlen("cosh") , i 已指向函数的下一个字符 , 所以要减1
					}
					if(CheckFuncName(string ,i , "cos")&& string[i+1]>='a'&& string[i+1] <= 'z')   //为cos(x)函数,并将其入栈stack中
					{
						top++ ; 
						stack[top].flag = 2 ; 
						stack[top].func = 5 ;
						i-- ;    //因为在CheckFuncName函数中
						befordigit = 1 ;
						continue ; // i = i+strlen("cos") , i 已指向函数的下一个字符 , 所以要减1
					}
					if(CheckFuncName(string ,i , "ceil")&& string[i+1]>='a'&& string[i+1] <= 'z')   //为ceil(x)函数,并将其入栈stack中
					{
						top++ ; 
						stack[top].flag = 2 ; 
						stack[top].func = 19 ;
						i-- ;    //因为在CheckFuncName函数中
						befordigit = 1 ;
						continue ; // i = i+strlen("ceil") , i 已指向函数的下一个字符 , 所以要减1
					}
				}
			}//if(string[i] == 'c')
			if(string[i] == 's')
			{
				if(string[i+1]=='+' || 
					string[i+1]=='-' || 
					string[i+1]=='*'|| 
					string[i+1]=='/' || 
					string[i+1]=='\0'|| 
					string[i+1]==')'||
					string[i+1]=='#' )
				{
					//UknowDigit = string[i];    //存入表达式中未知数
					bolan[j].value = string[i];              //存入表达式中未知数
					bolan[j].flag = 0 ;//标识该节点为未知数
					j++;
					befordigit = 0 ;
					continue ;
				}
				else  //是以s开头的库函数
				{
					if(CheckFuncName(string ,i , "sinh")&& string[i+1]>='a'&& string[i+1] <= 'z')   //为sinh(x)函数,并将其入栈stack中
					{
						top++ ; 
						stack[top].flag = 2 ; 
						stack[top].func = 9 ;
						i-- ;    //因为在CheckFuncName函数中
						befordigit = 1 ;
						continue ; // i = i+strlen("sinh") , i 已指向函数的下一个字符 , 所以要减1
					}
					if(CheckFuncName(string ,i , "sin")&& string[i+1]>='a'&& string[i+1] <= 'z')   //为sin(x)函数,并将其入栈stack中
					{
						top++ ; 
						stack[top].flag = 2 ; 
						stack[top].func = 6 ;
						i-- ;    //因为在CheckFuncName函数中
						befordigit = 1 ;
						continue ; // i = i+strlen("sin") , i 已指向函数的下一个字符 , 所以要减1
					}
					if(CheckFuncName(string ,i , "sqrt")&& string[i+1]>='a'&& string[i+1] <= 'z')   //为sqrt(x)函数,并将其入栈stack中
					{
						top++ ; 
						stack[top].flag = 2 ; 
						stack[top].func = 18 ;
						i-- ;    //因为在CheckFuncName函数中
						befordigit = 1 ;
						continue ; // i = i+strlen("sqrt") , i 已指向函数的下一个字符 , 所以要减1
					}
				}
			}//if(string[i] == 's')
			if(string[i] == 't')
			{
				if(string[i+1]=='+' || 
					string[i+1]=='-' || 
					string[i+1]=='*'|| 
					string[i+1]=='/' || 
					string[i+1]=='\0'|| 
					string[i+1]==')'|| 
					string[i+1]=='#' )
				{
					bolan[j].value = string[i];              //存入表达式中未知数
					bolan[j].flag = 0 ;//标识该节点为未知数
					j++;
					befordigit = 0 ;
					continue ;
				}
				else  //是以t开头的库函数
				{
					if(CheckFuncName(string ,i , "tanh")&& string[i+1]>='a'&& string[i+1] <= 'z')   //为tanh(x)函数,并将其入栈stack中
					{
						top++ ; 
						stack[top].flag = 2 ; 
						stack[top].func = 10 ;
						i-- ;    //因为在CheckFuncName函数中
						befordigit = 1 ;
						continue ; // i = i+strlen("tanh") , i 已指向函数的下一个字符 , 所以要减1
					}
					if(CheckFuncName(string ,i , "tan")&& string[i+1]>='a'&& string[i+1] <= 'z')   //为tan(x)函数,并将其入栈stack中
					{
						top++ ; 
						stack[top].flag = 2 ; 
						stack[top].func = 7  ;
						i-- ;    //因为在CheckFuncName函数中
						befordigit = 1 ;
						continue ; // i = i+strlen("tan") , i 已指向函数的下一个字符 , 所以要减1
					}
				}
			}//if(string[i] == 't')
			if(string[i] == 'e')
			{
				if(string[i+1]=='+' || string[i+1]=='-' || string[i+1]=='*'|| string[i+1]=='/' || string[i+1]=='\0'|| string[i+1]==')'|| string[i+1] =='#')
				{
				//	UknowDigit = string[i];    //存入表达式中未知数
					bolan[j].value = string[i];              //存入表达式中未知数
					bolan[j].flag = 0 ;//标识该节点为未知数
					j++;
					befordigit = 0 ;
					continue ;
				}
				else  //是以e开头的库函数
				{
					if(CheckFuncName(string ,i , "exp")&& string[i+1]>='a'&& string[i+1] <= 'z')   //为exp(x)函数,并将其入栈stack中
					{
						top++ ; 
						stack[top].flag = 2 ; 
						stack[top].func = 11 ;
						i-- ;    //因为在CheckFuncName函数中
						befordigit = 1 ;
						continue ; // i = i+strlen("exp") , i 已指向函数的下一个字符 , 所以要减1
					}
				}
			} // if(string[i] == 'e')
			if(string[i] == 'f')
			{
				if(string[i+1]=='+' || string[i+1]=='-' || string[i+1]=='*'|| string[i+1]=='/' || string[i+1]=='\0'|| string[i+1]==')')
				{
					bolan[j].value = string[i];              //存入表达式中未知数
					bolan[j].flag = 0 ;//标识该节点为未知数
					j++;
					befordigit = 0 ;
					continue ;
				}
				else  //是以f开头的库函数
				{
					if(CheckFuncName(string ,i , "frexp")&& string[i+1]>='a'&& string[i+1] <= 'z')   //为frexp(x,eptr)函数,并将其入栈stack中
					{
						top++ ; 
						stack[top].flag = 2 ; 
						stack[top].func = 12 ;
						i-- ;    //因为在CheckFuncName函数中
						befordigit = 1 ;
						continue ; // i = i+strlen("frexp") , i 已指向函数的下一个字符 , 所以要减1
					}
					if(CheckFuncName(string ,i , "fabs")&& string[i+1]>='a'&& string[i+1] <= 'z')   //为fabs(x)函数,并将其入栈stack中
					{
						top++ ; 
						stack[top].flag = 2 ; 
						stack[top].func = 20 ;
						i-- ;    //因为在CheckFuncName函数中
						befordigit = 1 ;
						continue ; // i = i+strlen("fabs") , i 已指向函数的下一个字符 , 所以要减1
					}
					if(CheckFuncName(string ,i , "floor")&& string[i+1]>='a'&& string[i+1] <= 'z')   //为floor(x)函数,并将其入栈stack中
					{
						top++ ; 
						stack[top].flag = 2 ; 
						stack[top].func = 21 ;
						i-- ;    //因为在CheckFuncName函数中
						befordigit = 1 ;
						continue ; // i = i+strlen("floor") , i 已指向函数的下一个字符 , 所以要减1
					}
					if(CheckFuncName(string ,i , "fmod")&& string[i+1]>='a'&& string[i+1] <= 'z')   //为fmod(x,y)函数,并将其入栈stack中
					{
						top++ ; 
						stack[top].flag = 2 ; 
						stack[top].func = 22 ;
						i-- ;    //因为在CheckFuncName函数中
						befordigit = 1 ;
						continue ; // i = i+strlen("fmod") , i 已指向函数的下一个字符 , 所以要减1
					}
				}
			}//if(string[i] == 'f')
			if(string[i] == 'l')
			{
				if(string[i+1]=='+' || string[i+1]=='-' || string[i+1]=='*'|| string[i+1]=='/' || string[i+1]=='\0'|| string[i+1]==')')
				{
					bolan[j].value = string[i];              //存入表达式中未知数
					bolan[j].flag = 0 ;//标识该节点为未知数
					j++;
					befordigit = 0 ;
					continue ;
				}
				else  //是以l开头的库函数
				{
					if(CheckFuncName(string ,i , "ldexp")&& string[i+1]>='a'&& string[i+1] <= 'z')   //为ldexp(x,n)函数,并将其入栈stack中
					{
						top++ ; 
						stack[top].flag = 2 ; 
						stack[top].func = 13 ;
						i-- ;    //因为在CheckFuncName函数中
						befordigit = 1 ;
						continue ; // i = i+strlen("ldexp") , i 已指向函数的下一个字符 , 所以要减1
					}
					if(CheckFuncName(string ,i , "log")&& string[i+1]>='a'&& string[i+1] <= 'z')   //为log(x)函数,并将其入栈stack中
					{
						top++ ; 
						stack[top].flag = 2 ; 
						stack[top].func = 14 ;
						i-- ;    //因为在CheckFuncName函数中
						befordigit = 1 ;
						continue ; // i = i+strlen("log") , i 已指向函数的下一个字符 , 所以要减1
					}
					if(CheckFuncName(string ,i , "log10")&& string[i+1]>='a'&& string[i+1] <= 'z')   //为log10(x)函数,并将其入栈stack中
					{
						top++ ; 
						stack[top].flag = 2 ; 
						stack[top].func = 15 ;
						i-- ;    //因为在CheckFuncName函数中
						befordigit = 1 ;
						continue ; // i = i+strlen("log10") , i 已指向函数的下一个字符 , 所以要减1
					}	
				}
			}//if(string[i] == 'l')
			if(string[i] == 'm' )
			{
				if(string[i+1]=='+' || string[i+1]=='-' || string[i+1]=='*'|| string[i+1]=='/' || string[i+1]=='\0'|| string[i+1]==')')
				{
					bolan[j].value = string[i];              //存入表达式中未知数
					bolan[j].flag = 0 ;//标识该节点为未知数
					j++;
					befordigit = 0 ;
					continue ;
				}
				else  //是以m开头的库函数
				{
					if(CheckFuncName(string ,i , "modf")&& string[i+1]>='a'&& string[i+1] <= 'z')   //为modf(x,y)函数,并将其入栈stack中
					{
						top++ ; 
						stack[top].flag = 2 ; 
						stack[top].func = 16 ;
						i-- ;    //因为在CheckFuncName函数中
						befordigit = 1 ;
						continue ; // i = i+strlen("modf") , i 已指向函数的下一个字符 , 所以要减1
					}
				}
			}//if(string[i] == 'm')
			if(string[i] == 'p')
			{
				if(string[i+1]=='+' || 

⌨️ 快捷键说明

复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?