怎样用C语言设计一个简单的计算器

xianzhiye 2010-05-09 10:59:22
用C语言设计一个简单的计算器,要求能够对输入的数

1.进行+,-,*,/,运算;

2.可以带括号( );

3.不限定运算式的输入长度.

例如:输入:123+213-67*34+345/23*45*(34+34-345+245+567)回车,
然后程序计算得出结果为:359183

注:(能不能用字符串或字符来实现啊?大家帮帮忙吧,给个代码吧。确实是作业,本想自己做自己想,不过很紧,所以请大家帮一下。给个代码,让我参考一下,谢谢大家了!!!)
...全文
2303 17 打赏 收藏 转发到动态 举报
写回复
用AI写文章
17 条回复
切换为时间正序
请发表友善的回复…
发表回复
reddevillg 2010-05-10
  • 打赏
  • 举报
回复
利用栈实现,数据结构的书上一般有。
elated 2010-05-10
  • 打赏
  • 举报
回复
给我多加点分我就给你
还有,最好先自己想想怎么写
匚匚 2010-05-10
  • 打赏
  • 举报
回复
结果完全正确,而且还可以阶乘、乘方、开方即1/N次方,函数运算如:sin30*cos60 ,exp1等等,当然函数还可自行扩展
匚匚 2010-05-10
  • 打赏
  • 举报
回复
http://blog.csdn.net/zhw952/archive/2010/04/27/5536627.aspx
qq675927952 2010-05-10
  • 打赏
  • 举报
回复
题目在:http://acm.scs.bupt.cn/onlinejudge/showproblem.php?problem_id=1511



#include <iostream>
#include <stack>
using namespace std;
string s;
stack <char> op;
stack <double> dg;
int priority(char c)
{
switch(c)
{
case '+': return 2;
case '-': return 2;
case '*': return 3; //最高
case '/': return 3;
case '=': return 1; //最低
default : return 0;
}

}

double opt(double x,double y,char c)
{
switch(c)
{
case '+':return x+y;
case '-':return x-y;
case '*':return x*y;
case '/':return x/y;
default: break;
}
return 0;
}


int main()
{
// scanf("%s",s);
cin>>s;
int len = s.length();
char temp[101];
int j=0;
for(int i=0; i<len; i++)
{
switch(s[i])
{
case ' ':
{
temp[j]='\0';
if(j>0)
{
int t = atoi(temp);
dg.push(t);
cout<<t<<endl;
}
j=0;
break;
}

case '+':
case '-':
case '*':
case '/':
case '=':
{
while(!op.empty() && priority(s[i])<=priority(op.top()))
{
double y = dg.top();dg.pop();
double x = dg.top();dg.pop();
char c = op.top();op.pop();
double z = opt(x, y, c);
dg.push(z);
}
op.push(s[i]);
cout<<s[i]<<endl;
break;
}
default:
{
temp[j++] =s[i];
}
}

}
cout<<dg.top()<<endl;
system("pause");
return 0;
}





希望对你有些帮助。。。
qq675927952 2010-05-10
  • 打赏
  • 举报
回复
中序表达转换成后序表达式的方法:

从左到右读取该中弱序表达式:

1.若是操作数,则直接输出.

2.若是运算符:
(1)若该运算符为"(",则直接入栈.
(2)若该运算符为")",则取出堆栈中的运算符,直到"("时.
(3)其它: 按优先级比较,如果大于或等于堆栈中当前的运算则压入栈中,否则直接输出.
(4)检查栈是否非空,如果非空,则输出所有值,直到空为止.



栈运算。维护一个变量栈和一个符号栈(数字认为是变量)

符号 栈内优先级 栈外优先级
+ - 2 1
* / 4 3
^ 6 5
( 0 8
) 8 0

可以看到,优先级高的符号先算。为了方便起见,先在表达式两边加括号。
依次读入每个字符,如果是变量则入变量栈。如果是符号,就与栈顶符号比较优先级。
如果相等,则同时退栈(不处理,读下一字符)。
如果栈外大,则入栈。
如果栈内大,则以栈内符号为根,变量栈最顶2元素成为他的孩子(该2变量退栈),创建一个新的变量代表这颗以该符号为根,两变量为孩子的树。同时栈外的这个符号保留,继续与栈顶比较。

还原成树结构,取出变量栈中的最后一个元素(如果表达式合法,此时符号栈应为空,变量栈仅有1个变量),依次扩展,具体可以使用以下数据结构:

(我是学PASCAL的,不会C,所以用PASCAL语言写出来咯。。。)

type
pnode=^node;
node=record
leftchild,rightchild:pnode;
va:string
end;
其中va域表示子树根里面记载的变量,leftchild和rightchild指向左子树和右子树。

以你给的(a-b)*(c+d)为例
左右先加括号变成((a-b)*(c+d))
读入(,(,a,-,b,),*,(,c,+,d,),)
时进行了如下操作
(入栈,(入栈,a入栈,-入栈[-比(优先级大],b入栈,
)处理时,因为)优先级比-小,取出a,b,-,创建变量p入变量栈,p(va='-',^leftchild.va='a',^rightchild.va='b').
继续处理),此时栈外)与栈内(优先级相等,同时退栈,继续,
*入栈,(入栈,c入栈................................
直到)处理完c+d后,处理*,创建变量p2,p2(va='*',leftchild=p,rightchild=p1[p1是c+d处理得到的])
接着)退栈,最后边的)也和最左边的(一起退栈,此时表达式处理完毕,符号栈为空,变量栈有一个变量p2

p2记录了完整的二叉树,还原后得到了

*
- +
a b c d
zhangzhongke007 2010-05-10
  • 打赏
  • 举报
回复
C语言里有按位操作啊,可以考虑下。其他的应该比较容易。自己动手,丰衣足食!
ThirtyFantasy 2010-05-10
  • 打赏
  • 举报
回复
6楼 7楼 正解,可以到网上查一下具体做法。
zhun_716 2010-05-10
  • 打赏
  • 举报
回复
实现加减等的逻辑就是用一个switch case语句就ok了。很简单的。
guguangshuai1987 2010-05-10
  • 打赏
  • 举报
回复
网上有代码。
shiweifu 2010-05-10
  • 打赏
  • 举报
回复
我咋记得前两天回答过一个类似问题?
参考C程序设计语言中的逆波兰式
cattycat 2010-05-10
  • 打赏
  • 举报
回复
数据结构的书上应该有吧,用栈实现,中追表达式转后缀表达式计算求值。
你找找吧,网上有代码。
delphiwcdj 2010-05-10
  • 打赏
  • 举报
回复
转化为逆波兰式
vanchristin 2010-05-10
  • 打赏
  • 举报
回复
利用栈
把中缀表达式转换成后缀表达式
再求值

输入是字符串,把数据和运算符提取出来,依次处理
xianzhiye 2010-05-09
  • 打赏
  • 举报
回复
那能不能用字符串或字符来实现啊?
xianzhiye 2010-05-09
  • 打赏
  • 举报
回复
那怎样实行+—*/和()等的逻辑啊
z569362161 2010-05-09
  • 打赏
  • 举报
回复
最简单的小程序了。

几个选择就解决的问题。

还是你自己解决吧

69,371

社区成员

发帖
与我相关
我的任务
社区描述
C语言相关问题讨论
社区管理员
  • C语言
  • 花神庙码农
  • 架构师李肯
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