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

Найти знак числа в строковом выражении

14.05.2019, 15:04. Показов 637. Ответов 7
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Допустим, имеется строка и множество ей подобных: 4 + 81 * (-20 + (4 * -6)) + -50
Мне нужно заменить отрицательный знак числа на какой-нибудь другой символ, например, так: 4 + 81 * (^20 + (4 * ^6)) + ^50

Каков будет алгоритм?
На данный момент модифицирую такой, он иногда дает промахи:
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
                int cst = 0;
                for (size_t a = 0; a < code.size(); ++a)
                {
                    if (code[a] == ' ') continue;
                    if (code[a] == '\n' || code[a] == '(')
                    {
                        cst = 0;
                        continue;
                    }
                    if (code[a] >= '0' && code[a] <= '9')
                    {
                        cst = 1;
                        continue;
                    }
                    if (cst == 1 && (code[a] == '+' || code[a] == '-' || code[a] == '*' || code[a] == '/'))
                    {
                        cst = 0;
                        continue;
                    }
                    if (cst == 0 && code[a] == '-')
                    {
                        code[a] = '^';
                    }
                }
0
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
14.05.2019, 15:04
Ответы с готовыми решениями:

В выражении вместо каждого знака вопрос записать знак одной из арифметических операций
Ребят, помогите решить.. У самого идей вообще нет.. Подозреваю, что рекурсией, но хз как) Буду рад за любые советы т.д.) А лучше еще за...

Увеличение (уменьшение) числа в строковом формате на единицу
Здравствуйте! Не подскажите, пожалуйста, как правильно увеличивать или уменьшать число в строковом формате? Например, у меня есть строка:...

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

7
7438 / 5030 / 2892
Регистрация: 18.12.2017
Сообщений: 15,692
14.05.2019, 15:31
Вам все минусы нужно поменять на ^ или только те, которые около цифр ? если все, можно так:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
#include <iostream> 
#include <string>
using namespace std;
 
int main()
{
    int i=0;
    string s="4 + 81 * (-20 + (4 * -6)) + -50";
    
    while (s[i])
        {
        if (s[i]=='-') s[i]='^';
        i++;
        }
       
    cout << s << "\n";    
 
system("pause");
return 0;
}
0
0 / 0 / 0
Регистрация: 18.04.2019
Сообщений: 32
14.05.2019, 15:39  [ТС]
Цитата Сообщение от Yetty Посмотреть сообщение
Вам все минусы нужно поменять на ^ или только те, которые около цифр ?
Это было бы слишком просто. Я упомянул, что речь идет о числах со знаком.
0
7438 / 5030 / 2892
Регистрация: 18.12.2017
Сообщений: 15,692
14.05.2019, 15:48
Цитата Сообщение от Хостес Посмотреть сообщение
Я упомянул, что речь идет о числах со знаком
неплохо и в выражении поставить минус, чтобы видно было, что нужно менять. так нужно ?
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
#include <iostream> 
#include <string>
#include <cctype>
using namespace std;
 
int main()
{
    int i=0;
    string s="4 + 81 * (-20 - (4 * -6)) + -50";
    
    while (s[i])
        {
        if (s[i]=='-' && isdigit(s[i+1])) s[i]='^';
        i++;
        }
       
    cout << s << "\n";    
 
system("pause");
return 0;
}
0
0 / 0 / 0
Регистрация: 18.04.2019
Сообщений: 32
14.05.2019, 16:41  [ТС]
Цитата Сообщение от Yetty Посмотреть сообщение
неплохо и в выражении поставить минус, чтобы видно было, что нужно менять. так нужно ?
Да, но тогда будет привязка к синтаксису, и выражения типа "5-7" будут ломаться. Поэтому я сбрасываю флаг cst после каждой последовательности число->оператор.
0
7438 / 5030 / 2892
Регистрация: 18.12.2017
Сообщений: 15,692
14.05.2019, 17:10
Цитата Сообщение от Хостес Посмотреть сообщение
выражения типа "5-7" будут ломаться
не совсем понятно что Вам нужно. -7 это число 7 с отрицательным знаком. знак '-' поменяется на знак '^'. приведите другой пример, чтобы было видно, какие минусы менять, какие не менять или сформулируйте более общую задачу.
0
0 / 0 / 0
Регистрация: 18.04.2019
Сообщений: 32
14.05.2019, 17:30  [ТС]
Цитата Сообщение от Yetty Посмотреть сообщение
-7 это число 7 с отрицательным знаком.
В данном примере это выражение, где из 5-ти вычитается 7. Ну и вычитание отрицательных чисел так же не исключается. Я потом конвертирую эти выражения в обратную польскую запись, чтобы прога смогла получить числовой результат, но перед этим нужно замаскировать все знаки чисел, чтобы дальнейшая часть программы не приняла их за оператор вычитания.
0
 Аватар для stzer
140 / 110 / 60
Регистрация: 26.10.2013
Сообщений: 314
14.05.2019, 17:51
Хостес, писал как то свой ковертер в обратную польскую запись, делал так:
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
    for (size_t i = 0; i < expr.size(); ++i)
    {
        auto s = expr[i];
        if (std::isdigit(s))
        {
            rpn += get_digit(expr, i);
            rpn += ' ';
            is_unary = false;
        }
        else if (s == '(')
        {
            stack.push(s);
            is_unary = true;
        }
        else if (s == ')')
        {
            while (stack.top() != '(')
            {
                rpn += stack.top();
                stack.pop();
            }
            stack.pop();
            is_unary = false;
        }
        else if (is_mathsign(s))
        {
            if (is_unary && s == '-')
                s = '~';
 
            while (!stack.empty() && get_priority(s) <= get_priority(stack.top()))
            {
                rpn += stack.top();
                stack.pop();
            }
            stack.push(s);
            is_unary = true;
        }
    }
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
14.05.2019, 17:51
Помогаю со студенческими работами здесь

В выражении a?b , где a и b вещественные числа замените вопросительный знак одной из арифметических операций
Здравствуйте форумчане. Помогите пожалуйста со следующей задачей: В выражении a?b , где a и b вещественные числа замените...

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

Заменить во введенном строковом выражении указанную подстроку нужным числовым значением
Составить и отладить программу, заменяющую во введенном строковом выражении указанную подстроку нужным числовым значением в строковом...

Заменить во введенном строковом выражении указанную подстроку нужным числовым значением
Cоставить программу, заменяющую во введенном строковом выражении указанную подстроку нужным числовым значением в строковом представлении....

Составить программу заменяющую во введенном строковом выражении подстроку нужным числовым значением
Составить и отладить программу, заменяющую во введенном строковом выражении указанную подстроку нужным числовым значением в строковом...


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

Или воспользуйтесь поиском по форуму:
8
Ответ Создать тему
Новые блоги и статьи
Восстановить юзерскрипты Greasemonkey из бэкапа браузера
damix 15.01.2026
Если восстановить из бэкапа профиль Firefox после переустановки винды, то список юзерскриптов в Greasemonkey будет пустым. Но восстановить их можно так. Для этого понадобится консольная утилита. . .
Изучаю 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% до. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru