С Новым годом! Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.60/5: Рейтинг темы: голосов - 5, средняя оценка - 4.60
0 / 0 / 0
Регистрация: 12.01.2017
Сообщений: 19

Выделение памяти в функции на примере калькулятора

19.01.2017, 07:58. Показов 995. Ответов 2
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
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
#include "stdafx.h"
#include "std_lib_facilities.h"
#include "windows.h"
//-------------------------------------------------
class Token {
public:
    char kind;        // what kind of token
    double value;     // for numbers: a value 
    Token(char ch)    // make a Token from a char
        :kind(ch), value(0) { }
    Token(char ch, double val)     // make a Token from a char and a double
        :kind(ch), value(val) { }
};
//-------------------------------------------------
class Token_stream
{
public:
    Token_stream();
    Token get();
    void putback(Token t);
private:
    bool full{false};
    Token buffer;
};
//--------------------------------------------------
Token_stream::Token_stream()
    :full(false), buffer(0)
{
}
 
//--------------------------------------------------
void Token_stream::putback(Token t)
{
    if (full) error("putback(): buffer  full");
    buffer = t;
    full = true;
}
//--------------------------------------------------
Token Token_stream::get()
{
    if (full)
    {
        full = false;
        return buffer;
    }
    char ch='q';
    cin >> ch;
    switch (ch)
    {
    case';':// для завершения ввода
    case 'q':// для выхода из программы
    case'(': case')':case'+': case'-':case'*':case'/':case'{':case'}':
        return Token(ch);
    case'.': case'0': case'1': case'2': case'3': case'4': case'5': case'6': case'7': case'8': case'9':
    {
        cin.putback(ch);
        double val;
        cin >> val;
        return Token('8', val);
    }
    default:
        error("bad token");
    }
    return Token(' ');
}
 
//--------------------------------------------
Token_stream ts;
//--------------------------------------------
double expression();
//--------------------------------------------
double primary()
{
    Token t = ts.get();
    switch (t.kind)
    {
    case'(':
    {
        double d = expression();
        t = ts.get();
        if (t.kind != ')')
            error("неправильное выражение требуется ')' или");
            return d;
    } 
    case'8':
        return t.value;
    default:
        error("требуется первичное выражение");
    }
    return 0.0;
}
//---------------------------------------------------
double term()
{
    double left = primary();
    Token t = ts.get();
    while (true)
    {
        switch (t.kind)
        {
        case'*':
            left *= primary();
            t = ts.get();
            break;
        case'/':
        {
            double d = primary();
            if (d == 0) error("деление на нуль");
            left /= d;
            t = ts.get();
            break; 
        }
        default:
            ts.putback(t);
            return left;
        }
    }
}
    double expression()
    {
        double left = term();
        Token t = ts.get();
        while (true)
        {
            switch (t.kind)
            {
            case'+':
                left += term();
                t = ts.get();
                break;
            case'-':
                left -= term();
                t = ts.get();
                break;
            default:
                ts.putback(t);
                return left;
            }
        }
    }
 
    int main()
    try
    {
    SetConsoleCP(1251);
    SetConsoleOutputCP(1251);
    double val = 0;
    while (cin)
    {
        Token t = ts.get();
        if (t.kind == 'q') break;
        if (t.kind == ';')
            cout << "=" << val << '\n';
        else {
            ts.putback(t);
            val = expression();
        }
    }
}
 
    catch (exception& e) {
        cerr << "error: " << e.what() << '\n';
        keep_window_open();
        return 1;
    }
    catch (...) {
        cerr << "Oops: unknown exception!\n";
        keep_window_open();
        return 2;
    }
Пытаюсь разобрать логику программы, но не как не пойму один момент. Попытаюсь выразить свое негодование на простом выражении 5+3.
Если по порядку то main вызывает функцию expression, а она соответственно функцию term которая вызывает primary.
Primary возвращает в term значение, там оно записывается в переменную left. Функция term возвращает переменную left в ф. expression там уже вступает в дело строка left-=term() которая опять запускает цепочку функций череда которых в функции term() присваивает переменной left значение 3 и возвращает его в строку left-=term() . А теперь вопрос Получается, что переменная left в term() и в expression() это не одна переменная, а две разных переменных? Под них выделяется разные участки памяти?
И еще один вопрос. Зачем в циклах ф-ций expression() и term() строка t=ts.get();? Зачем брать следующую лексему и не применять ее в расчетах?
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
double term()
{
    double left = primary();
    Token t = ts.get();
    while (true)
    {
        switch (t.kind)
        {
        case'*':
            left *= primary();
            t = ts.get();
            break;
        case'/':
        {
            double d = primary();
            if (d == 0) error("деление на нуль");
            left /= d;
            t = ts.get();// вопрос про эту строчу
            break; 
        }
        default:
            ts.putback(t);
            return left;
        }
0
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
19.01.2017, 07:58
Ответы с готовыми решениями:

Правильно ли в приведенном примере реализовано выделение и очищение памяти под двумерный вектор
Скажите правильно ли я выделяю и очищаю память под двухмерный вектор class A { private: std::vector&lt;...

Выделение памяти (CodeGear RAD Studio 2009 - C++ builder). Выделение памяти - консоль vs SDIApp
Есть определенный класс - длинная арифметика. Не идеальный - хранение данных исполнено в виде динамического массива типа short int, каждая...

Динамическое выделение памяти внутри функции (что вернуть из функции, если не удалось выделить память?)
такое дело, есть функция, которая выполняет некоторую операцию, функция при успешном выполнении должна вернуть 0, при ниудачном код...

2
1272 / 1029 / 470
Регистрация: 25.12.2016
Сообщений: 3,333
19.01.2017, 11:26
Цитата Сообщение от mayak1fm Посмотреть сообщение
там уже вступает в дело строка left-=term()
Только не -=, а += (если мы ввели 5+3).
Цитата Сообщение от mayak1fm Посмотреть сообщение
Получается, что переменная left в term() и в expression() это не одна переменная, а две разных переменных? Под них выделяется разные участки памяти?
Всё верно. Это локальные переменные, принадлежащие каждая своей функции.
Цитата Сообщение от mayak1fm Посмотреть сообщение
Зачем в циклах ф-ций expression() и term() строка t=ts.get();? Зачем брать следующую лексему и не применять ее в расчетах?
Она применяется, но на следующей итерации цикла.
1
0 / 0 / 0
Регистрация: 12.01.2017
Сообщений: 19
24.01.2017, 07:35  [ТС]
Цитата Сообщение от likehood Посмотреть сообщение
Она применяется, но на следующей итерации цикла.
Вот этот момент поподробнее

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

Выделение памяти в функции
Здравствуйте. Кто-нибудь знает почему при выделении памяти в функции set для массива b выводит `S) `S) `S) Duality isn't what it...

Ввод строки в edit на примере калькулятора
в общем мне необходимо, чтобы в edit вводилась строка по нажатию на button. ввод символа кнопки в конец строки я написала. все бы хорошо,...

Расширение окна программы(на примере калькулятора)
Добрый вечер! Хотелось бы узнать возможно ли реализовать на Delphi 7 такую штуку, что при растягивании окна программы(неограниченной...

Выделение памяти в отдельной функции
Помогите выделить память в отдельной функции и очистить тоже Язык Си вот выделяется так в мейне,как сделать в виде отдельной...

Выделение памяти в отдельной функции
Как эти 3 строчки занести в отдельную функцию a = (double **)malloc(n*sizeof(double)); b = (double *)malloc(n*sizeof(double)); ...


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

Или воспользуйтесь поиском по форуму:
3
Ответ Создать тему
Новые блоги и статьи
Изучаю kubernetes
lagorue 13.01.2026
А пригодятся-ли мне знания kubernetes в России?
Сукцессия микоризы: основная теория в виде двух уравнений.
anaschu 11.01.2026
https:/ / rutube. ru/ video/ 7a537f578d808e67a3c6fd818a44a5c4/
WordPad для Windows 11
Jel 10.01.2026
WordPad для Windows 11 — это приложение, которое восстанавливает классический текстовый редактор WordPad в операционной системе Windows 11. После того как Microsoft исключила WordPad из. . .
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 считается внутри мицелия. кстати, обьем тоже должен там считаться. . . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru