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

Вычислить арифметическое выражение записанное в строку

03.07.2018, 17:53. Показов 6180. Ответов 12
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Дана строка, содержащая N-ое количество чисел (N<6) со знаками вычисления между ними (сложение, вычитание, умножение, деление). Известно, что некоторые числа являются отрицательными и выделяются скобками, т.е ...*(-2)+... Необходимо вычислить правильное решение данного уравнения.
Писал по памяти, ломаю голову уже 3-ий день, думал просто сделать все числа через переменные и дальше подсчитать, но чет не могу толком обработать строку и разбить на переменные... Помогите, пожалуйста
0
Лучшие ответы (1)
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
03.07.2018, 17:53
Ответы с готовыми решениями:

Вычислить простое арифметическое выражение записанное в файл
Помогите, пожалуйста решить задачи на языке C++ К сожалению, плохо понимаю язык, так как перевелась посреди года. Задача 1. Вычислить...

Вычислить выражение записанное в стрке
Здравствуйте. Подскажите как выполнить следующее: данна строка. необходимо вычислить выражение которое в ней записано и вывести. например:...

Вычислить выражение, записанное строкой
Написать программу, которая использует класс string для анализа строки, содержащей математическое выражение, например, вида – «2 + 2 *...

12
82 / 78 / 34
Регистрация: 13.02.2018
Сообщений: 1,347
03.07.2018, 21:34
Лучший ответ Сообщение было отмечено VisRee как решение

Решение

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
#include <iostream>
#include <string>
using namespace std;
 
int CharToInt(const char a)
{
    switch (a)
    {
    case '1': return 1;
    case '2': return 2;
    case '3': return 3;
    case '4': return 4;
    case '5': return 5;
    case '6': return 6;
    case '7': return 7;
    case '8': return 8;
    case '9': return 9;
    case '0': return 0;
    }
}
 
int StrToInt(string str)
{
    int i = 0, mult = 1;
    if (str[0] == '-')
    {
        i = 1;
        mult = -1;
    }
    int retInt = CharToInt(str[i]);
    i++;
    for (; i < str.length(); i++)
    {
        retInt *= 10;
        retInt += CharToInt(str[i]);
    }
    retInt *= mult;
    return retInt;
}
 
 
 
int main()
{
    int Arr[6], Max = 0, count = 0;
    int result = 0;
    string Input;
    string znaki;
    string tmp;
    bool Open = false;
 
    for (int i = 0; i < 6; i++)
        Arr[i] = 0;
 
    cout << "Enter: ";
    cin >> Input;
    for (int i = 0; i < Input.length(); i++)
    {
        if (Open && Input[i] != ')')
        {
            tmp += Input[i];
        }
        else if (isdigit(Input[i]))
        {
            string tmpstr;
            while (isdigit(Input[i]))
            {
                tmpstr += Input[i];
                i++;
            }
            i--;
            Arr[count] = StrToInt(tmpstr);
            count++;
        }
        else if (Input[i] == '+' || Input[i] == '-' || Input[i] == '*' || Input[i] == '/')
        {
            znaki += Input[i];
        }
        else if (Input[i] == '(' || Input[i] == ')')
        {
            if (Input[i] == ')')
            {
                Open = false;
                Arr[count] = StrToInt(tmp);
                count++;
                tmp = "";
            }
            else Open = true;
        }
 
    }
    count = 1;
    result += Arr[0];
    for (int i = 0; i < znaki.length(); i++)
    {
        if (znaki[i] == '+')
        {
            result += Arr[count];
            count++;
        }
        else if (znaki[i] == '-')
        {
            result -= Arr[count];
            count++;
        }
        else if (znaki[i] == '/')
        {
            result /= Arr[count];
            count++;
        }
        else if (znaki[i] == '*')
        {
            result *= Arr[count];
            count++;
        }
    }
    cout << "Result: " << result;
    system("Pause");
    return 0;
}
проверишь там
Если запись идешь не в скобках то все лишние знаки игноряться
1
Диссидент
Эксперт C
 Аватар для Байт
27714 / 17332 / 3810
Регистрация: 24.12.2010
Сообщений: 38,978
03.07.2018, 22:01
Цитата Сообщение от k0vpack Посмотреть сообщение
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
int CharToInt(const char a)
{
    switch (a)
    {
    case '1': return 1;
    case '2': return 2;
    case '3': return 3;
    case '4': return 4;
    case '5': return 5;
    case '6': return 6;
    case '7': return 7;
    case '8': return 8;
    case '9': return 9;
    case '0': return 0;
    }
}
C++
1
return a - '0';
Правда, без проверки
Цитата Сообщение от VisRee Посмотреть сообщение
думал просто сделать все числа через переменные
Нет, думал неправильно. Надо просто анализировать строку и по ходу анализа вычислять выражение.

Добавлено через 2 минуты
Да и массив Arr в общем-то незачем создавать...
0
82 / 78 / 34
Регистрация: 13.02.2018
Сообщений: 1,347
03.07.2018, 22:07
Байт, странно использованный массив заметили, а переменную max которая объявленная и не использована не заметили
0
 Аватар для Kuzia domovenok
4268 / 3327 / 926
Регистрация: 25.03.2012
Сообщений: 12,531
Записей в блоге: 1
03.07.2018, 22:12
Цитата Сообщение от k0vpack Посмотреть сообщение
C++
1
2
int CharToInt(const char a) 
int StrToInt(string str)
а iostream зря подключался что ли?
А как же всякие
C++
1
2
3
4
5
6
7
int i;
char c;
cin>>c;
if (isdigit(c)){
  cin.unget();
  cin>>i;
}
Добавлено через 3 минуты
Цитата Сообщение от k0vpack Посмотреть сообщение
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
for (int i = 0; i < znaki.length(); i++) {
 if (znaki[i] == '+') {
     result += Arr[count];
     count++; 
 } else if (znaki[i] == '-') { 
     result -= Arr[count];
     count++; 
 } else if (znaki[i] == '/') {
     result /= Arr[count]; 
     count++;
 } else if (znaki[i] == '*') {
     result *= Arr[count];
     count++; 
 } 
}
на приоритет операторов, как я понимаю, все забили?
0
82 / 78 / 34
Регистрация: 13.02.2018
Сообщений: 1,347
03.07.2018, 22:12
Kuzia domovenok,
Цитата Сообщение от k0vpack Посмотреть сообщение
isdigit(Input[i])
так на всякий, с помощью этого я узнал что это цифра, а её еще нужно в int перевести, писал на на онлайн компиляторе, т.к. доступа в нормальному IDE не имею пока, и что бы не угадывать всякие методы я написал свой маленький велосипед, да и плюс нужно было со знаком еще перводить
0
 Аватар для Kuzia domovenok
4268 / 3327 / 926
Регистрация: 25.03.2012
Сообщений: 12,531
Записей в блоге: 1
03.07.2018, 22:14
Цитата Сообщение от k0vpack Посмотреть сообщение
C++
1
2
3
4
5
else if (Input[i] == '(' || Input[i] == ')') 
{ 
if (Input[i] == ')')
 {
 Open = false;
на множество вложенных скобок тоже
0
82 / 78 / 34
Регистрация: 13.02.2018
Сообщений: 1,347
03.07.2018, 22:15
Цитата Сообщение от Kuzia domovenok Посмотреть сообщение
на приоритет операторов, как я понимаю, все забили?
ну если ТС хочет что бы это были реализовано, флаг ему в руки

Добавлено через 38 секунд
Цитата Сообщение от Kuzia domovenok Посмотреть сообщение
на множество вложенных скобок тоже
ну если ТС хочет что бы это были реализовано, флаг ему в руки
0
Диссидент
Эксперт C
 Аватар для Байт
27714 / 17332 / 3810
Регистрация: 24.12.2010
Сообщений: 38,978
03.07.2018, 22:22
Цитата Сообщение от k0vpack Посмотреть сообщение
переменную max которая объявленная и не использована не заметили
Дык, я вообще-то не транслятор, флаг warningall мне никто не устанавливал.
А то что код, мягко говоря, оставляет желать..., это да, заметно.

Добавлено через 1 минуту
Цитата Сообщение от k0vpack Посмотреть сообщение
писал на на онлайн компиляторе
И не лень было такую swich-кишку писать?
0
82 / 78 / 34
Регистрация: 13.02.2018
Сообщений: 1,347
03.07.2018, 22:50
Цитата Сообщение от Байт Посмотреть сообщение
оставляет желать...
вот что не так с кодом? в задании не сказано что нужно без массивов, а если вы подумали что можно решить уравнения по ходу проверки строки на содержимое то можно было да, но почему то когда я увидел что в задании нужно еще и скобки я закинул этот метод, теперь подумал и не знаю почему закинул.
0
2784 / 1937 / 570
Регистрация: 05.06.2014
Сообщений: 5,602
03.07.2018, 23:19
Тыц. Код собрал на коленке, особо не тестировал. Буду теперь всех с подобными вопросами сразу отправлять туда.
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
#include<cstdlib>
#include<stdexcept>
 
inline double evalPlusMinus(const char*&expression);
inline double evalMulDiv(const char*&expression);
inline double evalPrefixAndBracket(const char*&expression)
{
    while(isspace(*expression))
        ++expression;
    switch(*expression)
    {
    case'0':case'1':case'2':case'3':case'4':case'5':case'6':case'7':case'8':case'9':
        return strtod(expression,(char**)&expression);
    case'-':
        return -evalPrefixAndBracket(++expression);
    case'+':
        return evalPrefixAndBracket(++expression);
    case'(':
    {
        double res=evalPlusMinus(++expression);
        if(*expression++==')')
            return res;
    }
    default:
        throw std::runtime_error("Bad expression");
    }
}
 
inline double evalMulDiv(const char *&expression)
{
    double res=evalPrefixAndBracket(expression);
    while(true)
    {
        while(isspace(*expression))
            ++expression;
        switch(*expression)
        {
        case 0:
            return res;
        case'*':
            res*=evalPrefixAndBracket(++expression);
            break;
        case'/':
            res/=evalPrefixAndBracket(++expression);
            break;
        default:
            return res;
        }
    }
}
 
inline double evalPlusMinus(const char *&expression)
{
    const double res=evalMulDiv(expression);
    while(isspace(*expression))
        ++expression;
    switch(*expression)
    {
    case 0:
        return res;
    case'+':
        return res+evalPlusMinus(++expression);
    case'-':
        return res-evalPlusMinus(++expression);
    default:
        return res;
    }
}
 
inline double evalExpression(const char *expression)
{
    const double res=evalPlusMinus(expression);
    while(isspace(*expression))
        ++expression;
    if(*expression)
        throw std::runtime_error("Bad expression");
    return res;
}
 
int main()
{
    std::cout<<evalExpression("2+2*2")<<std::endl;
    return 0;
}
0
Диссидент
Эксперт C
 Аватар для Байт
27714 / 17332 / 3810
Регистрация: 24.12.2010
Сообщений: 38,978
04.07.2018, 10:04
Цитата Сообщение от k0vpack Посмотреть сообщение
в задании не сказано что нужно без массивов
Представьте себе, что у вас есть юный племянник. Закончил первый класс. И вы на досуге решили проверить его знания в арифметике. Спрашиваете у него - "Сколько будет 10 плюс 20?" И племянник достает палочки, отсчитывает 10 штук, потом еще 20, потом, шевеля губами, начинает всю эту кучу пересчитывать. И выдает ответ - 30. Все правильно! "ЕГЭ-тест" он прошел. И в вашем задании не сказано, что "без палочек". Но будете ли вы довольны его ответом?
0
82 / 78 / 34
Регистрация: 13.02.2018
Сообщений: 1,347
04.07.2018, 16:03
Байт, если он закончил первый класс и додумался посчитать на палочках без чей либо помощи, я буду очень доволен что он решил задачу, его подход такой, а значит он умеет искать выход из ситуаций, хотя конечно было бы приятнее что бы он сразу сказал 30
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
04.07.2018, 16:03
Помогаю со студенческими работами здесь

В качестве исходного текста задать арифметическое выражение, записанное на Паскале
Помогите решить задачу. В качестве исходного текста задать арифметическое выражение, записанное на Паскале. Проверить, соблюдается ли...

Вычислить выражение, записанное в Edit
Всем привет! Вот задачка: Есть функция, есть Edit. function Fun(x1, x2 : real) :Real; begin Fun := a*x1*x1 +...

Вычислить выражение, записанное в постфиксной записи
В постфиксной записи (или обратной польской записи) операция записывается после двух операндов. Например, сумма двух чисел A и B...

Вычислить арифметическое выражение
Добрый день Помогите,пожалуйста, нужно срочно написать программу в Ассемблере, которая находить арифметическое выражение: y=a-x*(b+c) ...

Вычислить арифметическое выражение
Подскажите пожалуйста а вот если мне например надо уровнение возвести в квадрат (2+n)в квадрате как это сделать?


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

Или воспользуйтесь поиском по форуму:
13
Ответ Создать тему
Новые блоги и статьи
Thinkpad X220 Tablet — это лучший бюджетный ноутбук для учёбы, точка.
Programma_Boinc 23.12.2025
Thinkpad X220 Tablet — это лучший бюджетный ноутбук для учёбы, точка. Рецензия / Мнение/ Перевод https:/ / **********/ gallery/ thinkpad-x220-tablet-porn-gzoEAjs . . .
PhpStorm 2025.3: WSL Terminal всегда стартует в ~
and_y87 14.12.2025
PhpStorm 2025. 3: WSL Terminal всегда стартует в ~ (home), игнорируя директорию проекта Симптом: После обновления до PhpStorm 2025. 3 встроенный терминал WSL открывается в домашней директории. . .
Как объединить две одинаковые БД Access с разными данными
VikBal 11.12.2025
Помогите пожалуйста !! Как объединить 2 одинаковые БД Access с разными данными.
Новый ноутбук
volvo 07.12.2025
Всем привет. По скидке в "черную пятницу" взял себе новый ноутбук Lenovo ThinkBook 16 G7 на Амазоне: Ryzen 5 7533HS 64 Gb DDR5 1Tb NVMe 16" Full HD Display Win11 Pro
Музыка, написанная Искусственным Интеллектом
volvo 04.12.2025
Всем привет. Некоторое время назад меня заинтересовало, что уже умеет ИИ в плане написания музыки для песен, и, собственно, исполнения этих самых песен. Стихов у нас много, уже вышли 4 книги, еще 3. . .
От async/await к виртуальным потокам в Python
IndentationError 23.11.2025
Армин Ронахер поставил под сомнение async/ await. Создатель Flask заявляет: цветные функции - провал, виртуальные потоки - решение. Не threading-динозавры, а новое поколение лёгких потоков. Откат?. . .
Поиск "дружественных имён" СОМ портов
Argus19 22.11.2025
Поиск "дружественных имён" СОМ портов На странице: https:/ / norseev. ru/ 2018/ 01/ 04/ comportlist_windows/ нашёл схожую тему. Там приведён код на С++, который показывает только имена СОМ портов, типа,. . .
Сколько Государство потратило денег на меня, обеспечивая инсулином.
Programma_Boinc 20.11.2025
Сколько Государство потратило денег на меня, обеспечивая инсулином. Вот решила сделать интересный приблизительный подсчет, сколько государство потратило на меня денег на покупку инсулинов. . . .
Ломающие изменения в C#.NStar Alpha
Etyuhibosecyu 20.11.2025
Уже можно не только тестировать, но и пользоваться C#. NStar - писать оконные приложения, содержащие надписи, кнопки, текстовые поля и даже изображения, например, моя игра "Три в ряд" написана на этом. . .
Мысли в слух
kumehtar 18.11.2025
Кстати, совсем недавно имел разговор на тему медитаций с людьми. И обнаружил, что они вообще не понимают что такое медитация и зачем она нужна. Самые базовые вещи. Для них это - когда просто люди. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2025, CyberForum.ru