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

Сделать калькулятор арифметического выражения

30.04.2020, 11:11. Показов 7527. Ответов 35

Студворк — интернет-сервис помощи студентам
Вот такое мне дали задание:
Написать подпрограмму–функцию Form(S, X, Y), где S – строка, Х и Y
– вещественные переменные. В строке записано арифметическое выражение,
содержащее переменные Х и Y, константы (целые или вещественные),
операции +, -, *, /. Порядок операций определен скобками. Подпрограмма–
функция возвращает значение арифметического выражения при заданных
значениях Х и Y

Совершенно не понимаю, как эту строку преобразовать в арифметическое выражение для крестов и как посчитать. А ещё я ненавижу свою жизнь, хотя поводы для этого пустяковые.
1
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
30.04.2020, 11:11
Ответы с готовыми решениями:

Расчет арифметического выражения
Помогите с формулой не могу понять

Вычисление арифметического выражения
1. Рассчитать арифметическое выражение: а=(x^2-ху)/(0,7Sinln|x|) при x=45,892, y=0,601.

Чтение арифметического выражения из файла
Доброго времени суток. Столкнулся с проблемой. Задача состоит в том, чтобы программа читала из файла стоку вида: число, выражение(+,-,*,/),...

35
736 / 700 / 110
Регистрация: 29.05.2015
Сообщений: 4,266
30.04.2020, 11:38
Цитата Сообщение от DeveloperS73 Посмотреть сообщение
Совершенно не понимаю, как эту строку преобразовать в арифметическое выражение для крестов и как посчитать.
Гугли "обратная польская нотация".
0
Just Do It!
 Аватар для XLAT
4197 / 2652 / 654
Регистрация: 23.09.2014
Сообщений: 8,946
Записей в блоге: 3
30.04.2020, 12:10
Лучший ответ Сообщение было отмечено DeveloperS73 как решение

Решение

DeveloperS73,
1.
сам калькулятор можно взять отсюда:
Пытаюсь сделать калькулятор со вводом в одну строку, начал с прибавления, не хочет выводить конечный результат с функции

2.
Написать функцию генератора строки в которой будут подставляться значения вместо X и Y:
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
///----------------------------------------------------------------------------|
/// 
///----------------------------------------------------------------------------:
#include <iostream>
#include <string>
#include <sstream>
 
template <typename T>
std::string toString(T val)
{   std::ostringstream oss;
    oss << val;
    return oss.str();
}
 
inline std::string& foo(std::string& s, double x, std::string xy)
{   for(    size_t pos = 0, p; 
           (p   = s.find(xy, pos)) != std::string::npos; pos = ++p)
        s.replace(p, 1, toString(x));
    return s;
}
 
#define TOS(a) a, #a
std::string& foo(std::string& s, double x, double y)
{   foo(s , TOS(x));
    foo(s , TOS(y));
    return s;
}
#undef TOS
 
///----------------------------------------------------------------------------|
/// main()
///----------------------------------------------------------------------------:
int main()
{   setlocale(0, "");
 
    std::string str = "3.14 * (x + y * 2) +x";
    double x = 777.888;
    double y =   0.042;
    
    ///--------------------------------|
    /// Подставляем в шаблон значения. |
    ///--------------------------------:
    foo(str, x, y);
    
    std::cout << "Готовая строка для подачи в калькулятор: " << str << "\n";
    
    std::cin.get();
}
3.
Добавить пункт 1 в пункт 2.

Добавлено через 6 минут
Цитата Сообщение от DeveloperS73 Посмотреть сообщение
А ещё я ненавижу свою жизнь
жизнь тоже можно программировать, а если хотца чтобы жизнь вас радовала, то и нужно ...

Цитата Сообщение от alexu_007 Посмотреть сообщение
Гугли "обратная польская нотация".
ещё советские "ламповые" калькуляторы эту хрень перестали поддерживать на уровне юзера.
а если у вас строка, то тут обязательно где-то рядом будет уровень того, кто этим будет пользоваться.
1
736 / 700 / 110
Регистрация: 29.05.2015
Сообщений: 4,266
30.04.2020, 13:33
Цитата Сообщение от XLAT Посмотреть сообщение
а если у вас строка, то тут обязательно где-то рядом будет уровень того, кто этим будет пользоваться.
Уровень будет обязательно?
0
3 / 3 / 0
Регистрация: 18.11.2017
Сообщений: 26
30.04.2020, 13:39  [ТС]
Цитата Сообщение от XLAT Посмотреть сообщение
жизнь тоже можно программировать
Это через трансерфинг реальности зеландовский?
0
Just Do It!
 Аватар для XLAT
4197 / 2652 / 654
Регистрация: 23.09.2014
Сообщений: 8,946
Записей в блоге: 3
30.04.2020, 13:52
Цитата Сообщение от alexu_007 Посмотреть сообщение
Уровень будет обязательно?
ну да, вы конеш, можете прибить гвоздями внутря проги формулы в польской нотации
и в ваше кюте сделать меню, типа:
1.Расчет полинома Ньютона.
2.Подсчитать периметр круга
3.Сделать преобразование Фурье.
+
ещё 100500 пунктов в меню, вроде как на все случаи жизни.


Но юзверь, на то и юзверь:
у него полно своих формул, которые вы НИКОГДА, не сможете ЗАШИТЬ в свою прогу!

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

И тут БАХ, вы ему свою китайскуюпольскую нотацию,
потому, что, видите ли, вам так было проще кодировать.

Добавлено через 5 минут

Не по теме:

Цитата Сообщение от DeveloperS73 Посмотреть сообщение
Это через трансерфинг реальности зеландовский?
блин,
выкиньте всю такую хрень из своей головы!

аферисты экзотерики запускют чайники на орбиту,
и прошивают своим адептам моск, мол, они там есть и летают.
И ни доказать, и ни опровергнуть того нельзя!

мне ещё можно читать такую белиберду,
т.к. я прошёл тест на устойчивость психики к чёрной магии,

но для большинства москов любая экзотерика разрушительна!

1
736 / 700 / 110
Регистрация: 29.05.2015
Сообщений: 4,266
30.04.2020, 13:58
Цитата Сообщение от XLAT Посмотреть сообщение
Но можно сделать, что он легко сможет редактировать свои формулы на принятом всем миром матоязыке.
Кто будет делать?
0
Just Do It!
 Аватар для XLAT
4197 / 2652 / 654
Регистрация: 23.09.2014
Сообщений: 8,946
Записей в блоге: 3
30.04.2020, 14:00
Цитата Сообщение от alexu_007 Посмотреть сообщение
Уровень будет обязательно?
уровня может и вовсе не быть никакого,
если вашей прогой НИКТО не будет пользоваться.

Цитата Сообщение от alexu_007 Посмотреть сообщение
Кто будет делать?
о боже, вы для кого код пишите?
для себя?
ну возможно вы любитель польской нотации, тогда уровень это исключительно ваш уровень.
0
736 / 700 / 110
Регистрация: 29.05.2015
Сообщений: 4,266
30.04.2020, 15:01
Обратная польская нотация (ОПН) - это всего лишь другая форма записи арифметического выражения, в котором отсутствуют скобки, а цифры и знаки идут в порядке выполнения. Благодаря чему его можно легко вычислить:
Миниатюры
Сделать калькулятор арифметического выражения  
0
Just Do It!
 Аватар для XLAT
4197 / 2652 / 654
Регистрация: 23.09.2014
Сообщений: 8,946
Записей в блоге: 3
30.04.2020, 15:28
alexu_007, в фотошопе сделали?
...,
ах да, я забыл: надо на сырцы лицензию купить.

Цитата Сообщение от alexu_007 Посмотреть сообщение
это всего лишь другая форма записи арифметического выражения
отсортировать массив операций по приоритетам по мне проще, чем лопатить стек.
но это моё имхо, потому что это я уже делал и это работает.


собсно, вы правы, что если кодеру уж сильно хотца, то он может и перелопатить строку на стеке,
а почему бы и нет.

Но, на форуме здесь есть люди разрабатывающие ЯП, где в этом япе ПН будет стандартом,
(а вдруг вы тож из этого тайного общества?!)
поэтому я не исключил примерно такое желание и у вас:
чтобы пользователи изначально писали формулы в ПН.
0
736 / 700 / 110
Регистрация: 29.05.2015
Сообщений: 4,266
30.04.2020, 15:58
Цитата Сообщение от XLAT Посмотреть сообщение
ах да, я забыл: надо на сырцы лицензию купить.
Вопрос был "не понимаю как это можно сделать", а не "сделайте за меня".
0
3 / 3 / 0
Регистрация: 18.11.2017
Сообщений: 26
02.05.2020, 21:19  [ТС]
Можно вопрос: Что происходит в этой строке?
C++
1
(p   = s.find(xy, pos)) != std::string::npos; pos = ++p)
Почему в условиях допустимого существования фора случается какое-то присваивание для p? И как вообще связаны p и pos, это же одно и тоже?
0
Just Do It!
 Аватар для XLAT
4197 / 2652 / 654
Регистрация: 23.09.2014
Сообщений: 8,946
Записей в блоге: 3
03.05.2020, 00:16
Лучший ответ Сообщение было отмечено DeveloperS73 как решение

Решение

Цитата Сообщение от DeveloperS73 Посмотреть сообщение
Почему
Цитата Сообщение от DeveloperS73 Посмотреть сообщение
p = s.find(xy, pos)
1. xy это подстрока которую ищем в строке s
2. pos позиция с которой будет начат поиск.
3. p позиция найденной подстроки xy
4. если подстрока xy не будет найдена, то p == std::string::npos

Добавлено через 30 минут
DeveloperS73,
вот подправил ваш калькулятор
Как работает калькулятор в с++?
теперь он сможет работать с формулами-функциями в которых нужно подставлять аргументы.

Т.к. я не нашёл способа программно загрузить строку в потоковый буфер,
то я заменил энтот буфер на дек.
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 <deque>
 
class Calculator
{   private:    
        class  smycin
        {   
        public:
            void set(const std::string& s)
            {   for(const auto& e : s)
                {   d.push_back(e);
                }
                //info();
            }
 
            void putback(char c)
            {   d.push_front(c);
            }
            
            char get()
            {   char c = d.front();
                d.pop_front();
                return c;
            }
 
        private:
            std::deque<char> d;
            void info()
            {   for(size_t i = 0; i < d.size(); i++)
                    std::cout << d[i];
                std::cout << "\n";
            }
        } my;
 
        float number()
        {   int res = 0;
            for (;;)
            {   char c = my.get();
                if (c >= '0' && c <= '9')
                    res = res * 10 + c - '0';
                else
                {   my.putback(c);
                    return res;
                }
            }
        }
 
        float skobki()
        {   char c = my.get();
            if (c == '(')
            {   float x = expr();
                my.get();
                return x;
            }
            else
            {   my.putback(c);
                return number();
            }
        }
 
        float factor()
        {   float x = skobki();
            for (;;)
            {   char c = my.get();
                switch (c)
                {   case '*':
                        x *= skobki();
                        break;
                    case '/':
                        x /= skobki();
                        break;
                    default:
                        my.putback(c);
                        return x;
                }
            }
        }
 
        float expr()
        {   float x = factor();
            for (;;)
            {   char c = my.get();
                switch (c)
                {   case '+':
                        x += factor();
                        break;
                    case '-':
                        x -= factor();
                        break;
                    default:
                        my.putback(c);
                        return x;
                }
            }
        }
    
    public:
        ///---------------------------------------------|
        /// Это тут всё!                                |
        /// Что ты должен знать об этом калькуляторе!!! |
        ///---------------------------------------------:
        float res;
        float go(std::string str)
        {   std::cout << "Virazhenie: " << str;
            my.set(str);
            res = expr();
            std::cout << " = " << res << std::endl;
            return res;
        }
};
 
///----------------------------------------------------------------------------|
/// Тест.
///----------------------------------------------------------------------------:
int main()
{   Calculator calc;
    calc.go("2*(3*(5-2))"); /// Otvet: 18
 
    std::cin.get();
}
теперь у вас есть альтернатива простого по реализации калькулятора, который не напугает препода.
разумеется вам нужно это засунуть в ту часть где вы генерируйте калькуляторную строку(см. пост #3 выше).
1
3 / 3 / 0
Регистрация: 18.11.2017
Сообщений: 26
03.05.2020, 00:25  [ТС]
Спасибо большое!
1
 Аватар для freevoyajer
20 / 21 / 2
Регистрация: 09.04.2020
Сообщений: 125
03.05.2020, 01:59
Цитата Сообщение от XLAT Посмотреть сообщение
ещё советские "ламповые" калькуляторы эту хрень перестали поддерживать на уровне юзера
Это всего лишь один из способов упаковки математического выражения заданного инфиксной нотацией, как и двоичное дерево. Разница только в том где лежат данные. К слову, forth программисты вообще всё пишут сразу в постфиксе. В чем проблема?
0
Just Do It!
 Аватар для XLAT
4197 / 2652 / 654
Регистрация: 23.09.2014
Сообщений: 8,946
Записей в блоге: 3
03.05.2020, 02:02
Цитата Сообщение от freevoyajer Посмотреть сообщение
В чем проблема?
я как раз и спрашиваю в чем проблема ваших погромистов, что надо переводит в постфикс?
но вы вроде как ответили на этот вопрос: проблема в том, что они FORTH-погромисты.
0
 Аватар для freevoyajer
20 / 21 / 2
Регистрация: 09.04.2020
Сообщений: 125
03.05.2020, 16:37
Цитата Сообщение от XLAT Посмотреть сообщение
я как раз и спрашиваю в чем проблема ваших погромистов, что надо переводит в постфикс?
Ну как бы инфикс привычен глазу, но не удобный для разбора и вычисления. Постфикс/префикс в этом плане более унифицированные нотации. Я искренне не понимаю вашего сарказма и прошу вас пояснить мне/публике почему на ваш взгляд ОПН:
Цитата Сообщение от XLAT Посмотреть сообщение
ещё советские "ламповые" калькуляторы эту хрень перестали поддерживать на уровне юзера
Также отвергая предложение вы, очевидно, должны сослаться на более эффективные на ваш взгляд альтернативы. Я вижу предложенное решение использовать ОПН гораздо более эффективным чем то что предложили вы.
Цитата Сообщение от XLAT Посмотреть сообщение
проблема в том, что они FORTH-погромисты
Ахахаха, посмеялись. Может пора перейти к ктоструктиву?
0
Just Do It!
 Аватар для XLAT
4197 / 2652 / 654
Регистрация: 23.09.2014
Сообщений: 8,946
Записей в блоге: 3
03.05.2020, 16:46
Цитата Сообщение от freevoyajer Посмотреть сообщение
Я вижу предложенное решение использовать ОПН гораздо более эффективным чем то что предложили вы.
вы видите?
так и нам покажите!
в этой теме два калькулятора без ПН,
покажите, пжлста, ваш эффективный калькулятор с ПН.
0
 Аватар для freevoyajer
20 / 21 / 2
Регистрация: 09.04.2020
Сообщений: 125
03.05.2020, 16:50
Цитата Сообщение от XLAT Посмотреть сообщение
я как раз и спрашиваю в чем проблема ваших погромистов, что надо переводит в постфикс?
Просто уточняю: перевод в постфикс не предполагается. Идет вычисление результата с разбором выражения в один проход с заменой неизвестный "на лету".

Добавлено через 2 минуты
Цитата Сообщение от XLAT Посмотреть сообщение
вы видите?
Да. Я вижу что вы прошли по исходному выражению 100500 раз чтобы заменить неизвестные их значениями. Потом высмеяли предложение собеседника по-моему безосновательно. Моя просьба к вам обосновать подобный выпад вполне естественна. Так вы обоснуете или нет?
0
Just Do It!
 Аватар для XLAT
4197 / 2652 / 654
Регистрация: 23.09.2014
Сообщений: 8,946
Записей в блоге: 3
03.05.2020, 17:05
Цитата Сообщение от freevoyajer Посмотреть сообщение
Идет вычисление результата с разбором выражения в один проход с ...
где идёт? доуточните, пжлста ...

уточняю вопрос: где ваш код, где оно идёт???

Добавлено через 2 минуты
Цитата Сообщение от freevoyajer Посмотреть сообщение
Потом высмеяли предложение собеседника по-моему безосновательно.
ну кидаться фразами с википедии мы тут все горазды:
ГДЕ КОНКРЕТНО ВАШ ЭФФЕКТИВНЫЙ КОД???

Добавлено через 4 минуты
Цитата Сообщение от freevoyajer Посмотреть сообщение
Я вижу что вы прошли по исходному выражению 100500 раз
я не заморочен на одних калькуляторах,
проходил мимо, вижу нужен калькулятор, открыл у себя иде - cделал его,
и пошёл дальше.

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

Короче, жду ваш рабочий супер эффективный код.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
03.05.2020, 17:05
Помогаю со студенческими работами здесь

Вычислить значение арифметического выражения
5...Требуется вычислить значение арифметического выражения. Выражение записано без пробелов в следующем формате: AxB где A и B...

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

Вычислить значение арифметического выражения
Строка символов состоит из десятичных цифр разделенных знаками сложения и вычитания. Вычислить значение арифметического выражения, а...

Проверить правильность арифметического выражения
С++ Проверить правильность арифметического выражения, состоящего из числовых констант, знаков арифметических действий и скобок () и .

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


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

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
Новые блоги и статьи
Thinkpad X220 Tablet — это лучший бюджетный ноутбук для учёбы, точка.
Programma_Boinc 23.12.2025
Thinkpad X220 Tablet — это лучший бюджетный ноутбук для учёбы, точка. Рецензия / Мнение Это мой обзор планшета X220 с точки зрения школьника. Недавно я решила попытаться уменьшить свой. . .
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