CSDN首页 空间 新闻 论坛 Blog 下载 读书 网摘 搜索 .NET Java 视频 接项目 求职 在线学习 买书 程序员 通知
花落谁家,你作主! 盛大widget设计大赛英雄榜
CSDN社区
搜索 收藏 打印 关闭
CSDN社区 >  扩充话题 >  灌水乐园

linux下的bc计算器---源代码????????

楼主jsjjms(专心研究嵌入式)2005-04-04 09:59:06 在 扩充话题 / 灌水乐园 提问

本人需要进行大整数的计算,本想自己编程,碍于时间问题,请各位大虾指点,哪方有  
  大整数的计算(主要是+   -   *   /)的源代码。  
   
  偶知在linux   下bc计算器能对大数进行高速计算,谁有源码。谢谢!!! 问题点数:40、回复次数:2Top

1 楼hbcb(青蛙王子)回复于 2005-04-04 10:25:33 得分 10

用C写一段代码就可以实现了,早年我当作练习作业写过一个简单的,不知道现在还能不能找到,找到的话给你参考Top

2 楼hbcb(青蛙王子)回复于 2005-04-04 10:36:15 得分 30

比较简陋的函数,变量名命名方法不规范,你凑合着看吧  
   
  /*计算表达式,返回计算结果*/  
  double   bc(in,ERR)  
      char   *in;         /*输入值,算术表达式*/  
      char   *ERR;       /*返回信息,计算正确=空;若有错误=具体错误消息*/  
      {  
          char   *s,t[256],cp[256],ep[256],e;  
          int   i,j,k,p,q,c,xs,err;  
          double   np[256],a,w,f;  
          err=0;*ERR='\0';  
          strcpy(t,in);s=t;  
          i=0;while((e=*(s+i++))!='\0')if(e=='('   &&   *(s+i)=='-')*(s+i)=':';  
          c=0;i=q=0;np[1]=0.0;  
          cp[0]='@';                 /*置栈底标志@*/  
          /*====扫描表达式,压入栈中====*/  
          while(err==0   &&   *s!='\0'){  
              if(*s=='-'   &&   (q==0   ||   *(s-1)=='('))*s=':';  
              e=*(s+1);  
              switch(*s){  
                  case   '(':  
                      if((e<'0'||e>':')   &&   e!='-'   &&   e!='(')err=1;  
                      else   cp[++c]=*s;  
                      break;  
                  case   ')':  
                      if(e!='+'&&e!='-'&&e!='*'&&e!='/'&&e!=')'&&e!='\0')err=1;  
                      else   {  
                          while(cp[c]!='(')ep[i++]=cp[c--];  
                          c--;  
                          if(c<0)err=1;  
                          };  
                      break;  
                  case   '+':case   '-':  
                      if((e<'0'||e>':')   &&   e!='(')err=1;  
                      else   {  
                          while((e=cp[c])=='+'||e=='-'||e=='*'||e=='/')ep[i++]=cp[c--];  
                          cp[++c]=*s;  
                          };  
                      break;  
                  case   '*':case   '/':  
                      if((e<'0'||e>':')   &&   e!='(')err=1;  
                      else   {  
                          while((e=cp[c])=='*'   ||   e=='/')ep[i++]=cp[c--];  
                          cp[++c]=*s;  
                          };  
                      break;  
                  case   '^':  
                      if((e<'0'||e>':')   &&   e!='(')err=1;  
                      else   {  
                          while(cp[c]=='^')ep[i++]=cp[c--];  
                          cp[++c]=*s;  
                          };  
                      break;  
                  case   '.':  
                      if((e<'0'||e>':')&&e!='+'&&e!='-'&&e!='*'&&e!='/'&&  
                          e!='^'&&e!=')'&&e!='%'&&e!='\0')err=1;  
                      else   {  
                          ep[i++]=*s;  
                          if(e<'0'||e>':')ep[i++]='#';  
                          };  
                      break;  
                  case   '%':     /*===百分号===*/  
                      if(e!='+'&&e!='-'&&e!='*'&&e!='/'&&e!='^'&&e!=')'&&e!='\0')err=1;  
                      else   {  
                          ep[i++]=*s;  
                          ep[i++]='#';  
                          };  
                      break;  
                  case   '0':case   '1':case   '2':case   '3':  
                  case   '4':case   '5':case   '6':case   '7':  
                  case   '8':case   '9':   case   ':':                                 /*===数字符号===*/  
                      if((e<'0'||e>':')   &&   e!='+'&&e!='-'&&e!='*'&&e!='/'&&  
                          e!='^'&&e!=')'&&e!='%'&&e!='.'&&e!='\0')err=1;  
                      else   {  
                          ep[i++]=*s;  
                          if((e<'0'||e>':')   &&   e!='%'   &&   e!='.')ep[i++]='#';  
                          };  
                      break;  
                  default:                                                         /*===非数字符号===*/  
                      err=1;  
                  };  
              s++;q++;  
              };  
          if(err==1){sprintf(ERR,"表达式错误");return;};  
          if(ep[i-1]!='#')ep[i++]='#';     /*==置数据项结束标志#====*/  
          /*====出栈,计算值====*/  
          while(cp[c]!='@')ep[i++]=cp[c--];  
          ep[i]='\0';  
          i=j=0;f=1.0;  
          while((e=ep[i++])!='\0'){  
              switch(e){  
                  case   '0':case   '1':case   '2':case   '3':  
                  case   '4':case   '5':case   '6':case   '7':  
                  case   '8':case   '9':case   '.':case   '%':case   ':':  
                      a=0.0;xs=0;w=1.0;  
                      if(e==':'){f=(-1.0);e=ep[i++];};  
                      while(e!='#'){  
                          switch(e){  
                              case   '.':   xs=1;break;  
                              case   '%':   a/=100;e='#';break;  
                              case   ':':   break;  
                              default:     if(xs==0)a*=10;else   w/=10;  
                                  a+=(e-'0')*w;  
                              };  
                          e=ep[i++];  
                          };  
                      np[++j]=a*f;f=1.0;  
                      break;  
                  case   '+':np[--j]+=np[j+1];break;  
                  case   '-':np[--j]-=np[j+1];break;  
                  case   '*':np[--j]*=np[j+1];break;  
                  case   '/':  
                      if(np[j]==0.0){sprintf(ERR,"除数为0");return;};  
                      np[--j]/=np[j+1];break;  
                  case   '^':                                                         /*只能是整数次乘方*/  
                      k=(int   )np[j--];  
                      a=np[j];np[j]=1.0;  
                      if(k>0)for(p=0;p<k;p++)np[j]*=a;  
                      else   if(k<0)for(p=0;p>k;p--)np[j]/=a;  
                      break;  
                  };  
              };  
          return(np[1]);  
          }  
  Top

