Форум программистов, компьютерный форум CyberForum.ru
Наши страницы

С++ для начинающих

Войти
Регистрация
Восстановить пароль
 
 
Рейтинг: Рейтинг темы: голосов - 27, средняя оценка - 4.96
ЛазаретЪ
1 / 1 / 0
Регистрация: 04.02.2011
Сообщений: 30
#1

Как работает калькулятор? - C++

23.05.2011, 20:42. Просмотров 3353. Ответов 21
Метки нет (Все метки)

Помогите подробней код разобрать и прокомментировать назначение переменных, функций...

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
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
#include <iostream>
#include <vector>
#include <cmath>
#include <iomanip>
 
double number();
double factor();
double expr();
double brackets();
double power();
 
int main()
{
    double n;
 
    setlocale(LC_ALL, "Rus");
 
    std::cout << "Введите выражение: ";
 
    n = expr();
 
    std::cout << "Результат вычисления: " << std::setprecision(10) << n << std::endl;
 
    std::cin.get();
    return 0;
}
 
double number()
{
    double result = 0.0;
    double k = 10.0;
    int sign = 1;
    char c;
 
    c = std::cin.get();
 
    while (c == ' ')
        c = std::cin.get();
 
    if (c == '-')
        sign = -1;
    else
    {
        if (c != '+')
            std::cin.putback(c);
    }
 
    while (true)
    {
        c = std::cin.get();
 
        while (c == ' ')
            c = std::cin.get();
 
        if (c >= '0' && c <= '9')
            result = result * 10.0 + (c - '0');
        else
        {
            std::cin.putback(c);
            break;
        }
    }
 
    c = std::cin.get();
 
    if (c == '.')
    {
        while (true)
        {
            c = std::cin.get();
 
            if (c >= '0' && c <= '9')
            {
                result += (c - '0') / k;
                k *= 10.0;
            }
            else
            {
                std::cin.putback(c);
                break;
            }
        }
    }
    else
        std::cin.putback(c);
 
    return sign * result;
}
 
double factor()
{
    double result;
    double temp;
    char op;
 
    result = power();
 
    while (true)
    {
        op = std::cin.get();
 
        while (op == ' ')
            op = std::cin.get();
 
        switch (op)
        {
        case '*':
            result *= power();
            break;
        case '/':
            temp = power();
 
            if (temp == 0.0)
            {
                std::cout << "Деление на нуль!" << std::endl;
                exit(-1);
            }
 
            result /= temp;
            break;
        default:
            std::cin.putback(op);
            return result;
        }
    }
}
 
double expr()
{
    double result;
    char op;
 
    result = factor();
 
    while (true)
    {
        op = std::cin.get();
 
        while (op == ' ')
            op = std::cin.get();
 
        switch (op)
        {
        case '+':
            result += factor();
            break;
        case '-':
            result -= factor();
            break;
        default:
            std::cin.putback(op);
            return result;
        }
    }
}
 
double brackets()
{
    double result;
    int sign = 1;
    char op;
 
    op = std::cin.get();
 
    while (op == ' ')
        op = std::cin.get();
 
    if (op == '-')
    {
        sign = -1;
        op = std::cin.get();
    }
    else
    {
        if (op == '+')
            op = std::cin.get();
    }
 
    while (op == ' ')
        op = std::cin.get();
 
    if (op == '(')
    {
        result = sign * expr();
 
        op = std::cin.get();
 
        if (op != ')')
        {
            std::cout << "Неверная расстановка скобок!" << std::endl;
            exit(-1);
        }
 
        return result;
    }
    else
    {
        std::cin.putback(op);
 
        return sign * number();
    }
}
 
double power()
{
    double result;
    char op;
    std::vector < double > args;
 
    args.push_back(brackets());
 
    while (true)
    {
        op = std::cin.get();
        
        while (op == ' ')
            op = std::cin.get();
 
        if (op == '^')
            args.push_back(brackets());
        else
        {
            std::cin.putback(op);
            break;
        }
    }
 
    for (int i = args.size() - 1; i > 0; i--)
        args[i - 1] = pow(args[i - 1], args[i]);
 
    return args[0];
}
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
23.05.2011, 20:42
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Как работает калькулятор? (C++):

Как работает калькулятор? - C++
100500-й раз задаю вопрос про этот калькулятор. Возможно, сам виноват - формулировал неточно. Ну, так вот: пожалуйста, опишите на примере...

