Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Низкоуровневое программирование > Assembler - Ассемблер (FASM, MASM, WASM, NASM, GoASM, Gas, RosAsm, HLA) и не рекомендуем TASM
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 03.05.2009, 22:55   #1
Артин
 
Регистрация: 14.04.2009
Сообщений: 8
По умолчанию Сортировка слов по длине.

Задание: Слова в предложении разделены пробелами. Отсортировать слова по длине.

Ввод-вывод массива работает корректно, длины слов так же записываются нормально. Но сортировка почему-то либо обрезает первое, либо несколько слов.

Идея такова:
1) Дан массив из 256 элементов.
2) Под каждое слово в массиве отводится 16 ячеек. В первая ячейку (В массиве она кратна 10h) помещаем длину слова, далее само слово. Все незанятые ячейки равны нулю.
3) Ввод осуществляется посимвольно. Если ввели пробел, то перескакиваем к началу следующего слова.
4) Сортировка соответсвует алгоритму по средствам выбора.
5) Вывод осуществляется так же посимвольно, но с исключением ячеек, содержащие длины слов. Если наткнулись на ноль, то выводим пробел и переходим к следующему слову.

Цитата:
.model small
.stack 100h;
.data;
i dw 0h
String db 'Enter a line: $'
Stg db 100h dup(0h); Массив для строки
.code;
mov ax, @data;
mov ds, ax;
mov ah, 00h; Очистка экрана
mov al, 2h;
int 10h
mov ah, 09h
Lea dx, String
int 21h
mov ah, 1h; Ф-я ввода символа
mov si, 0h
mov bx, 0h
Input: ;Ввод массива
int 21h
mov cx, si
mov Stg[bx], cl; Длина слова
cmp al, 32; Проверка на пробел
jne Skip
mov si, 0h
add bx, 10h; Начало следующего слова
jmp Input
Skip:
inc si
mov Stg[bx+si], al; Помещение символа в массив
cmp al, 13
jne Input
mov i, bx; Кол-во слов*16
mov bx, 0h
Sort1: ;Выборочная сортировка
mov di, bx; Индекс минимальной длины
mov ax, bx
add ax, 10h
Sort2:
mov si, ax
mov cl, Stg[si]
cmp cl, Stg[di]
jae Skip2
mov di, si; Если меньше
Skip2:
add ax, 10h
cmp ax, i
jbe Sort2
mov si, 0h
Sort3:
moV cl, Stg[bx+si]; Смена слов
mov al, Stg[di]
mov Stg[bx+si], al
mov Stg[di], cl
inc si
inc di
cmp si, 10h
jb Sort3
add bx, 10h
cmp bx, i
jb Sort1
mov ah, 02h; Ф-я установки позиции курсора:
mov bh, 0h; № Страницы
mov dh, 2h; № строки
mov dl, 0h; № столбца
int 10h
mov bx, 0h
mov si, 0h
mov ah, 2h; Ф-я вывода символа
Output: ;Вывод массива
inc si
mov dx, word ptr Stg[bx+si]
cmp dx, 0h
jne Skip3
cmp bx, i
je Exit
mov si, 0h
add bx, 10h
mov dx, ' '
add dx, '0'
add bx, 10h
Skip3:
int 21h
cmp bx, i
jbe Output
Exit:
mov ah, 4ch;
int 21h
End

Последний раз редактировалось Артин; 04.05.2009 в 22:31.
Артин вне форума Ответить с цитированием
Старый 05.05.2009, 10:00   #2
airyashov
Форумчанин
 
Регистрация: 02.04.2008
Сообщений: 358
По умолчанию

ну почему вы не умеете писать процедурами...
1.При вводе 2-х и далее пробелов получаем слова 0 длины
2.В последнее слово записывается еще код 13

mov i, bx; mov i, bx; Кол-во слов*16
это будет не так (Кол-во слов-1)*16 нумерация с 0, хотя алгоритму это не мешает

самое интересное это вот этот код

Код:
mov si, 0h
add bx, 10h
mov dx, ' '
add dx, '0'
add bx, 10h
поясните что он делает и смотрите куда он идет далее, когда исправите его будет все ок
неплохо пишу на ассемблере для 80х86
icq: 3(один)7748666
mail: airyashov(а)inbox.ru

