Форум программистов, компьютерный форум, киберфорум
C# для начинающих
Войти
Регистрация
Восстановить пароль
 
Рейтинг 4.80/5: Рейтинг темы: голосов - 5, средняя оценка - 4.80
433 / 298 / 82
Регистрация: 11.12.2010
Сообщений: 1,209
1
.NET 4.x

Разобрать в ПОЛИЗ логическое выражение

26.03.2013, 15:20. Показов 957. Ответов 2
Метки нет (Все метки)

Предположим у нас есть логическое выражение типа
https://www.cyberforum.ru/cgi-bin/latex.cgi?Con(A \bigcup B)\bigcap Dil(!A).
И его надо решить.
Для решения я выбрал разбор выражения в ПОЛИЗ (Обратная польская запись).
И саму функцию решения написал. Но вот с функцией разбора по лексемам туго.
Для данного примера Con(A∪B)∩Dil(!A)
он пишет Con A B ∪ Dil A ! ∩
А должен A B ∪ Con A ! Dil ∩
Con и Dil - УНАРНЫЕ
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
        public string MyRevers(string input)
        {
            string myoutputString = " ";
            int sL = 0;
            int sW = 0;
            int i = 0;
 
            for (i = 0; i < input.Length; i++)
            {
                if (input[i] == '(')
                {
                    sL = sL + 1;
                }
                if (input[i] == ')')
                {
                    sW = sW + 1;
                }
            }
            if (sL != sW)
            {
                MessageBox.Show("Input error");
                return " ";
 
            }
            Regex rx = new Regex(@"\(|\)|\!|∪|\∩|Dil([A-Z][a-z]*)|Con([A-Z][a-z]*)|([A-Z][a-z]*|[А-Я][А-Я]*)");
            MatchCollection mc = rx.Matches(input);
 
            Regex id = new Regex(@"[A-Z][a-z]*|[А-Я][А-Я]*"); // идентификаторы
            Regex skobki = new Regex(@"\(|\)"); // скобки
            string[] operators = { "(", ")", "!", "Con([A-Z][a-z]*)", "Dil([A-Z][a-z]*)", "∩", "∪" }; // операторы по приоритету
 
            Regex opers = new Regex(@"\(|\)|\!|∪|\∩|Con([A-Z][a-z])|Dil([A-Z][a-z])"); // операторы
 
            Stack stOper = new Stack();
            ArrayList expr = new ArrayList();
            foreach (Match m in mc)
            {
                Match m1;
                m1 = id.Match(m.Value);
                if (m1.Success) { expr.Add(m1.Value); continue; }
                m1 = skobki.Match(m.Value);
                if (m1.Success)
                {
                    if (m1.Value == "(") { stOper.Push(m1.Value); continue; }
                    string op = stOper.Pop().ToString();
                    while (op != "(")
                    {
                        expr.Add(op);
                        op = stOper.Pop().ToString();
                    }
                    continue;
                }
                m1 = opers.Match(m.Value);
                if (m1.Success)
                {
                    try
                    {
                        while (Array.IndexOf(operators, m1.Value) > Array.IndexOf(operators, stOper.Peek()))
                        {
                            if (stOper.Peek().ToString() == "(") break;
                            expr.Add(stOper.Pop().ToString());
                        }
                    }
                    catch (System.Exception ex)
                    {
 
                    }
                    stOper.Push(m1.Value);
                }
            }
            while (stOper.Count != 0)
            {
                expr.Add(stOper.Pop().ToString());
            }
 
            foreach (string s in expr)
            {
 
                myoutputString += s + " ";
            }
            return myoutputString.Substring(1, myoutputString.Length - 2);
        }
Добавлено через 30 минут
Если писать операторы только с маленькой буквы а переменные только с большой
То так работает. Но это не вариант
C#
1
2
3
4
5
6
7
8
            Regex rx = new Regex(@"\(|\)|\!|con|dil|∪|\∩|([A-Z][A-Z]*|[А-Я][А-Я]*)");
            MatchCollection mc = rx.Matches(input);
 
            Regex id = new Regex(@"[A-Z][A-Z]*|[А-Я][А-Я]*"); // идентификаторы
            Regex skobki = new Regex(@"\(|\)"); // скобки
            string[] operators = { "(", ")", "!","con", "dil",  "∩", "∪" }; // операторы по приоритету
 
            Regex opers = new Regex(@"\(|\)|\!|con|dil|∪|\∩"); // операторы
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
26.03.2013, 15:20
Ответы с готовыми решениями:

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

Помогите преобразовать выражение в ПОЛИЗ и вывести его
Нужно преобразовать исходное арифметическое выражение записанное в файле в ПОЛИЗ и записать его в...

Какое выражение необходимо подставить, чтобы данное логическое выражение стало истинным?
Если вместо знака &quot;?&quot; подставить одно из выражений, то при х=1 данное логическое выражение станет...

Логическое выражение
Помогите решить пару задачек: а) 74,28 (10) стрелочка вправо &quot;2&quot;; &quot;8&quot;; &quot;16&quot; с.с.; &lt;я вообще не...

2
20 / 17 / 0
Регистрация: 15.08.2012
Сообщений: 122
26.03.2013, 15:22 2
Kill100, использование множеств в программировании - это не самая лучшая задача )))
0
433 / 298 / 82
Регистрация: 11.12.2010
Сообщений: 1,209
26.03.2013, 15:32  [ТС] 3
Цитата Сообщение от darkExpressI2P Посмотреть сообщение
Kill100, использование множеств в программировании - это не самая лучшая задача )))
Ну лучше нечего не придумал. + если нормально написать класс, то они не чем не уступают обычным переменным.
Правда с разбором действий засада оказалась. То ли регулярку не верно пишу то ли еще что...
0
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
26.03.2013, 15:32

Логическое выражение
2е задание на c++ П.5.18.Правил Запрещено размещать задания и решения в виде картинок и других...

Логическое выражение
1) Установить истинность/ложность приводимого ниже логического выражения 2) Запишите их по...

Логическое выражение
Здравствуйте. Можно ли в JS решить логическое выражение, представленное строкой? Например: var...

Логическое выражение
Здравствуйте. Запишите логическое выражение, которое принимает значение &quot;истина&quot; тогда и только...

Логическое выражение
Записать логическое выражение, которое является истинным, когда число N чётное делится на 7, но не...

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


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

Или воспользуйтесь поиском по форуму:
3
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2021, vBulletin Solutions, Inc.