//implement a calculator
//no bracket
#include <iostream>
#include<cctype>//the 'isdigit' which was included in it will be used in the funcion named number;
#include <cstdlib>

using std::cin;
using std::cout;
using std::endl;

void eatspaces(char * str);
double number(const char * str, size_t & index);
double expr(const char *str);
double term(const char *str, size_t & index);

int main()
{
    const int max{ 80 };//length of the expression
    char buffer[max]{};
    
    cout << endl << "enter an expression , or an empty line to quit :" << endl;

    while (1)
    {
        cin.getline(buffer, sizeof buffer);//get an expression from keyboard
        cout << "the expression you enter is : " << buffer<<endl;
        eatspaces(buffer);
        cout << "the expression without spaces is : " << buffer << endl;
        double value{};
        //size_t index{};

        value = expr(buffer);//calculate the expression
        //value = number(buffer, index);//be use to test whether the function "number" is on work
        cout << "the value :" << value << endl;


        if (buffer[0] == 0)
            return 0;
    }

    //cout << endl;
    return 0;

}
/*expr :calculate the expression got from buffer*/
double expr(const char *str)
{
    double value{};
    size_t index{};//this index will be used from now to the end ,which show as a '&'

    //divide the expression into term according to the '+' or '-'
    value=term(str, index);//the beginning term
    for (;;)
    {
        char temp{ *(str + index) };
        index++;
        cout << "test index" << endl;
        switch (temp)
        {    
        case '\0':return value;
        case '+': value = value + term(str, index); break;//whether put index++ here or not?
        case '-':value = value - term(str, index); break;
        //default:char message[38]{ "expression evaluation error,found: " };
        //        strncat_s(message, str + index -1, 1);
        //        throw message;
        //        break;
        }    
    }
}
/*calculate every term by using the multi (*)and divide(/)*/
double term(const char *str, size_t & index)
{
    double value{};
    value = number(str, index);
    while (1)
    {
        if (*(str + index) == '*')
            value = value*number(str, ++index);
        else if (*(str + index) == '/')
            value = value / number(str, ++index);
        else
            break;
        //switch (*(str + index++))
        //{
        //case '\0':return value;
        //case '*':value = value*number(str, index); break;
        //case '/':value = value / number(str, index); break;
        //default:return value;
            
        //}
    }
    return value;
}
/*read number;*/
double number(const char * str, size_t & index)
{
    double value{};
    while (isdigit(*(str + index)))
    {    
        value = 10 * value + (*(str + index) - '0');
        index++;
    }
    if (*(str + index) != '.')
    {
        return value;//if the number is not a decimal 
    }
    else
    {
        //if the number is a decimal
        double factor{ 1.0 };
        index++;//point to the char after the dicimal
        while (isdigit(*(str + index)))
        {
            factor = factor*0.1;
            value = value + (*(str + index) - '0')*factor;
            index++;
        }
        return value;
    }
}

/*delete space*/
void eatspaces(char * str)
{
    size_t i{};//control the pointer which point to the new string;
    size_t j{};//control the pointer which point to the old string;
    do
    {
        if (*(str + j) != ' ')
        {
            *(str + i) = *(str + j);
            i++;
        }
        j++;
    } while (*(str + j) != '\0');
    *(str + i) = '\0';//give an end command to the new string ;
    return;
}

 

转载于:https://www.cnblogs.com/simayuhe/p/5185113.html

Logo

开放原子开发者工作坊旨在鼓励更多人参与开源活动,与志同道合的开发者们相互交流开发经验、分享开发心得、获取前沿技术趋势。工作坊有多种形式的开发者活动,如meetup、训练营等,主打技术交流,干货满满,真诚地邀请各位开发者共同参与!

更多推荐