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

来源:互联网 发布:淘宝买东西如何开发票 编辑:程序博客网 时间:2024/05/29 09:03

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


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

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

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

// 再添加其他运算符


// 基本思路是嵌套

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

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


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


#include <stdio.h>#define MAX_STR 10000char *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;}

原创粉丝点击