Последний раз редактировалось rpy3uH; 05.05.2009 в 10:39.
airyashov вне форума Ответить с цитированием
Старый 05.05.2009, 11:45   #3
Артин
 
Регистрация: 14.04.2009
Сообщений: 8
По умолчанию

airyashov
add dx, '0'
add bx, 10h
- это я забыл убрать. Использовал при проверки правильности нахождения длин. Обычно обковыченые стояли.
Удаление ентера из последнего слова действительно помогло. Теперь всё сортирует.
P.S. А два или более пробелов и не нужно. В условии только один пробел между словами.
Цитата:
.model small;
.stack 100h;
.data;
i dw 0h
String db 'Enter a line: $'
Stg db 100h dup(0h); Массив для строки
.code;
mov ax, @data;
mov ds, ax;
mov ah, 00h; Очистка экрана
mov al, 2h;
int 10h
mov ah, 09h
Lea dx, String
int 21h
mov ah, 1h; Ф-я ввода символа
mov si, 0h
mov bx, 0h
Input: ;Ввод массива
int 21h
mov cx, si
mov Stg[bx], cl; Длина слова
cmp al, 32; Проверка на пробел
jne Skip1
mov si, 0h
add bx, 10h; Начало следующего слова
jmp Input
Skip1:
inc si
mov Stg[bx+si], al; Помещение символа в массив
cmp al, 13
jne Input
mov Stg[bx+si], 0h; Удаление Enter'а
mov i, bx; Кол-во слов
mov bx, 0h
Sort1: ;Выборочная сортировка
mov di, bx; Индекс минимальной длины
mov ax, bx
add ax, 10h
Sort2:
mov si, ax
mov cl, Stg[si]
cmp cl, Stg[di]
jae Skip2
mov di, si; Если меньше
Skip2:
add ax, 10h
cmp ax, i
jbe Sort2
mov si, 0h
Sort3:
moV cl, Stg[bx+si]; Смена слов
mov al, Stg[di]
mov Stg[bx+si], al
mov Stg[di], cl
inc si
inc di
cmp si, 10h
jb Sort3
add bx, 10h
cmp bx, i
jb Sort1
mov ah, 02h; Ф-я установки позиции курсора:
mov bh, 0h; № Страницы
mov dh, 2h; № строки
mov dl, 0h; № столбца
int 10h
mov bx, 0h
mov si, 0h
mov ah, 2h; Ф-я вывода символа
Output: ;Вывод массива
inc si
mov dx, word ptr Stg[bx+si]
cmp dx, 0h
jne Skip3
cmp bx, i
je Exit
mov si, 0h
add bx, 10h
mov dx, ' '
Skip3:
int 21h
cmp bx, i
jbe Output
Exit:
mov ah, 4ch;
int 21h
End

Последний раз редактировалось Артин; 05.05.2009 в 11:53.
Артин вне форума Ответить с цитированием
Старый 05.05.2009, 12:01   #4
Артин
 
Регистрация: 14.04.2009
Сообщений: 8
По умолчанию

Хотя легко и с несколькими пробелами.
Цитата:
Input: ;Ввод массива
int 21h
mov cx, si
mov Stg[bx], cl; Длина слова
cmp al, 32; Проверка на пробел
jne Skip1
cmp cl, 0h; Если до этого был пробел
je Input
mov si, 0h; Обнуление
add bx, 10h; Начало следующего слова
jmp Input
Skip1:
inc si
mov Stg[bx+si], al; Помещение символа в массив
cmp al, 13
jne Input
Артин вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Сортировка списка слов Solace Microsoft Office Excel 2 03.03.2009 22:37
Составить в алфавитном порядке список всех слов, встречающихся в тексте, и количество этих слов. KAPAHDAW Паскаль, Turbo Pascal, PascalABC.NET 2 17.02.2009 01:19
сортировка слов(Пузырек) chipset Общие вопросы C/C++ 2 11.02.2008 08:58
Сортировка слов по алфавиту victorio Microsoft Office Word 7 15.12.2007 19:03