【问题标题】:Problem pushing a float to stack for console Calculator将浮点数推送到控制台计算器的问题
【发布时间】:2011-07-16 14:49:19
【问题描述】:

我正在编写一个基于 C++ 控制台的计算器。

它的工作方式是 - readEquation 由一个迭代器组成,该迭代器读取总和,并将所有数字放入堆栈中。 -当读取方程遇到运算符时,例如'+',它调用 add() 函数,它有两个参数: add(float topOfStack, nextNumber()); -nextNumber 处理 BODMAS,如果下一个数字被除或乘,它会先解决那些,否则它会返回数字。 - 前一个和从堆栈中弹出,加法的结果被压入堆栈。

这是我目前写的代码: 根据调试器,我在this->numberStack->push(f); 这一行中遇到了某种错误——但它并没有告诉我问题出在哪里。如有任何帮助,我将不胜感激。

谢谢

代码:

    #include <iostream>
#include <cstdlib>
#include <sstream>
#include <string>
#include <cmath>
#include <cstring>
#include <stack>


using namespace std;

class Calculator
{
    public:
        Calculator();
        virtual ~Calculator();
        void readEquation();
        float nextInteger(int position);
        string equation;
    protected:
        float add(float firstNumber, float secondNumber);
        float subtract (float firstNumber, float secondNumber);
        float multiply (float number, float multiple);
        float divide (float numerator, float denominator);
        float squareRoot(float number);
        float square(float number);
    private:
        void temporaryPrintStack();
        float answer();
        stack<float>* numberStack;
};



Calculator::Calculator()
{
    //c
}

Calculator::~Calculator()
{
    //dtor
}

float Calculator::add(float numOne,float numTwo)
{
    return numOne+numTwo;
}

float Calculator::subtract(float numOne,float numTwo)
{
    return numOne-numTwo;
}

float Calculator::multiply(float number, float multiple)
{
    return number*multiple;
}

float Calculator::divide(float numerator, float denominator)
{
    return numerator/denominator;
}

float Calculator::square(float number)
{
    return number*number;
}

float Calculator::squareRoot(float number)
{
    return 0;
}

float Calculator::answer()
{
     return this->numberStack->top();
}

void Calculator::temporaryPrintStack()
{
    for(int index = 0; index <=  (int) this->numberStack->size();index++)
    {
        cout<<this->numberStack->top()<<", ";
        this->numberStack->pop();
    }
}

void Calculator::readEquation()
{
    int position=0;
    stringstream stringStream;
    string::iterator iterator;
    for(iterator = this->equation.begin();iterator!=this->equation.end();iterator++,position++)
    {
        if(*iterator>='0' && *iterator<='9' || *iterator=='.')//can this be replaced by isdigit()?
        {
            stringStream<<*iterator;
        }
        if(*iterator=='+')
        {
            string number;
            stringStream>>number;
            cout<<number<<" pushed to stack."<<endl;
            float f = atof(number.c_str());
            this->numberStack->push(f);
            //this->numberStack->push(this->add(this->numberStack->top(),this->nextInteger(position)));
            this->temporaryPrintStack();
        }

        if(*iterator=='=')
        {
            this->answer();
        }
    }
}

int main()
{
    Calculator *c=new Calculator();
    std::cout<<"Enter your sum in this form 2+2/1=";
    getline(cin,c->equation,'=');
    c->readEquation();
    system("pause");
    delete c;
    return 0;
}

【问题讨论】:

  • 这是作业是吗?像这样标记它。
  • @Erich Lancaster:你必须更具体地说明你看到什么样的错误消息或行为,而不是仅仅说get some kind of error

标签: c++ stack calculator


【解决方案1】:
stack<float>* numberStack;

这声明你的类将持有一个指向stack&lt;float&gt; 的指针。它确实分配该对象。您需要自己执行此操作(可能在构造函数中),并注意在析构函数中删除该对象。

// in ctor
numberStack = new stack<float>;

// in dtor
delete numberStack;

或者,不要使用指针,而是使用普通对象。

【讨论】:

  • 糟糕。你完全正确。太着急测试read函数了,忘记写出构造函数了:$
【解决方案2】:

看起来您忘记在 Calculator 构造函数中初始化堆栈。 其实你可以简单地使用:

stack<float> numberStack;

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-10-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多