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

Изменить порядок букв в строке

20.10.2013, 13:43. Показов 3444. Ответов 16
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Здравствуйте . Есть такая задача: дана строка с восьми слов , в словах с парным номером нужно изменить порядок букв на противоположный .
Вот я пытался что-то сделать , но у меня просто меняет порядок букв во всех словах строки :
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
.686             ; директива визначення типу мікропроцесора
.model flat,stdcall  ; завдання лінійної моделі пам’яті
                     ; та угоди ОС Windows
option casemap:none  ; відмінність малих та великих літер
include \masm32\include\windows.inc
include \masm32\include\kernel32.inc
include \masm32\include\fpu.inc
include \masm32\include\user32.inc        ; для MessageBox
includelib \masm32\lib\user32.lib
includelib \masm32\lib\kernel32.lib
BSIZE equ 30 
.data
mas1 db 'abc wer tyd oop yhf tdd kjs llj'
mas2 db 31 dup(0)
cWritten DWORD ?
stdout DWORD ?
.code
_Start:
cld   ;напрям- вгору
lea edi,mas1 ;адреса 1-го масиву
mov esi,0
mov edx,0
mov al,' '   ;знак пропуска
mov ecx,21
push ecx
jmp m2
m4:mov ecx,8   ;счётчик слов
m1:
mov ah,[ebx]         ;заносим в ah последний символ массива
mov mas2[edx],ah     ;сохраняем этот символ
inc edx              ;увеличиваем индекс
dec ebx              ;переходим на следующий элемент
cmp [ebx],esi
dec ecx
jnz m1
m2:
pop ecx
repne scasb         ;ищем пропуск в массиве
mov ebx,edi         ;сохраняем в ebx место, где был найден пропуск
dec ebx             ;ebx-1
push ecx
dec ecx
jnz m4
 
invoke GetStdHandle,STD_OUTPUT_HANDLE
mov stdout,eax
invoke WriteConsoleA,stdout,ADDR mas2,sizeof mas2+1,ADDR cWritten,0
 
push 1800h
call Sleep                  ; API-функция задержки изображения
 
