Консультация № 189157
11.04.2016, 13:28
0.00 руб.
0 10 1
Здравствуйте, уважаемые эксперты! Прошу вас ответить на следующий вопрос: Мне надо бы сделать "СОРТИРОВКУ СЛОВ ПО ТРЕТЕЙ БУКВЕ". Помогите пожалуйста. очень надоо.

Обсуждение

давно
Посетитель
7438
7205
12.04.2016, 16:38
общий
Адресаты:
Слова-то где берем?
Как задаем?
Какую сортировку применяем?
Об авторе:
"Если вы заметили, что вы на стороне большинства, —
это верный признак того, что пора меняться." Марк Твен
давно
Посетитель
400184
10
13.04.2016, 10:26
общий
Адресаты:
Слова можно взять любые.
Задание в полном звучит вот так.
Реализовать программу работы со строками. Исходная строка вводиться с клавиатуры, результат выводиться на экран. Слова в строке могут быть разделены пробелом и знаками препинания. Отсортировать слова строки по третьей букве.
Вот так вот. Помогите пожалуйста. Я не понимаю как сделать.
давно
Посетитель
7438
7205
13.04.2016, 11:09
общий
Адресаты:
По свободе сделаю. День-два терпит?
Об авторе:
"Если вы заметили, что вы на стороне большинства, —
это верный признак того, что пора меняться." Марк Твен
давно
Посетитель
400184
10
13.04.2016, 11:39
общий
Адресаты:
Мне бы на завтра
давно
Посетитель
7438
7205
13.04.2016, 16:14
общий
это ответ
Здравствуйте, yasha190!
Вот Вам программа. Читайте комментарии, там все описано, как работает
[code lang=asm h=200]
.model small
.code ;сегмент кода
.startup ;инициализация сегментов для выбранной модели памяти

call GetString ;вводим строку
call ParseString ;разбираем строку на слова
call SortWords ;сортируем слова
call OutSortWords ;выводим слова

mov ah, 0 ;ждем нажатие на клавишу
int 16h
.exit 0

GetString proc ;вводим строку
lea dx, sEnterString
mov ah, 9 ;выведем строку приглашения
int 21h

lea dx, max ;вводим строку
mov ah, 0ah
int 21h
ret
GetString endp

isLetter proc ;проверка на букву
cmp al, 'A' ;буквы - только английские
jb not_letter
cmp al, 'Z'
jbe yes_letter
cmp al, 'a'
jb not_letter
cmp al, 'z'
jbe yes_letter
not_letter:
stc ;не буква
ret
yes_letter:
clc ;буква
ret
isLetter endp

ParseString proc ;разбор строки на слова
xor cx, cx ;счетчик слов
lea si, String ;адрес введенной строки
lea bx, array ;адрес массива, где будем сохранять
; начало каждого слова и длину слова
xor di, di ;счетчик букв в слове
Parse_loop: ;цикл разбора
lodsb ;очередной символ
cmp al, 0dh ;символ конца строки (после ф-и 0ah)
je Parse_last ;на анализ последнего слова
call isLetter ;проверяем на букву
jc Parse_word_found;разделитель?
test di, di ;первая буква?
jnz Parse_next_letter ;нет - на счет букв
lea dx, [si-1] ;для первой запоминаем начало слова
Parse_next_letter:
inc di ;считаем буквы
jmp Parse_loop ;на повтор
Parse_word_found: ;разделитель
test di, di
je Parse_loop ;букв не было - игнорируем разделители
mov [bx], dx ;есть слово - сохраняем начало слова
mov [bx+2], di ; и длину
add bx, 4 ;на следующий элемент массива
xor di, di ;обнуляем счетчик букв
inc cx ;считаем слова
jmp Parse_loop ;на повтор
Parse_last: ;конец строки
test di, di ;было ли последнее слово
je Parse_ret
mov [bx], dx ;сохраняем начало
mov [bx+2], di ;длину
inc cx ;считаем
Parse_ret:
mov count, cx ;сохраним счетчик
ret
ParseString endp

