c 语言简单计算器源码

//  main.c

//  计算器

//  Created by qianfeng on 14-7-15.

//  Copyright (c) 2014年 ___FGY___. All rights reserved.

//iPhone自带计算器不够好,由于你技术出众,你被安排去开发一款iOS新式计算器。

/*项目经理认为计算器第一版要支持表达式求值,所以要求如下:

输入任意表达式 求出他的值(支持负数,不支持小数)

这里支持6种表达式

() * / + -

()优先级最高, * /优先级其次 + -优先级最低

比如输入任意表达式:

(100+2)*2

输出

204

在比如:

输入任意表达式:

(-100-2)*(10-2)/(100-22)

输出

-10

不考虑除法小数的情况.

*/

#include <stdio.h>

#include <string.h>

#include <stdlib.h>

int weishu(int c);

void yiwei( int *a, int b, int c);

void chyiwei(char *a,int b,int c){//字符串用过删除操作字符+ - * /

    int i = 0;

    for (i = b; i < c ; i ++)

    {

        a[i]=a[i+1];

    }

    a[c] ='\0';

}

void yiwei ( int *a,int b,int c){//数字用过之后往前移动一位

    int i ;

    for (i = b; i < c;  i ++) {

        a[i]=a[i+1];

    }

    a[c]=0;

}

int weishu(int c){//atoi之后需要统计这个数字的位数

    int i ;

    int t = 0;

    if ( c<0)

    {

        t = 1;

        c = -c;

    }

    for (  i = 0; c >0;  i++) {

        c /= 10;

    }

    return  i+t;

}

int main(int argc, const char * argv[])

{

 

    char buff[256] = {};

    int arr[100]={};

    char ch[100] , *p , *p1 ,*p3 ,*p4 = NULL , *p5 =NULL;

    int k = 0,k1 = 0, k2 = 1;

    fgets(buff, 256, stdin);

    unsigned long bu_len = strlen(buff)-1;

    buff[bu_len] = '\0';

    int i , j ;

    for ( i = 0 ;  i < bu_len;  i ++) {//这个循环是把字符串转化成数字与操作字符 + - * 、

        if ( buff[i] == '(')

        {

            ch[k1] = '(';

            k1 ++;

            p=&buff[i+1];

            arr[k]=atoi(p);//判断是否是数字并且存储

            i +=( weishu(arr[k]) );//向后移动数据的位数

            k++;

        } else if (buff[i] == ')')

        {

            ch[k1] =')';

            k1 ++;

            

        }

        else if ( buff[i] == 43)

        {

            ch[k1] = 43;

             k1 ++;

        }

        else if (buff[i] == 45)

        {

            if ( i != 0)

            {

                

                ch[k1]=45;

                k1 ++;

            }else{//判断是否是数字若是第一次进入则按负数计算

                p = &buff[i];

                arr[k]=atoi(p);

                i +=(weishu(arr[k])-1);

                k++;

                

            }

        }

        else if (buff[i]== '*')

        {

            ch[k1]='*';

             k1 ++;

        }

        else if ( buff[i]=='/')

        {

            ch[k1] = '/';

             k1 ++;

        }

        else

        {

            

            p = &buff[i];

            arr[k]=atoi(p);

            i +=(weishu(arr[k])-1);

            k++;

        }

    }//接受在数组里边

    int count = 0;

    for (  i = 0;  k1 >0;)

    {

                p4 = strstr( ch,  "(");

                 p3 = strstr(ch,")");

            if ( p4  || p5 == p4  )//此循环是 判断括号内是否是计算完成,当没完成的时候继续完成。

                {

                     if ( p4 == p5)

                    {

                        p = strstr(p4, "*");

                        p1 = strstr(p4, "/");//判断是否有乘法和除法

                        if (p < p3 || p1 < p3 )

                        {

                            if (p || p1)//查找乘法和除法

                            {

                                if (p1 && p)

                                {

                                    if ((p1 - p )>0 && p <p3)//必须是本括号内

                                    {

                                        i = (int)(p -ch);

                                    }

                                    else if ((p1-p)<0 && p1 <p3)

                                    {

                                        i = (int)(p1 - ch);

                                    }

                                }

                                else if (p1)//不能为null

                                {

                                    i = (int)(p1 - ch );

                                }

                                else if (p){

                                    i = (int)(p - ch);//不能为null

                                }

                            }

                                else

                                {

                                    i = (int)(p4-ch+1);//没有* /从括号出开始从左向右计算

                                }

                        }

                        else///没有乘除除的情况

                        {

                            i = (int)(p4-ch+1);//从括号后边开始

                        }

                    }

                        else if (p4)//判断是否是前半个括号

                    {

                        p5 = p4;

                        i  = (int)(p4 - ch);

                       //k2 =3;

                    }

                }

                else//没有括号的情况下查找  乘法和除法

                {

                    p = strstr(ch, "*");

                    p1 = strstr(ch, "/");//判断是否有乘法和除法

                    if (p || p1)

                    {

                        if (p1 && p)

                        {

                            if ((p1 - p )>0)

                            {

                                i = (int)(p -ch);

                            }

                            else if ((p1-p)<0)

                            {

                                i = (int)(p1 - ch);

                            }

                        }

                        else if (p1)

                        {

                            i = (int)(p1 - ch);

                        }

                        else if (p){

                            i = (int)(p - ch);

                        }

                    }

                    else

                            {

                                i = 0;

                            }

                                k2 = 2;

                     }

        {

            if (ch[i] == '(' && count %2 == 0 )

            {

                count %= 2;

                count ++;

                i++;

                k2 = 0;

            }

            else if ( ch[i] == '+')

            {

                arr[i-count] += arr[i - count+1];

                yiwei(arr, i+1-count, k --);

                chyiwei(ch, i, k1--);

                if (count %2 == 1 && (ch[i-1] =='(' &&ch[i] == ')') )

                {

                    k2 = 1;

                    chyiwei(ch, i - 1, k1--);

                    chyiwei(ch, i-1, k1--);

                    count = 0;

                }

            }

            else if ( ch[i] == '-')

            {

                arr[i -count] -= arr[i-count+1];

                yiwei(arr, i+1-count, k --);

                chyiwei(ch, i, k1--);

                if (count %2 == 1  && (ch[i-1] =='(' &&ch[i] == ')') )

                {

                    k2 = 1;

                    chyiwei(ch, i - 1, k1--);

                    chyiwei(ch, i - 1, k1--);

                    count = 0;

                }

            }

            else if ( ch[i] == '*')

            {

                arr[i -count] *= arr[i - count +1];

               yiwei(arr, i+1-count, k --);

                chyiwei(ch, i, k1--);

                if (count %2 == 1 && (ch[i-1] =='(' &&ch[i] == ')') )

                {

                    k2 = 1;

                    chyiwei(ch, i - 1, k1--);

                    chyiwei(ch, i - 1, k1--);

                    count = 0;

                }

            }

            else if (ch[i] == '/')

            {

                arr[i -count] /= arr[i - count+1];

                yiwei(arr, i+1-count, k --);//计算后将数据覆盖

                chyiwei(ch, i, k1--);//计算后将操作符覆盖

                if (count %2 == 1 && (ch[i-1] =='(' &&ch[i] == ')') )

                {

                    k2 = 1;//若是括号,则删除括号,操作符前移

                    chyiwei(ch, i - 1, k1--);

                    chyiwei(ch, i - 1, k1--);

                    count = 0;

                }

            }

            else if ( ch[i] == ')')

            {

                count ++ ;//

                i++;

                //chyiwei(ch, i, k1--);

            }

        }

 

    }

    for (  j = 0;  j < k ;  j ++)

    {

        printf("%d\t",arr[j]);//shuchu 输出 存的 数据

    }

    for (  j = 0;  j < k1;  j ++) {

        printf("%c\t",ch[j]);   //c操作字符的 输出 要是成功的话字符为空

    }

    return 0;

}

转载于:https://www.cnblogs.com/fgyqbs/p/3849461.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值