Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.89/18: Рейтинг темы: голосов - 18, средняя оценка - 4.89
1 / 1 / 0
Регистрация: 23.07.2013
Сообщений: 72

Calculator by Bjarne Stroustrup

23.12.2017, 19:06. Показов 3691. Ответов 4
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Здравствуйте, уважаемые форумчане!

Изучаю C++ по книге Bjarne Stroustrup'a. Пишу пример калькулятора и есть небольшие трудности. Все работает, но на станице 288 начинается раздел по тому, как работать с объявленными переменными. Когда вводишь в окно программы, например, let x = 2.5; , то программа на первый взгляд все правильно обрабатывает (то есть переменной присваивается значение ), но затем когда вводишь выражение 5 - x; , то попадаешь в
C++
1
error("primary expected");
блока
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
double primary()
{
 
    Token t = ts.get();
    switch (t.kind) {
    case '(':    // handle '(' expression ')'
    {
        double d = expression();
        Token   t = ts.get();
        if (t.kind != ')') error("')' expected");
        return d;
    }
    case number:            // we use '8' to represent a number
        return t.value;  // return the number's value
    case '-':
        return -primary();
    case '+':
        return primary();
    default:
        error("primary expected");
    }
}
хотя case c лексемой let находится в функции
C++
1
2
3
4
5
6
7
8
9
10
11
12
double statement()
{
    Token t = ts.get();
    switch (t.kind)
    {
    case let:
        return declaration();
    default:
        ts.putback(t);
        return expression();
    }
}
и, да, кажется, я запутался. Не могли бы помочь?
Вложения
Тип файла: rar ConsoleApplication1.rar (1.46 Мб, 9 просмотров)
0
Лучшие ответы (1)
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
23.12.2017, 19:06
Ответы с готовыми решениями:

Интервью Bjarne Stroustrup
Прочитал вот это интервью http://cs.mipt.ru/docs/comp/rus/develop/other/stroustrup_interview/index.html и надеюсь это неправда. Я недавно...

Загадочная функция bjarne stroustrup
прочитал много соответствующих тем, но решения данной проблемы так и не нашел: чем заменить функцию get_token();

Задача из Bjarne Stroustrup (Глава 12,7 №2)Графическая линия в консоли(в стиле ASCII)
Глава 12,7 №2. Implement a simple graphics system using whatever graphics facilities are available on your system (if you don’t have a...

4
277 / 226 / 93
Регистрация: 27.06.2016
Сообщений: 639
24.12.2017, 01:02
MaximRTS, полагаю, в primary должна быть помимо обработки скобок, унарного плюса и минуса, также обработка произвольных имён (то же "a").
C++
1
2
3
4
5
6
7
8
 case '-':
        return -primary();
    case '+':
        return primary();
case identifier:
       ....
    default:
        error("primary expected");
1
1 / 1 / 0
Регистрация: 23.07.2013
Сообщений: 72
03.01.2018, 13:29  [ТС]
Спасибо за ответ! Очень помогли!
Добавил в primary
C++
1
2
case name:
        return get_value(t.name);
все работает! спасибо

Добавлено через 1 час 24 минуты
Еще, есть задание "10. Измените 'ключевое слово объявления' с let на #". Не получается.
здесь я меняю:
C++
1
const string declkey = "let";
на:
C++
1
const string declkey = "#";
но после это попадаю в
C++
1
error("Bad token");
блока
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
Token Token_stream::get()
{
    if (full) {       // do we already have a Token ready?
                      // remove token from buffer
        full = false;
        return buffer;
    }
 
    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 '%':
    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(number, val);
    }
    default:
        if (isalpha(ch)) {
            string s;
            s += ch;
            while (cin.get(ch) && (isalpha(ch) || isdigit(ch))) s += ch;
            cin.putback(ch);
            if (s == declkey)
                return Token(let);
            return Token{ name, s };
        }
        error("Bad token");
    }
}
Я, так понимаю, что проблема в конструкции
C++
1
2
return Token(let);
            return Token{ name, s };
может быть, что нет преобразования string в char.
Подскажите, пожалуйста. Потому, что как работает
C++
1
isalpha(ch)
я не понимаю. Он есть в библиотеке std_lib_facilities.h, но описанную, как функцию я там не нашел.
0
277 / 226 / 93
Регистрация: 27.06.2016
Сообщений: 639
03.01.2018, 18:03
Лучший ответ Сообщение было отмечено MaximRTS как решение

Решение

MaximRTS,
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
 switch (ch) {
    case '#': return Token(let);
    case ';':    // for "print"
    ..................................................
    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(number, val);
    }
    default:
        if (isalpha(ch)) {
            string s;
            s += ch;
            while (cin.get(ch) && (isalpha(ch) || isdigit(ch))) s += ch;
            cin.putback(ch);
            return Token{ name, s };
        }
        error("Bad token");
    }
1
1 / 1 / 0
Регистрация: 23.07.2013
Сообщений: 72
03.01.2018, 20:35  [ТС]
Так, не получается. Тогда перекидывает в
C++
1
error("пропущен '=' в определении", var_name);
блока
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
double declaration()
//Считаем, что мы уже встретили ключевое слово "let"
//Обрабатываем : Имя = Выражение 
//Объявление переменной с Именем с начальным значением ,
//заданным Выражением
{
    Token t = ts.get();
    if (t.kind != name)
        error("in defing expected name of variable");
    string var_name = t.name;
 
    Token t2 = ts.get();
    if (t2.kind != '=')
        error("пропущен '=' в определении", var_name);
 
    double d = expression();
    define_name(var_name, d);
    return d;
}
Я думаю, что ошибка из-за того, что в структуре
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
class Token {
public:
    string name;
    char kind;        // what kind of token
    double value;     // for numbers: a value 
    Token(char ch)    // make a Token from a char
        :kind{ ch } { }
 
    Token(char ch, double val)     // make a Token from a char and a double
        :kind{ ch }, value{ val } { }
    //
    Token(char ch, string n)// инициализирует kind и name
        :kind{ ch }, name{ n } {}
};
класс Token(char ch) работает с типом char
C++
1
2
Token(char ch)    // make a Token from a char
        :kind{ ch } { }
хотя, когда там string , тоже не работает

Добавлено через 19 минут
Спасибо, большое) Это я коммент невнимательно посмотрел, дурак потому, что) Спасибо все работает!
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
03.01.2018, 20:35
Помогаю со студенческими работами здесь

Подключение FLTK Stroustrup
Тема возможно избитая, но я никак не могу разобраться. В 12 главе книги Страуструпа требуется подключить FLTK. Делал всё по инструкции из...

calculator
вопрос как изменить код что бы можно было , пользоваться приоритетами знаков , т.е 4+4*2 =12 а не 16 !??? #include<stdio.h> ...

calculator II
привет! как сделать - x:=0; после нажатия кнопки x:=1; если еще раз нажать то прибавляется единица! при каждом нажатии кнопки...

Calculator
Помогите, пожалуйста:-[ надо решить задачку: Реализовать класс Calculator с полным набором арифметических операций, используя класс...

Make Calculator
пожалуйста помогите искать ошибку <?php if (isset ($_POST )) { require_once "lib/functions.php"; $n_1 = $_POST; ...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
5
Ответ Создать тему
Новые блоги и статьи
Советы по крайней бережливости. Внимание, это ОЧЕНЬ длинный пост.
Programma_Boinc 28.12.2025
Советы по крайней бережливости. Внимание, это ОЧЕНЬ длинный пост. Налог на собак: https:/ / **********/ gallery/ V06K53e Финансовый отчет в Excel: https:/ / **********/ gallery/ bKBkQFf Пост отсюда. . .
Кто-нибудь знает, где можно бесплатно получить настольный компьютер или ноутбук? США.
Programma_Boinc 26.12.2025
Нашел на реддите интересную статью под названием Anyone know where to get a free Desktop or Laptop? Ниже её машинный перевод. После долгих разбирательств я наконец-то вернула себе. . .
Thinkpad X220 Tablet — это лучший бюджетный ноутбук для учёбы, точка.
Programma_Boinc 23.12.2025
Рецензия / Мнение/ Перевод Нашел на реддите интересную статью под названием The Thinkpad X220 Tablet is the best budget school laptop period . Ниже её машинный перевод. Thinkpad X220 Tablet —. . .
PhpStorm 2025.3: WSL Terminal всегда стартует в ~
and_y87 14.12.2025
PhpStorm 2025. 3: WSL Terminal всегда стартует в ~ (home), игнорируя директорию проекта Симптом: После обновления до PhpStorm 2025. 3 встроенный терминал WSL открывается в домашней директории. . .
Как объединить две одинаковые БД Access с разными данными
VikBal 11.12.2025
Помогите пожалуйста !! Как объединить 2 одинаковые БД Access с разными данными.
Новый ноутбук
volvo 07.12.2025
Всем привет. По скидке в "черную пятницу" взял себе новый ноутбук Lenovo ThinkBook 16 G7 на Амазоне: Ryzen 5 7533HS 64 Gb DDR5 1Tb NVMe 16" Full HD Display Win11 Pro
Музыка, написанная Искусственным Интеллектом
volvo 04.12.2025
Всем привет. Некоторое время назад меня заинтересовало, что уже умеет ИИ в плане написания музыки для песен, и, собственно, исполнения этих самых песен. Стихов у нас много, уже вышли 4 книги, еще 3. . .
От async/await к виртуальным потокам в Python
IndentationError 23.11.2025
Армин Ронахер поставил под сомнение async/ await. Создатель Flask заявляет: цветные функции - провал, виртуальные потоки - решение. Не threading-динозавры, а новое поколение лёгких потоков. Откат?. . .
Поиск "дружественных имён" СОМ портов
Argus19 22.11.2025
Поиск "дружественных имён" СОМ портов На странице: https:/ / norseev. ru/ 2018/ 01/ 04/ comportlist_windows/ нашёл схожую тему. Там приведён код на С++, который показывает только имена СОМ портов, типа,. . .
Сколько Государство потратило денег на меня, обеспечивая инсулином.
Programma_Boinc 20.11.2025
Сколько Государство потратило денег на меня, обеспечивая инсулином. Вот решила сделать интересный приблизительный подсчет, сколько государство потратило на меня денег на покупку инсулинов. . . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2025, CyberForum.ru