С Новым годом! Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.54/13: Рейтинг темы: голосов - 13, средняя оценка - 4.54
 Аватар для maxon887
12 / 12 / 7
Регистрация: 05.06.2012
Сообщений: 280

Калькулятор страуструпа

20.09.2013, 12:29. Показов 2866. Ответов 15
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Ну по крайней мере если это и не он, то очень на него похож.
Проблема в скобках.Например:
(1+1 - всё хорошо, выплывет ощибка "Expected right bracket"
1+1) - плохо, каклькуляторо продолжит работать, для больших выражений результат не предсказуемый.
Надо это как то починить, я уже сам голову сламал))) Спасибо зарание.
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
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
#include <iostream>
using namespace std;
enum TokenValue
{
    END,NUMBER,PLUS='+',MINUS='-',MUL='*',DIV='/',
    LB='(',RB=')'
};
TokenValue CurrentSymbol;
double CurrentNumber;
int errors;
 
double error(const char* s)
{
    cerr<<"Error: "<<s<<endl;
    errors++;
    return -1;
}
 
double expr();
TokenValue GetSymbol()
{
    char ch=0;
    ch=cin.get();
    switch(ch)
    {
    case'\n':
        return CurrentSymbol=END;
    case'1': case'2': case'3': case'4': case'5':
    case'6': case'7': case'8': case'9': case'0':
        cin.putback(ch);
        cin>>CurrentNumber;
        return CurrentSymbol=NUMBER;
    case'+': case'-': case'*': case'/':
    case'(': case')':
        return CurrentSymbol=TokenValue(ch);
    default:
        error("Imput error");
        return CurrentSymbol=END;
    }
}
 
double prim()
{
    switch(CurrentSymbol)
    {
    case NUMBER:
        GetSymbol();
        return CurrentNumber;
    case LB:
    {
        GetSymbol();
        double e=expr();
        if(CurrentSymbol!=RB)
            return error("Expected right bracket");
        GetSymbol();
        return e;
    }
    default:
        error("Primary expected");
        GetSymbol();
        return -1;
    }
}
 
double term()
{
    double left=prim();
    while(1)
    {
        switch(CurrentSymbol)
        {
        case MUL:
            GetSymbol();
            left *=prim();
            break;
        case DIV:
        {
            GetSymbol();
            double d=prim();
            if(d!=0)
                left /= d;
            else
                error("Division by zero");
            break;
        }
        default:
            return left;
        }
    }
}
 
double expr()
{
    double left=term();
    while(1)
    {
        switch(CurrentSymbol)
        {
        case PLUS:
            GetSymbol();
            left += term();
            break;
        case MINUS:
            GetSymbol();
            left -= term();
            break;
        default:
            return left;
        }
    }
}
 
int main()
{
    while(1)
    {
        GetSymbol();
        if(CurrentSymbol==END)
            continue;
        cout<<expr()<<endl;
    }
    return 0;
}
0
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
20.09.2013, 12:29
Ответы с готовыми решениями:

Калькулятор Страуструпа С++
Я новичок в С++, пытаюсь читать Страуструпа. Дошёл до строчного калькулятора и не понимаю принципов его работы, перечитывал главу 4 раза....

Калькулятор Страуструпа
Вот код калькулятора, помогите исправить 2 вещи: 1) Когда в командной строке пишем, допустим А = 5, надо сделать так, чтобы 5 не писалось...

Калькулятор Страуструпа (C++)
Добрый вечер! Я изучаю &quot;Принципы и практика использования C++&quot; Страуструпа. Все, что он пишет, хорошо понимаю, но следующая логика...

15
 Аватар для Cynacyn
35 / 35 / 7
Регистрация: 02.05.2013
Сообщений: 109
20.09.2013, 13:00
Помню сам долго парился с тем, чтобы добавить обработку скобок. Я запомнил что очень важно правильно определить грамматику.
Под спойлером Вы можете увидеть как это сделал я:
Кликните здесь для просмотра всего текста
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
47
48
49
50
// Calculator.h
/*
 
    Grammatis:
 
        calculation:
            statement
            print
            quit
            calculation statement
        statement:
            declaration
            expression
        declaration:
            "let" name "=" expression
        print:
            ';'
        quit:
            'q'
 
        expression:
            term
            expression '+' term
            expression '-' term
        term:
            primary
            term '*' primary
            term '/' primary
        primary:
            number
            name
            number name
            '('expression')'
            '-' primary
            '+' primary
            sqrt primary
            pow '(' expression ',' expression ')'
            name '=' expression
            help
        number:
            floating_point_literal
        name:
            string_literal
        help:
            help
            
 
 
 
*/


Пример моей реализации калькулятора (буду рад отзывам):

http://codepad.org/OcGLe0Pd
http://codepad.org/RFm9DKzb

пример использования:
C++
1
2
3
int main() { 
calculate(std::cin,std::cout); 
return 0;
1
 Аватар для Nullik
46 / 15 / 4
Регистрация: 13.03.2013
Сообщений: 302
20.09.2013, 13:02
это чем-то похоже на обратную польскую запись через стек?
0
 Аватар для Cynacyn
35 / 35 / 7
Регистрация: 02.05.2013
Сообщений: 109
20.09.2013, 13:07
Цитата Сообщение от Nullik Посмотреть сообщение
это чем-то похоже на обратную польскую запись через стек?
Глянул в вики что есть ОПЗ - здесь определяется естественная грамматика для работы с потоком символов, не знаю в чем может быть сходство.

Т.е. можно написать (2+2)2, ответ = 8.

P.S. Исправил ссылки.

Calculator.h
Calculator.cpp
0
 Аватар для Nullik
46 / 15 / 4
Регистрация: 13.03.2013
Сообщений: 302
20.09.2013, 13:24
Cynacyn, не могу найти в инете: а этот калькулятор что делает? Примеры, если не трудно.

Ну, польская так: 2+2*(8-1)
Кликните здесь для просмотра всего текста

1) стек1:
2
стек2:

2)
стек1:
2
стек2:
+

3)
стек1:
2
2
стек2:
+

4)
стек1:
2
2
стек2:
+
*

5)
стек1:
2
2
стек2:
+
*
(

6)
стек1:
2
2
8
стек2:
+
*
(

7)
стек1:
2
2
8
стек2:
+
*
(
-

8)
стек1:
2
2
8
1
стек2:
+
*
(
-

9) (встретили закрывающую скобку, пошли до первой открывающей)
стек1:
2
2
7 (сделали действия, пока шли обратно)
стек2:
+
*

10) т.к. конец строки, то начинаем из стеков доставать:
стек1:
2
14 (сделали действия, пока шли обратно)
стек2:
+

11)
стек1:
16
стек2:
0
 Аватар для Cynacyn
35 / 35 / 7
Регистрация: 02.05.2013
Сообщений: 109
20.09.2013, 13:30
Цитата Сообщение от Nullik Посмотреть сообщение
Cynacyn, не могу найти в инете: а этот калькулятор что делает? Примеры, если не трудно.

Ну, польская так: 2+2*(8-1)
Кликните здесь для просмотра всего текста



обычные арифметические действия, используя обычные приоритет арифметических операторов и скобок, позволяет объявлять переменные, считает корень/степень, уже не помню что ещё - скомрилируйте программу используя cin, cout как аргументы calculate и введите help
1
 Аватар для maxon887
12 / 12 / 7
Регистрация: 05.06.2012
Сообщений: 280
20.09.2013, 13:46  [ТС]
Цитата Сообщение от Cynacyn Посмотреть сообщение
Пример моей реализации калькулятора (буду рад отзывам):
Не собрался в виду отсутствия std_lib_facilities.h
0
 Аватар для Cynacyn
35 / 35 / 7
Регистрация: 02.05.2013
Сообщений: 109
20.09.2013, 13:48
Цитата Сообщение от maxon887 Посмотреть сообщение
Не собрался в виду отсутствия std_lib_facilities.h
std_lib_facilities.h переименуйте в std_lib_facilities.h и сохраните в директорию проекта (туда где лежит файл содержащий main())
Вот ссылка на страницу с кодом :std_lib_facilities.h
1
 Аватар для maxon887
12 / 12 / 7
Регистрация: 05.06.2012
Сообщений: 280
20.09.2013, 23:12  [ТС]
да блин вы видели как он вообще функцию поиска из таблицы имён реализовал???
это вообще что такое?))
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
name* look(const char* p, int ins =0)
{
int ii = 0; // хэш-код
const char* pp = p;
while (*pp) ii = ii<<1 ^ *pp++;
if (ii < 0) ii = -ii;
ii %= TBLSZ;
for (name* n=table[ii]; n; n=n->next) // поиск
if (strcmp(p,n->string) == 0) return n;
if (ins == 0) error("имя не найдено");
name* nn = new name; // занесение
nn->string = new char[strlen(p)+1];
strcpy(nn->string,p);
nn->value = 1;
nn->next = table[ii];
table[ii] = nn;
return nn;
}
0
 Аватар для Cynacyn
35 / 35 / 7
Регистрация: 02.05.2013
Сообщений: 109
23.09.2013, 09:34
Цитата Сообщение от maxon887 Посмотреть сообщение
да блин вы видели как он вообще функцию поиска из таблицы имён реализовал???
это вообще что такое?))
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
name* look(const char* p, int ins =0)
{
int ii = 0; // хэш-код
const char* pp = p;
while (*pp) ii = ii<<1 ^ *pp++;
if (ii < 0) ii = -ii;
ii %= TBLSZ;
for (name* n=table[ii]; n; n=n->next) // поиск
if (strcmp(p,n->string) == 0) return n;
if (ins == 0) error("имя не найдено");
name* nn = new name; // занесение
nn->string = new char[strlen(p)+1];
strcpy(nn->string,p);
nn->value = 1;
nn->next = table[ii];
table[ii] = nn;
return nn;
}
кто "он"?
0
 Аватар для maxon887
12 / 12 / 7
Регистрация: 05.06.2012
Сообщений: 280
23.09.2013, 11:43  [ТС]
страуструп
0
 Аватар для Cynacyn
35 / 35 / 7
Регистрация: 02.05.2013
Сообщений: 109
23.09.2013, 11:44
Цитата Сообщение от maxon887 Посмотреть сообщение
страуструп
а откуда у Вас этот код?
0
 Аватар для maxon887
12 / 12 / 7
Регистрация: 05.06.2012
Сообщений: 280
23.09.2013, 14:18  [ТС]
http://rutracker.org/forum/viewtopic.php?t=2226992
страница 77
0
 Аватар для Cynacyn
35 / 35 / 7
Регистрация: 02.05.2013
Сообщений: 109
23.09.2013, 17:05
Цитата Сообщение от maxon887 Посмотреть сообщение
Я ещё не работал с этой книгой, пока только "Принципы и практику использования С++" изучаю. Там такого нет.
0
 Аватар для maxon887
12 / 12 / 7
Регистрация: 05.06.2012
Сообщений: 280
23.09.2013, 18:34  [ТС]
а можно ссылку?
0
 Аватар для Cynacyn
35 / 35 / 7
Регистрация: 02.05.2013
Сообщений: 109
23.09.2013, 20:08
Цитата Сообщение от maxon887 Посмотреть сообщение
а можно ссылку?
Programming: Principles and Practice Using C++ / Программирование. Принципы и практика использования C++ (+Code)
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
23.09.2013, 20:08
Помогаю со студенческими работами здесь

калькулятор страуструпа
Всем привет, читаю книгу Страуструпа. Вроде все понимаю, циклы, условия if, switch, типы данных, вектора. Но начиная с 200й страницы когда...

Калькулятор Страуструпа
Компилятор выдает ошибку: C2361 пропуск инициализации &quot;d&quot; из-за метки &quot;default&quot;. (строка 51) Уже понятия не имею, как фиксить. Помогите. ...

Калькулятор в книге Страуструпа
Приветствую всех кто читает эту тему. У меня возникла проблема во время написании калькулятора. Он был описан в 6 главе книги и там же...

Калькулятор в книге Страуструпа
Я знал, что это довольно тяжелая книга, поэтому начал читать ее после другой о С++, но пример &quot;элементарного&quot; калькулятора...

Упражнение из книги Страуструпа. Программа мини-калькулятор. Цифры записанные в строковом формате
Привет всем. Не могу понять, как необходимо изменить программу исходя из условия упражнения. Упражнение сформулировано так: ...


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

Или воспользуйтесь поиском по форуму:
16
Ответ Создать тему
Новые блоги и статьи
WordPad для Windows 11
Jel 10.01.2026
WordPad для Windows 11 — это приложение, которое восстанавливает классический текстовый редактор WordPad в операционной системе Windows 11. После того как Microsoft исключила WordPad из. . .
Old Classic Notepad for Windows 11
Jel 10.01.2026
Old Classic Notepad for Windows 11 Приложение для Windows 11, позволяющее пользователям вернуть классическую версию текстового редактора «Блокнот» из Windows 10. Программа предоставляет более. . .
Почему дизайн решает?
Neotwalker 09.01.2026
В современном мире, где конкуренция за внимание потребителя достигла пика, дизайн становится мощным инструментом для успеха бренда. Это не просто красивый внешний вид продукта или сайта — это. . .
Модель микоризы: классовый агентный подход 3
anaschu 06.01.2026
aa0a7f55b50dd51c5ec569d2d10c54f6/ O1rJuneU_ls https:/ / vkvideo. ru/ video-115721503_456239114
Owen Logic: О недопустимости использования связки «аналоговый ПИД» + RegKZR
ФедосеевПавел 06.01.2026
Owen Logic: О недопустимости использования связки «аналоговый ПИД» + RegKZR ВВЕДЕНИЕ Введу сокращения: аналоговый ПИД — ПИД регулятор с управляющим выходом в виде числа в диапазоне от 0% до. . .
Модель микоризы: классовый агентный подход 2
anaschu 06.01.2026
репозиторий https:/ / github. com/ shumilovas/ fungi ветка по-частям. коммит Create переделка под биомассу. txt вход sc, но sm считается внутри мицелия. кстати, обьем тоже должен там считаться. . . .
Расчёт токов в цепи постоянного тока
igorrr37 05.01.2026
/ * Дана цепь постоянного тока с сопротивлениями и напряжениями. Надо найти токи в ветвях. Программа составляет систему уравнений по 1 и 2 законам Кирхгофа и решает её. Последовательность действий:. . .
Новый CodeBlocs. Версия 25.03
palva 04.01.2026
Оказывается, недавно вышла новая версия CodeBlocks за номером 25. 03. Когда-то давно я возился с только что вышедшей тогда версией 20. 03. С тех пор я давно снёс всё с компьютера и забыл. Теперь. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru