C语言实现基本计算器功能

这两天写了一个计算器,目前能实现加减乘除,支持小数,能判断空格,能排查一些基本错误。运用了栈的思想,虽然这是数据结构里最基本的内容了,但还是实现着很困难,中间参考了廖星的代码。这个用了数组实现,所以代码只有140行左右。先上代码
#include<stido.h>
#include<stdlib.h>
#include<string.h>
#define size 200

int isoptr(char op)
{
    if(op=='+'||op=='-'||op=='*'||op=='/'||op=='('||op==')'||op=='#')
        return 1;
    else
        return 0;
}

char precede(char lopt,char ropt)
{  
    switch(lopt)
    {
    case '+':
    case '-':
        if(ropt=='+'||ropt=='-'||ropt==')'||ropt=='#') return '>';
        else if(ropt=='*'||ropt=='/'||ropt=='(') return '<';
    case '*':
    case '/':
        if(ropt=='+'||ropt=='-'||ropt=='*'||ropt=='/'||ropt==')'||ropt=='#') return '>';
        else if(ropt=='(') return '<';
    case '(':
        if(ropt=='+'||ropt=='-'||ropt=='*'||ropt=='/'||ropt=='('||ropt=='^') return '<';
        else if(ropt==')') return '=';
    case ')':
        if(ropt=='+'||ropt=='-'||ropt=='*'||ropt=='/'||ropt==')'||ropt=='#') return '>';
    case '#':
        if(ropt=='+'||ropt=='-'||ropt=='*'||ropt=='/'||ropt=='(') return '<';
        else if(ropt=='#') return '=';
    }
}
double operate(double a,char c,double b)
{
    switch(c)
    {
      case '+' :return a+b;
      case '-' :return a-b;
      case '*' :return a*b;
      case '/' :return a/b;
    }
}
int main()
{
    double a,b,sum=0;
    char optr[size],optt[size];
    double opnd[size];
    char c,op;
    int i=-1,k=0,m=0,temp=0;
    int o=-1,p=0;
    op=getchar();
    optr[0]='#';
    while(op!='#'||optr[p]!='#')
    {
       
        while(op==' ')
        {
            getchar();
            op=getchar();
        }
        if(!isoptr(op))
        {
            if(op<='9'&&op>='0'||op=='.')
            {
               
                    i++;
                    optt[i]=op;
                    op=getchar();
            }
            else
            {
                printf("你输入的格式有错误!\n");
                return 0;
            }
        }
        else
        {
            if(i>=0)
            {
                while(i>=0)
            {
                if(optt[i]=='.') k=m;
                else
                {
                    sum+=pow(10,m)*(optt[i]-'0');
                    m++;
               
                }
                i--;
           
            }
            o++;
            opnd[o]=(double)(sum/pow(10,k));
            sum=0;
            k=0;
            m=0;
            i=-1;
            temp=1;
            }
             switch(precede(optr[p],op))
            {
            case '<':
            p++;
            optr[p]=op;
            op=getchar();break;
            case '=':
            p--;
            op=getchar();break;
            case '>':
            c=optr[p];
            --p;
            b=opnd[o];
            --o;
            a=opnd[o];
            --o;
            ++o;
            if(o<0)
            {
                printf("你输入的格式错误!");
                return 0;
            }
       
            opnd[o]=operate(a,c,b);
            break;
            }
        }
        if(op=='\n'||op=='=')op='#';
    }
    if(temp==0)
    {
        for(k=0;k<=i;k++)
            printf("%c",optt[k]);
        printf("\n");
    }
    else if(o>=0)
        printf("%g\n",opnd[o]);
    else
        printf("你输入的格式错误!\n");
    return 0;
}

 


这次代码要总结的是:
第一:对栈的思想理解加深了。
第二:这种代码如果放在学期开始的时候也许也能写出来,但是拖到了现在。
第三:中间部门参考了廖星的代码。所以真正的不算是自己写的
第四:自己的编程能力真的还需提高。
第五:关于调试的方法,自己研究出的system(“pause”)的方法不错。不过希望自己能再多研究研究更好的
10号就要考概率论了,之前基本在它上面下的功夫很少。最近在看各种博客,上面不断在说数学和概率论对计算机的重要性。看来还是自己太无知了。所以在接下来的几天里,不会在更新技术博客了。好好加油复习概率论了。加油!!
                                                                                 2014年1月6日

 

转载于:https://www.cnblogs.com/ccode/p/3906018.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值