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

Реализация вычисления выражения в текстом файле

23.04.2017, 12:50. Показов 1043. Ответов 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
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
    
//Вычислить выражения записанное в текстом файле(например - "пять плюс три умножить на сорок пять") 
//      Предусмотреть 4 ариф.операции и целые числа в диапазоне от - 1000 до 1000.
 
#include "stdafx.h"
#include <iostream>
#include <clocale>
#include <fstream>
#include <string>
#include <iomanip>
#include <cstdlib>
#include <sstream>
 
using namespace std;
 
int rashifrovka(const string& arg);
 
struct base
{
    string word;
    int number;
} mass_st[100];
string buffer_arif[30];
int buffer_arif2[30];
int result[100];
 
 
int main()
{
 
    setlocale(LC_ALL, "Russian");
 
    string buffer_slov_1[100];
    int buffer_slov_2[100];
    int i(0);
 
 
    //CreateFile();
    ifstream arifmetika("arifmetika.txt", ios_base::in);
    ifstream slovar1("Slovar_1.txt", ios_base::in);
    ifstream slovar2("Slovar_2.txt", ios_base::in);
    if (!arifmetika.is_open()) cout << "Ошибка при открытии файла для чтения\n";
    else
    {
        while (!arifmetika.eof()) //Будем читать информацию пока не дойдем до конца файла
        {
 
 
            arifmetika >> buffer_arif[i];
            i++;
        }
    }
    i = 0;
    if (!slovar1.is_open()) cout << "Ошибка при открытии файла для чтения\n";
    else
    {
        while (!slovar1.eof()) //Будем читать информацию пока не дойдем до конца файла
        {
 
            slovar1 >> buffer_slov_1[i]; //Построчное считывание информации в S
            mass_st[i].word = buffer_slov_1[i];
 
 
            i++;
        }
    }
    i = 0;
    if (!slovar2.is_open()) cout << "Ошибка при открытии файла для чтения\n";
    else
    {
        while (!slovar2.eof()) //Будем читать информацию пока не дойдем до конца файла
        {
 
            slovar2 >> buffer_slov_2[i]; //Построчное считывание информации в S
 
            mass_st[i].number = buffer_slov_2[i];
            i++;
        }
    }
    int buffer_int;
    buffer_arif2[0] = rashifrovka(buffer_arif[0]);
    for (int k = 0; k < 30; k++)
    {
        for (int i = 0; i < 42; i++)
        {
            if (buffer_arif[k] == "на")
                break;
            if (buffer_arif[k] == "плюс")
            {
                if (buffer_arif[k + 1] == "минус")
                {
                    cout << endl << buffer_arif2[k - 1] << buffer_arif[k] << (-1)*rashifrovka(buffer_arif[k + 2]);
                    buffer_int = buffer_arif2[k - 1] - rashifrovka(buffer_arif[k + 2]);
                    buffer_arif2[k + 2] = buffer_int;
                    cout << endl << buffer_arif2[k + 2];
                    k++;
                    break;
                }
                else
                {
                
                cout << endl << buffer_arif2[k - 1] << buffer_arif[k] << rashifrovka(buffer_arif[k + 1]);
                buffer_int = buffer_arif2[k - 1] + rashifrovka(buffer_arif[k + 1]);
                buffer_arif2[k + 1] = buffer_int;
                cout << endl << buffer_arif2[k + 1];
                break;
                }
                
 
            }
            if (buffer_arif[k] == "минус")
 
            {
 
                if (buffer_arif[k + 1] == "минус")
                {
                    cout << endl << buffer_arif2[k - 1] << buffer_arif[k] << (-1)*rashifrovka(buffer_arif[k + 2]);
                    buffer_int = buffer_arif2[k - 1] - rashifrovka(buffer_arif[k + 2]);
                    buffer_arif2[k + 2] = buffer_int;
                    cout << endl << buffer_arif2[k + 2];
                    k++;
                    break;
                }
                else
                {
                    cout << endl << buffer_arif2[k - 1] << buffer_arif[k] << rashifrovka(buffer_arif[k + 1]);
                    buffer_int = buffer_arif2[k - 1] - rashifrovka(buffer_arif[k + 1]);
                    buffer_arif2[k + 1] = buffer_int;
                    cout << endl << buffer_arif2[k + 1];
 
                    break;
                }
            }
            if (buffer_arif[k] == "умножить")
            {
                if (buffer_arif[k + 1] == "минус")
                {
                    cout << endl << buffer_arif2[k - 1] << buffer_arif[k] << (-1)*rashifrovka(buffer_arif[k + 2]);
                    buffer_int = buffer_arif2[k - 1] - rashifrovka(buffer_arif[k + 2]);
                    buffer_arif2[k + 2] = buffer_int;
                    cout << endl << buffer_arif2[k + 2];
                    k++;
                    break;
                }
                else
                {
                cout << endl << buffer_arif2[k - 1] << buffer_arif[k] << rashifrovka(buffer_arif[k + 1]);
                buffer_int = buffer_arif2[k - 1] * rashifrovka(buffer_arif[k + 1]);
                buffer_arif2[k + 1] = buffer_int;
                cout << endl << buffer_arif2[k + 1];
                break;
                }
 
                    
                }
            if (buffer_arif[k] == "разделить")
            {
                if (buffer_arif[k + 1] == "минус")
                {
                    cout << endl << buffer_arif2[k - 1] << buffer_arif[k] << (-1)*rashifrovka(buffer_arif[k + 2]);
                    buffer_int = buffer_arif2[k - 1] - rashifrovka(buffer_arif[k + 2]);
                    buffer_arif2[k + 2] = buffer_int;
                    cout << endl << buffer_arif2[k + 2];
                    k++;
                    break;
                }
                else
 
                {
                cout << endl << buffer_arif2[k - 1] << buffer_arif[k] << rashifrovka(buffer_arif[k + 1]);
                buffer_int = buffer_arif2[k - 1] / rashifrovka(buffer_arif[k + 1]);
                buffer_arif2[k + 1] = buffer_int;
                cout << endl << buffer_arif2[k + 1];
                break;
                }
                    
                }
 
            }
 
        }
 
        arifmetika.close();  //Закрыли открытый файл
        slovar1.close();
        slovar2.close();
 
 
        system("pause");
        return 0;
 
    }
 
int rashifrovka(const string& arg)
{
    int chislo(0);
 
    for (int i = 0; i < 42; i++) 
    {
        if (arg == mass_st[i].word)
        {
            
            chislo=mass_st[i].number;
            
            return chislo;
        }
 
    }
    
}
Как сделать чтобы сначала считалась наиболее сильная арифметическая операция(* и /)?Можно ли это реализовать не переписывая алгоритм полностью....
0
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
23.04.2017, 12:50
Ответы с готовыми решениями:

Вычислить выражения записанное в текстом файле
Вычислить выражения записанное в текстом файле(например - &quot;пять плюс три умножить на сорок пять&quot;) Предусмотреть 4 ариф.операции и...

Реализация вычисления арифметического выражения вида 1 / ( 1 + 1 / (1 + 7 / 9 ) )
Помогите, написать код к реалізації обчислення арифметичного виразу виду 1 / ( 1 + 1 / (1 + 7 / 9 ) )

Вывести результат вычисления выражения, записанного в текстовом файле, на экран
Создать приложение через которую можно открыть текстовой файл. в котором будет написано 7+3 и программа должна показать результат на экране.

2
1 / 1 / 0
Регистрация: 16.04.2017
Сообщений: 35
23.04.2017, 12:51  [ТС]
Внешние файлы приложил.
Вложения
Тип файла: txt arifmetika.txt (47 байт, 11 просмотров)
Тип файла: txt Slovar_1.txt (361 байт, 10 просмотров)
Тип файла: txt Slovar_2.txt (152 байт, 10 просмотров)
0
 Аватар для igorrr37
2895 / 2042 / 992
Регистрация: 21.12.2010
Сообщений: 3,791
Записей в блоге: 9
23.04.2017, 20:54
преобразуй строку к числовому виду и применяй ОПЗ
Арифмометр: посчитать значение выражения, заданного в виде строки

Добавлено через 7 часов 41 минуту
вроде пашет
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
233
234
235
236
237
238
239
240
#include <iostream>
#include <stack>
#include <cctype>
#include <map>
#include <sstream>
#include <fstream>
#include <stdexcept>
#include <vector>
#include <algorithm>
 
// создаёт ОПЗ из строки
std::string RPN(std::string str)
{
    std::string srpn;
 
    std::string::size_type ind;
    while ((ind = str.find(' ')) != std::string::npos) // удаление пробелов из входной строки
    {
        str.erase(ind, 1);
    }
 
    for (int i = 0; i < str.size(); ++i) // учёт отрицательных чисел
    {
        if ((str[i] == '+' || str[i] == '-') && (0 == i || (!isdigit(str[i-1]) && str[i-1] != '.' && str[i-1] != ')')))
        {
            auto it = std::find_if(str.begin() + i + 1, str.end(), [](char const c) {return !isdigit(c);});
            str.insert(it, ')');
            str.insert(i, "(0");
            int nnn = 0;
        }
    }
 
    std::cout << str << std::endl;
 
    std::map<char, size_t> map; // карата весов символов
    map.insert(std::make_pair('*', 3));
    map.insert(std::make_pair('/', 3));
    map.insert(std::make_pair('+', 2));
    map.insert(std::make_pair('-', 2));
    map.insert(std::make_pair('(', 1));
    std::stack<char> stack;
    for (auto c : str) // формировка результирующей строки в ОПЗ
    {
        if (!isdigit(c) && ('.' != c))
        {
            srpn += ' ';
            if (')' == c)
            {
                while (stack.top() != '(')
                {
                    srpn += stack.top();
                    stack.pop();
                    srpn += ' ';
                }
                stack.pop();
            }
            else if ('(' == c)
            {
                stack.push(c);
            }
            else if (stack.empty() || (map[stack.top()] < map[c]))
            {
                stack.push(c);
            }
            else
            {
                do
                {
                    srpn += stack.top();
                    srpn += ' ';
                    stack.pop();
                } while (!(stack.empty() || (map[stack.top()] < map[c])));
                stack.push(c);
            }
        }
        else
        {
            srpn += c;
        }
    }
    while (!stack.empty())// остаток из стека добавляется в результ. строку
    {
        srpn += stack.top();
        srpn += ' ';
        stack.pop();
    }
    std::cout << srpn << std::endl; // результирующая строка в ОПЗ
 
    return srpn;
}
 
// вычисляет значение из ОПЗ
double Calculate(std::string const& srpn)
{
    double ret = 0.;
 
    std::stack<double> dstack;
    std::stringstream ss(srpn);
    double d, d1;
    char c;
    while (ss.get(c)) // вычисление результата
    {
        if (isdigit(c) || '.' == c)
        {
            ss.unget();
            ss >> d;
            dstack.push(d);
        }
        else if (!isspace(c))
        {
            d1 = dstack.top();
            dstack.pop();
            d = dstack.top();
            dstack.pop();
            switch (c)
            {
            case '+':
                dstack.push(d + d1);
                break;
            case '-':
                dstack.push(d - d1);
                break;
            case '*':
                dstack.push(d * d1);
                break;
            case '/':
                dstack.push(d / d1);
                break;
            }
        }
    }
    if (!dstack.empty())
    {
        ret = dstack.top();
        dstack.pop();
    }
 
    return ret;
}
 
// сборка числа из его единиц десятков, сотен
std::string getNumber(std::vector<std::string>& vec1)
{
    bool found = false;
    std::stringstream ss1;
    int sum = 0;
    int n;
    while (!vec1.empty())
    {
        found = true;
        ss1 << vec1.back();
        vec1.pop_back();
        ss1 >> n;
        ss1.clear();
        ss1.str("");
        sum += n;
    }
    if (found)
    {
        ss1 << sum;
    }
 
    return ss1.str();
}
 
 
int main()
{
    std::ifstream ifs("arifmetika.txt"), ifs1("Slovar_1.txt"), ifs2("Slovar_2.txt");
    if (ifs.is_open() && ifs1.is_open() && ifs2.is_open())
    {
        std::map<std::string, std::string> mNums;
        std::map<std::string, std::string> mOpers;
        std::string str;// = "10/ (-2-3) *2 + 6 - 2";
        
        std::string num;
        while (ifs1 >> str && ifs2 >> num)
        {
            mNums[str] = num;
        }
        mOpers["плюс"] = '+';
        mOpers["минус"] = '-';
        mOpers["умножить"] = '*';
        mOpers["разделить"] = '/';
 
        std::getline(ifs, str);
 
        int ind;
        while ((ind = str.find(" на ")) != std::string::npos)
        {
            str.replace(ind, 4, " ");
        }
 
        std::string res;
        std::istringstream iss(str);
        
        std::vector<std::string> vec, vec1;
        while (iss >> str)
        {
            vec.emplace_back(str);
        }
 
        for (int i = 0; i < vec.size(); ++i)
        {
            auto itNums = mNums.find(vec[i]);
            if (itNums != mNums.end())
            {
                vec1.emplace_back(itNums->second);
            }
            else
            {
                res += (" " + getNumber(vec1));
 
                auto itOpers = mOpers.find(vec[i]);
                if (itOpers != mOpers.end())
                {
                    res += (" " + itOpers->second);
                }
                else
                {
                    throw std::runtime_error("unrecognized word");
                }
            }
        }
 
        res += (" " + getNumber(vec1));
 
        std::cout << res << std::endl;
        
        std::string srpn = RPN(res);
        double dres = Calculate(srpn);
        std::cout << "Answer: " << dres << std::endl; // результат
        
    }
    else
    {
        std::cerr << "Unable to open file\n";
    }
    return 0;
}
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
23.04.2017, 20:54
Помогаю со студенческими работами здесь

Поиск в текстовом файле всех слов, заданных в другом текстом файле
Вообщем такое задание: Поиск в текстовом файле всех слов, заданных в другом текстом файле; Не могу понять почему не работает: ...

Работа с текстом в файле
Дан текст в файле. Вывести каждую вторую строку файла((

Реализация галереи с текстом и скролом в низ + картинка + подкартинки
Добрый день, не так давно увидел такой интересный макет, но не могу понять, как реализовать такую вот систему, сначала подумала, что это...

Реализация создания отформатированого сообщения с жирным текстом, абзацами
Сейчас есть сайт в котором коментарии пишутся и отправляются на сервер через обычный хелпер Html.TextArea(). Но хотелось бы чтобы текст...

Подсчитать в файле с исходным текстом
Посчитать в файле с исходным текстом модуля(.vb) кол-во переменных типа массив. Заранее всем спасибо за любую помощь.


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

Или воспользуйтесь поиском по форуму:
3
Ответ Создать тему
Новые блоги и статьи
1С: Программный отбор элементов справочника по группе
Maks 22.03.2026
Установка программного отбора элементов справочника "Номенклатура" из модуля формы документа. В качестве фильтра для отбора справочника служит группа номенклатуры. Отбор по наименованию группы. . .
Как я обхитрил таблицу Word
Alexander-7 21.03.2026
Когда мигает курсор у внешнего края таблицы, и нам надо перейти на новую строку, а при нажатии Enter создается новый ряд таблицы с ячейками, то мы вместо нервных нажатий Энтеров мы пишем любые буквы. . .
Krabik - рыболовный бот для WoW 3.3.5a
AmbA 21.03.2026
без регистрации и смс. Это не торговля, приложение не содержит рекламы. Выполняет свою непосредственную задачу - автоматизацию рыбалки в WoW - и ничего более. Однако если админы будут против -. . .
1С: Программный отбор элементов справочника по значению перечисления
Maks 21.03.2026
Установка программного отбора элементов справочника "Сотрудники" из модуля формы документа. В качестве фильтра для отбора служит значение перечислений. / / Событие "НачалоВыбора" реквизита на форме. . .
Переходник USB-CAN-GPIO
Eddy_Em 20.03.2026
Достаточно давно на работе возникла необходимость в переходнике CAN-USB с гальваноразвязкой, оный и был разработан. Однако, все меня терзала совесть, что аж 48-ногий МК используется так тупо: просто. . .
Оттенки серого
Argus19 18.03.2026
Оттенки серого Нашёл в интернете 3 прекрасных модуля: Модуль класса открытия диалога открытия/ сохранения файла на Win32 API; Модуль класса быстрого перекодирования цветного изображения в оттенки. . .
SDL3 для Desktop (MinGW): Рисуем цветные прямоугольники с помощью рисовальщика SDL3 на Си и C++
8Observer8 17.03.2026
Содержание блога Финальные проекты на Си и на C++: finish-rectangles-sdl3-c. zip finish-rectangles-sdl3-cpp. zip
Символические и жёсткие ссылки в Linux.
algri14 15.03.2026
Существует два типа ссылок — символические и жёсткие. Ссылка в Linux — это запись в каталоге, которая может указывать либо на inode «файла-ИСТОЧНИКА», тогда это будет «жёсткая ссылка» (hard link),. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru