zoukankan      html  css  js  c++  java
  • 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] ='';

    }

    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] = '';

        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 ",arr[j]);//shuchu 输出 存的 数据

        }

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

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

        }

        return 0;

    }

  • 相关阅读:
    Codeforces Round #694 (Div.1, Div.2)题解(2A-1D)(1E-1F待填)
    【Luogu日报#294】OI中你可能会用到的一些不等式及其证明 | 习题题解
    SP10570 LONGCS
    Unity 数字孪生笔记 工具介绍
    Unity3D 最佳数字孪生插件(一个基于Unity的自动化概念设计,仿真,虚拟调试和3D HMI的框架)
    Unity 数字孪生笔记 PiXYZ快速入门
    数据结构:堆排序
    HDU 4704 Sum (欧拉降幂+二项式公式+快速幂)
    Codeforces Goodbye2020部分题解
    Apache架构师的30条设计原则
  • 原文地址:https://www.cnblogs.com/fgyqbs/p/3849461.html
Copyright © 2011-2022 走看看