⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 calc.c

📁 24点游戏,DOS下运行的,增加了输入验证的强度,可以在程序中对答案进行查询
💻 C
字号:
/*输入表达式计算器模块*/
#include "MAGIC.h"
#include <stdio.h>
#include <stdlib.h>
#include <conio.h>
#include <math.h>
#include <string.h>

float CalcForm(char Input[])                /*计算字符串表达式的浮点值*/
{
    float Form[50];
    if(Convert(Input,Form))
    return SmartCalc(Form);
    else
    {
/*        printf("Error:Input illegal!\n");*/
        return INERROR;
    }
}
int Convert(char Input[],float Form[])          /*转换字符串为浮点数组*/
{
    int i=0,j=0,flag=0,ll=0,rl=0;
    float temp=0;

    while(Input[i]!='\0')
    {
        if(Input[i]>='0'&&Input[i]<='9')
        {
            temp=temp*10+(Input[i]-48);
            flag=1;
            if(Input[i+1]=='\0')
            {
                Form[j]=temp;
                j++;
            }
        }
        else if(Input[i]=='+'||Input[i]=='-'||Input[i]=='*'||Input[i]=='/'||Input[i]=='('||Input[i]==')')
        {
            if(flag)
            {
                Form[j]=temp;
                temp=0;
                j++;
            }

            if(Input[i]=='+')
            {
                if(((Input[i-1]<'0'||Input[i-1]>'9')&&Input[i-1]!=')')||((Input[i+1]<'0'||Input[i+1]>'9')&&Input[i+1]!='(')) return 0;

                Form[j]=ADD;
                j++;
            }
            else if(Input[i]=='-')
            {
                if(((Input[i-1]<'0'||Input[i-1]>'9')&&Input[i-1]!=')')||((Input[i+1]<'0'||Input[i+1]>'9')&&Input[i+1]!='(')) return 0;

                Form[j]=MIS;
                j++;
            }
            else if(Input[i]=='*')
            {
                if(((Input[i-1]<'0'||Input[i-1]>'9')&&Input[i-1]!=')')||((Input[i+1]<'0'||Input[i+1]>'9')&&Input[i+1]!='(')) return 0;

                Form[j]=MUT;
                j++;
            }
            else if(Input[i]=='/')
            {
                if(((Input[i-1]<'0'||Input[i-1]>'9')&&Input[i-1]!=')')||((Input[i+1]<'0'||Input[i+1]>'9')&&Input[i+1]!='(')) return 0;

                Form[j]=DEV;
                j++;
            }
            else if(Input[i]=='(')
            {
                if(((i>0)&&Input[i-1]!='('&&Input[i-1]!='+'&&Input[i-1]!='-'&&Input[i-1]!='*'&&Input[i-1]!='/')||(Input[i+1]!='\0'&&Input[i+1]!='('&&(Input[i+1]<'0'||Input[i+1]>'9'))) return 0;

                Form[j]=LL;
                j++;
                ll++;
            }
            else if(Input[i]==')')
            {
                if((i>0&&Input[i-1]!=')'&&(Input[i-1]<'0'||Input[i-1]>'9'))||(Input[i+1]!='\0'&&Input[i+1]!=')'&&Input[i+1]!='+'&&Input[i+1]!='-'&&Input[i+1]!='*'&&Input[i+1]!='/')) return 0;

                Form[j]=RL;
                j++;
                rl++;
            }
            flag=0;
        }
        else return 0;

        i++;
    }
    if(ll!=rl) return 0;
    Form[j]=END;
    return 1;
}
float SmartCalc(float Form[])                  /*递归计算浮点数组的值*/
{
    int i=0,Start=0,End,Flag1=0,Flag2=0;
    float temp;

    while(Form[i]!=END)
    {
        if(Form[i]==LL)
        {
            Start=i+1;
            Flag1=1;
        }
        else if(Form[i]==RL)
        {
            End=i-1;
            Flag2=1;
            if(Flag1==1) break;
        }
        i++;
    }
    if(Flag2==0) End=i-1;

    if(Flag1+Flag2==0) return FloatCalc(Form,Start,End);
    else if(Flag1+Flag2==2)
    {
        temp=FloatCalc(Form,Start,End);

        if(temp==OUTERROR) return OUTERROR;

        Replace(Form,Start-1,Start+1,temp);
        return SmartCalc(Form);
    }
}

void Replace(float Form[],int Start,int End,float Res)     /*替换字符串中指定的字符*/
{
    Form[Start]=Res;
    do
    {
        Form[++Start]=Form[++End];

    }while(Form[End]!=END);
}

float FloatCalc(float Form[],int Start,int End)        /*计算从START到END的表达式的值*/
{
    int i=Start;
    float Sum;

    for(i=Start;i<End;i++)
    {
        if(Form[i]==MUT)
        {
            Replace(Form,i-1,i+1,Form[i-1]*Form[i+1]);
            End=End-2;
            i--;
        }
        else if(Form[i]==DEV)
        {
            if(fabs(Form[i+1])<1e-5)
            {
/*                printf("Error:Devided by zero!\n");*/
                return OUTERROR;
            }
            Replace(Form,i-1,i+1,(float)Form[i-1]/Form[i+1]);
            End=End-2;
            i--;
        }
    }

    Sum=Form[Start];

    for(i=Start+1;i<End;i=i+2)
    {
        if(Form[i]==ADD) Sum=Sum+Form[i+1];
        else if(Form[i]==MIS) Sum=Sum-Form[i+1];
    }
    Replace(Form,Start,End,Sum);

    return Sum;
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -