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

Вынесение общего множителя за скобки в выражении

26.01.2014, 04:44. Показов 3204. Ответов 8
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Здравствуйте! Вот какая проблемка: нужно написать программку, которая выносит общий множитель за скобочки, я ввожу в TextBox арифметическое выражение, например: a*b+a*c, на выходе должно получиться a*(b+c),аналогично и с числовыми выражениями,но я ума не приложу как вообще это реализовать,с чего начинать?? Подсобите неопытному программисту....
0
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
26.01.2014, 04:44
Ответы с готовыми решениями:

Вынесение общего элемента из выражения
(X \vee Y) \wedge (Z \vee Y) В данном случае можно вынести Y, а в следующем: (X \wedge Y) \vee (Z \wedge Y) ? Это в контексте алгебры...

Раскрыть скобки в выражении
Вот написал программку, Теперь необходимо раскрыть скобки, кто может помочь? п.с. в архиве так же используемый шрифт Ш-сложение по...

Раскрыть скобки в выражении
раскрыть скобки (sin(x)-12)(5sin(x)^3-1)+(1-2xos(x)+7co(x)^2)^3/(cos(3x)-sin(4x))(2+cos(x))^3 как их решить в MathCAD

8
814 / 422 / 169
Регистрация: 08.02.2013
Сообщений: 711
26.01.2014, 07:21
Nastya12, Вам, наверное, в раздел алгоритмы нужно. Могу предложить очень простой вариант, для операций + и *:
1. разобрать скобочное выражение любым удобным способом
2. раскрыть скобки и получить многочлен суммы произведений: ΣiПjaji
3. вычислить все числовые суммы
4. разложить все числовые множители на произведение простых чисел
5. брать группы в сумме и выносить одинаковые множители за скобки
6. Повторять для новых сумм

Однозначно, какое-то упрощение вы получите, но не оптимальное. Для последнего необходимо уточнить задачу, т.к. определения "простоты" выражения не существет, если это учебное задание, лучше решить его для каких-то частных вариантов, выражений особых видов или операций упрощения, например, пусть алгоритм ищет полный квадрат итд.. Если сформулируете подобную конкретную задачу, думаю, здесь точно кто-то поможет с решением.
1
1195 / 588 / 88
Регистрация: 20.09.2012
Сообщений: 1,881
26.01.2014, 09:16
Цитата Сообщение от Nastya12 Посмотреть сообщение
с чего начинать?
Если хотите сделать самостоятельно, то с теории. Пишете парсер, разбираете через него формулу в синтаксическое дерево, преобразуете дерево по своим правилам (выносит общий множитель за скобочки), выводите результат. Ключевые слова для изучения
http://ru.wikipedia.org/wiki/%... 0%B8%D0%B7
http://ru.wikipedia.org/wiki/%... 0%B2%D0%BE
http://en.wikipedia.org/wiki/Graph_rewriting
2
foo();
 Аватар для rattrapper
886 / 587 / 222
Регистрация: 03.07.2013
Сообщений: 1,549
Записей в блоге: 2
26.01.2014, 12:25
Nastya12, условие : строка вида "a + b", где а и b - целые числа
C# Скопировано
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
static void Main(string[] args)
{
    var nums = Console.ReadLine()
        .Split('+')
        .Select(int.Parse);
    int a = nums.First(), b = nums.Last(),
        n = NOD(a, b);
    a /= n; b /= n;
    Console.WriteLine("{0} * ({1} + {2})", n, a, b);
    Console.ReadKey();
}
static int NOD(int a, int b)
{
    if (b > a) return NOD(b, a);
    else if (a % b == 0) return b;
    else return NOD(b, a % b);
}
дальше сами
1
215 / 63 / 25
Регистрация: 30.04.2013
Сообщений: 865
Записей в блоге: 10
03.03.2016, 00:29
Цитата Сообщение от pycture Посмотреть сообщение
преобразуете дерево по своим правилам
вот с этим моментом у меня сейчас и проблема

вот
моя тема

В моей модели каждый нетерминал - интерфейс. Каждая правая часть продукций - реализация соответствующего интерфейса, которая аггрегирует элементы(терминалы(значения) и/или нетерминалы(указатели на интерфейсы)) правой части.

Можно ли пример самый простой но по существу реализаций такого преобразования.
Хотя бы с раскрытием скобок.
0
Master of Orion
Эксперт .NET
 Аватар для Psilon
6100 / 4956 / 905
Регистрация: 10.07.2011
Сообщений: 14,522
Записей в блоге: 5
03.03.2016, 00:38
Qazan, вам нужно просто дерево построить. Самый простой вариант - рекурсивный. Ищем оператор с наименьшим приоритетом, это корень дерева, после этого рекурсивно повторяем для текста слева и справа от этого оператора. Дальше применяем правила упрощения, если есть два одинаковых потомка и у них есть один общий операнд, то его можно вынести наверх. Таким образом +*ab*ac => *a+bc
0
215 / 63 / 25
Регистрация: 30.04.2013
Сообщений: 865
Записей в блоге: 10
03.03.2016, 01:24
Psilon,
не уверен, что все понял.
У меня уже строиться синтаксическое дерево.

В каждой ноде создается объект по такому принципу:
C++ Скопировано
1
2
3
4
5
6
7
8
Number number = 25;
AbstractA *a = new Atom(number);
AbstarctE *e = new SingleTerm(a);
 
Number number1 = 73;
AbstractT *t = new Atom(number1);
 
AbstarctE *e1 = new Sum(e, t);
Проблема как на folding'е делать преобразования в случае со скобками ?
Из под самих объектов или это нужно как то внешне делать ?
0
Эксперт .NETАвтор FAQ
 Аватар для Storm23
10421 / 5151 / 1825
Регистрация: 11.01.2015
Сообщений: 6,226
Записей в блоге: 34
03.03.2016, 02:00
Qazan, Раскрытие скобок:
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
    class Node
    {
        public string Name;
        public Node LeftOp;
        public Node RightOp;
 
        public Node(string name)
        {
            Name = name;
        }
 
        public Node RemoveBrackets()
        {
            var list = RemoveBracketsEnum().ToList();
            if (list.Count == 1) return list[0];
 
            var root = new Node("+");
            var n = root;
            for(int i = 0;i<list.Count - 1;i++)
            {
                n.LeftOp = list[i];
                n.RightOp = i == list.Count - 2 ? list[i + 1] : new Node("+");
                n = n.RightOp;
            }
 
            return root;
        }
 
        private IEnumerable<Node> RemoveBracketsEnum()
        {
            //atom ?
            if (LeftOp == null) yield return new Node(Name);
            //*
            if (Name == "*")
            foreach (var n in LeftOp.RemoveBracketsEnum())
            foreach (var m in RightOp.RemoveBracketsEnum())
                yield return new Node("*") {LeftOp = n, RightOp = m};
            //+
            if (Name == "+")
            {
                foreach (var n in LeftOp.RemoveBracketsEnum())
                    yield return n;
                foreach (var m in RightOp.RemoveBracketsEnum())
                    yield return m;
            }
        }
    }
1
6 / 0 / 0
Регистрация: 24.11.2012
Сообщений: 125
09.04.2016, 02:01  [ТС]
Ребят, все сделано, спасибо за участие, забыла отписать год назад
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
09.04.2016, 02:01
Помогаю со студенческими работами здесь

Расставить скобки в арифметическом выражении
Расставить скобки в выражении по старшинству операций, т.е. операция &quot;возведение в степень&quot; самая старшая, затем &quot;деление&quot;,...

Раскрыть скобки в алгебраическом выражении.
Здравствуйте! Подскажите каким алгоритмом (способом) можно осуществить раскрытие скобок в выражении?? Например: Имеется ...

Знак скобки ( в регулярном выражении
здравствуйте, код 'Chr$(7) это концевая сноска таблицы Word, удаляем её reg.Pattern = Chr$(7) Выделенный_текст =...

Как экранировать скобки в регулярном выражении
Добрый день! Ищу через регулярные выражения: if (Regex.IsMatch(lineToCheck, &quot;(?:|^)&quot; + key + &quot;(?:|$)&quot;)) При этом...

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


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

Или воспользуйтесь поиском по форуму:
9
Ответ Создать тему
Новые блоги и статьи
Не удержался от оценки концепции двигателя Стирлинга.
Hrethgir 03.04.2025
Сколько не пытался - она выдавала правильные схемы, причём случайно рисовала горячие области в середине, холодные по краям, трубки с краёв в низ и магнит в соединяющей, но при этой выдавала описание. . .
Метод с двумя буферами (или double buffering) или ping-pong buffering
Hrethgir 02.04.2025
Из ответов LM модели. Метод, который предполагает использование двух массивов для хранения промежуточных результатов сложения векторов, обычно применяется в сценариях, где необходимо минимизировать. . .
На любовном киберфронте
Alexander-7 01.04.2025
Недавно на одном малоизвестном сайте знакомств мною заинтересовалась девушка: «Текст немного странный. Но, судя по адресу почты, иностранка», – подумал я. Поколебавшись пару суток, я ответил ей:. . .
Как работает Node.js изнутри
run.dev 29.03.2025
Node. js изменил подход к разработке веб-приложений, позволив использовать JavaScript не только на стороне клиента, но и на сервере. Созданный в 2009 году Райаном Далем, этот открытый,. . .
Моки в Python: Mock Object Library
py-thonny 29.03.2025
Тестирование кода требует особого подхода, когда речь идёт о компонентах, взаимодействующих с внешним миром. Мы часто сталкиваемся с непредсказуемостью HTTP-запросов, чтением данных из базы или. . .
JavaScript: Управление памятью и улучшение производительности
run.dev 29.03.2025
В отличие от низкоуровневых языков программирования, JavaScript не требует ручного выделения и освобождения памяти. Здесь работает автоматический сборщик мусора, который определяет, какие объекты. . .
Мультитенантная архитектура со SpringBoot и PostgreSQL
ArchitectMsa 29.03.2025
SaaS-приложения редко обслуживают одного клиента и обычно они должны поддерживать множество организаций, каждая из которых работает в своём изолированном пространстве. Мультитенантная архитектура. . .
std::span в C++: Производительность и лучшие практики
NullReferenced 28.03.2025
std::span — одно из самых недооценённых нововведений стандарта C++20, которое радикально меняет подход к работе с непрерывными последовательностями данных. По сути, это невладеющее представление. . .
Многопоточность в C#: Threadpool
UnmanagedCoder 28.03.2025
Пул потоков в C# — это коллекция заранее созданных и готовых к использованию потоков, которые находятся в распоряжении приложения. Вместо того чтобы создавать и уничтожать потоки для каждой небольшой. . .
Вопросы на собеседованиях по микросервисам
ArchitectMsa 27.03.2025
Работодатели ищут не просто разработчиков, знающих базовые концепции, а специалистов, разбирающихся в тонкостях масштабирования, отказоустойчивости и производительности. Сейчас на первый план выходят. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2025, CyberForum.ru
Выделить код Копировать код Сохранить код Нормальный размер Увеличенный размер