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

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

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

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

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

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

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

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

Вычислить значение арифметического выражения
5...Требуется вычислить значение арифметического выражения. Выражение записано без пробелов в...

35
661 / 662 / 106
Регистрация: 29.05.2015
Сообщений: 3,967
30.04.2020, 11:38 2
Цитата Сообщение от DeveloperS73 Посмотреть сообщение
Совершенно не понимаю, как эту строку преобразовать в арифметическое выражение для крестов и как посчитать.
Гугли "обратная польская нотация".
0
Just Do It!
3841 / 2286 / 636
Регистрация: 23.09.2014
Сообщений: 7,072
Записей в блоге: 3
30.04.2020, 12:10 3
Лучший ответ Сообщение было отмечено 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
661 / 662 / 106
Регистрация: 29.05.2015
Сообщений: 3,967
30.04.2020, 13:33 4
Цитата Сообщение от XLAT Посмотреть сообщение
а если у вас строка, то тут обязательно где-то рядом будет уровень того, кто этим будет пользоваться.
Уровень будет обязательно?
0
3 / 3 / 0
Регистрация: 18.11.2017
Сообщений: 26
30.04.2020, 13:39  [ТС] 5
Цитата Сообщение от XLAT Посмотреть сообщение
жизнь тоже можно программировать
Это через трансерфинг реальности зеландовский?
0
Just Do It!
3841 / 2286 / 636
Регистрация: 23.09.2014
Сообщений: 7,072
Записей в блоге: 3
30.04.2020, 13:52 6
Цитата Сообщение от alexu_007 Посмотреть сообщение
Уровень будет обязательно?
ну да, вы конеш, можете прибить гвоздями внутря проги формулы в польской нотации
и в ваше кюте сделать меню, типа:
1.Расчет полинома Ньютона.
2.Подсчитать периметр круга
3.Сделать преобразование Фурье.
+
ещё 100500 пунктов в меню, вроде как на все случаи жизни.


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

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

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

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

Не по теме:

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

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

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

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

1
661 / 662 / 106
Регистрация: 29.05.2015
Сообщений: 3,967
30.04.2020, 13:58 7
Цитата Сообщение от XLAT Посмотреть сообщение
Но можно сделать, что он легко сможет редактировать свои формулы на принятом всем миром матоязыке.
Кто будет делать?
0
Just Do It!
3841 / 2286 / 636
Регистрация: 23.09.2014
Сообщений: 7,072
Записей в блоге: 3
30.04.2020, 14:00 8
Цитата Сообщение от alexu_007 Посмотреть сообщение
Уровень будет обязательно?
уровня может и вовсе не быть никакого,
если вашей прогой НИКТО не будет пользоваться.

Цитата Сообщение от alexu_007 Посмотреть сообщение
Кто будет делать?
о боже, вы для кого код пишите?
для себя?
ну возможно вы любитель польской нотации, тогда уровень это исключительно ваш уровень.
0
661 / 662 / 106
Регистрация: 29.05.2015
Сообщений: 3,967
30.04.2020, 15:01 9
Обратная польская нотация (ОПН) - это всего лишь другая форма записи арифметического выражения, в котором отсутствуют скобки, а цифры и знаки идут в порядке выполнения. Благодаря чему его можно легко вычислить:
Миниатюры
Сделать калькулятор арифметического выражения  
0
Just Do It!
3841 / 2286 / 636
Регистрация: 23.09.2014
Сообщений: 7,072
Записей в блоге: 3
30.04.2020, 15:28 10
alexu_007, в фотошопе сделали?
...,
ах да, я забыл: надо на сырцы лицензию купить.

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


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

Но, на форуме здесь есть люди разрабатывающие ЯП, где в этом япе ПН будет стандартом,
(а вдруг вы тож из этого тайного общества?!)
поэтому я не исключил примерно такое желание и у вас:
чтобы пользователи изначально писали формулы в ПН.
0
661 / 662 / 106
Регистрация: 29.05.2015
Сообщений: 3,967
30.04.2020, 15:58 11
Цитата Сообщение от XLAT Посмотреть сообщение
ах да, я забыл: надо на сырцы лицензию купить.
Вопрос был "не понимаю как это можно сделать", а не "сделайте за меня".
0
3 / 3 / 0
Регистрация: 18.11.2017
Сообщений: 26
02.05.2020, 21:19  [ТС] 12
Можно вопрос: Что происходит в этой строке?
C++
1
(p   = s.find(xy, pos)) != std::string::npos; pos = ++p)
Почему в условиях допустимого существования фора случается какое-то присваивание для p? И как вообще связаны p и pos, это же одно и тоже?
0
Just Do It!
3841 / 2286 / 636
Регистрация: 23.09.2014
Сообщений: 7,072
Записей в блоге: 3
03.05.2020, 00:16 13
Лучший ответ Сообщение было отмечено 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  [ТС] 14
Спасибо большое!
1
20 / 21 / 2
Регистрация: 09.04.2020
Сообщений: 125
03.05.2020, 01:59 15
Цитата Сообщение от XLAT Посмотреть сообщение
ещё советские "ламповые" калькуляторы эту хрень перестали поддерживать на уровне юзера
Это всего лишь один из способов упаковки математического выражения заданного инфиксной нотацией, как и двоичное дерево. Разница только в том где лежат данные. К слову, forth программисты вообще всё пишут сразу в постфиксе. В чем проблема?
0
Just Do It!
3841 / 2286 / 636
Регистрация: 23.09.2014
Сообщений: 7,072
Записей в блоге: 3
03.05.2020, 02:02 16
Цитата Сообщение от freevoyajer Посмотреть сообщение
В чем проблема?
я как раз и спрашиваю в чем проблема ваших погромистов, что надо переводит в постфикс?
но вы вроде как ответили на этот вопрос: проблема в том, что они FORTH-погромисты.
0
20 / 21 / 2
Регистрация: 09.04.2020
Сообщений: 125
03.05.2020, 16:37 17
Цитата Сообщение от XLAT Посмотреть сообщение
я как раз и спрашиваю в чем проблема ваших погромистов, что надо переводит в постфикс?
Ну как бы инфикс привычен глазу, но не удобный для разбора и вычисления. Постфикс/префикс в этом плане более унифицированные нотации. Я искренне не понимаю вашего сарказма и прошу вас пояснить мне/публике почему на ваш взгляд ОПН:
Цитата Сообщение от XLAT Посмотреть сообщение
ещё советские "ламповые" калькуляторы эту хрень перестали поддерживать на уровне юзера
Также отвергая предложение вы, очевидно, должны сослаться на более эффективные на ваш взгляд альтернативы. Я вижу предложенное решение использовать ОПН гораздо более эффективным чем то что предложили вы.
Цитата Сообщение от XLAT Посмотреть сообщение
проблема в том, что они FORTH-погромисты
Ахахаха, посмеялись. Может пора перейти к ктоструктиву?
0
Just Do It!
3841 / 2286 / 636
Регистрация: 23.09.2014
Сообщений: 7,072
Записей в блоге: 3
03.05.2020, 16:46 18
Цитата Сообщение от freevoyajer Посмотреть сообщение
Я вижу предложенное решение использовать ОПН гораздо более эффективным чем то что предложили вы.
вы видите?
так и нам покажите!
в этой теме два калькулятора без ПН,
покажите, пжлста, ваш эффективный калькулятор с ПН.
0
20 / 21 / 2
Регистрация: 09.04.2020
Сообщений: 125
03.05.2020, 16:50 19
Цитата Сообщение от XLAT Посмотреть сообщение
я как раз и спрашиваю в чем проблема ваших погромистов, что надо переводит в постфикс?
Просто уточняю: перевод в постфикс не предполагается. Идет вычисление результата с разбором выражения в один проход с заменой неизвестный "на лету".

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

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

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

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

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

Короче, жду ваш рабочий супер эффективный код.
0
03.05.2020, 17:05
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
03.05.2020, 17:05
Помогаю со студенческими работами здесь

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

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

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

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

Синтаксический разбор арифметического выражения
Здравствуйте , было поставлено задание : &quot;Написать программу, которая с помощью дерева...

Циклическое нахождение значения арифметического выражения
И вот уравнение.


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

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru