| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 3596 人关注过本帖, 1 人收藏
标题:自己编的简易计算器,可以运算+ - * / ()的表达式,可以计算小数
只看楼主 加入收藏
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,*(st1+p_i));
    p_i++;
    pushb(s,num[s_i]);
    pushb(s,num[s_i+1]);
    s_i+=2;
    printf("%d\n",s_i);
    while(*(st1+p_i)!='\0'){
         n=pan(*(st1+p_i));
         if(n!=3&&n!=4){
             if(n>p->p1){
                 pushb(s,num[s_i]);
                 a1=popb(s);
                 a2=popb(s);
                 jg1=jisuan(*(st1+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);
            printf("%f\n",jg1);
            pushb(s,jg1);
            pusha(p,*(st+p_i));
            pushb(s,num[s_i]);
            p_i++;
            s_i++;
            }
         }
         else if(n==3)
         j_jisuan1();
    }

}

   
    int j_jisuan1()
    {   
        float a1,a2;int i,n;
        char c;
        pusha(p,*(st1+p_i));
        p_i++;
        while(*(st1+p_i)!='\0'){
           n=pan(*(st1+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,*(st1+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;
        init1(p);
        init(s);
        j_jisuan();
        while(p->top1!=p->base1){
            a1=popb(s);
            a2=popb(s);
            c=popa(p);
            printf("%c\n",c);
            jg1=jisuan(c,a1,a2);
            pushb(s,jg1);
            printf("%f111\n",jg1);
        }
    }
   
     
int main()
{
char num4[20],num5[10],n;
float 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();
jieguo();
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);
}
}
}

[ 本帖最后由 zhu224039 于 2012-9-1 20:17 编辑 ]

我要成为嘿嘿的黑客,替天行道
2012-09-01 08:55
TonyDeng
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:贵宾
威 望:304
帖 子:25859
专家分:48889
注 册:2011-6-22
收藏
得分:0 
嗯,就这样不断改,改好了就差不多了,专注弄一个就好。

授人以渔,不授人以鱼。
2012-09-01 11:57
快速回复:自己编的简易计算器,可以运算+ - * / ()的表达式,可以计算小数
数据加载中...
 
   



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

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