Форум программистов, компьютерный форум, киберфорум
C# для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.93/55: Рейтинг темы: голосов - 55, средняя оценка - 4.93
0 / 0 / 1
Регистрация: 28.11.2014
Сообщений: 38

Парсер простых математических выражений

04.05.2015, 21:19. Показов 11764. Ответов 4
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Доброго времени суток, люди помогите перелопатил весь нет не могу решить одну задачку.
Вот задание: Разработать анализатор : строка вводимого интерпетуется программой , которая выполняет нужные действия , заданные пользователем в строке . Реализовать простые арифметические операции ( / * - + ) . Например, в textBox1 вводим строку « 2 плюс 5 » или «2+5», нажимаем button1 результат выводится на textBox2 программы должно быть - «7». Застрял на том как производить арифметические операции словами "плюс" "+" и т.д , или хотя бы подскажите в каком направлении искать, может я не там искал. Заранее спасибо.
0
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
04.05.2015, 21:19
Ответы с готовыми решениями:

Парсер математических выражений
Например человек вводит вот этот в текстовую перемену char или string: 1+2+3*(4/2)-1 Как автоматически распознавая математические функции...

Парсер математических выражений
Здравствуйте. Пишу понемногу для тренировки парсер обычных математических выражений, содержащим арифметические действия. Вопрос №1:...

Преобразование математических выражений из строкового типа
Существует ли в c.net класс решающий следующую задачу: имеется строковое представление математического выражения. Нужно перевести его в...

4
 Аватар для chumich
2081 / 1239 / 464
Регистрация: 20.12.2014
Сообщений: 3,234
04.05.2015, 23:40
Если соблюдать правила ввода через пробел и использовать "разделить", а не "разделить на", то для двух чисел можно сделать так:
C#
1
2
3
4
5
6
7
8
9
        private void button1_Click(object sender, EventArgs e)
        {
            string[] mass = new string[3];
            mass = textBox1.Text.Split(' ');
            if (mass[1].Equals("+") == true || mass[1].Equals("плюс") == true) textBox2.Text = Convert.ToString(Convert.ToDouble(mass[0]) + Convert.ToDouble(mass[2]));
            if (mass[1].Equals("-") == true || mass[1].Equals("минус") == true) textBox2.Text = Convert.ToString(Convert.ToDouble(mass[0]) - Convert.ToDouble(mass[2]));
            if (mass[1].Equals("*") == true || mass[1].Equals("умножить") == true) textBox2.Text = Convert.ToString(Convert.ToDouble(mass[0]) * Convert.ToDouble(mass[2]));
            if (mass[1].Equals("/") == true || mass[1].Equals("разделить") == true) textBox2.Text = Convert.ToString(Convert.ToDouble(mass[0]) / Convert.ToDouble(mass[2]));
        }
2
 Аватар для Alex_Sabaka
638 / 499 / 77
Регистрация: 28.07.2010
Сообщений: 895
05.05.2015, 03:06
Чтоб не изобретать велосипед - пользуйтесь парсерами. К примеру, мне очень нравиться Sprache
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
        enum opType
        {
            add, sub, mul, div, pow
        }
 
        static Parser<opType> Operator(string op, opType type)
        {
            return Parse.String(op).Token().Return(type);
        }
 
        static double binaryApply(opType op, double a, double b)
        {
            switch (op)
            {
                case opType.add:
                    return a + b;
                case opType.sub:
                    return a - b;
                case opType.div:
                    return a / b;
                case opType.mul:
                    return a * b;
                case opType.pow:
                    return Math.Pow(a, b);
                default: throw new ParseException();
            }
        }
 
        static readonly Parser<double> constant = Parse.Decimal.Select(x => double.Parse(x)).Named("number");
 
        static readonly Parser<opType> add = Operator("+", opType.add);
        static readonly Parser<opType> sub = Operator("-", opType.sub);
        static readonly Parser<opType> div = Operator("/", opType.div);
        static readonly Parser<opType> mul = Operator("*", opType.mul);
        static readonly Parser<opType> pow = Operator("^", opType.pow);
 
        static readonly Parser<double> factor = (from lparen in Parse.Char('(')
                                                 from ex in Parse.Ref(() => expr)
                                                 from rparen in Parse.Char(')')
                                                 select ex).XOr(constant);
 
        static readonly Parser<double> operand = ((from sign in Parse.Char('-')
                                                   from fact in factor
                                                   select -fact).XOr(factor)).Token();
 
        static readonly Parser<double> innerTerm = Parse.ChainOperator(pow, operand, binaryApply);
        static readonly Parser<double> term = Parse.ChainOperator(mul.Or(div), innerTerm, binaryApply);
        static readonly Parser<double> expr = Parse.ChainOperator(add.Or(sub), term, binaryApply);
 
        public static void Main2(string[] args)
        {
            while (true)
            {
                Console.Write(">> ");
                var s = Console.ReadLine();
                var r = expr.Parse(s);
                Console.WriteLine("\t{0}", r);
            }
        }
1
0 / 0 / 1
Регистрация: 28.11.2014
Сообщений: 38
07.05.2015, 20:19  [ТС]
chumich, Спасибо, очень помогли.
0
2 / 1 / 1
Регистрация: 23.04.2020
Сообщений: 15
19.10.2020, 09:48
1.А как ты юзаешь Parse?
2.Как ты юзаешь этот код в С# (не написано где оно должно срабатывать при нажатии и тп...)?
3.Напиши по нормальному как ты этот код используешь в С#
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
19.10.2020, 09:48
Помогаю со студенческими работами здесь

Библиотеки - нужен конвертер математических выражений
Здравствуй, нужен конвертер математических выражений. Скачал вроде бы то что надо, но не могу понять как вызвать функцию из этого проекта....

Парсер математических функций
Нужен парсер, который по строке 2x+3 создаст лябмду x =&gt; 2*x+3 обратную задачу я смог сделать с помощью дерева выражений: ...

Написать парсер математических выражений с функцией упрощения этих выражений
Люди, здравствуйте. Есть такая задача: написать упроститель выражений. На вход подается строка вида &quot;a*b+a*c&quot;, являющаяся...

Парсер математических выражений на С/С++
Добрый вечер, можете написать или помочь написать парсер математических выражений для программы вычисляющей интеграл

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


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

Или воспользуйтесь поиском по форуму:
5
Ответ Создать тему
Новые блоги и статьи
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
Кстати, совсем недавно имел разговор на тему медитаций с людьми. И обнаружил, что они вообще не понимают что такое медитация и зачем она нужна. Самые базовые вещи. Для них это - когда просто люди. . .
Создание Single Page Application на фреймах
krapotkin 16.11.2025
Статья исключительно для начинающих. Подходы оригинальностью не блещут. В век Веб все очень привыкли к дизайну Single-Page-Application . Быстренько разберем подход "на фреймах". Мы делаем одну. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2025, CyberForum.ru