| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 3596 人关注过本帖, 1 人收藏
标题:自己编的简易计算器,可以运算+ - * / ()的表达式,可以计算小数
只看楼主 加入收藏
stophin
Rank: 7Rank: 7Rank: 7
等 级:黑侠
威 望:3
帖 子:227
专家分:618
注 册:2010-3-26
收藏
得分:0 
到目前为止,我帮你把这儿
if(z!=0&&*(st+j)!='('&&*(st+j)!=')')
改成
if(z!=0&&*(st+j)!='('&&*(st+j-1)!=')')
因为"+("和")-"是不同的,'('前面是符号,而')'后面才能跟符号
另外你这个程序数据结构有缺陷,没有peek函数,只有pop函数,pop是向外取出数据并在堆栈中删除,
而peek是查看栈顶元素,并不出栈,这样能解决你说的这个问题:
"有想过从栈取一个数然后在从数组中取一个数进行运算,这样省一步入栈,觉得麻烦就没这么做"
这个想法主要用在运算符数组中,从运算符数组中取一个,再用peek看一下运算符栈的栈顶元素,比较它们的优先级,
若栈顶元素优先级高的话,就用pop取出运算符,再从数字栈中取两个数字运算。反之使用数组中的运算符配合数字栈的两个数字进行运算。当然数字栈仍然全部入栈。
另外括号的问题,输入的格式包含单括号可以,但包含多层括号就错误了。这要用到消去法:栈顶为'('当前为')'则消去,即出栈'(',st向后移动,不做任何运算。
要做到这两点,你需要改一下程序的整体框架,动大手术,否则输入其他形式的数据就会计算错误。
我帮你改也改了半天也不好,满足这个格式又不满足那个格式,完全是拼凑出来的,你还是自己看看吧。另外可以到我的资源里面下载一个,有源码的
2012-08-22 14:12
a745043791
Rank: 4
等 级:业余侠客
帖 子:95
专家分:260
注 册:2012-2-12
收藏
得分:0 
如果你的算法是书上的,那么你很了不起,因为我在学数据结构时对于书上的这个算法各种不懂,就没有看下去了。但我还是希望你再用你自己的算法写一个计算器。
2012-08-22 14:56
zhu224039
Rank: 8Rank: 8
等 级:贵宾
威 望:17
帖 子:862
专家分:792
注 册:2012-7-29
收藏
得分:0 
回复 11楼 stophin
你的资源怎么访问啊?
如果我用线程的思路来写这个计算器行的通么.

我是觉得工具 是次要的,主要的是思想,在思想下 使用工具 即使不是很熟练 但最终会比先学好根基再往上学好


别见笑徒弟,根基不稳就往高处爬,而觉得我人浮于事,不肯指点一二。。。

我要成为嘿嘿的黑客,替天行道
2012-08-22 19:53
zhu224039
Rank: 8Rank: 8
等 级:贵宾
威 望:17
帖 子:862
专家分:792
注 册:2012-7-29
收藏
得分:0 
您说的 手术 我已经开始做了。
这个代码编出来,我自己看着都不爽的很,各位老师们能帮我检查错误,实在感激啊


我要成为嘿嘿的黑客,替天行道
2012-08-22 19:56
stophin
Rank: 7Rank: 7Rank: 7
等 级:黑侠
威 望:3
帖 子:227
专家分:618
注 册:2010-3-26
收藏
得分:0 
楼主别气馁,毕竟是自己写的,就像自己的孩子一样,不论是好是坏都要好好保存起来,说不定以后有用呢
资源的话,到下载频道搜“c语言计算器”,找到以后,在作者的其他资源里有源码,选那个不要分数的就可以了,
使用的也是堆栈的方法,楼主可以参考一下,我的是字符串加链表顺序处理的,而楼主的是将数字与字符分开来处理,
可能有一些区别,但思路是差不多的

[ 本帖最后由 stophin 于 2012-8-23 10:06 编辑 ]
2012-08-23 09:58
qq872551969
Rank: 9Rank: 9Rank: 9
等 级:禁止访问
威 望:1
帖 子:241
专家分:1377
注 册:2012-7-13
收藏
得分:0 
问题是吧,你应该怎样连接到皮肤呢?

