标题:用C语言编写计算器
取消只看楼主
是个狠人
Rank: 1
等 级:新手上路
帖 子:3
专家分:0
注 册:2020-3-17
结帖率:100%
 问题点数:0 回复次数:0 
用C语言编写计算器
1)       完成最基本整数的四则运算的程序

2)       能识别串式表达式输入

3)       能正确使用函数

4)       能够完成竖式显示计算过程(尤其是这个)

5)       能完成连续运算功能

6)       能判断先乘除后加减
用C语言编写能完成上述功能的计算器
保留如下代码的基础上有没有可以优化的地方(又可以改进的地方,dl们可以把大概修改的代码也发出来吗)
有没有更好的思路编写相同功能的代码(直接发代码)
#include<stdio.h>
int n,i;         /* 请注意这里的n与i设置为全局变量的用意 */  
float val[100];  /* 这个数组用来收集字符流中的数 */
char c[1000],fu[100];  /* c数组是字符流,而fu数组用来收集计算符号+-* /和{、}*/
float digui()
{
    float he=0,ji=0;  /* he代表加减运算结果,ji代表乘除运算结果 */
    char hefu='+';    /* 每次进入递归是,都要把标示符he设置为0,hefu设置为+。但那个标示符ji可以不用设置 */
     
    for( ;fu[i]!='}'&&fu[i]!='=';i++)
    {
        switch(fu[i])
        {
 
            case '{':
            i++;
            digui();  // 如果遇到圆括号,则优先计算圆括号里面的内容
            break;
            
            
            
            case '+':
            if(hefu=='+') {val[n] = he + val[n];he = val[n];}  
            else          {val[n] = he - val[n],he = val[n];}  // 如果+、-后面的符号依然是加减,则可以进行计算
            hefu = '+';                                       
            n++;
            break;
            
            case '-':
            if(hefu=='+')  {val[n] = he + val[n];he = val[n];}  
            else           {val[n] = he - val[n];he = val[n];}  // 同上
            hefu = '-';
            n++;
            break;
            
            case '*':  //  如果遇到优先级高一级的乘符号【或除符号】,则进入循环,直至遇到非乘除符号时推出
            {
            ji=val[n];  // ji在这里被设置
            while(1)
            {
               if(fu[i] == '*')
               {
                  if(fu[i+1] == '{')  //  如果在乘除循环里遇到圆括号,则递归调用自身,就是优先计算圆括号里面的内容
                    {
                            i+=2;n++;
                            ji = ji * digui();
                    }
                  else
                    {
                            ji = ji*val[n+1];
                            i++;n++;
                    }
                }
                else if(fu[i] == '/')
                {
                    if(fu[i+1] == '{')
                    {
                            i+=2;n++;
                            ji = ji / digui();
                    }
                    else
                    {
                            ji = ji/val[n+1];
                            i++;n++;
                    }
                }
                else break;  // 遇到非乘除符号,退出
            }
            val[n] = ji;  // 乘除循环结束,把n现在指向的数设置成循环计算的结果数,以便它以后可以与he计算,最后得出前面所有数的运算结果
            if(fu[i]=='+'||fu[i]=='-')
            i--;
            break;
            }
            
            case '/':   //这个与上面那个case里面的作用一样
            {
                ji = val[n];
                while(1)
                {
                    if(fu[i] == '*')
                    {
                        if(fu[i+1] == '{')
                        {
                            i+=2;n++;
                            ji = ji * digui();
                        }
                        else
                        {
                            ji = ji*val[n+1];
                            i++;n++;
                        }
                    }
                    if(fu[i] == '/')
                    {
                        if(fu[i+1] == '{')
                        {
                            i+=2;n++;
                            ji = ji / digui();
                             
                        }
                        else
                        {
                            ji = ji/val[n+1];
                            i++;n++;
                        }
                    }
                    else break;  
                }
            }
            val[n] = ji;
            if(fu[i]=='+'||fu[i]=='-'||fu[i]=='=')
            i--;
            break;
            }
    }
     
    if(hefu == '+') val[n] = he + val[n];  // 到这里就是到了一个递归的结束,然后根据hefu的状态决定进行+运算或-运算
    else val[n] = he - val[n];
     
    return val[n];  // 最后我们需要返回这个值
}
 
void main()
{
    int a=0,j=0;float b=0,d=0,g=10;;
    gets(c);
     
    for(i=0;c[i]!=0&&i<1000;i++)
    {
        if(c[i]>='0'&&c[i]<='9')
        {
            
            while(c[i]>='0'&&c[i]<='9')
            {
                b=(c[i]-'0')+b*10;
                i++;
            }
            if(c[i]=='.')
            {
                i++;
                while(c[i]>='0'&&c[i]<='9')
                {
                    d=d+(c[i]-'0')/g;
                    g*=10;
                    i++;
                }
            }  // 以上是手机输入流中的数
        val[n]=b+d;
        n++;
        }
      b=0;d=0;g=10;
    }
     
    for(i=0;c[i]!=0;i++)
        {
            if(c[i] < '0' || c[i] > '9')
            fu[j++]=c[i];
        }  // 这个则是收集输入流中的运算符
   
    j=n;
     
    i=0;
    n=0;  // 这里的清零是必须的
     
     
    printf(":::::%f\n", digui());
}
搜索更多相关主题的帖子: 计算 乘除 i++ break 符号 
2020-05-29 14:45



参与讨论请移步原网站贴子:https://bbs.bccn.net/thread-501858-1-1.html




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

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