Консультация № 183402
29.05.2011, 18:41
52.69 руб.
0 3 1
Здравствуйте, уважаемые эксперты! Прошу вас помочь в написании программы:
Ввести произвольную символьную строку. Найти в ней первую по алфавиту букву (не просто символ) и вывести на экран.
Задача для TASM, model small

Заранее спасибо.

Обсуждение

давно
Посетитель
7438
7205
30.05.2011, 12:07
общий
1) Алфавит русский/английский? Или оба?
2) Большие/малые различаем?
Об авторе:
"Если вы заметили, что вы на стороне большинства, —
это верный признак того, что пора меняться." Марк Твен
Неизвестный
30.05.2011, 19:06
общий
Адресаты:
1. Если можно сделать оба алфавита, то это было бы отлично.
2. Если можно, то с различением.
давно
Посетитель
7438
7205
31.05.2011, 15:35
общий
это ответ
Здравствуйте, Илья Андреевич!

Программа ищет минимальную, в лексикографическом порядке, букву
(все английские, естественно, получаются меньше русских).
При этом учтены и русские буковки Ё и ё, которые, в общем-то, выпадают
из общего порядка букв. По программе, они точно за буквами Е и е, соответственно...


[code h=207];Ввести произвольную символьную строку.
;Найти в ней первую по алфавиту букву (не просто символ) и вывести на экран.

.model small
.stack 100h
.data
sString db 'Enter string: $'
sResult db 0ah,'Found min letter: $'
sPress db 0dh,0ah,'Press any key$'
sNoLetters db 0ah,'Letters not found$'

;буфер для ввода строки (для функции 0ah)
bBuf db 80 ;максимальный размер буфера
bCnt db ? ;реальный размер строки
bStr db 80 dup (?) ;сама строка

.code
main proc
mov ax, @data
mov ds, ax ;настроим сегмент данных

lea dx, sString
mov ah, 9
int 21h ;ждем строку

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

;ищем букву с минимальным кодом
lea si, bStr ;строка
mov ah, 0ffh ;считаем, что букв вообще нет (взяли самый большой код)
MainLoop:
lodsb ;очередной символ
cmp al, 0dh
je Print ;дошли до конца
cmp al, 41h ;'A'
jb MainLoop
cmp al, 5ah ;'Z'
jbe SearchMin ;большие английские - ищем с минимальным кодом
cmp al, 61h ;'a'
jb MainLoop
cmp al, 7ah ;'z'
jbe SearchMin ;малые английские - ищем с минимальным кодом
cmp al, 80h ;'А'
jb MainLoop
cmp al, 0afh ;'п'
jbe SearchMin ;большие русские + малые 'а'-'п' - ищем с минимальным кодом
cmp al, 0e0h ;'р'
jb MainLoop
cmp al, 0f1h ;'р'-'я','Ё','ё'
ja MainLoop
SearchMin: ;проверим на "особые" буквы 'Ё' и 'ё'
cmp ah, 0f0h ;минимальная 'Ё'?
je L_min_f0
cmp ah, 0f1h ;минимальная 'ё'?
je L_min_f1
cmp al, 0f0h ;текущая 'Ё'?
je L_f0
cmp al, 0f1h ;текущая 'ё'?
je L_f1
CmpMin:
cmp al, ah ;сравниваем
jae MainLoop ;больше или равно - игнорируем
SetMin:
mov ah, al ;меньше - сохраняем, как новый минимальный
jmp MainLoop ;читаем дальше

L_min_f0: ;минимальная 'Ё'
cmp al, 85h ;сравним текущую с 'E'
ja MainLoop ;если больше, то игнорируем
jmp SetMin ;иначе сохраним, как минимальную

L_min_f1: ;минимальная 'ё'?
cmp al, 0f0h ;текущая 'Ё'?
je SetMin ;она меньше! - сохраним
cmp al, 0a5h ;иначе сравним текущую с 'е'
ja MainLoop ;если больше, то игнорируем
jmp SetMin ;иначе сохраним, как минимальную

L_f0: ;текущая 'Ё'
cmp ah, 85h ;сравним минимальную с 'E'
ja SetMin ;если больше, то сохраняем
jmp MainLoop ;иначе игнорируем

L_f1: ;текущая 'ё'
cmp ah, 0f0h ;минимальная 'Ё'?
je MainLoop ;игнорируем
cmp ah, 0a5h ;сравним минимальную с 'е'
ja SetMin ;если больше, то сохраняем
jmp MainLoop ;иначе игнорируем

Print: ;выводим
cmp ah, 0ffh ;буквы были?
je NoLetters ;не было - вводим сообщение
push ax ;сохраним минимальную буковку
lea dx, sResult
mov ah, 9
int 21h ;результат
pop ax ;восстановим букву в ah
mov dl, ah ;для вывода
mov ah, 2 ;ф-я вывода
int 21h
jmp Exit ;на конец

NoLetters: ;сообщение о том, что букв нет
lea dx, sNoLetters
mov ah, 9
int 21h
Exit:
lea dx, sPress ;выведем приглашение нажать на любую клавишу
mov ah, 9
int 21h

mov ah, 0 ;ждем
int 16h

mov ax, 4c00h
int 21h ;выход в ДОС
main endp

end main
[/code]
Примерный вывод программы:

Код:
Enter string: опрстёщш
Found min letter: ё
Press any key
Об авторе:
"Если вы заметили, что вы на стороне большинства, —
это верный признак того, что пора меняться." Марк Твен
Форма ответа