一个四则运算的小小计算器

// 一个四则运算的小小计算器


// 陆陆续续解决了 小数 空格 括号 的问题

// 之后准备添加错误检测

// 还准备把三个函数合起来

// 再添加其他运算符


// 基本思路是嵌套

// 注释很乱,所以我暂时删掉了,见谅

// 想要注释的小伙伴可以找我


// 有bug的话请务必告诉我


#include <stdio.h>
#define MAX_STR 10000

char *highofstr(char *low)
{
    while(*low!='\0')
        low++;
    return low-1;
}

double trans(char *low, char *high)
{   
    double num=0;
    int cnt_point=-1;
    while(low<=high)
    {
        if( *low=='.' || cnt_point>-1 )
            cnt_point++;
        if( *low!='.' )
            num= 10*num+((*low)-'0');
        low++;
    }
    for( ; cnt_point>0; cnt_point--)
        num /=10;
    return num;
}

int flagch(char ch)
{
    if('0'<=ch && ch<='9')return 9;
    if(ch=='.')return 9; 
    if(ch=='+' || ch=='-')return 1;
    if(ch=='*' || ch=='/')return 2;
    if(ch=='(' || ch==')')return 9;
    return -1;
}

double deal_1(char *low, char *high)
{
    double deal_2(char *low, char *high);
    
    int cnt_kh=0;
    char *p=high;
    while( (flagch(*p)!=1 && p>low) || (cnt_kh!=0) )
    {
        if(*p=='(')cnt_kh++;
        if(*p==')')cnt_kh--;
        p--;
    } 
    
    if(p<=low)
        return deal_2(low, high);
    else if(*p=='+')
        return deal_1(low, p-1)+deal_2(p+1, high);
    else if(*p=='-')
        return deal_1(low, p-1)-deal_2(p+1, high);
}

double deal_2(char *low, char *high)
{
    double deal_9(char *low, char *high);
    
    int cnt_kh=0;
    char *p=high;
     while( (flagch(*p)!=2 && p>low) || (cnt_kh!=0) )
    {
        if(*p=='(')cnt_kh++;
        if(*p==')')cnt_kh--;
        p--;
    } 
    
    if(p<=low)
        return deal_9(low, high);
    else if(*p=='*')
        return deal_2(low, p-1)*deal_9(p+1, high);
    else if(*p=='/')
        return deal_2(low, p-1)/deal_9(p+1, high);
}

double deal_9(char *low, char *high)
{ 
    double deal_1(char *low, char *high);
    if( *low!='(' )
        return trans(low, high);
    else
        return deal_1(low+1, high-1);
}

int true_cnt_point(double num)
{  
    if( num-(int)num==0 )return 0;
    return 1+true_cnt_point(num*10);
}

void Enterstr(char *str)
{
    for(int i=0; i<MAX_STR; i++)
    {
        scanf("%c", str);
        if(*str=='\n')break;
        if(*str!=' ')str++; 
    } 
    *str='\0';
}

int main()
{
    char str[MAX_STR+1];
    while(1)
    {
        Enterstr(str);
        printf("%.10f\n", deal_1(str, highofstr(str)));
    }
    return 0;
}

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值