Форум программистов, компьютерный форум, киберфорум
Assembler для начинающих
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.54/13: Рейтинг темы: голосов - 13, средняя оценка - 4.54
0 / 0 / 0
Регистрация: 02.07.2011
Сообщений: 12
1

Проверить, имеется ли в заданном тексте баланс открывающих и закрывающих круглых скобок

16.09.2012, 19:16. Показов 2442. Ответов 11
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Доброе время суток уважаемые программисты.
Есть такая задачка, нужно написать на ассемблере:

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

Заранее спасибо за помощь.
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
16.09.2012, 19:16
Ответы с готовыми решениями:

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

Проверить, имеется ли в заданном тексте баланс открывающих и закрывающих круглых скобок
Помогите пожалуйста,имеется код. Все работает, но при вводе строки к примеру: " (7a-b)*5 " ...

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

Проверить, имеется ли в заданном тексте баланс открывающих и закрывающих круглых скобок
Тема «Разработка и отладка алгоритмов и программ по обработке строк символов» Задание:...

11
1127 / 261 / 9
Регистрация: 11.06.2010
Сообщений: 1,049
16.09.2012, 23:13 2
Код писать не буду, ибо он прост.
Алгоритм для строк ASCIIZ:
1. Читаем первый символ и сравниваем с символом открывающей скобки. Если равно, то идем дальше. Если нет - выходим с ошибкой
2. В цикле перебираем символы, пока не увидим нулевой символ. Если символ равен '(', то прибавляем к счетчику(это такая особая переменная, о заведении которой надо позаботиться) 1, если ')', вычитаем 1.
3. Если находим нулевой символ, то проверяем символ перед ним. Если закрывающая скобка, идем далее. Если нет - выходим с ошибкой
4. Проверяем значение счетчика. Если 0, то всё ОК. Если не 0, говорим, что баланс нарушен.

Вот и всё
1
0 / 0 / 0
Регистрация: 02.07.2011
Сообщений: 12
18.09.2012, 18:33  [ТС] 3
спасибо, но именно проблемы в написании кода.
0
155 / 125 / 3
Регистрация: 22.06.2011
Сообщений: 1,784
18.09.2012, 20:05 4
Не тестировал...
Assembler
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
brackets:
xor ecx,ecx
mov edx,[esp+4]
.next:
mov al,[edx]
inc edx
cmp al,'('
je .open
cmp al,')'
je .close
cmp al,0
je .fin
jmp .next
.open:
inc ecx
jmp .next
.close:
dec ecx
jmp .next
.fin:
cmp ecx,0
je .yes
stc
ret 4
.yes:
clc
ret 4
0
5231 / 3204 / 362
Регистрация: 12.12.2009
Сообщений: 8,116
Записей в блоге: 2
19.09.2012, 18:07 5
HITMAN, а если такую строку ввести: )))((( ?
Такие задачи через стек элементарно решаются.
Либо тут:
Assembler
1
2
.close:
dec ecx
перед декриментом добавить проверку, не ноль ли ecx. Если ноль, то скобки не сбалансированы.
0
155 / 125 / 3
Регистрация: 22.06.2011
Сообщений: 1,784
19.09.2012, 18:29 6
Kastaneda,
Не тестировал...
Assembler
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
;*************************************
;От стэка у 47 изжога да, если есть возможность 
;обойтись без него её обязательно надо использовать
brackets:
xor ecx,ecx
mov edx,[esp+4]
.next:
mov al,[edx]
inc edx
cmp al,'('
je .open
cmp al,')'
je .close
cmp al,0
je .fin
jmp .next
.open:
inc ecx
jmp .next
.close:
dec ecx
js .no;Одно условие и вопрос решён.
jmp .next
.fin:
cmp ecx,0
je .yes
no:
stc
ret 
.yes:
clc
ret


Добавлено через 3 минуты
Цитата Сообщение от Kastaneda Посмотреть сообщение
перед декриментом добавить проверку, не ноль ли ecx. Если ноль, то скобки не сбалансированы.
Асм - куча способов решить поставленную задачу!
0
5231 / 3204 / 362
Регистрация: 12.12.2009
Сообщений: 8,116
Записей в блоге: 2
19.09.2012, 18:52 7
Цитата Сообщение от HITMAN Посмотреть сообщение
;От стэка у 47 изжога да, если есть возможность
;обойтись без него её обязательно надо использовать
Да, не совсем верно выразился, имелось ввиду стек - структура данных LIFO. Удобно использовать, когда скобки не ограничиваются круглыми, а например используется полный набор (){}<>[].

Не по теме:

Цитата Сообщение от HITMAN Посмотреть сообщение
у 47
я так и не догнал этого прикола, хотя в соседней теме мне пытались объяснить=-O

0
155 / 125 / 3
Регистрация: 22.06.2011
Сообщений: 1,784
19.09.2012, 19:09 8

Не по теме:

Цитата Сообщение от Kastaneda Посмотреть сообщение
я так и не догнал этого прикола, хотя в соседней теме мне пытались объяснить
Прочти здесь!


Цитата Сообщение от Kastaneda Посмотреть сообщение
(){}<>[]
Не тестировал...
Assembler
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
;***************************
;Один минус каждый тип скобок не может превысить 127,
;но этого и так много ...
brackets:
push ebx
xor ecx,ecx
xor edx,edx
mov ebx,[esp+8]
.next:
mov al,[ebx]
inc ebx
cmp al,'('
je .open
cmp al,')'
je .close
cmp al,'{'
je .open1
cmp al,'}'
je .close1
cmp al,'<'
je .open2
cmp al,'>'
je .close2
cmp al,'<'
je .open3
cmp al,'>'
je .close3
cmp al,0
je .fin
jmp .next
.open:
inc cl
js .no
jmp .next
.close:
dec cl
js .no
jmp .next
.open1:
inc ch
js .no
jmp .next
.close1:
dec ch
js .no
jmp .next
.open2:
inc dl
js .no
jmp .next
.close2:
dec dl
js .no
jmp .next
.open3:
inc dh
js .no
jmp .next
.close3:
dec dh
js .no
jmp .next
.fin:
cmp cx,0
jne .no
cmp dx,0
je .yes
no:
stc
pop ebx
ret 
.yes:
clc
pop ebx
ret
0
5231 / 3204 / 362
Регистрация: 12.12.2009
Сообщений: 8,116
Записей в блоге: 2
19.09.2012, 19:15 9
Очепятка в коде, вместо скобок [] дважды скобки <> используются.

Не по теме:

Цитата Сообщение от HITMAN Посмотреть сообщение


Не по теме:

там (в соседней ветке) еще фигурировала ссылка на статью 47 УПК, я вот связи не понял.

0
155 / 125 / 3
Регистрация: 22.06.2011
Сообщений: 1,784
19.09.2012, 19:22 10
Цитата Сообщение от Kastaneda Посмотреть сообщение
Очепятка в коде, вместо скобок [] дважды скобки <> используются.
Кому понадобиться тот догадается исправить!

Не по теме:

Цитата Сообщение от Kastaneda Посмотреть сообщение
там (в соседней ветке) еще фигурировала ссылка на статью 47 УПК, я вот связи не понял.
Связь есть 47 убивает, то есть нарушает закон соответственно может быть обвиняемым по 47 статье если будет пойман8-)

0
5231 / 3204 / 362
Регистрация: 12.12.2009
Сообщений: 8,116
Записей в блоге: 2
19.09.2012, 19:41 11
Цитата Сообщение от HITMAN Посмотреть сообщение
Не тестировал...
Assembler
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
;***************************
;Один минус каждый тип скобок не может превысить 127,
;но этого и так много ...
brackets:
push ebx
xor ecx,ecx
xor edx,edx
mov ebx,[esp+8]
.next:
mov al,[ebx]
inc ebx
cmp al,'('
je .open
cmp al,')'
je .close
cmp al,'{'
je .open1
cmp al,'}'
je .close1
cmp al,'<'
je .open2
cmp al,'>'
je .close2
cmp al,'<'
je .open3
cmp al,'>'
je .close3
cmp al,0
je .fin
jmp .next
.open:
inc cl
js .no
jmp .next
.close:
dec cl
js .no
jmp .next
.open1:
inc ch
js .no
jmp .next
.close1:
dec ch
js .no
jmp .next
.open2:
inc dl
js .no
jmp .next
.close2:
dec dl
js .no
jmp .next
.open3:
inc dh
js .no
jmp .next
.close3:
dec dh
js .no
jmp .next
.fin:
cmp cx,0
jne .no
cmp dx,0
je .yes
no:
stc
pop ebx
ret 
.yes:
clc
pop ebx
ret
Кривость такого подхода в том, что он вернет положительный результат на такую строку:
({)}
0
155 / 125 / 3
Регистрация: 22.06.2011
Сообщений: 1,784
19.09.2012, 21:44 12
Цитата Сообщение от Kastaneda Посмотреть сообщение
({)}
Не тестировал...
Assembler
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
;*********************************
.data
bfr db 128 dup ?  
.code
brackets:
push esi
xor ecx,ecx
mov edx,bfr
mov esi,[esp+8]
.next:
lodsb
cmp al,'('
je .open
cmp al,')'
je .close
cmp al,'{'
je .open1
cmp al,'}'
je .close1
cmp al,'<'
je .open2
cmp al,'>'
je .close2
cmp al,'['
je .open3
cmp al,']'
je .close3
cmp al,0
je .fin
jmp .next
.open:
mov byte[edx+ecx],')'
inc ecx
jmp .next
.close:
dec ecx
cmp byte[edx+ecx],al
jne .no
jmp .next
.open1:
mov byte[edx+ecx],'}'
inc ecx
jmp .next
.close1:
dec ecx
cmp byte[edx+ecx],al
jne .no
jmp .next
.open2:
mov byte[edx+ecx],'>'
inc ecx
jmp .next
.close2:
dec ecx
cmp byte[edx+ecx],al
jne .no
jmp .next
.open3:
mov byte[edx+ecx],']'
inc ecx
jmp .next
.close3:
dec ecx
cmp byte[edx+ecx],al
jne .no
jmp .next
.fin:
cmp ecx,0
je .yes
no:
pop esi
stc
ret 
.yes:
pop esi
clc
ret


Добавлено через 17 минут
Kastaneda,
Не тестировал, но уменьшил...
Assembler
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
bfr db 128 dup ?
brackets:
push esi
xor ecx,ecx
mov edx,bfr
mov esi,[esp+8]
.next:
lodsb
cmp al,'('
je ._open
cmp al,')'
je .close
cmp al,'{'
je .open
cmp al,'}'
je .close
cmp al,'<'
je .open
cmp al,'>'
je .close
cmp al,'['
je .open
cmp al,']'
je .close
cmp al,0
je .fin
jmp .next
._open:
inc al
mov byte[edx+ecx],al
inc ecx
jmp .next
.open:
inc al
inc al
mov byte[edx+ecx],al
inc ecx
jmp .next
.close:
dec ecx
cmp byte[edx+ecx],al
jne .no
jmp .next
.fin:
cmp ecx,0
je .yes
no:
pop esi
stc
ret 
.yes:
pop esi
clc
ret


Добавлено через 1 час 1 минуту
Протестировал работает норм...
Assembler
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
;*********************************
.data
bfr db 128 dup ?  
.code
brackets:
push esi
xor ecx,ecx
mov edx,bfr
mov esi,[esp+8]
.next:
lodsb
cmp al,'('
je ._open
cmp al,')'
je .close
cmp al,'{'
je .open
cmp al,'}'
je .close
cmp al,'<'
je .open
cmp al,'>'
je .close
cmp al,'['
je .open
cmp al,']'
je .close
cmp al,0
je .fin
jmp .next
.open:
inc al
._open:
inc al
mov byte[edx+ecx],al
inc ecx
jmp .next
.close:
dec ecx
cmp byte[edx+ecx],al
jne .no
jmp .next
.fin:
or cl,cl
jz .yes
.no:
mov eax,1
pop esi
stc
ret 4
.yes:
xor eax,eax
pop esi
clc
ret 4
0
19.09.2012, 21:44
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
19.09.2012, 21:44
Помогаю со студенческими работами здесь

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

Проверить, имеется ли в заданном тексте баланс открывающих и закрывающих скобок
Проверить, имеется ли в заданном тексте баланс открывающих и закрывающих скобок, имея в виду, что с...

Проверить, имеется ли в заданном тексте баланс открывающих и закрывающих скобок
Проверить, имеется ли в заданном тексте баланс открывающих и закрывающих скобок.

Имеется ли в тексте баланс открывающих и закрывающих скобок
Пожалуйста, напишите программу на Turbo Pascal с таким условием: проверить, имеется ли в заданном...


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

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