Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 5.00/4: Рейтинг темы: голосов - 4, средняя оценка - 5.00
12 / 10 / 5
Регистрация: 27.08.2015
Сообщений: 236

Объясните код

06.10.2015, 13:28. Показов 788. Ответов 8
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Всем доброго времени суток.
Я начинающий джава, но в связи с сложившейся ситуации необходимо разобраться в С++ коде. Я понимаю что это калькулятор, использующий обратную польскую запись, но не более. Буду очень благодарен если кто-то сможет прокомментировать данный код.

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
#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 << "Enter the expression: ";
 
    n = expr();
 
    std::cout << "The result of calculation: " << 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 << "Division by zero!" << std::endl;
            }
 
            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 << "Incorrect placement of the brackets!" << std::endl;
        }
 
        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
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
06.10.2015, 13:28
Ответы с готовыми решениями:

объясните код
Не понял данный код,нашел на сайте,отписал админстрации в итоге не было ответа,хотел бы попросить у вас как образован этот код.Код был...

Объясните код
Можете объяснить, как работает эта программа? Я понимаю только то, что в main'e, о работе того, что написано выше я могу только...

Объясните код
#include &lt;iostream.h&gt; #include &lt;string&gt; int main() { const std::string cardianl = &quot;NESW&quot;; char c; int n; ...

8
:)
Эксперт С++
4773 / 3267 / 497
Регистрация: 19.02.2013
Сообщений: 9,046
06.10.2015, 14:32
Цитата Сообщение от JavJun Посмотреть сообщение
если кто-то сможет прокомментировать данный код.
Думаешь, кому-то будет интересно комментировать каждую строчку кода для тебя?
Если есть непонимание по каким-то конкретным местам - выдели их отдельно.
0
12 / 10 / 5
Регистрация: 27.08.2015
Сообщений: 236
09.10.2015, 10:03  [ТС]
Tulosba, не понятна вот эта часть кода...не понятно как именно это работает:

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
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
 Аватар для Kastaneda
5232 / 3205 / 362
Регистрация: 12.12.2009
Сообщений: 8,143
Записей в блоге: 2
09.10.2015, 11:21
Цитата Сообщение от JavJun Посмотреть сообщение
Я начинающий джава
В коде нет ничего, чего нет в Java. Разве что шаблоны, которые хотя синтаксически похожи на дженерики, но все же другое.
Вот это
C++
1
2
std::vector < double > args;
args.push_back(brackets());
читай как
Java
1
2
ArrayList<Double> args = new ArrayList<>();
args.add(brackets());
Вот это
C++
1
std::cin.get();
читаем один символ из потока ввода (пользователь вводит с клавиатуры)

Это должно быть интуитивно понятно
C++
1
pow(args[i - 1], args[i]);
Java
1
Math.pow(args.get(i - 1), args.get(i))
0
12 / 10 / 5
Регистрация: 27.08.2015
Сообщений: 236
09.10.2015, 11:54  [ТС]
Kastaneda, Спасибо! А подскажите пожалуйста, используется ли в коде обратная польская запись? Просто со всем кодом уже более-менее разобрался,но так и не нашел...
Так же подскажите пожалуйста, правильно ли я понял саму структуру: программа просто берет один символ из введенных, прогоняет его по всем функциям и возвращает обработав,если он попал под условия...но на каком этапе идет само вычисление?
0
306 / 101 / 18
Регистрация: 04.07.2014
Сообщений: 571
09.10.2015, 13:13
Цитата Сообщение от JavJun Посмотреть сообщение
на каком этапе идет само вычисление?
Внутри каждой функции результат работы функции, отвечающей за операцию с более высоким приоритетом, преобразуется в результат согласно внутренней операции.

