C程序-简单计算器-整型浮点型

 思路:主要是处理乘除和加减的优先级问题,遍历字符串,如果是加减,直接把值加到结果sum中;如果是乘除,则需先计算乘除运算结果,用中间变量记录处理过程,不初始化即可做到连乘除,结果会加到sum。获取数字时,整数部分与小数部分分开处理。字符串算式以‘=’做为结束标志

#include <iostream>
#include <string>
#include <math.h>
using namespace std;

int Func(const char c)//把字符转换成目标字符 
{
    if(c >= '0' && c <= '9')//获得,0~9整数 
        return c -'0';
    else if(c == '.' )//浮点型'.' 
        return -1;
    else if (c == '*')//乘 
        return -2;
    else if(c == '/' )//除 
        return -3;
    else if(c == '-')//减 
        return -4;
    else if(c == '+')//加 
        return -5;
    else if(c == '=')//等于 ,结束标志 
        return -6;
    else if(c == '%')//取余 
        return -7;

    return -8;
}

//n字符处理起始位,a浮点型标记,str需要处理的字符 
double Get_num(int &n,int &a,string &p)//把字符转成数 
{
    double num = 0.0,k = 0.0;
    int i;
    for(i = n; Func(p[i]) >= -1; i++)//小于-1是运算符 
    {
        if(Func(p[i]) == -1)//浮点型 
        {
            k = 10.0;//浮点型,控制'.'位 
            a=0;
            continue;//获得'.'结束当次循环 
        }

        if(k > 0)//浮点型 
        {
            num = num + Func(p[i]) / k;//'.'点后位 
            k *= 10;
        }
        else
            num = num * 10 + Func(p[i]);//整数部分 
    }

    n = i;//处理到该位 

    return num;//返回所得数 
}

int main()
{
    string str;
    double num = 0.0, sum = 0.0;
    int m,k,a,flag = 0;

    cin >> str;

    if(Func(str[0]) == -4)//判断首位数字符号
        k = -4;//负 
    else
        k = -5;//正 

    for(int i = 0; str[i] != '\0'; i++)//遍历字符串 
    {
        a=1;// 非浮点型标志 
        if( Func(str[i]) >= -1)//非运算符,即数字 
            num = Get_num(i,a,str);//获取数字 

        switch (Func(str[i])) {
        case -2://乘法运算,num没有初始化,可连乘 
            num *= Get_num(++i,a,str);//++i,获得数字,而非运算符 
            i--;//处理置运符,退1位, 
            break;
        case -3://乘法运算,num没有初始化,可连除 
            m = Get_num(++i,a,str);//++i,获得数字,而非运算符 
            if (fabs(m) < 1E-6)//除数不能为0 
            {
                flag = 1;//非法运算标志 
                break;//非法,结束运算 
            }
            num /= m;
            i--;//处理置运符,退1位, 
            break;
        case -4:
        case -5:
        case -6:
            if(k == -4)//负数,即是加相反数 
                num = -num;
            sum += num;
            k = Func(str[i]);//获得下一个数的符号 
            num = 0.0;//初始化 
            break;
        case -7://取余 
            if(a)//整型才能取余 
            {
                m = Get_num(++i,a,str);//++i,获得数字,而非运算符 
                i--;//处理置运符,退1位,
                if(a && m > 0)//整型才能取余 ,正数 
                    num = (int)num % (int)m;
                else
                {
                  flag = 2;//非法运算标志 
                  break;//非法,结束运算 
                }
            }
            else
            {
              flag = 2;//非法运算标志 
              break;//非法,结束运算 
            }
        default:
            break;
        }
        if(flag)//非法,结束运算 
            break;
    }

    if(!flag)
        cout << "Result: " << sum << endl;//输出结果 
    else
        cout << "Input error" << endl;//非法,输入错误 
    return 0;
}

 

Guess you like

Origin blog.csdn.net/qq_40788199/article/details/102711940