续上文中的头文件fx.h
//----------------------------------------------------------------
int DoNum(char format)
{
double NowNum=0;
if(flag==-1){NumStack.push(double(format-'0'));flag=0;}
else if(flag==0)
{
double NowNum=NumStack.pop();
NowNum=NowNum*10+double(format-'0');
NumStack.push(NowNum);
}
else
{
NowNum=NumStack.pop();
NowNum=NowNum+pow(0.1,flag++)*double(format-'0');
NumStack.push(NowNum);
}
return 0;
}
//-----------------------------------------------------
bool FuncOver(char *format,int i)
{
switch(format[i])
{
case '0': case '1': case '2': case '3': case '4':
case '5': case '6': case '7': case '8': case '9':
case '.': case '+': case '-': case '*': case '/':
case '^': case '~': case '(': case ')':
return true;break;
default : return false;break;
}
}
//-----------------------------------------------------
int DoFunction(char *Func)
{
struct stack F;
F.value=FUNC;
if(stricmp(Func,"sin")==0)
F.sign='s';
else if(stricmp(Func,"cos")==0)
F.sign='c';
else if(stricmp(Func,"tan")==0)
F.sign='t';
else if(stricmp(Func,"cot")==0)
F.sign='C';
else if(stricmp(Func,"exp")==0)
F.sign='e';
else if(stricmp(Func,"abs")==0)
F.sign='a';
else if(stricmp(Func,"lg")==0)
F.sign='l';
else if(stricmp(Func,"ln")==0)
F.sign='L';
else if(stricmp(Func,"sqrt")==0)
F.sign='S';
else return 0;
while(!OpeStack.empty())
{
struct stack p=OpeStack.get();
if(p.value>=F.value)
{
dealwith(p.sign);
OpeStack.pop();
}
else break;
}
OpeStack.push(F);
return 0;
}
//-----------------------------------------------------
double f(char *format,double x)
{
int i,FuncNum=0;
char Func[10];
for(i=0;*(format+i)!='\0';i++)
{
switch(*(format+i))
{
case 'x':
case 'X':
if(format[i-1]=='e'||format[i-1]=='E')
{ Func[FuncNum++]=*(format+i);
Func[FuncNum]='\0';
if(FuncOver(format,i+1)==true)
{
DoFunction(Func);
FuncNum=0;
flag=-1;
}}
else NumStack.push(x);flag=-1;
continue;
case '+':
case '-':if(i==0||format[i-1]=='(')NumStack.push(0);
case '*':
case '/':
case '^':
case '(':
case ')':DoOpe(*(format+i));flag=-1;continue;
case '.':flag=1;continue;
case '0':
case '1':
case '2':
case '3':
case '4':
case '5':
case '6':
case '7':
case '8':
case '9':DoNum(*(format+i));continue;
case 'a': case 'b': case 'c': case 'd':
case 'e': case 'f': case 'g': case 'h':
case 'i': case 'j': case 'k': case 'l':
case 'm': case 'n': case 'o': case 'p':
case 'q': case 'r': case 's': case 't':
case 'u': case 'v': case 'w': case 'y'://没有x
case 'z':
case 'A': case 'B': case 'C': case 'D':
case 'E': case 'F': case 'G': case 'H':
case 'I': case 'J': case 'K': case 'L':
case 'M': case 'N': case 'O': case 'P':
case 'Q': case 'R': case 'S': case 'T':
case 'U': case 'V': case 'W': case 'Y'://没有X
case 'Z':
Func[FuncNum++]=*(format+i);
Func[FuncNum]='\0';
if(FuncOver(format,i+1)==true)
{
DoFunction(Func);
FuncNum=0;
flag=-1;
}
continue;
default :continue;
}
}
solvestack('=');
double aa=NumStack.get();
NumStack.clear();
OpeStack.clear();
flag=-1;
return aa;
}
//-------以下函数df(char *format,double x)用于求函数表达式为
//-------format在x点的导数值.
double df(char *format,double x)
{
double h=1e-6;
double x0=x,x1=x+h,x2=x+h*2;
return (-3*f(format,x0)+4*f(format,x1)-f(format,x2))/2/h;