写一个函数用递归函数的方法计算7求大神帮忙

碰到一个题用C写一个简易计算器,没思路啊求大神指导 - C语言当前位置:& &&&碰到一个题用C写一个简易计算器,没思路啊求大神指导碰到一个题用C写一个简易计算器,没思路啊求大神指导&&网友分享于:&&浏览:116次遇到一个题用C写一个简易计算器,没思路啊,求大神指导用C写一个函数实现简单计算器功能,输入一个数学表达式需要支持加、减、乘、除运算,不需要支持括号。 要求支持一个表达式:input:8+9 output:17input:-0.1*9
output:-0.9可选:支持多个表达式input: 2.5+2.5+2.5
output :7.5input: 2+2*2.5-1.5*2
output :4------解决方案--------------------switch语句就可以完成了,自己试着动手做下,很简单的
------解决方案--------------------主要是楼主从输入信息中提取出数据和操作符。然后使用楼上说的switch来做都可以的
------解决方案--------------------用栈就行了,例子如下1+2*3首先是简单的词法分析得到词素:&1&, &+&, &2&, &*&, &3&然后根据优先级法则构建语法树:
&3&然后用栈执行这个语法树即可。
------解决方案--------------------《C++程序设计语言》第6章有个桌面计算器的实现,参考一下吧。
------解决方案--------------------http://blog.csdn.net/kuzuozhou/article/details/7179188腾讯考过该题,参见我的博客。上面是链接
------解决方案--------------------the c programming language 有一个简单的expert c programming 有一个upgrading 版
------解决方案--------------------C/C++ code
/*---------------------------------------
函数型计算器(VC++6.0,Win32 Console)程序由 yu_hua 于设计完成
目前提供了10多个常用数学函数:
⑷开平方sqrt
⑸反正弦arcsin
⑹反余弦arccos
⑺反正切arctan
⑻常用对数lg
⑼自然对数ln
⑽e指数exp
⑾乘幂函数∧
如果要求2的32次幂,可以打入2^32&回车&
如果要求30度角的正切可键入tan(Pi/6)&回车&
注意不能打入:tan(30)&Enter&
如果要求1.23弧度的正弦,有几种方法都有效:
sin(1.23)&Enter&
sin 1.23 &Enter&
如果验证正余弦的平方和公式,可打入sin(1.23)^2+cos(1.23)^2 &Enter&或sin1.23^2+cos1.23^2 &Enter&
此外两函数表达式连在一起,自动理解为相乘如:sin1.23cos0.77+cos1.23sin0.77就等价于sin(1.23)*cos(0.77)+cos(1.23)*sin(0.77)
当然你还可以依据三角变换,再用sin(1.23+0.77)也即sin2验证一下。
本计算器充分考虑了运算符的优先级因此诸如:2+3*4^2 实际上相当于:2+(3*(4*4))
另外函数名前面如果是数字,那么自动认为二者相乘.
同理,如果某数的右侧是左括号,则自动认为该数与括弧项之间隐含一乘号。
如:3sin1.2^2+5cos2.1^2 相当于3*sin2(1.2)+5*cos2(2.1)
又如:4(3-2(sqrt5-1)+ln2)+lg5 相当于4*(3-2*(√5 -1)+loge(2))+log10(5)
此外,本计算器提供了圆周率 Pi键入字母时不区分大小写,以方便使用。
----------------------------------------*/
#include &iostream&
#include &iomanip&
#include &cstdlib&
#include &cstring&
#include &cctype&
#include &cmath&
#include &stdio.h&
#include &string.h&
#include &windows.h&
const char Tab=0x9;
const int MAXLEN=16384;
char s[MAXLEN],*
int pcs=15;
double fun(double x,char op[],int *iop) {
while (op[*iop-1]&32) //本行使得函数嵌套调用时不必加括号,如 arc sin(sin(1.234)) 只需键入arc sin sin 1.234&Enter&
switch (op[*iop-1]) {
7: x=sin(x);
8: x=cos(x);
9: x=tan(x);
case 10: x=sqrt(x); (*iop)--;
case 11: x=asin(x); (*iop)--;
case 12: x=acos(x); (*iop)--;
case 13: x=atan(x); (*iop)--;
case 14: x=log10(x);(*iop)--;
case 15: x=log(x);
case 16: x=exp(x);
double calc(char *expr,char **addr) {
//递归深度
static char *fname[]={ &sin&,&cos&,&tan&,&sqrt&,&arcsin&,&arccos&,&arctan&,&lg&,&ln&,&exp&,NULL};
double ST[10]={0.0}; //数字栈
char op[10]={'+'}; //运算符栈
char c,*rexp,*pp,*
int ist=1,iop=1,
if (!deep) {
c = *pp++;
if (c!=' '&& c!=Tab)
} while (c!='\0');
if ((c=*pp)=='-'||c=='+') {
last = !DIGIT;
while ((c=*pp)!='\0') {
if (c=='(') {//左圆括弧
ST[ist++]=calc(++pp,addr);
ST[ist-1]=fun(ST[ist-1],op,&iop);
last = DIGIT;
if (*pp == '('||isalpha(*pp) && strnicmp(pp,&Pi&,2)) {//目的是:当右圆括弧的右恻为左圆括弧或函数名字时,默认其为乘法
op[iop++]='*';
last = !DIGIT;
c = op[--iop];
else if (c==')') {//右圆括弧
} else if (isalpha(c)) {
if (!strnicmp(pp,&Pi&,2)) {
if (last==DIGIT) {
cout&& &π左侧遇)& &&exit(1);
ST[ist++]=3.38328;
ST[ist-1]=fun(ST[ist-1],op,&iop);
last = DIGIT;
if (!strnicmp(pp,&Pi&,2)) {
cout&& &两个π相连& &&exit(2);
if (*pp=='(') {
cout&& &π右侧遇(& &&exit(3);
for(int i=0; (pf=fname[i])!=NULL; i++)
if (!strnicmp(pp,pf,strlen(pf)))
if (pf!=NULL) {
op[iop++] = 07+i;
pp += strlen(pf);
cout&& &陌生函数名& &&exit(4);
} else if (c=='+'||c=='-'||c=='*'||c=='/'||c=='^') {
if (last != DIGIT) {
cout&& &运算符粘连& &&exit(5);
if (c=='+'||c=='-') {
cc = op[--iop];
switch (cc) {
ST[ist-1] += ST[ist];
ST[ist-1] -= ST[ist];
ST[ist-1] *= ST[ist];
ST[ist-1] /= ST[ist];
ST[ist-1] = pow(ST[ist-1],ST[ist]);
} while (iop);
op[iop++] =
} else if (c=='*'||c=='/') {
cc = op[iop-1];
if (cc=='+'||cc=='-') {
op[iop++] =
op[iop-1] =
switch (cc) {
ST[ist-1] *= ST[ist];
ST[ist-1] /= ST[ist];
ST[ist-1] = pow(ST[ist-1],ST[ist]);
cc = op[iop-1];
if (cc=='^') {
cout&& &乘幂符连用& &&exit(6);
op[iop++] =
last = !DIGIT;
if (last == DIGIT) {
cout&& &两数字粘连& &&exit(7);
ST[ist++]=strtod(pp,&rexp);
ST[ist-1]=fun(ST[ist-1],op,&iop);
if (pp == rexp) {
cout&& &非法字符& &&exit(8);
last = DIGIT;
if (*pp == '('||isalpha(*pp)) {
op[iop++]='*';
last = !DIGIT;
c = op[--iop];
if (iop&=ist) {
cout&& &表达式有误& &&exit(9);
while (iop) {
switch (op[--iop]) {
ST[ist-1] += ST[ist];
ST[ist-1] -= ST[ist];
ST[ist-1] *= ST[ist];
ST[ist-1] /= ST[ist];
ST[ist-1] = pow(ST[ist-1],ST[ist]);
return ST[0];
int main(int argc,char **argv) {
if (argc&=1) {
if (GetConsoleOutputCP()!=936) system(&chcp 936&NUL&);//中文代码页
cout && &计算函数表达式的值。&&&endl&&&支持(),+,-,*,/,^,Pi,sin,cos,tan,sqrt,arcsin,arccos,arctan,lg,ln,exp&&&
while (1) {
cout && &请输入表达式:&;
if (s[0]==0)//
cout && s &&&=&;
cout && setprecision(15) && calc(s,&endss) &&
strncpy(s,argv[1],MAXLEN-1);s[MAXLEN-1]=0;
if (argc&=3) {
pcs=atoi(argv[2]);
if (pcs&0||15&pcs) pcs=15;
printf(&%.*lf\n&,pcs,calc(s,&endss));
printf(&%.15lg\n&,calc(s,&endss));
} 共&2&页:
12345678910
12345678910
12345678910 上一篇:下一篇:文章评论相关解决方案 12345678910 Copyright & &&版权所有C语言:采用递归调用函数方法计算Fibonacci数列_百度文库
两大类热门资源免费畅读
续费一年阅读会员,立省24元!
C语言:采用递归调用函数方法计算Fibonacci数列
百家号是全球最大中文搜索引擎百度为内容创...|
总评分0.0|
阅读已结束,下载文档到电脑
想免费下载更多文档?
定制HR最喜欢的简历
你可能喜欢用递归的方法,求四分之一圆的面积? - 知乎5被浏览498分享邀请回答05 条评论分享收藏感谢收起

我要回帖

更多关于 sql写递归函数 的文章

 

随机推荐