编程交流请加群:【234181324】,一起学习,一起进步,新建的群,主打C语言和JAVA等程序设计,等待高手们的入驻,无论你是高手也好,新手也好,在这里都是平等的,欢迎你们的加入~!【234181324】
2012-08-23 12:23
Alar30
Rank: 10Rank: 10Rank: 10
等 级:贵宾
威 望:10
帖 子:988
专家分:1627
注 册:2009-9-8
收藏
得分:0 
不错啊
比俺强多了
2012-08-23 15:14
zhu224039
Rank: 8Rank: 8
等 级:贵宾
威 望:17
帖 子:862
专家分:792
注 册:2012-7-29
收藏
得分:0 
回复 2楼 stophin
jmp_buf jmp;
float jisuanshu(int num[],int i)
{
int  j;
float f,f1=0;
f=num[0];
for(j=1;j<=i;j++)
{
 if(num[j]>=0)     
 f=10*f+num[j];
 else                                                   
 break;
}
if(j<i)
{
f1=num[i]/10;
for(;i>j;i--)
f1=(f1+num[i])/10;
}
f=f+f1;
return(f);
}
void biaodashi(char *st,int i,int z)
{
   
       if(*(st+i)!='('&&*(st+i-1)!=')')
       {
         printf("表达式错误1,请重新输入:\n");
         longjmp(jmp,1);
       }
     
}
void biaodashi1(char *st,int i,int z)
{
     if(*(st+i-1)!=')')
     {
         printf("表达式错误1,请重新输入:\n");
         longjmp(jmp,1);
       }
}
int qufen(char *st,float num[],char *st1)
{

  struct shu
  {
   int num1[10];
   int j1;
  }sj;
  int i=0,j=0,z=1,k=0,m=0,k1=0,k2=0;
  float f;
  while(*(st+i)!='\0')
  {
    if((*(st+i)>='0'&&*(st+i)<='9')||*(st+i)=='.')
    {
     sj.num1[j]=*(st+i)-'0';
     sj.j1=j;
     j++; i++;
     z=0;
    }
    else
    {
      if(z>0)
      biaodashi(st,i,z);
      if(z==0)
      {
       f=jisuanshu(sj.num1,sj.j1);
       num[k]=f;
       k++;j=0;f=0;
       if(i!=0&&*(st+i)=='(')
         {
         printf("表达式错误1,请重新输入:\n");
         longjmp(jmp,1);
         }
       }
       if(*(st+i)=='(')  k1++;
       else  if(*(st+i)==')')
       k2++;
      *(st1+m)=*(st+i);
       m++;
       i++;
       z++;
    }
  }
  if(z!=0)
  biaodashi1(st,i,z);
  if(k1!=k2)
   {
   printf("表达式错误2,请重新输入:\n");
   longjmp(jmp,2);
   }
  if(j!=0)
  {
  f=jisuanshu(sj.num1,sj.j1);
  num[k]=f;
  }
  *(st1+m)='\0';
}




int main()
{
char *st,*st1,num4[20],num5[10],n;
float num[10],zjg;
st=num4;
st1=num5;
*st1='l';
s=(struct b*)malloc(sizeof(struct b));
p=(struct a*)malloc(sizeof(struct a));
printf("请输入表达式:\n");
setjmp(jmp);
printf("%s\n",st1);
scanf("%s",st);
qufen(st,num,st1);
printf("%s\n",st1);
zjg=jieguo(st1,num);
printf("%f\n",zjg);
printf("还要计算吗?y/n\n");
scanf("%c",&n);
while(n!='n')
{
if(n=='y')
longjmp(jmp,1);
else if(n=='n')
exit(0);
else
{
printf("请输入:y 或者 n\n");
scanf("%c",&n);
}
}
}

我要成为嘿嘿的黑客,替天行道
2012-08-23 22:20
zhu224039
Rank: 8Rank: 8
等 级:贵宾
威 望:17
帖 子:862
专家分:792
注 册:2012-7-29
收藏
得分:0 
回复 17楼 Alar30
哎,算法上的问题,老是修修补补的  还是调试不过来,不能满足所有的条件啊,我在设计设计
实在弄不好了,就看你的代码  学习

我要成为嘿嘿的黑客,替天行道
2012-08-23 22:22
zhu224039
Rank: 8Rank: 8
等 级:贵宾
威 望:17
帖 子:862
专家分:792
注 册:2012-7-29
收藏
得分:0 
回复 17楼 Alar30
主要是把区分函数给 修整了下   但是还是那么长的代码,能给点窍门吗?,怎么去精简代码

我要成为嘿嘿的黑客,替天行道
2012-08-23 22:24
快速回复:自己编的简易计算器,可以运算+ - * / ()的表达式,可以计算小数
数据加载中...
 
   



关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.019122 second(s), 7 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved