Хостинг портала RFpro.ru: Московский хостер Профессиональный ХОСТИНГ на базе Linux x64 и Windows x64 РАССЫЛКИ ПОРТАЛА RFPRO.RU Лучшие эксперты данной рассылки Номер выпуска: | 1397 | Дата выхода: | 12.12.2010, 18:00 | Администратор рассылки: | Лысков Игорь Витальевич (Старший модератор) | Подписчиков / экспертов: | 224 / 66 | Вопросов / ответов: | 1 / 1 | Вопрос № 181128: Здравствуйте, уважаемые эксперты! Прошу Вас ответить на следующий вопрос: Версию доса и тасма незнаю модель вроде small В массиве а(10) отсортировать все элементы по возростанию до первого кратног... Вопрос № 181128: Здравствуйте, уважаемые эксперты! Прошу Вас ответить на следующий вопрос: Версию доса и тасма незнаю модель вроде small
В массиве а(10) отсортировать все элементы по возростанию до первого кратного 7
прошу сделать как можно проще, и желательно описание к каждой строчке чтобы было как можно понятнее заранее благодарен Отправлен: 06.12.2010, 17:55 Вопрос задал: Евтеев Алексей Николаевич (Посетитель) Всего ответов: 1 Страница вопроса » Отвечает Лысков Игорь Витальевич (Старший модератор) : Здравствуйте, Евтеев Алексей Николаевич! Массив вводим с консоли. Причем, можно вводить, как в одно строке, так и в нескольких Затем ищем число элементов до первого кратного 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 (?) ;сама строка
.code .286 assume ds:_DATA, es:_DATA, cs:_TEXT start: mov ax, _DATA mov ds, ax mov es, ax
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 (Россия) | Еще номера » | Оценить выпуск » Нам очень важно Ваше мнение об этом выпуске рассылки! Скажите "спасибо" эксперту, который помог Вам! Отправьте СМС-сообщение с тестом #thank НОМЕР_ОТВЕТА на короткий номер 1151 (Россия) Номер ответа и конкретный текст СМС указан внизу каждого ответа. Полный список номеров » * Стоимость одного СМС-сообщения от 7.15 руб. и зависит от оператора сотовой связи. (полный список тарифов) ** При ошибочном вводе номера ответа или текста #thank услуга считается оказанной, денежные средства не возвращаются. *** Сумма выплаты эксперту-автору ответа расчитывается из суммы перечислений на портал от биллинговой компании. |
Комментариев нет:
Отправить комментарий