Loading...
kostadink2001 avatar kostadink2001 7 Точки

C++ Advanced - 08_05.Calculator. Mr операцията

Здравейте,

задачата ми работи с изключение на mr операцията, толкова време дебъгвах и нищо, не мога да открия причината и да си оправя грешката. Реших да използвам глобален стак за паметта ми(колкото и некоректно да е това и да има и по-хубави начини). 

std::stack<int> memory;

class DivideOperation : public Operation {
	std::vector<int> operands;
	int result;
public:
	void addOperand(int operand) override {
		this->operands.push_back(operand);

		if (this->isCompleted()) {
			this->result = this->operands[0] / this->operands[1];
		}
	}

	bool isCompleted() override {
		return this->operands.size() == 2;
	}

	int getResult() override {
		return this->result;
	}
};

class MemorySaveOperation : public Operation {
	std::vector<int> operands;
	int result;
public:
	void addOperand(int operand) override {
		this->operands.push_back(operand);

		if (this->isCompleted()) {
			memory.push(operand);
			this->result = operand;
		}
	}

	bool isCompleted() override {
		return this->operands.size() == 1;
	}

	int getResult() override {
		return this->result;
	}
};

class MemoryReadOperation : public Operation {
	std::vector<int> operands;
	int result;
public:
	void addOperand(int operand) override {
		this->operands.push_back(operand);

		if (this->isCompleted()) {
			this->result = memory.top();
			memory.pop();
		}
	}

	bool isCompleted() override {
		return this->operands.size() == 1;
	}

	int getResult() override {
		return this->result;
	}

};

Къде точно греша в mr оператора? Благодаря предварително !

Тагове:
0
C++ Programming
MartinBG avatar MartinBG 4803 Точки
Best Answer

Пообъркана е логиката на методите, най-вече кога е isCompleted, заради излишни неща в класовете.

Ето изчистени варианти на двата класа, с които тестовете минават. Пускам ги като решения за да успееш да вземеш точките в Judge, защото си личи, че си хвърлил доста усилия по тази задача, но бих ти препоръчал след това да я доразгедаш и да видиш кое и защо работи така.

 

class MemorySaveOperation : public Operation {
public:
  void addOperand(int operand) override {
    memory.push(operand);
  }

  bool isCompleted() override {
    return false;
  }

  int getResult() override {
    return 0; // A dummy value
  }
};

class MemoryReadOperation : public Operation {
public:
  void addOperand(int operand) override { }

  bool isCompleted() override {
    return true;
  }

  int getResult() override {
    int result = memory.top();
    memory.pop();
    return result;
  }
};

 

0
30/10/2018 23:23:30
kostadink2001 avatar kostadink2001 7 Точки

Много ти благодаря, определено ще я доразгледам!

1
Можем ли да използваме бисквитки?
Ние използваме бисквитки и подобни технологии, за да предоставим нашите услуги. Можете да се съгласите с всички или част от тях.
Назад
Функционални
Използваме бисквитки и подобни технологии, за да предоставим нашите услуги. Използваме „сесийни“ бисквитки, за да Ви идентифицираме временно. Те се пазят само по време на активната употреба на услугите ни. След излизане от приложението, затваряне на браузъра или мобилното устройство, данните се трият. Използваме бисквитки, за да предоставим опцията „Запомни Ме“, която Ви позволява да използвате нашите услуги без да предоставяте потребителско име и парола. Допълнително е възможно да използваме бисквитки за да съхраняваме различни малки настройки, като избор на езика, позиции на менюта и персонализирано съдържание. Използваме бисквитки и за измерване на маркетинговите ни усилия.
Рекламни
Използваме бисквитки, за да измерваме маркетинг ефективността ни, броене на посещения, както и за проследяването дали дадено електронно писмо е било отворено.