Простой калькулятор: Не работает код, как это исправить? - C++
Здравствуйте! Вот имеется такой код, взят отсюда, https://code-live.ru/post/cpp-variables-and-datatypes/#more и он как бы получается не...

Почему так странно работает калькулятор - C++
Здраствуйте, я сегодня решил взяться за C++, решил написать самое простое, калькулятор: #include &lt;cstdlib&gt; #include &lt;iostream&gt; ...

Неправильно работает небольшая программа-калькулятор - C++
это калькулятор фунтов, шиллингов и пенсов по старой системе. он должен уметь складывать, вычитать суммы, а также, умножать на число....

Как это работает? Я хочу спросить как работает C++ и где можно про него почитать - C++
Привет, котоны. Заранее благодарю. Это будет моих общих вопросов нить, т.к. создавать целую ветку для каждого нецелесообразно. Я хочу...

Как доделать калькулятор на С/С++ ? - C++
Помогите пожалуйста в калькулятором. У меня есть уже скобки и возведение в степень. Мня нужно добавить ещё косинусы, синусы, квадратный...

21
ЛазаретЪ
1 / 1 / 0
Регистрация: 04.02.2011
Сообщений: 30
25.05.2011, 19:31  [ТС] #16
А в каком случае программа выдаст сообщение "Неверная расстановка скобок!" ? По разному перепробовал скобки ставить, а ошибка не вылазит..
0
silent_1991
Эксперт С++
4984 / 3041 / 149
Регистрация: 11.11.2009
Сообщений: 7,027
Завершенные тесты: 1
25.05.2011, 19:42 #17
На обработку этой ошибки особый упор не делался, в данном случае обрабатывается вариант, когда открывающей скобке не соответствует закрывающая.
1
ЛазаретЪ
1 / 1 / 0
Регистрация: 04.02.2011
Сообщений: 30
26.05.2011, 20:29  [ТС] #18
C++
1
2
3
#include <iostream> \\заголовочный файл с классами, функциями и переменными для организации ввода-вывода
#include <vector>   \\для работы с динамическими массивами(в него можно засовывать числа, объекты и прочее)
#include <cmath>    \\для выполнения простых математических операций
А #include <iomanip> - для чего нужен?
0
silent_1991
Эксперт С++
4984 / 3041 / 149
Регистрация: 11.11.2009
Сообщений: 7,027
Завершенные тесты: 1
26.05.2011, 20:35 #19
Например, для std::setprecision.
0
jonson
233 / 206 / 61
Регистрация: 18.03.2010
Сообщений: 750
26.05.2011, 20:39 #20
Цитата Сообщение от ЛазаретЪ Посмотреть сообщение
А #include <iomanip> - для чего нужен?
В этом файле определены некоторые манипуляторы потокового ввода/вывода.
например:
std::setprecision
std::setw
std::setbase и т. д.
0
ЛазаретЪ
1 / 1 / 0
Регистрация: 04.02.2011
Сообщений: 30
26.05.2011, 20:41  [ТС] #21
Цитата Сообщение от silent_1991 Посмотреть сообщение
Например, для std::setprecision.
Т.е. для точности знаков после запятой?
0
silent_1991
Эксперт С++
4984 / 3041 / 149
Регистрация: 11.11.2009
Сообщений: 7,027
Завершенные тесты: 1
26.05.2011, 20:49 #22
ЛазаретЪ, да, грубо говоря.
0
26.05.2011, 20:49
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
26.05.2011, 20:49
Привет! Вот еще темы с ответами:

Простой калькулятор и калькулятор с парсингом - C++
Ребят я совсем не давно только начал изучать сишку, решил написать простенький калькулятор который работает с 2 числами. Возник вопрос, как...

Посоветуйте как написать калькулятор - C++
Как применить знания на практике? Есть ли такие учебники с не сложными задачи? Как написать калькулятор? И Где лучше всего учить С++?

Как открыть калькулятор через С++ ? - C++
Здравствуйте! Меня интересует такой вопрос: как открыть в програме С++ например калькулятор ? Я просто пишу мини ОС и очень нужна помощ...

Как сделать с кода настоящий калькулятор? - C++
Вопрос: есть код,откомпилированный. Как сделать с него .exeшник? Можно сказать что моя первая программа, так что не судите строго)) ...


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

Или воспользуйтесь поиском по форуму:
22
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru