Я непреднамеренно позволил своим ученикам чрезмерно ограничить общий класс, используемый для решения следующей задачи. Я понял, что это может быть проблемой для обитателей этого сайта.
Первая команда/функция, getNodes, принимает строку, представляющую префиксное выражение, используя целые числа со знаком и четыре операции +, -, * и /, и создает соответствующий связанный список токенов с нулевым завершением, используя класс Node, с токенами, связанными через "правильный" указатель.
Вторая команда/функция, getTree, берет аналогичную строку, передает ее в getNodes и повторно связывает результирующие узлы в дерево выражений.
Третья команда/функция, оценка, берет аналогичную строку, передает ее в getTree и оценивает результирующее дерево выражений, чтобы сформировать ответ.
Далее следует чрезмерно ограниченный exptree.h. Проблема должна быть решена путем написания только трех функций, определенных выше, без дополнительных функций.
#ifndef EXPTREE_H_
#define EXPTREE_H_
using namespace std;
enum Ops{ADD, SUB, MUL, DIV, NUM};
class Node {
private:
int num;
Ops op;
Node *left, *right;
public:
friend Node *getNodes(string d);
friend Node *getTree(string d);
friend int evaluate (string);
};
int evaluate(string d);
Node *getNodes(string d);
Node *getTree(string d);
#endif
Единственные библиотеки, которые можно использовать, это
#include <iostream>
#include <vector>
#include <string>
#include "exptree.h"
Для тех из вас, кто беспокоится о моих учениках, сегодня я укажу, как еще пара хорошо расположенных функций позволит легко решить эту проблему. Я знаю, что дерево выражений может кодировать рациональные числа, а не только целые числа. Сегодня я тоже это укажу.
Вот программа драйвера, которую я дал им на основе их спецификаций.
#include <iostream>
#include <string>
#include "exptree.h"
using namespace std;
void test(string s, int target) {
int result = evaluate(s);
if (result == target)
cout << s << " correctly evaluates to " << target << endl;
else
cout << s << "(" << result
<< ") incorrectly evaluates to " << target << endl;
}
int main() {
test("42", 42);
test("* - / 4 2 1 42", 42);
test("* - / -4 +2 -1 2", -2);
test("* - / -4 +2 -1 2 ", -2);
test("* 9 6", 54);
return 0;
}
Сможете ли вы написать три функции как можно элегантнее, чтобы решить эту кошмарную проблему?
<string>
? В противном случае сложно определить функции ;-) - person Steve Jessop   schedule 04.04.2011string
вexptree.h
не находится в глобальном пространстве имен к моменту включенияexptree.h
в программу-драйвер. - person Robᵩ   schedule 04.04.2011<string>
иusing namespace std
или префиксstring
s. Подумаешь? - person pajton   schedule 05.04.2011