求用c程序编写中学数学函数源程序~~~~~~~~~悬赏100分

求用c程序编写中学数学函数源程序~~~~~~~~~悬赏100分,第1张

恩,这个问题写起来不简单。

而且lz还是要求的还是带参数值运算。

我以前写过数值的表达式运算,您可以参考一下:

[表达式求值]

经过上面的叙述,难点落在了表达式求值上,在这里我们介绍一下最一般、最简单的方法,栈运算。

用栈实现表达式求值的方法:

首先,我们要给每一个符号一个优先级:

符号 + - / ^ ( )

栈内级别 2 4 6 0 8

栈外级别 1 3 5 8 0

可以看到,优先级高的符号先算。为了方便起见,我们定义特殊符号#,它级别最低(赋-1)

先将它置栈底,然后依次读入每个字符,如果是数字则入数栈。如果是符号,就与栈顶符号比较优先级。

如果相等,则退栈,读下一字符。如果栈外大,则入栈。

如果栈内大,则取栈顶元素与数栈最顶2元素运算,结果入数栈。这个符号继续处理(再与栈顶比较)。

直到读到最后符号#使栈底#出栈时。数栈顶即为表达式结果。

由此,本题已经变得清晰了,剩下的就是具体将我们的表述变成代码。

下面是double类型的表达式运算(完整版本)

/

tc

Created on: 2009-3-9

Author: T

/

#include<stdioh>

#include<ctypeh>

#include<stdlibh>

#include<stringh>

#include<mathh>

int i,j,k,n,l;

char s[200];

void U(chars){

chart;

int i=-1,j=0,k,g;

//去掉多余空格

for(t=(char)malloc(strlen(s)+1);s[++i];)if(s[i]!=' ')t[j++]=s[i];

//去掉多余加减

for(i=j=t[j]=0;t[i];)if(t[i]=='+'||t[i]=='-'){

g=1;

for(k=i;t[k]&&(t[k]=='+'||t[k]=='-');k++)if(t[k]-'+')g=-g;

s[j++]=g<0'-':'+';

i=k;

}else s[j++]=t[i++];

s[j++]=')';

s[j]=0;

//把"atan2"变为"atanZ","log10"变为"loglO"

for(;(t=strstr(s,"atan2"))!=NULL;)t[4]='Z';

for(;(t=strstr(s,"log10"))!=NULL;t[4]='O')t[3]='l';

}

//求前n项最大的

double max(doubles,int i){

int t=s;

for(;i--;)if(t<s[i])t=s[i];

return t;

}

double min(doubles,int i){

int t=s;

for(;i--;)if(s[i]<t)t=s[i];

return t;

}

//记录函数类型

int R(chars,int i){

char t[10];

int j;

for(j=i;0<j&&isalpha(s[j-1]);)j--;

strncpy(t,s+j,i-j);

t[i-j]=0;

//以下为函数库自带的部分数学函数

if (!strcmp("abs",t)) return 1;//abs() 求绝对值

if (!strcmp("acos",t)) return 2;//acos() 求反余弦

if (!strcmp("asin",t)) return 3;//asin() 求反正弦

if (!strcmp("atan",t)) return 4;//atan() 求反正切

if (!strcmp("atanZ",t)) return 5;//atan2() 求反正切,按符号判定象限

if (!strcmp("ceil",t)) return 6;//ceil() 求不小于某值的最小整数 (求上界)

if (!strcmp("cos",t)) return 7;//cos() 求余弦

if (!strcmp("cosh",t)) return 8;//cosh() 求双曲余弦

if (!strcmp("exp",t)) return 10;//exp() 求e的幂

if (!strcmp("fabs",t)) return 11;//fabs() 求浮点数的绝对值

if (!strcmp("floor",t)) return 12;//floor() 求不大于某值的最大整数 (求下界)

if (!strcmp("mod",t)) return 13;//fmod() 求模数

if (!strcmp("log",t)) return 18;//log() 自然对数

if (!strcmp("loglO",t)) return 19;//log10() 以10为底的自然对数

if (!strcmp("pow",t)) return 21;//pow() 求幂

if (!strcmp("sin",t)) return 22;//sin() 求正弦

if (!strcmp("sinh",t)) return 23;//sinh() 求双曲正弦

if (!strcmp("sqrt",t)) return 24;//sqrt() 求平方根

if (!strcmp("tan",t)) return 25;//tan() 求正切

if (!strcmp("tanh",t)) return 26;//tanh() 求双曲正切

//以下为自己补充的函数

if (!strcmp("max",t)) return 101;//max() 求最大值

if (!strcmp("min",t)) return 102;//min() 求最小值

return 0;

}

//函数计算

double F(doublem,int k,int l){

double v=m;

switch(k){

case 1: return(fabs(v));

case 2: return(acos(v));

case 3: return(asin(v));

case 4: return(atan(v));

case 5: return(atan2(m[1],v));

case 6: return(ceil(v));

case 7: return(cos(v));

case 8: return(cosh(v));

case 10: return(exp(v));

case 11: return(fabs(v));

case 12: return(floor(v));

case 13: return(fmod(m[1],v));

case 18: return(log(v));

case 19: return(log10(v));

case 21: return(pow(m[1],v));

case 22: return(sin(v));

case 23: return(sinh(v));

case 24: return(sqrt(v));

case 25: return(tan(v));

case 26: return(tanh(v));

case 101: return(max(m,l));

case 102: return(min(m,l));

}

return v;

}

//表达式计算

//o[]为运算符号栈,n[]为数字栈,r[]为函数栈,m[]为逗号栈

double C(chars){

int r[128],o[128]={-2},i=1,j=0,k=-1,l;

double n[64],t,m[64];

char v[128],c;

v[',']=2;

v['+']=4; v['-']=5;

v['']=6; v['/']=7;

v['^']=8;

v['(']=10;v[')']=0;

memset(n,0,512);

for(U(s);(c=s[++k]);){

for(;isalpha(c);)c=s[++k];

if(isdigit(c)||c==''){

n[j]=atof(s+k);

for(;isdigit(s[k+1])||s[k+1]=='';)k++;

}

else{

for(l=0;v[c]/2<=o[i-1]/2;){

t=n[j]; n[j--]=0; i--;

if(o[i]==0){

m[l++]=t;

n[j]=F(m,r[i],l);

break;

}

if(o[i]==1)m[l++]=t;

if(o[i]==4)n[j]+=t;

if(o[i]==5)n[j]-=t;

if(o[i]==6)n[j]=t;

if(o[i]==7)n[j]/=t;

if(o[i]==8)n[j]=pow(n[j],t);

}

if(v[c]){

r[i]=R(s,k);

o[i++]=c-'('c-','v[c]:1:0;

j++;

}

}

}

return n[0];

}

int main(){

gets(s);

printf("%f\n",C(s));

return 0;

}

# include< stdioh>

# include<mathh>

int main()

{ double x,y;

scanf(“%lf”&x);

y=(2xx-1)/(fabs( e^2x-tanx)+1);

printf(“fun(x)=%3f”,y);

retuen 0;

}

就上面这一段,你照着打试试。不要直接复制粘贴,符号可能不符。

以上就是关于求用c程序编写中学数学函数源程序~~~~~~~~~悬赏100分全部的内容,包括:求用c程序编写中学数学函数源程序~~~~~~~~~悬赏100分、编写一个程序,用于计算以下数学表达式、等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!

欢迎分享,转载请注明来源:内存溢出

原文地址:https://54852.com/zz/9609998.html

(0)
打赏 微信扫一扫微信扫一扫 支付宝扫一扫支付宝扫一扫
上一篇 2023-04-30
下一篇2023-04-30

发表评论

登录后才能评论

评论列表(0条)

    保存