c语言 c语言实现四则运算算器连续运算问题……怎么解决?

问题已关闭
代为完成的个人任务
提问需要满足:其他人可能遇到相似问题,或问题的解决方法对其他人有所助益。如果通过其他方式解决遇到困难,欢迎提问并说明你的求知过程。
C语言设计简单计算器的问题?
前面的代码看懂了,自己也敲了一遍,可是后面的思考题真心解决不了!!!求助!&img data-rawwidth=&2448& data-rawheight=&3264& src=&/607ece26e717f_b.jpeg& class=&origin_image zh-lightbox-thumb& width=&2448& data-original=&/607ece26e717f_r.jpeg&&&img data-rawwidth=&2448& data-rawheight=&3264& src=&/ef4ff7aeb8e3f337d3fe193_b.jpeg& class=&origin_image zh-lightbox-thumb& width=&2448& data-original=&/ef4ff7aeb8e3f337d3fe193_r.jpeg&&&img data-rawwidth=&2448& data-rawheight=&3264& src=&/c2c68e774cbc8f1ad67fce_b.jpeg& class=&origin_image zh-lightbox-thumb& width=&2448& data-original=&/c2c68e774cbc8f1ad67fce_r.jpeg&&
前面的代码看懂了,自己也敲了一遍,可是后面的思考题真心解决不了!!!求助!…
按投票排序
谢邀。第一题比较简单就不说了。第二题,遇到乘除就调一个子函数即可:if op=='*' or op=='/':Sum+=Cal(x)这个Cal(x)就是一个只处理乘除的函数,碰到加减或者输入结束就返回。第三题,把整个之前的main函数封装成一个sub函数,碰到‘('就调用它自身,碰到')'就返回值。int sub():......if op=='(':Sum+=sub()elif op==')':return Sum....int main()print sub()return 0
你可以试试逆波兰表达式,我之前写玩具编译器里面operation操作的时候就是用的它。大概意思就是把中缀表达式变成后缀表达式,这基本就可以完成所有的运算了,包括四则运算和带括号的优先级。具体介绍在这里:()至于如何将中缀表达式变成后缀表达式的,可以看这个知乎问题:
我数学不好你可不要骗我我数学不好你可不要骗我没有优先级那简单啊我给个核心代码scanf("%d", &num);
result = num;
scanf("%c", &op);
switch(op)
scanf("%d", &num);
result += num;
//case '-':case'*':case'/'和错误判断自己写
if(op == '=')
printf("%d", result);
break;//for(;;)
已有帐号?
无法登录?
社交帐号登录如何用简单的C语言实现带有括号的四则运算
[问题点数:40分]
如何用简单的C语言实现带有括号的四则运算
[问题点数:40分]
不显示删除回复
显示所有回复
显示星级回复
显示得分回复
只显示楼主
2013年 总版技术专家分年内排行榜第三
2012年 总版技术专家分年内排行榜第七
本帖子已过去太久远了,不再提供回复功能。> 用c语言实现简易的计算器四则运算的代码最好用栈方法实现,该怎么解决
用c语言实现简易的计算器四则运算的代码最好用栈方法实现,该怎么解决
simonhb & &
发布时间: & &
浏览:1 & &
回复:1 & &
悬赏:0.0希赛币
用c语言实现简易的计算器四则运算的代码最好用栈方法实现要求用上数据结构里栈的方法,应该是用上数组和指针吧,请高手们多多赐教啊,越快越好啊在这谢谢啦!!!!
  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));
}simonlxm & &
23:52:44 & &
& & (0)(0)
本问题标题:
本问题地址:
温馨提示:本问题已经关闭,不能解答。
暂无合适的专家
&&&&&&&&&&&&&&&
希赛网 版权所有 & &&四则运算之加减法
计算机所能完成的一个基本功能就是完成数据的计算,譬如加法、减法等等。但是在任何一种计算机上,计算中能够使用的数字都是有一定范围的,超过了范围,就没法得到精确的结果。
你现在接受了一个任务,要编写一个高精度计算器的核心部分。所谓高精度计算器,就是可以计算很大很大的数据的计算器。而你所需要编写的程序,就是真正完成高精度加法和高精度减法运算的两个函数,因为程序其它的部分已经由别人编写好了。
函数的输入、输出接口也已经定义完成,譬如 plus() 函数,它有三个参数 a、b 和 c,都是 char * 类型。a 和 b 分别是参加运算的两个整数,而 c 用来存放运算的结果。所有的数字都是以字符串的形式保存的。
注意,只需提交你自己编写的两个函数。
输入的每一行是两个十进制的正整数和一个运算符,每个整数可以由最多 500 个数字组成。运算符可以是加号或者减号。
对应着输入的每一行数据,输出计算的结果,每个结果占一行。
view plainprint?
/*PRESETCODEBEGIN-NEVERTOUCHCODEBELOW*/
voidplus(char*a,char*b,char*c);
voidminus(char*a,char*b,char*c);
chara[1000];
charb[1000];
charc[1000];
while(scanf(&%s%s%s\n&,a,s,b)==3){
if(s[0]==&#39;+&#39;){
plus(a,b,c);
}elseif(s[0]==&#39;-&#39;){
minus(a,b,c);
printf(&%s\n&,c);
/*PRESETCODEEND-NEVERTOUCHCODEABOVE*/
测试用例 1
以文本方式显示
以文本方式显示
大致思路:
我用的思路是,先将a,b两个字符串倒序转化为整形数组,然后模拟加减法的竖式计算通过数组之间的&进位&来将最后的结果存入一个整形数组里面,最后再把这个整形数组转化为字符型的数组。
具体实现方式以及需要注意的事项:
首先预制的函数里面在输入中多了&/n&,这个我们在自己编写的时候可以先将其去掉,要不然读入的时候会有问题。
然后就是进行字符串的转化,需要注意的是需要先把字符串前面的前导0去掉,借用大神的方法while(a[0]==&#39;0&#39;)a++;while(b[0]==&#39;0&#39;)b++;这样就可以吧字符串前面的前导0去掉。但是应该注意字符串a=&0000&或b=&00000&的这种情况,这种情况下会导致,把字符串清空,这里需要判断一下,如果经过上面的处理之后字符串的长度为0,我们就可以人为的令字符串的长度为1,a[0]=0,b[0]=0.然后进行转化,转化的时候一般有两种方法比较容易想到一是在后面-&0&,另一种是在后面-48,不过看发帖说&0&-&0&=&\0&(自己理解是因为两个字符是一样的,所以减完之后就是空了),所以还是用第二种方法进行倒序的转换。这里对于减法需要注意,为了是最后的&-&比较好处理,所以我们要用大数减去小数,在做转换的时候,如果a<b,那么就需要做相应的处理(可以再转化数组的时候将大的数组放进规定的放大数的数组里,并做好标记;也可以直接转化,然后在减的时候用表示大数的数组减去表示小数的数组,并做标记)。注意在每次调用函数的时候都要将自己定义的三个整形数组清0.</b,那么就需要做相应的处理
然后就是计算了,对于加法,按照竖式计算的顺序每一位的两个数相加,相加的结果存入c[i]里面,如果c[i]&9,则c[i+1]++;c[i]+=10;这样循环着计算(循环的长度是两个数组里面最长的数组的长度),最后计算完了之后要判断c[length](length表示两个数组里面最长的数组的长度)是否等于1,即判断最高位是否有进位,如果有那么length++。对于减法,思路和加法一样,按照竖式计算的顺序每一位的两个数相减,相减的结果存入c[i]里面,如果如果c[i]&0,则c[i+1] - -;c[i]+=10;这样循环着计算(循环的长度是两个数组里面最长的数组的长度),最后计算完了之后要判断数组a的前面(length表示两个数组里面最长的数组的长度)是否有等于0的位,即判断前面的位是否被借走,剩下0,如果是那么length--,终止的条件是c[length--]!=0(就是所说的退位)。
最后就是将整形数组c中的数字转换为字符串,即每个位上的数+48.要注意减法中如果最后的结果是负数的时候要在数组的前面加&-&,因为最后是&%s&输出的,所以可以领cc[0]=&-&.还要注意在转换完成的时候要在字符数组的最后加上&\0&,这样可以防止由于数组没有初始化而导致输出乱码。
void plus(char *a, char *b, char *c)
int lengtha,lengthb,
int aa[505],bb[505],cc[505];
for(i=0;i&505;i++)
while(a[0]==&#39;0&#39;)a++;
while(b[0]==&#39;0&#39;)b++;
lengtha=strlen(a);
lengthb=strlen(b);
if(lengtha==0&&lengthb!=0)
else if(lengtha!=0&&lengthb==0)
else if(lengtha==0&&lengthb==0)
else if(lengtha&lengthb)
//找出最长的数
for(i=0;i9)
cc[i+1]++;
cc[i]-=10;
if(cc[length]&0)
for(j=0;jlengtha)
if(temp!=0)
for(i=0;i0)
if(temp==0)
(window.slotbydup=window.slotbydup || []).push({
id: '2467140',
container: s,
size: '1000,90',
display: 'inlay-fix'
(window.slotbydup=window.slotbydup || []).push({
id: '2467141',
container: s,
size: '1000,90',
display: 'inlay-fix'
(window.slotbydup=window.slotbydup || []).push({
id: '2467143',
container: s,
size: '1000,90',
display: 'inlay-fix'
(window.slotbydup=window.slotbydup || []).push({
id: '2467148',
container: s,
size: '1000,90',
display: 'inlay-fix'}

我要回帖

更多关于 c语言长整数四则运算 的文章

更多推荐

版权声明:文章内容来源于网络,版权归原作者所有,如有侵权请点击这里与我们联系,我们将及时删除。

点击添加站长微信