Например, деление происходит в строке 118, сложение и вычитание в строках 144 и 147, соответственно, возведение в степень -- 227.
0
12 / 10 / 5
Регистрация: 27.08.2015
Сообщений: 236
09.10.2015, 17:25  [ТС]
mporro, но mporro, вот именно сам алгоритм работы и не ясен. Допустим есть у нас выражение (2+2)*2. Функция expr() сначала прогоняет через себя "(" пропуская ее через factor() и затем через brackets(). и когда скобка туда попала она попадает под условие:
C++
1
2
3
4
5
6
7
8
9
10
if (c == '(')
    {
        result = sign * expression();
 
        c = cin.get();
 
        if (c != ')'){
            cout << "Incorrect placement of the brackets!" << endl;
            exit(-1);
        }
Но зачем нам в brackets() вообще нужен sing=1? И судя по коду оно проверяет есть ли закрывающаяся скобка, проверяя символ,но как она там может быть,если "()" не имеет смысла?Или я что-то не так понял?

Добавлено через 2 часа 50 минут
Так же, подскажите пожалуйста на счет этого участка кода:
C++
1
2
3
4
5
6
 while (true)
    {
        op = std::cin.get();
        
        while (op == ' ')
            op = std::cin.get();
Первый и второй "op" берет один и тот же символ или разные?Т.е. если есть 2+2, он сначала берет "2",а потом в следующем цикле "+"?
0
306 / 101 / 18
Регистрация: 04.07.2014
Сообщений: 571
09.10.2015, 19:36
JavJun
Операции вызывают друг друга в порядке, обратном приоритету. Само вычисление, знак равно, выраженное функцией expr, имеет самый низкий приоритет вместе с операциями сложения и вычитания, которые и выполняются в функции expr. Но expr не производит этих вычислений, пока не будут выполнены все операции более высокого приоритета. Какая более приоритетная операция, которая должна выполняться перед сложением/вычитанием? Умножение/деление! Потому expr предварительно вызывает функцию frac, чтобы выполнить в первом операнде все более приоритетные операции, а затем прибавляет/вычитает второй операнд, для которого также предварительно вызывает функцию frac, которая обслуживает операции более высокого приоритета.

Точно так же поступают и другие функции: frac вызывает функцию power, которая обладает более высоким приоритетом, чем frac, а power вызывает brackets...

***
О code snippets

Перед скобкой может стоять знак минут, который обращает конечный результат. Если в скобках получилось 2, то знак минус превратит результат в -2.

Скобки обрамляют какое-то другое выражение, в котором тоже могут быть другие операции, потому brackets либо вызывает ещё более приоритетную функцию, которая читает число, либо передаёт управление функции expr, которая разберёт выражение в скобках.

Во втором кусочке кода написано, что пробельные символы из потока ввода читаются без всяких действий. Своего рода "ожидание", крутись, пока дельная информация не придёт, а пробелы игнорируй.
1
12 / 10 / 5
Регистрация: 27.08.2015
Сообщений: 236
18.11.2015, 17:44  [ТС]
Подскажите пожалуйста, а в данном коде функция cin.get() берет по одному символу и прогоняет через все функции или в каждой функции она берет по одному символу и к следующей уже передает обработанную строку?
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
18.11.2015, 17:44
Помогаю со студенческими работами здесь

Объясните код
Объясните, как работают перегрузки оператора = и функций Union ..а точнее указатель this.Заранее спасибо. #include &lt;iostream&gt; ...

Объясните код
Обьясните что обозначают и что делают различные команды и знаки в следующей программе. #include &quot;stdafx.h&quot; #include...

Объясните код
Добрый день. Закомментируйте код программы пожалуйста. Не могу разобраться в нем.. Вот условие: Определить массив указателей на...

Объясните код
как работает этот код? опишите, пожалуйста void Comb(int m, int l) { if (m==0) { cout &lt;&lt; endl; for (int j(0);...

Объясните код
Если честно я не знаю как написать программу, пожалуйста помогите. Опишите код полностью и пожалуйста постройте программу функции.


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

Или воспользуйтесь поиском по форуму:
9
Ответ Создать тему
Новые блоги и статьи
SDL3 для Web (WebAssembly): Реализация движения на Box2D v3 - трение и коллизии с повёрнутыми стенами
8Observer8 20.02.2026
Содержание блога Box2D позволяет легко создать главного героя, который не проходит сквозь стены и перемещается с заданным трением о препятствия, которые можно располагать под углом, как верхнее. . .
Конвертировать закладки radiotray-ng в m3u-плейлист
damix 19.02.2026
Это можно сделать скриптом для PowerShell. Использование . \СonvertRadiotrayToM3U. ps1 <path_to_bookmarks. json> Рядом с файлом bookmarks. json появится файл bookmarks. m3u с результатом. # Check if. . .
Семь CDC на одном интерфейсе: 5 U[S]ARTов, 1 CAN и 1 SSI
Eddy_Em 18.02.2026
Постепенно допиливаю свою "многоинтерфейсную плату". Выглядит вот так: https:/ / www. cyberforum. ru/ blog_attachment. php?attachmentid=11617&stc=1&d=1771445347 Основана на STM32F303RBT6. На борту пять. . .
Камера Toupcam IUA500KMA
Eddy_Em 12.02.2026
Т. к. у всяких "хикроботов" слишком уж мелкий пиксель, для подсмотра в ESPriF они вообще плохо годятся: уже 14 величину можно рассмотреть еле-еле лишь на экспозициях под 3 секунды (а то и больше),. . .
И ясному Солнцу
zbw 12.02.2026
И ясному Солнцу, и светлой Луне. В мире покоя нет и люди не могут жить в тишине. А жить им немного лет.
«Знание-Сила»
zbw 12.02.2026
«Знание-Сила» «Время-Деньги» «Деньги -Пуля»
SDL3 для Web (WebAssembly): Подключение Box2D v3, физика и отрисовка коллайдеров
8Observer8 12.02.2026
Содержание блога Box2D - это библиотека для 2D физики для анимаций и игр. С её помощью можно определять были ли коллизии между конкретными объектами и вызывать обработчики событий столкновения. . . .
SDL3 для Web (WebAssembly): Загрузка PNG с прозрачным фоном с помощью SDL_LoadPNG (без SDL3_image)
8Observer8 11.02.2026
Содержание блога Библиотека SDL3 содержит встроенные инструменты для базовой работы с изображениями - без использования библиотеки SDL3_image. Пошагово создадим проект для загрузки изображения. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru