Форум программистов, компьютерный форум, киберфорум
Assembler для начинающих
Войти
Регистрация
Восстановить пароль
 
Рейтинг 4.80/5: Рейтинг темы: голосов - 5, средняя оценка - 4.80
Spee
1 / 1 / 0
Регистрация: 18.10.2015
Сообщений: 7
1

Если в строке встречаются подряд 3 гласные буквы, вставить после них пробел (tasm)

21.01.2016, 21:45. Просмотров 1006. Ответов 9
Метки нет (Все метки)

Дана произвольная строка, если встречаются подряд 3 гласные буквы, вставить после них пробел
0
Лучшие ответы (1)
QA
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
21.01.2016, 21:45
Ответы с готовыми решениями:

В строке, введенной с экрана, после каждой согласной буквы вставить пробел
В строке, введенной с экрана, после каждой согласной буквы вставить пробел помогите пожалуйста!

Вставить пробел в строку после каждого символа «.» «,» «!» или «?», если за этими символами не следует пробел
Вставить пробел после каждого символа «.» «,» «!» или «?», если за этими символами не следует...

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

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

9
R71MT
4625 / 1723 / 331
Регистрация: 29.07.2014
Сообщений: 2,705
Записей в блоге: 5
22.01.2016, 00:25 2
Сам пытался колдовать? Или "сделайте за меня?"
2
Spee
1 / 1 / 0
Регистрация: 18.10.2015
Сообщений: 7
22.01.2016, 15:12  [ТС] 3
R71MT, Вот, только тут заменяет символ идущий после 2 гласных на пробел, а как вставить после них пробел?
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
.model small
.data
strBig db 254
len db ?
str_ db 255 dup (?)
vowels db 'aeiouyAEIOUY'
len1 = $ - vowels
 
.code      
start:
mov ax,@data
mov ds,ax
mov es,ax
 
mov ah,10
mov dx,offset strBig
int 21h
 
xor cx,cx
mov cl,len
mov bx,2                           ; флаг наличия гласных букв во введённой строке
mov si,offset strBig+2
 
@1:
lodsb                                 ; очередной символ строки записываем в регистр al
mov dx,cx                          ; длину строки сохраняем в свободном регистре
mov cx,len1
mov di,offset vowels             ; адрес строки с гласными буквами 
repnz scasb                       ; сканируем эту строку пока не встретим в ней значение равное al
mov cx,dx                          ; восстанавливаем текущее значение длины введённой строки  
jnz @2                              ; если символ в al был найден в строке с гласными
 
dec bx                               ; уменьшаем на единицу значение флага
je @3                               ; если оно стало равно нулю - выходим из цикла, две гласные подряд найдены
jmp @4                              ; и продолжаем цикл
 
@2:
mov bx,2                          ; иначе восстанавливаем значение флага
@4:
loop @1                             ; продолжение цикла
 
jmp exit                             ; если просмотрена вся строка - двух гласных подряд не нашлось, выход
 
@3:
 
mov di,si  
mov byte ptr [di],' '
rep movsb                        ; и копируем оставшиеся символы строки, затирая две гласные
mov al,24h
stosb                                ; записываем символ завершения строки '$'
 
mov al,10                          ; переводим курсор на новую строку
int 29h
 
mov dx,offset str_              ; выводим на экран результат
mov ah,9
int 21h
 
exit:
 
xor ax,ax
int 16h
 
mov ax,4c00h
int 21h
end start
0
R71MT
4625 / 1723 / 331
Регистрация: 29.07.2014
Сообщений: 2,705
Записей в блоге: 5
22.01.2016, 22:47 4
Лучший ответ Сообщение было отмечено tezaurismosis как решение

Решение

Зачем отводить для этого буфер? Обрабатывай строку на-лету...
Читаешь/сохраняешь первый символ, а потом сравниваешь его с последующими.
Если есть совпадения, проверяешь на гласную и задействуешь счётчик.
В коде ниже, можно изменять кол-во подряд/идущих символов в ту-или-иную сторону, изменив потолок в регистре 'BX' (cmp bx,2).

Вот тебе приблезительная стратегия.
Код - оптимизацией не блещет, зато размер исходника 120 байт (на фасме), и неограниченая строка без буфера:

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
ORG 100h
JMP start
 
mess0   DB  13,10,'ENTER STRING: $'
mess1   DB  13,10,'Press any key...$'
table   DB  'AEIOUYaeiouy'
 
start:
   MOV   AH,9             ; запрос на ввод строки
   MOV   DX,mess0         ;
   INT   21h              ;
   XOR   BX,BX            ; счётчик гласных тройняшек
   MOV   AH,1             ; ввод с эхо..
   INT   21h              ;
 
@@1:                      ;
   MOV   DH,AL            ; DH = предыдущий символ
   MOV   AH,1             ; ввод с эхо..
   INT   21h              ;
   CMP   AL,13            ; это Enter?
   JE    exit             ;
   CMP   DH,AL            ; это предыдущий символ?
   JNE   @@1              ;
 
   MOV   DI,table         ; 2 символа совпали!
   MOV   CX,12            ; проверим их на гласную
   REPNE SCASB            ;
   OR    CX,CX            ; если пара согласная,
   JZ    @@1              ; то мотаем цикл..
 
   INC   BX               ; счётчик найденых +1
   CMP   BX,2             ; 3 символа совпали? (можно изменить предел в +/-)
   JZ    space            ; да - вставить пробел
   JMP   @@1              ; иначе: ждём следующий символ
 
space:                    ;
   MOV   AL,' '           ; вставим 'Space'
   INT   29h              ; могут быть ещё 3 гласных в строке
   XOR   BX,BX            ; 'Reset' счётчика
   JMP   @@1              ; следующий символ...
 
exit:                     ;
   MOV   DX,mess1         ; мессага "Press key"
   MOV   AH,9             ; 
   INT   21h              ; 
   XOR   AX,AX            ; 
   INT   16h              ; 
   INT   20h              ;  Gagarin...
1
Spee
1 / 1 / 0
Регистрация: 18.10.2015
Сообщений: 7
22.01.2016, 23:18  [ТС] 5
R71MT, спасибо, принцип понял. Попробывал переделать для тасм, компилируется без ошибок, но результат не выводит, не могли бы подсказать что не так?
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
.model small
.data
mess0   DB  13,10,'ENTER STRING: $'
mess1   DB  13,10,'Press any key...$'
table   DB  'AEIOUYaeiouy'
 
.code      
start:
mov ax,@data
mov ds,ax
mov es,ax
 
MOV   AH,9             ; запрос на ввод строки
   MOV   DX, offset mess0         ;
   INT   21h              ;
   XOR   BX,BX            ; счётчик гласных тройняшек
   MOV   AH,1             ; ввод с эхо..
   INT   21h              ;
 
@@1:                      ;
   MOV   DH,AL            ; DH = предыдущий символ
   MOV   AH,1             ; ввод с эхо..
   INT   21h              ;
   CMP   AL,13            ; это Enter?
   JE    exit             ;
   CMP   DH,AL            ; это предыдущий символ?
   JNE   @@1              ;
 
   MOV   DI, offset table         ; 2 символа совпали!
   MOV   CX,12            ; проверим их на гласную
   REPNE SCASB            ;
   OR    CX,CX            ; если пара согласная,
   JZ    @@1              ; то мотаем цикл..
 
   MOV   DH,AL            ; запоминаем текущий символ
   INC   BX               ; счётчик найденых +1
   CMP   BX,2             ; 3 символа совпали? (можно изменить предел в +/-)
   JZ    space            ; да - вставить пробел
   JMP   @@1              ; иначе: ждём следующий символ
 
space:                    ;
   MOV   AL,' '           ; вставим 'Space'
   INT   29h              ; могут быть ещё 3 гласных в строке
   XOR   BX,BX            ; 'Reset' счётчика
   JMP   @@1              ; следующий символ...
 
mov dx,offset mess0              ; выводим на экран результат
mov ah,9
int 21h
 
exit:                     ;
   MOV   DX,offset mess1         ; мессага "Press key"
   MOV   AH,9             ; 
   INT   21h              ; 
   XOR   AX,AX            ; 
   INT   16h              ; 
   INT   20h              ;  Gagarin...
 
 
mov ax,4c00h
int 21h
end start
Если в строке встречаются подряд 3 гласные буквы, вставить после них пробел (tasm)
0
R71MT
4625 / 1723 / 331
Регистрация: 29.07.2014
Сообщений: 2,705
Записей в блоге: 5
22.01.2016, 23:33 6
..убери в строке(47) вывод сообщения, и в строке(57) INT-20H.
Остальное вроде всё нормально. Как я уже говорил, никакого результата не будет, т.к. ввод обрабатывается на-лету, и при вводе 3-гласных букв, автоматом будет подставляться пробел. Enter - конец ввода и всё..

Не по теме:

А для спасибо есть буттон...



Добавлено через 7 минут
..э-э-э, я не внимательно прочитал задание! Я организовал фильтр 3-х/одинаковых/гласных, а тебе нужно любых гласных.
1
Spee
1 / 1 / 0
Регистрация: 18.10.2015
Сообщений: 7
22.01.2016, 23:35  [ТС] 7
R71MT, оказывается, ставится пробел только если гласные одинаковые
Если в строке встречаются подряд 3 гласные буквы, вставить после них пробел (tasm)

Не по теме:

спасибо поставил

1
R71MT
4625 / 1723 / 331
Регистрация: 29.07.2014
Сообщений: 2,705
Записей в блоге: 5
22.01.2016, 23:49 8
Spee , ..убери в своём коде строки: 17,18,21,26,27,
1
Spee
1 / 1 / 0
Регистрация: 18.10.2015
Сообщений: 7
22.01.2016, 23:56  [ТС] 9
R71MT, спасибо, добрый человек!
0
R71MT
4625 / 1723 / 331
Регистрация: 29.07.2014
Сообщений: 2,705
Записей в блоге: 5
23.01.2016, 00:12 10
Всегда пожалуйста!..
И возьми за правило, создавать темы со-своими наработками. Тогда вопрос не останется без ответа. Удачи..
1
23.01.2016, 00:12
Answers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
23.01.2016, 00:12

Заказываю контрольные, курсовые, дипломные и любые другие студенческие работы здесь.

В символьной строке удалить все слова, содержащие две подряд идущие гласные буквы
Здравствуйте, помогите пожалуйста напрсать программу, сам вообще ноль :( Условие: В символьной...

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

Если в строке символов подряд встречаются буква и цифра, то удалить цифру
Ввести произвольной строку символов. если подряд встречаются буква i цифра, то изъять цифру;...

Если в строке символов подряд встречаются буква и цифра, то удалить цифру
Ввести произвольной строку символов. если подряд встречаются буква i цифра, то изъять цифру; ...


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

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

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