| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 3596 人关注过本帖, 1 人收藏
标题:自己编的简易计算器,可以运算+ - * / ()的表达式,可以计算小数
只看楼主 加入收藏
zhu224039
Rank: 8Rank: 8
等 级:贵宾
威 望:17
帖 子:862
专家分:792
注 册:2012-7-29
收藏
得分:0 
回复 19楼 zhu224039
发错了

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

我要成为嘿嘿的黑客,替天行道
2012-08-23 22:26
孙志刚
Rank: 1
等 级:新手上路
帖 子:2
专家分:1
注 册:2012-8-24
收藏
得分:0 
我想说太难了
2012-08-24 09:42
stophin
Rank: 7Rank: 7Rank: 7
等 级:黑侠
威 望:3
帖 子:227
专家分:618
注 册:2010-3-26
收藏
得分:14 
代码没发全吧,jmp什么的是怎么回事?
2012-08-24 11:00
zhu224039
Rank: 8Rank: 8
等 级:贵宾
威 望:17
帖 子:862
专家分:792
注 册:2012-7-29
收藏
得分:0 
回复 23楼 孙志刚
jmp 是 函数 setjmp() 和 longjmp() 的跳转 点

我要成为嘿嘿的黑客,替天行道
2012-08-24 15:31
zhu224039
Rank: 8Rank: 8
等 级:贵宾
威 望:17
帖 子:862
专家分:792
注 册:2012-7-29
收藏
得分:0 
回复 24楼 stophin
和loop 和goto 是一类控制的作用 ,只是setjmp和longjmp 可以在不同函数里跳转,也相当于一个指点位置的break;

我要成为嘿嘿的黑客,替天行道
2012-08-24 15:33
stophin
Rank: 7Rank: 7Rank: 7
等 级:黑侠
威 望:3
帖 子:227
专家分:618
注 册:2010-3-26
收藏
得分:0 
好像这么一个小小的程序不需要跳来跳去的吧?c语言的禁忌就是goto语句,不到万不得已时不能用
不同函数的跳转直接使用函数名就可以了。18楼那个代码你不发完整代码我没办法帮你调。1楼那个
代码缺乏通用性,就是满足这个不满足那个,你再改改吧。
测试的话,你用这几个来测试,+-*/顺序运算没什么问题,就是括号把运算顺序都打乱了:
1.3+2-5    //这个应该没什么问题
2.(3+2-5)    //这个注意括号,把所有出栈入栈函数都加个printf,看出入栈的结果是什么,运算过程是否正确,然后改变括号的位置再试试如3+(2-5)
3.((3+2-5))    //这个多层括号,虽然很少用这样的表达式,但计算应该是没有问题的,同上,printf一下,也可以换括号顺序,如((3+2)-5)
                //或者加更多括号,如(((((30))))),应该输出30
4.3+-2+-5    //这个要求更高些,加负数,负数不加括号也是可以的,注意"+*"、"-/"这样的符号不能出现,但"-+"也可以,再配合括号运算看可以不?
            //其实遇到这种的,可以把后面的-与数字一起转换成float数据-2,也可以在入栈+以后,入栈一个0,再入栈-,相当于3+0-2,效果一样
另外我的资源里那个计算器有2.0版本的了,你拿过去把#define DEBUG_XXX三个改成1,运行一下看看那些数字和运算符
是怎么入栈出栈以及运算的,把思路用到你的程序中吧。我的程序那么长其实都是输入容错用的,而计算核心并没有多大,
你可以先不考虑容错写写看
2012-08-25 15:46
jj369258
Rank: 4
等 级:业余侠客
帖 子:116
专家分:226
注 册:2010-12-2
收藏
得分:0 
回复 楼主 zhu224039
这个我也写了一个,只是用的是栈的知识!!
2012-08-29 16:20
zxdjz1990163
Rank: 1
来 自:河北唐山
等 级:新手上路
帖 子:9
专家分:4
注 册:2012-8-28
收藏
得分:0 
楼主牛啊,真牛,我也是新手,这差距,不能比呀。
2012-08-30 19:28
zhu224039
Rank: 8Rank: 8
等 级:贵宾
威 望:17
帖 子:862
专家分:792
注 册:2012-7-29
收藏
得分:0 
借个地方放下代码,未调试 ,还请各位不要费神 了谢谢
#include "stdlib.h"
#include "stdio.h"
#include <setjmp.h>
jmp_buf jmp;
struct a   /*存放字符和字符运算优先级*/
{
char ax[10];
char *top1;
char *base1;
int p1;
};
struct b   /*存放运算数*/
{
float bx[10];
float *top;
float *base;
};
struct a *p;
struct b *s;
int p_i=0,s_i=0;
char *st,*st1;
float num[10],jg1;
int pan(char c)   /*判断运算优先级别*/
{
int i;
switch(c)
{
case '+':
i=1;
break;
case '-':
i=1;
break;
case '*':
i=2;
break;
case '/':
i=2;
break;
case '(':
i=3;
break;
case ')':
i=4;
break;
default :
printf("表达式错误,你妹\n");
exit(0);
}
return(i);
}
void init1(struct a *p)   /*初始化站*/
{
p->base1=p->ax;
p->top1=p->ax;
}
void init(struct b *s)
{
s->base=s->bx;
s->top=s->bx;
}
void pusha(struct a *p,char c)
{
*(p->top1)=c;
p->top1++;
p->p1=pan(c);
}
void pushb(struct b *s,float c)
{
*(s->top)=c;
s->top++;
}
char popa(struct a *p)
{
char c;
p->top1-=1;
c=*(p->top1);
return(c);
}
float popb(struct b *s)
{
float c;
s->top-=1;
c=*(s->top);
return(c);
}
char SEEK(struct a *p)
 {
    char c;
    c=*(p->top1-1);
    return c;
 }
 float jisuanshu(int num1[],int i)
{
int  j;
float f,f1=0;
f=num1[0];
for(j=1;j<=i;j++)
{
if(num1[j]>=0)     
f=10*f+num1[j];
else                                                   
break;
}
if(j<i)
{
f1=num1[i]/10;
for(;i>j;i--)
f1=(f1+num1[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()
{

  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';
}
float jisuan(char c,float a1,float a2 )   /*计算*/
{
switch(c)
{
case '+':
a1=a1+a2;
break;
case '-':
a1=a2-a1;
break;
case '*':
a1=a1*a2;
break;
case '/':
a1=a2/a1;
break;
}
return(a1);
}
int j_jisuan()
{   
    float a1,a2,jg1;
    int n;
    char c;
    int j_jisuan1();
    pusha(p,*(st+p_i));
    p_i++;
    pushb(s,num[s_i]);
    pushb(s,num[s_i+1]);
    s_i+=2;
    while(*(st+p_i)!='\0'){
         n=pan(*(st+p_i));
         if(n!=3&&n!=4){
             if(n>p->p1){
                 pushb(s,num[s_i]);
                 a1=popb(s);
                 a2=popb(s);
                 jg1=jisuan(*(st+p_i),a1,a2);
                 pushb(s,jg1);
                 p_i++;
                 s_i++;
             }
          else{
              a1=popb(s);
            a2=popb(s);
            c=popa(p);
            jg1=jisuan(c,a1,a2);
            pushb(s,jg1);
            pusha(p,*(st+p_i));
            pushb(s,num[s_i]);
            p_i++;
            s_i++;
            }
         }
         else
         j_jisuan1();
    }
}
 
   
    int j_jisuan1()
    {   
        float a1,a2;int i,n;
        char c;
        pusha(p,*(st+p_i));
        p_i++;
        while(*(st+p_i)!='\0'){
           n=pan(*(st+p_i));
           if(n!=3&&n!=4)
             j_jisuan();
             else if(n==3)
               j_jisuan1();
           else{
                    a1=popb(s);
                 a2=popb(s);
                 c=popa(p);
                 jg1=jisuan(c,a1,a2);
                 pushb(s,jg1);
                 popa(p);
                 for(i=1;*(p->top1-i)!='(';i++)
                      ;
                 i--;
                 if(i==1){
                     pushb(s,num[s_i]);
                    pusha(p,*(st+p_i));
                    s_i++;p_i++;
                 }
                 else if(i==3){
                      a1=popb(s);
                    a2=popb(s);
                    c=popa(p);
                    jg1=jisuan(c,a1,a2);
                    pushb(s,jg1);
                 }
           }
        }
    }
    float jieguo()
    {  
        float a1,a2;
        char c;
        j_jisuan();
        while(p->top1!=p->base1){
            a1=popb(s);
            a2=popb(s);
            c=popa(p);
            jisuan(c,a1,a2);
            pushb(s,jg1);
        }
        return (jg1);
    }
   
   
     
int main()
{
char *st,*st1,num4[20],num5[10],n;
float num[10],zjg;
st=num4;
st1=num5;
s=(struct b*)malloc(sizeof(struct b));
p=(struct a*)malloc(sizeof(struct a));
printf("请输入表达式:\n");
setjmp(jmp);
scanf("%s",st);
qufen();
zjg=jieguo();
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-09-01 08:54
快速回复:自己编的简易计算器,可以运算+ - * / ()的表达式,可以计算小数
数据加载中...
 
   



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

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