Я делаю упражнения в новой книге Страуструпа "Принципы и практика программирования с использованием C++", и мне было интересно, выполнил ли кто-нибудь из них в Кару и готов ли поделиться своими знаниями?
В частности, о калькуляторе, который был разработан в главах 6 и 7. Например, вопросы о добавлении оператора !
и sqrt(), pow() и т.д. Я сделал это, но я не знаю, если решение я Имеется "хороший" способ делать вещи, и на сайте Bjarne нет опубликованных решений. Я хотел бы знать, иду ли я по правильному пути. Может быть, мы можем сделать вики для упражнений?
В основном у меня есть парсер токена. Он читает символ за раз из cin. Это означало токенизировать выражения типа 5 * 3 + 1, и это прекрасно работает для этого. Одним из упражнений является добавление функции sqrt(). Поэтому я изменил код токенизации, чтобы обнаружить "sqrt ("), а затем вернуть объект Token, представляющий sqrt. В этом случае я использую символ "s". Это так, как это сделали бы другие? Что если мне нужно реализовать sin()? Изложение дела может стать грязным.
char ch;
cin >> ch; // Note that >> skips whitespace (space, newline, tab, etc.)
switch (ch) {
case ';': // For "print"
case 'q': // For "quit"
case '(':
case ')':
case '+':
case '-':
case '*':
case '/':
case '!':
return Token(ch); // Let each character represent itself
case '.':
case '0': case '1': case '2': case '3': case '4':
case '5': case '6': case '7': case '8': case '9':
{
cin.putback(ch); // Put digit back into the input stream
double val;
cin >> val; // Read a floating-point number
return Token('8', val); // Let '8' represent "a number"
}
case 's':
{
char q, r, t, br;
cin >> q >> r >> t >> br;
if (q == 'q' && r == 'r' && t == 't' && br == '(') {
cin.putback('('); // Put back the bracket
return Token('s'); // Let 's' represent sqrt
}
}
default:
error("Bad token");
}