相关问题

  • 给我一计算器的源代码
  • 谁有简单计算器的vc源代码?
  • 急急急 需科学计算器源代码 分数不限
  • 急寻??Linux or Unix 下BC计算器的源码
  • LINUX 内核源代码
  • 那为仁兄帮忙,赶快给发一个tc20的计算器程序源代码,明天要交作业!!!
  • 哪里有linux下的ftp源代码??
  • linux的源代码太长,怎么看?:(
  • 怎么读linux的源代码?
  • 研究linux内核源代码

关键词

  • np
  • ep
  • 表达式
  • err
  • case
  • 计算
  • bc
  • 整数
  • cp
  • break

得分解答快速导航

  • 帖主:jsjjms
  • hbcb
  • hbcb

相关链接

  • CSDN Blog
  • 技术文档
  • 代码下载
  • 第二书店
  • 读书频道

广告也精彩

反馈

请通过下述方式给我们反馈
反馈
提问
网站简介|广告服务|VIP资费标准|银行汇款帐号|网站地图|帮助|联系方式|诚聘英才|English|问题报告
北京创新乐知广告有限公司 版权所有, 京 ICP 证 070598 号
世纪乐知(北京)网络技术有限公司 提供技术支持
Copyright © 2000-2008, CSDN.NET, All Rights Reserved
GongshangLogo