invoke ExitProcess,0
end _Start
Так всё работает , выводит правильно.
Но я ума не приложу , как поменять порядок букв именно в словах с парным номером (

Помогите , пожалуйста , с этой задачей .Заранее спасибо Вам !
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
20.10.2013, 13:43
Ответы с готовыми решениями:

В строке в словах с четным номером изменить порядок букв на обратный
Доброго времени суток, у меня не работает программа в эмуляторе 8086. В чем может быть ошибка? ...

В строке символов изменить на обратный порядок следования цепочек , составленных из малых русских букв
Как реализовать? В указанной строке символов изменить на обратный порядок следования цепочек ,...

Изменить порядок букв на обратный
В этой программе максимальное слово в строке переворачивается, а мне нужно чтоб всё слова в строке...

Изменить порядок букв в слове на обратный
Образовать по заданному слову, это же слово только в обратном порядке букв. например : привет-тевирп

16
Ушел с форума
Автор FAQ
16279 / 7604 / 1065
Регистрация: 11.11.2010
Сообщений: 13,617
20.10.2013, 13:57 2
_War_,
по-русски это называется "четные слова", парные слова это "черный - белый", "мама - папа", "Тимошенко - Янукович"

по-тренеруйся пока на двух словах, в строке mas1 - два исходных слова, а в строку mas2 выводишь первое слово нормально, а второе в обратном порядке
0
0 / 0 / 1
Регистрация: 20.10.2013
Сообщений: 22
20.10.2013, 13:58  [ТС] 3
Да это я понимаю , что чётные , то есть 2,4,6,8 -е слова
Как просто изменять порядок тоже понял .
Но вот как сделать так , чтобы именно в чётных словах - вообще без понятия (
Помогите , пожалуйста
0
Ушел с форума
Автор FAQ
16279 / 7604 / 1065
Регистрация: 11.11.2010
Сообщений: 13,617
20.10.2013, 14:05 4
  • сперва ты должен получить список, в котором будет указан адрес начала слова и его длина
  • потом, используя этот список, ты начинаешь слова переворачивать

Добавлено через 3 минуты
mas1 db 'abc wer tyd oop yhf tdd kjs llj'
index dw 0,3,4,3,8,3,12,3,16,3,20,3,24,3,28,3
0
0 / 0 / 1
Регистрация: 20.10.2013
Сообщений: 22
20.10.2013, 14:07  [ТС] 5
Цитата Сообщение от Mikl___ Посмотреть сообщение
  • сперва ты должен получить список, в котором будет указан адрес начала слова и его длина
  • потом, используя этот список, ты начинаешь слова переворачивать
что за список такой?
адресс начала это вот это ? lea edi,mas1 ;адреса 1-го масиву

Добавлено через 41 секунду
что ещё за index?
0
Ушел с форума
Автор FAQ
16279 / 7604 / 1065
Регистрация: 11.11.2010
Сообщений: 13,617
20.10.2013, 14:13 6
Цитата Сообщение от _War_ Посмотреть сообщение
что ещё за index?
  • сперва ты должен получить список, в котором будет указан адрес начала слова и его длина
  • потом, используя этот список, ты начинаешь слова переворачивать
index - это как раз такой список, начало первого слова адрес mes1+0, длина первого слова=3, начало второго слова mes1+4, и т.д.
0
0 / 0 / 1
Регистрация: 20.10.2013
Сообщений: 22
20.10.2013, 14:21  [ТС] 7
Цитата Сообщение от Mikl___ Посмотреть сообщение
  • сперва ты должен получить список, в котором будет указан адрес начала слова и его длина
  • потом, используя этот список, ты начинаешь слова переворачивать
index - это как раз такой список, начало первого слова адрес mes1+0, длина первого слова=3, начало второго слова mes1+4, и т.д.
индекс-это начало слово , понятно
длина получается - это количество букв
только я вообще не пойму , как это всё записывать

mas1+0-это начало abc
mas1+4- wer
mas1+8-tyd
mas1+12-oop
mas1+16 -yhf
mas1+20 -tdd
mas1+24 -kjs
mas1+28-llj

получается , нужно переворачивать только 4,12,20,28 - но не понимаю , как это сделать (

Добавлено через 34 секунды
как записать этот список ?
0
Ушел с форума
Автор FAQ
16279 / 7604 / 1065
Регистрация: 11.11.2010
Сообщений: 13,617
20.10.2013, 14:27 8
ты же умеешь переворачивать всю строку? теперь нужно вывернуть только часть строки - поменять местами с 4-ого по 6-ой символ - начни с малого
считай, что список уже есть
0
0 / 0 / 1
Регистрация: 20.10.2013
Сообщений: 22
20.10.2013, 14:29  [ТС] 9
всё равно не пойму никак
почему с 4-го по 6-ой символ?
0
Ушел с форума
Автор FAQ
16279 / 7604 / 1065
Регистрация: 11.11.2010
Сообщений: 13,617
20.10.2013, 14:36 10
Цитата Сообщение от _War_ Посмотреть сообщение
почему с 4-го по 6-ой символ?
 0123456
mas1 db abc wer
0
0 / 0 / 1
Регистрация: 20.10.2013
Сообщений: 22
20.10.2013, 14:51  [ТС] 11
а, понял , почему с 4-го по 6-ой

нужно тогда вот так писать ?
Assembler
1
lea edi,mas1+4  ;адреса 1-го слова
Добавлено через 2 минуты
не понимаю , как работать с отдельными словами(
0
Ушел с форума
Автор FAQ
16279 / 7604 / 1065
Регистрация: 11.11.2010
Сообщений: 13,617
20.10.2013, 15:19 12
Цитата Сообщение от _War_ Посмотреть сообщение
не понимаю , как работать с отдельными словами(
Вступайте в Таможенный Союз - тогда объясним, или пусть в Евросоюзе объясняют
0
0 / 0 / 1
Регистрация: 20.10.2013
Сообщений: 22
20.10.2013, 15:24  [ТС] 13
смешно-смешно)
нужно вступать

не поможете на это примере разобраться ? чувствую , сам я далеко не уйду
0
Ушел с форума
Автор FAQ
16279 / 7604 / 1065
Регистрация: 11.11.2010
Сообщений: 13,617
20.10.2013, 15:28 14
_War_,
определитесь с Евро-выбором, тогда и поговорим
0
0 / 0 / 1
Регистрация: 20.10.2013
Сообщений: 22
20.10.2013, 15:33  [ТС] 15
окей , да здравствует Таможний союз
0
593 / 390 / 70
Регистрация: 29.03.2013
Сообщений: 813
20.10.2013, 21:30 16
_War_, вариант с использованием одного массива:
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
.686             ; директива визначення типу мікропроцесора
.model flat,stdcall  ; завдання лінійної моделі пам’яті
                     ; та угоди ОС Windows
option casemap:none  ; відмінність малих та великих літер
include \masm32\include\windows.inc
include \masm32\include\kernel32.inc
;include \masm32\include\fpu.inc
include \masm32\include\user32.inc        ; для MessageBox
includelib \masm32\lib\user32.lib
includelib \masm32\lib\kernel32.lib
BSIZE equ 30 
.data
mas1        db  'abc wer tyd oop yhf tdd kjs llj'
        db  0dh, 0ah
;mas2       db  31 dup(0)
cWritten    dd  ?
stdout      dd  ?
.code
_Start:
    invoke  GetStdHandle, STD_OUTPUT_HANDLE
    mov stdout, eax
    invoke  WriteConsoleA, stdout, ADDR mas1, sizeof mas1+2, ADDR cWritten, 0
 
    cld             ; напрям- вгору
    mov ecx, sizeof mas1    ;* длина строки с массивом
    mov dl, 01010101b       ;* чёт/нечет
    mov bl, ' '         ;* пробел - разделитель элементов массива
    mov edi, offset mas1    ; адреса 1-го масиву
@@scan:
    test    ecx, ecx
    mov al, bl          ; поместить пробел в al
    jz  @@end_scan      ; выйти, если достигнут конец строки (массива)
    mov esi, edi        ; сохранить в esi указатель на начало текущего слова
    repne   scasb           ; найти следующий пробел (или конец массива)
    je  @F          ; если пробел найден - перепрыгнуть
    inc edi         ; подправить edi для правильного вычисления длины слова (если достигнут конец строки)
@@:
    ror dl, 1           ; повернуть "барабан" в dl, соcтоящий из единичных и нулевых бит на одну позицию
    jc  @@scan          ; если перенесён единичный бит, то слово нечетное - продолжить сканирование
    push    ecx
    push    edi
    mov ecx, edi
    sub ecx, esi        ; ecx=количеству букв в слове плюс пробел
    dec edi         ; [edi]=пробел (или символ за концом строки)
    dec ecx         ; ecx=количеству букв в слове
    dec edi         ; [edi]=последний символ слова
    shr ecx, 1          ; ecx=количеству необходимых обменов букв
    jz  @@pop
@@:
    mov al, [esi]
    xchg    al, [edi]
    mov [esi], al
    dec edi
    inc esi
    dec ecx
    jnz @B
@@pop:
    pop edi
    pop ecx
    jmp @@scan
@@end_scan:
 
    invoke  WriteConsoleA, stdout, ADDR mas1, sizeof mas1+2, ADDR cWritten, 0
 
    push    1800h
    call    Sleep                  ; API-функция задержки изображения
 
    invoke  ExitProcess, 0
    end _Start
1
0 / 0 / 1
Регистрация: 20.10.2013
Сообщений: 22
20.10.2013, 22:03  [ТС] 17
Спасибо тебе огромнейшее за помощь ! Ещё и с комментариями ) Буду разбираться . Хочется всё-таки понять , как ЭТО работает.
0
20.10.2013, 22:03
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
20.10.2013, 22:03
Помогаю со студенческими работами здесь

Изменить порядок букв в слове на обратный
надо в 3 строке найти 4 слово и поменять в нем порядок букв на обратный. я давно уже не...

Изменить порядок следования букв на обратный
Разработать программу для обработки текстовой информации . Консольный интерфейс программы должен...

Изменить в тексте порядок следования букв|слов|предложений
#Изменить в тексте порядок следования: #- букв в словах; #- слов в предложениях; #- предложений...

Изменить порядок букв в каждом слове файла на противоположный
Помогите, пожалуйста, написать программку на лиспе для решения след задания: "В данном текстовом...


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

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