
Быстрый поиск
Введите фрагмент названия статьи для поиска

Запись числа римскими цифрами на Ассемблере
18.09.2023 | Категория: Образ мышления: Assembler | Автор: ManHunter

Запись числа римскими цифрами на Ассемблере
Задачки на запись натурального числа римскими цифрами очень часто встречаются на различных олимпиадах по программированию. Я решил нарисовать свой вариант решения задачи на Ассемблере.
Натуральные числа записываются при помощи повторения этих цифр. При этом применяется следующее базовое правило: одна и та же букво-цифра не может повторяться в записи числа более 3-х раз подряд. Для этого введены дополнительные двухбуквенные комбинации и, если меньшая букво-цифра стоит перед большей, то меньшая вычитается из большей. В табличке это наглядно видно. Но ограниченный набор букво-цифр приводит к тому, что максимальное число, которое можно записать базовым набором римских цифр, не может превышать десятичного числа 3999 (MMMCMXCIX). Также в римской записи нет нулевого значения, отрицательных и дробных чисел.
Читать статью целиком »
Просмотров: 164 | Комментариев: 0

Сортировка Шелла на Ассемблере
06.10.2022 | Категория: Образ мышления: Assembler | Автор: ManHunter

Сортировка Шелла на Ассемблере
Сегодня разберем еще один алгоритм сортировки - сортировку Шелла. Он назван в честь ученого Дональда Шелла, который в 1959 году опубликовал этот алгоритм. Сортировка Шелла представляет собой нечто среднее между классической пузырьковой сортировкой и сортировкой вставками, легко реализуется на разных языках программирования, при этом показывает хорошую скорость работы и не требует выделения дополнительной памяти.
Читать статью целиком »
Просмотров: 533 | Комментариев: 5

Поиск подстроки в строке по алгоритму Карпа-Рабина
01.06.2022 | Категория: Образ мышления: Assembler | Автор: ManHunter

Поиск подстроки в строке по алгоритму Карпа-Рабина
Когда речь заходит об алгоритмах точного поиска подстроки в строке, то обычно все так или иначе сводится к последовательному сравнению символов. Но есть группа алгоритмов, которые основаны не на сравнении символов, а на сравнении числовых данных - хешей. Одним из таких алгоритмов является алгоритм Карпа-Рабина. Его принцип достаточно простой: вычисляется хеш от строки поиска, затем вычисляется хеш от фрагмента строки, в которой производится поиск. Длина фрагмента равна длине искомой строки. Если хеши равны, то выполняется дополнительное посимвольное сравнение, если не равны, то продвигаемся по строке дальше. Казалось бы, что выигрыша тут никакого быть не может, ведь вместо сравнения вычислительные ресурсы тратятся на хеширование. Однако, как показывает практика, для поиска совпадения это гораздо эффективнее, чем сравнение отдельных символов строк. Вместо O(n*m) операций можно добиться среднего результата O(n+m), где n - длина исходной строки, а m - длина искомой строки. К тому же алгоритм Карпа-Рабина не требует выделения дополнительной памяти для своей работы.
Читать статью целиком »
Просмотров: 1277 | Комментариев: 3

Алгоритм быстрой сортировки на Ассемблере
19.05.2022 | Категория: Образ мышления: Assembler | Автор: ManHunter

Алгоритм быстрой сортировки на Ассемблере
Алгоритм быстрой сортировки появился еще на заре компьютерной эпохи в 1960 году. И до сих пор он остается одним из самых быстрых универсальных алгоритмов сортировки массивов. Несмотря на некоторые недостатки в виде наличия рекурсивных вызовов, алгоритм быстрой сортировки очень прост в реализации, не требует выделения дополнительной памяти и даже может быть распараллелен между несколькими подпроцессами.
Читать статью целиком »
Просмотров: 961 | Комментариев: 1

Подгонка размеров поля EDIT под используемый шрифт
07.12.2020 | Категория: Образ мышления: Assembler | Автор: ManHunter
Много чего уже делали и с полями ввода, и со шрифтами. На очереди автоматическая подгонка высоты однострочного элемента EDIT в зависимости от размеров шрифта, который ему назначен. Это необходимо, чтобы при изменении шрифта текст в поле ввода смотрелся правильно. Высота EDIT считается по высоте выбранного шрифта плюс отступ толщиной в двойную рамку, чтобы текст при отображении эту рамку не перекрывал. В случае многострочных полей ввода высоту надо считать по высоте шрифта, умноженной на необходимое количество строк, плюс отступ.Code (Assembler) : Убрать нумерацию
- ;-------------------------------------------------------------
- ; Подгонка размера поля EDIT под заданный шрифт
- ;-------------------------------------------------------------
- ; Параметры:
- ; hEdit - хэндл поля EDIT
- ; hFont - хэндл шрифта
- ;-------------------------------------------------------------
- proc resize_edit hEdit:DWORD, hFont:DWORD
- locals
- rc RECT
- tm TEXTMETRIC
- endl
- pusha
- mov edi,[hEdit]
- ; Получить контекст устройства
- invoke GetDC,edi
- or eax,eax
- ; Поля ввода не существует, на выход
- jz .loc_exit
- xchg eax,esi
- ; Выбрать шрифт
- invoke SelectObject,esi,[hFont]
- or eax,eax
- jnz @f
- ; Шрифт не загружен, на выход
- invoke ReleaseDC,edi,esi
- jmp .loc_exit
- @@:
- ; Получить метрику выбранного шрифта
- lea ebx,[tm]
- invoke GetTextMetrics,esi,ebx
- invoke ReleaseDC,edi,esi
- ; Высота шрифта
- mov ebx,[ebx+TEXTMETRIC.tmHeight]
- ; Добавить к высоте размер рамки
- invoke GetSystemMetrics,SM_CYEDGE
- shl eax,2
- add ebx,eax
- ; Получить размеры поля EDIT
- lea esi,[rc]
- invoke GetWindowRect,edi,esi
- invoke GetParent,edi
- ; Отмасштабировать координаты окна
- invoke MapWindowPoints,HWND_DESKTOP,eax,esi,2
- ; Установить новые размеры поля EDIT
- mov eax,[esi+RECT.right]
- sub eax,[esi+RECT.left]
- invoke MoveWindow,edi,[esi+RECT.left],[esi+RECT.top],eax,ebx,TRUE
- .loc_exit:
- popa
- ret
- endp
Читать статью целиком »
Просмотров: 940 | Комментариев: 1
