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