Вопрос № 181128: Здравствуйте, уважаемые эксперты! Прошу Вас ответить на следующий вопрос: Версию доса и тасма незнаю модель вроде small В массиве а(10) отсортировать все элементы по возростанию до первого кратног...
Вопрос № 181128:
Здравствуйте, уважаемые эксперты! Прошу Вас ответить на следующий вопрос: Версию доса и тасма незнаю модель вроде small
В массиве а(10) отсортировать все элементы по возростанию до первого кратного 7
прошу сделать как можно проще, и желательно описание к каждой строчке чтобы было как можно понятнее заранее благодарен
Отвечает Лысков Игорь Витальевич (Старший модератор) :
Здравствуйте, Евтеев Алексей Николаевич! Массив вводим с консоли. Причем, можно вводить, как в одно строке, так и в нескольких Затем ищем число элементов до первого кратного 7 методом деления на 7 и сравнения остатка с 0. Затем сортируем найденное количество методом пузырька (надеюсь, знакомы?). Ну и, наконец, выводим все элементы на экран.
Код:
;В массиве а(10) отсортировать все элементы по возростанию до первого кратного 7 .model small .data sEnter db 'Enter 10 numbers: ',0dh,'$' sTitle db 0ah,'Sorted array: $' .data? a dw 10 dup (?) len_a equ ($-a)/2 ;число элементов ;буфер для приема строки sNum db
? ;максимальный размер буфера sCount db ? ;реальный размер строки sBuf db 80 dup (?) ;сама строка
push offset a ;параметром - адрес массива call GetArray ;вводим массив
;найдем число элементов до первого кратного 7 lea si, a ;адрес массива mov cx, len_a ;всего элементов xor bx, bx ;искомый счетчик mov di, 7 ;делим на 7 search_div7: lodsw ;очередной
элемент cwd ;подготовим dx:ax к делению idiv di ;ds:ax / 7 test dx, dx ;остаток есть? jz sort ;нет - разделилось нацело, идем на сортировку inc bx ;считаем loop search_div7
;отсортируем bx элементов методом пузырька sort: mov cx, bx ;число сортируемых элементов cmp cx, 2 ;0 и 1 нет смысла сортировать jb print dec cx ;число сравнений lea si, a ;адрес элемента в массиве SortLoop: ;цикл по
поиску очередного минимального lea di, [si+2] ;начинаем со следующего push cx ;сохраним счетчик mov ax, [si] ;текущий минимальный по адресу [si] SearchMinLoop: ;цикл по всем последующим ;сравниваем текущий со всеми последующими cmp ax, [di] ;если текущий минимальный <= последующего, jle SortNext ; то обходим обмен ;меняем местами элементы xchg ax, [di] mov [si], ax ;по адресу [si] и в ax новый минимальный SortNext: inc di inc di ;на следующий последующий loop SearchMinLoop inc si inc si ;на
следующий текущий pop cx ;восстановим счетчик сравнений loop SortLoop
print: ;выведем все элементы lea dx, sTitle mov ah, 9 int 21h ;заголовок
mov cx, len_a ;число всех lea si, a ;адрес PutLoop: lodsw ;элемент call PutNumber ;выводим loop PutLoop
mov ah, 0 int 16h ;ждем нажатие на клавишу
mov ax, 4c00h ;выход в ДОС int 21h
PutNu
mber proc ;преобразование числа из ax в строку и вывод на экран push cx bx ;сохраним использованые регистры xor cx, cx ;счетчик разрядов mov bx, 10 ;делим на 10 DivLoop: ;цикл преобразования в разряды cwd ;подготавливаем dx:ax к делению idiv bx ;dx = очередному младшему разряду push dx ;сохраним в стеке inc cx ;считаем test ax, ax ;продолжаем, пока не дойдем до 0 jnz DivLoop PrLoop: ;цикл вывода в обратном порядке pop ax ;берем число 0-9 из стека or al,
'0' ;преобразовываем в символ '0'-'9' int 29h ;выводим loop PrLoop mov al, ' ' int 29h ;отделим пробелом pop bx cx ret PutNumber endp
GetArray proc pArray:word ;ввод массива local pLast:word ;переменная для сравнения на конец
push bp mov bp, sp ;адресуем параметр через [bp+4] sub sp, 2 ;2 байта под локальную переменную pLast
lea dx, sEnter mov ah, 9 int 21
h ;приглашение на ввод элементов массива
mov di, pArray ;адрес массива
mov ax, len_a ;адрес за массивом (для контроля кон
ца) shl ax, 1 add ax, pArray mov pLast, ax ;сохраним GA_ask: mov ah, 2 mov dl, 0ah int 21h ;переход на новую строку
mov sNum, 80 lea dx, sNum mov ah, 0ah int 21h lea si, sBuf ;строка с числами, разделенная разделителями
GA_next: cmp di, pLast ;массив заполнен? je GA_ret
call stoi ;[si] -> ax jcxz GA_ask ;дошли до конца строки? stosw ;сохраняем jmp GA_next ;на следующее число в строке GA_ret: mov sp, bp ;восстановим
вершину стека pop bp ;восстановим старое значение bp ret 2 ;2выкинем" из стека параметр GetArray endp
;функция преобразовывает числовую строку в число ;преобразование заканчивается по любому разделителю или концу строки (0dh) ;признаком конца строки является cx = 0 stoi proc ;преобразование строки [si] в беззнаковое число AX push dx xor bx, bx ;здесь будем стоить число xor cx, cx ;счетчик разрядов stoi_next: lodsb ;очередной символ cmp al, 0dh ;конец стоки? je stoi_eol cmp al, '0' jb stoi_sep ;любая нецифра - разделитель cmp al, '9' ja stoi_sep push ax ;сохраним новый разряд mov ax, 10 mul bx ;умножим старшие на 10 pop dx ;новый and dx, 0fh ;'0'-'9' -> 0-9 add ax, dx ;добавляем новый разряд mov bx, ax ;сохраняем inc cx ;считаем jmp stoi_next ;продолжаем stoi_sep: ;встретили разделитель jcxz stoi_next ;были
только разделители - на продолжение ; иначе - конец числа и выходим stoi_eol: ; если числа нет и встретили 0dh - конец строки mov ax, bx ;число возвращаем в ax dec si ;шаг назад, чтобы легче было проанализировать 0dh pop dx ret stoi endp
end start
----- Люби своего ближнего, как самого себя
Ответ отправил: Лысков Игорь Витальевич (Старший модератор)
Ответ отправлен: 07.12.2010, 02:25
Номер ответа: 264557 Украина, Кировоград Тел.: +380957525051 ICQ # 234137952 Mail.ru-агент: igorlyskov@mail.ru
Вам помог ответ? Пожалуйста, поблагодарите эксперта за это! Как сказать этому эксперту "спасибо"?
Отправить SMS#thank 264557
на номер 1151 (Россия) |
Еще номера »
Оценить выпуск »
Нам очень важно Ваше мнение об этом выпуске рассылки!
* Стоимость одного СМС-сообщения от 7.15 руб. и зависит от оператора сотовой связи.
(полный список тарифов)
** При ошибочном вводе номера ответа или текста #thank услуга считается оказанной, денежные средства не возвращаются.
*** Сумма выплаты эксперту-автору ответа расчитывается из суммы перечислений на портал от биллинговой компании.