;сравнение слов
;аргументы: si - индекс первого элемента массива
; di - второго
;слова длиной меньшей 3 считаем минимальными, считаем символ нулем
CompWords proc
mov bx, si ;первый
cmp word ptr array[bx+2], 3 ;длина меньше 3?
jge long_word_1 ;>= - считываем третий символ
mov al, 0 ;иначе = 0
jmp from_word_2 ;символ второго слова
long_word_1:
mov bx, array[bx] ;адрес начала слова
mov al, [bx+2] ;третий символ
from_word_2:
mov bx, di ;второй
cmp word ptr array[bx+2], 3
jge long_word_2
mov ah, 0
jmp cmp_letters
long_word_2:
mov bx, array[bx]
mov ah, [bx+2]
cmp_letters: ;сравнение символов
cmp al, ah
jl set_less
jz set_equal
set_great:
mov ax, 1 ;признак >
ret
set_less:
mov ax, -1 ;признак <
ret
set_equal: ;признак =
xor ax, ax
ret
CompWords endp

SortWords proc ;сортировка "пузырьком"
mov cx, count ;считаем, только если слов > 2
cmp cx, 2
jb SortWords_ret
;зададим правую границу цикла 2
shl cx, 1
shl cx, 1
mov dx, cx
sub dx, 4 ;правая граница цикла 1

xor si, si ;индекс цикла 1
SortWords_loop1: ;цикл 1
lea di, [si+4] ;индекс цикла 2, di = si+1
; (+4, т.к элемент массива имеет размер 4 байта)
SortWords_loop2: ;цикл 2
call CompWords ;сравниваем элементы si и di
test ax, ax ;проверяем результат
jle SortWords_next2 ;<= ничего не делаем
mov ax, array[si] ;меняем местами адрес слова
xchg array[di], ax
mov array[si], ax
mov ax, array[si+2] ;и длину
xchg array[di+2], ax
mov array[si+2], ax
SortWords_next2:
lea di, [di+4] ;на следующий элемент цикла 2
cmp di, cx ;дошли до конца?
jb SortWords_loop2

lea si, [si+4] ;на следующий элемент цикла 1
cmp si, dx ;дошли до конца?
jb SortWords_loop1
SortWords_ret:
ret
SortWords endp

OutSortWords proc ;вывод отсортированных слов
lea dx, sResult ;строка "Sorted words: "
mov ah, 9
int 21h

mov di, count ;количество слов
xor bx, bx ;индекс в массиве элементов массива
mov ah, 2 ;ф-я вывода символа dl на экран
PrintWords_loop:
mov si, array[bx] ;адрес слова
mov cx, array[bx+2] ;длина
PrintWord_loop:
mov dl, [si]
inc si
int 21h
loop PrintWord_loop ;выводим в цикле
mov dl, ' ' ;отделим пробелом
int 21h
add bx, 4 ;на следующий элемент (слово)
dec di ;все слова?
jne PrintWords_loop
mov dl, 0dh
int 21h
mov dl, 0ah ;перевод строки
int 21h
ret
OutSortWords endp

.data
sEnterString db "Enter string: $" ;приглашение ввести строку
sResult db 0dh,0ah,"Sorted words: $"
;буфер для ввода строки-вещественного числа
max db 128 ;размер буфера
len db ? ;реальная длина
String db 128 dup (?) ;сама строка

even ;выровняем адрес памяти на слово
count dw ? ;количество слов
array dw 256 dup (?) ;массив элементов, в которых адрес слова и длина
end
[/code]
5
Об авторе:
"Если вы заметили, что вы на стороне большинства, —
это верный признак того, что пора меняться." Марк Твен
давно
Мастер-Эксперт
17387
18345
14.04.2016, 07:01
общий
Адресаты:
Цитата: yasha190
БОЛЬШОЕ СПАСИБОО

Пожалуйста! Но не нужно писать такие сообщения всем модераторам. Благодарите автора ответа.
Об авторе:
Facta loquuntur.
давно
Старший Модератор
31795
6196
14.04.2016, 08:35
общий
Адресаты:
Модераторов зачем звали?

Я удалил Ваше:
Цитата: yasha190
БОЛЬШОЕ СПАСИБОО


Оценку за ответ лучше поставьте.
Об авторе:
Мне безразлично, что Вы думаете о обо мне, но я рад за Вас - Вы начали думать.

давно
Посетитель
400184
10
14.04.2016, 10:33
общий
Адресаты:
Указывает на ошибку. Почему?
Прикрепленные файлы:
048c356f71e36ed18ac93abf42ab0e40.png
давно
Посетитель
7438
7205
14.04.2016, 10:42
общий
Адресаты:
Поменяйте
.exit 0
На
mov ax, 4c00h
int 21h
Об авторе:
"Если вы заметили, что вы на стороне большинства, —
это верный признак того, что пора меняться." Марк Твен
давно
Посетитель
400184
10
14.04.2016, 10:47
общий
Адресаты:
Все нормально решил проблему
Форма ответа