Форум программистов, компьютерный форум, киберфорум
Наши страницы
C# для начинающих
Войти
Регистрация
Восстановить пароль
 
Рейтинг 5.00/4: Рейтинг темы: голосов - 4, средняя оценка - 5.00
karom
1 / 1 / 0
Регистрация: 07.12.2012
Сообщений: 7
#1

Удаление скобок в логическом выражении

23.09.2013, 19:22. Просмотров 667. Ответов 3
Метки нет (Все метки)

Здравствуйте.
Задание: удалить лишние скобки в логическом выражении.
Есть код на Pascal
Pascal
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
uses crt;
var
    n, i, j, sch: longint;
    fl: boolean;
    a, b: string;
    h, g: array[0..5555] of longint;
 
 
procedure del_pair(i: longint);
    begin
        b[i] := '#';
        b[h[i]] := '#';
        a[i] := a[i-1];
        a[h[i]] := a[h[i]+1];
    end;
 
 
 
begin
 
 
readln(a);
 
n := length(a);
 
a := '#' + a + '#';
 
b := a;
 
sch := 0;
 
for i := 2 to n + 1 do
    if a[i] = '(' then
        begin
            inc(sch);
            g[sch] := i;
        end
    else
    if a[i] = ')' then
        begin
            h[g[sch]] := i;
            dec(sch);
        end;
 
 
for i := 2 to n + 1 do
    if a[i] = '(' then
        begin
            if ((a[i+1] = '(') and (h[i+1] = h[i] - 1)) or (i + 2 = h[i]) then
                begin
                    del_pair(i);
                    continue;
                end;
 
            if a[i-1] = '!' then continue;
 
            if ((a[i-1]='v')or(a[i-1]='#')or(a[i-1]='('))and((a[h[i]+1]<>'^')and(a[h[i]+1]<>'!')) then
                begin
                    del_pair(i);
                    continue;
                end;
 
        fl := true;
        sch := 0;
 
        for j := i + 1 to h[i] - 1 do
            if (a[j] = 'v')  and (sch = 0) then
                begin
                    fl := false;
                    break;
                end
            else
            if a[j] = '(' then inc(sch)
            else
            if a[j] = ')' then dec(sch);
        if fl then
            begin
                del_pair(i);
                continue;
            end;
 
        end;
 
 
 
for i := 2 to n + 1 do
    if b[i] <> '#' then write(b[i]);
writeln;
 
readln;
 
end.
Переписал на C#
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
 class Program
    {
 
        
            
 
        static void Main(string[] args)
        {
 
            int n, sch;
            bool fl;
            string a ;
            string b ;
            int[] h = new int[500];
            int[] g = new int[500];
           
            
            
                a = Console.ReadLine();
                n = a.Length;
                a = '#' + a + '#';
                b = String.Copy(a);
                
                sch = 0;
                for (int i = 1; i < n+1 ; i++)
                {
                    if (a[i] == '(')
                    {
                        sch++;
                        g[sch] = i;
                    }
                    else if (a[i] == ')')
                    {
                        h[g[sch]] = i;
                        
                        sch--;
                    }
                }
                for (int i = 1; i < n+1 ; i++)
                {
                    
                    if (a[i] == '(')
                    {
                        if (((a[i + 1] == '(') && (h[i + 1] == h[i] - 1)) || (i + 2 == h[i]))
                        {
 
                            b = b.Replace(b[i], '#');
                            b = b.Replace(b[h[i]], '#');
                            a = a.Replace(a[i], a[i - 1]);
                            a = a.Replace(a[h[i]], a[h[i] + 1]);
                            continue;
 
                        }
 
                        if ((a[i - 1] == '!'))
                        {
                           
                            continue;
                        }     
                       if ((((a[i-1]=='v')||(a[i-1]=='#')||(a[i-1]=='('))&&((a[h[i]+1]!='!')&&(a[h[i]+1]!='^'))))
                        {
 
                            b = b.Replace(b[i], '#');
                            b = b.Replace(b[h[i]], '#');
                            a = a.Replace(a[i], a[i - 1]);
                            a = a.Replace(a[h[i]], a[h[i] + 1]);
                            continue;
                        }
                       
                        fl = true;
                        sch = 0;
                        for (int j = i + 1; j < h[i] ; j++)
                        {
                            if ((a[j] == 'v') && (sch == 0))
                            {
                                
                                fl = false;
                                break;
                            }
                            else if (a[j] == '(') sch = sch + 1;
                            else if (a[j] == ')') sch = sch - 1;
                        }
                        if (fl)
                        {
                            
                            b=b.Replace(b[i], '#');
                            b=b.Replace(b[h[i]], '#');
                            a = a.Replace(a[i], a[i - 1]);
                            a = a.Replace(a[h[i]], a[h[i] + 1]);
                            continue;
                        }
                    }
                    
 
                }
                for (int i = 1; i < n+1 ; i++)
                {
                    if (b[i] != '#') Console.Write(b[i]);
                }
                Console.WriteLine();
                Console.WriteLine(b);
                string[] c = { "#" };
                for (int i = 0; i < c.Length; i++)
                {
                    b = b.Replace(c[i], "");
                }
                Console.WriteLine(b);
            
            
            Console.ReadKey();
        }
    }
но работает некорректно. Подскажите,где ошибка.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
23.09.2013, 19:22
Ответы с готовыми решениями:

Найти ошибку в логическом выражении
Всем привет. Подскажите пожалуйста, на что ругается редактор. public static...

Баланс скобок в математическом выражении
В математическом выражении встречаются скобки трех типов: круглые, квадратные и...

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

Удаление лишних скобок
С#. Пользователь вводит строку символов. состоящую из букв латинского алфавита...

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

3
titans2011
302 / 263 / 109
Регистрация: 27.09.2010
Сообщений: 1,058
23.09.2013, 21:57 #2
Опишите хотя бы, что должна делать программа.
0
karom
1 / 1 / 0
Регистрация: 07.12.2012
Сообщений: 7
23.09.2013, 22:25  [ТС] #3
Цитата Сообщение от titans2011 Посмотреть сообщение
Опишите хотя бы, что должна делать программа.
Программа должна удалять скобки в логическом выражении, которые не влияют на результат. К примеру (NOT(XvY)v(YvZ))==NOT(XvY)vYvZ. То, что написано на паскале делает так, а то, что я переписал удаляет все скобки, пропуская условия.
0
karom
1 / 1 / 0
Регистрация: 07.12.2012
Сообщений: 7
24.09.2013, 16:32  [ТС] #4
Цитата Сообщение от karom Посмотреть сообщение
Программа должна удалять скобки в логическом выражении, которые не влияют на результат. К примеру (NOT(XvY)v(YvZ))==NOT(XvY)vYvZ. То, что написано на паскале делает так, а то, что я переписал удаляет все скобки, пропуская условия.
Скрины на C# и Pascal
0
Миниатюры
Удаление скобок в логическом выражении   Удаление скобок в логическом выражении  
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
24.09.2013, 16:32

Условие в выражении
Существует ли к C# конструкция такого типа int а = (условие),(если условие...

Что означает => в выражении?
int arr = System.IO.File.ReadAllText(&quot;test.txt&quot;).Split(' ').Select(n =&gt;...

Разобраться в регулярном выражении
&quot;(?&lt;=&lt;img+?src=\&quot; )+&quot; вон оно я не могу понять что значит и \&quot; )+ ...


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

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

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